@perspective-dev/viewer-datagrid 4.3.0 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/cdn/perspective-viewer-datagrid.js +4 -22
  2. package/dist/cdn/perspective-viewer-datagrid.js.map +4 -4
  3. package/dist/css/perspective-viewer-datagrid-toolbar.css +1 -1
  4. package/dist/css/perspective-viewer-datagrid.css +1 -1
  5. package/dist/esm/color_utils.d.ts +22 -0
  6. package/dist/esm/custom_elements/datagrid.d.ts +5 -5
  7. package/dist/esm/data_listener/format_cell.d.ts +1 -1
  8. package/dist/esm/data_listener/formatter_cache.d.ts +1 -1
  9. package/dist/esm/data_listener/index.d.ts +3 -2
  10. package/dist/esm/event_handlers/click/edit_click.d.ts +3 -2
  11. package/dist/esm/event_handlers/click.d.ts +4 -6
  12. package/dist/esm/event_handlers/dispatch_click.d.ts +3 -2
  13. package/dist/esm/event_handlers/expand_collapse.d.ts +1 -1
  14. package/dist/esm/event_handlers/focus.d.ts +4 -5
  15. package/dist/esm/event_handlers/header_click.d.ts +5 -3
  16. package/dist/esm/event_handlers/keydown/edit_keydown.d.ts +3 -4
  17. package/dist/esm/event_handlers/select_region.d.ts +3 -1
  18. package/dist/esm/event_handlers/sort.d.ts +8 -7
  19. package/dist/esm/model/create.d.ts +1 -1
  20. package/dist/esm/perspective-viewer-datagrid.js +3 -3
  21. package/dist/esm/perspective-viewer-datagrid.js.map +4 -4
  22. package/dist/esm/plugin/activate.d.ts +1 -1
  23. package/dist/esm/plugin/column_style_controls.d.ts +1 -1
  24. package/dist/esm/style_handlers/body.d.ts +3 -3
  25. package/dist/esm/style_handlers/column_header.d.ts +4 -3
  26. package/dist/esm/style_handlers/consolidated.d.ts +3 -47
  27. package/dist/esm/style_handlers/editable.d.ts +3 -2
  28. package/dist/esm/style_handlers/focus.d.ts +4 -4
  29. package/dist/esm/style_handlers/group_header.d.ts +1 -1
  30. package/dist/esm/style_handlers/table_cell/boolean.d.ts +1 -1
  31. package/dist/esm/style_handlers/table_cell/cell_flash.d.ts +1 -1
  32. package/dist/esm/style_handlers/table_cell/datetime.d.ts +6 -2
  33. package/dist/esm/style_handlers/table_cell/numeric.d.ts +1 -1
  34. package/dist/esm/style_handlers/table_cell/row_header.d.ts +1 -1
  35. package/dist/esm/style_handlers/table_cell/string.d.ts +1 -1
  36. package/dist/esm/style_handlers/types.d.ts +0 -4
  37. package/dist/esm/types.d.ts +10 -17
  38. package/package.json +3 -5
  39. package/src/css/mitered-headers.css +64 -0
  40. package/src/css/perspective-viewer-datagrid.css +6 -0
  41. package/src/{less/pro.less → css/pro.css} +32 -31
  42. package/src/css/regular_table.css +589 -0
  43. package/src/{less/row-hover.less → css/row-hover.css} +48 -29
  44. package/src/{less/scrollbar.less → css/scrollbar.css} +16 -15
  45. package/src/{less/sub-cell-scroll.less → css/sub-cell-scroll.css} +14 -13
  46. package/src/{less/toolbar.less → css/toolbar.css} +57 -39
  47. package/src/ts/color_utils.ts +144 -16
  48. package/src/ts/custom_elements/datagrid.ts +11 -12
  49. package/src/ts/custom_elements/toolbar.ts +4 -5
  50. package/src/ts/data_listener/format_cell.ts +28 -9
  51. package/src/ts/data_listener/formatter_cache.ts +1 -1
  52. package/src/ts/data_listener/index.ts +4 -8
  53. package/src/ts/event_handlers/click/edit_click.ts +7 -6
  54. package/src/ts/event_handlers/click.ts +39 -68
  55. package/src/ts/event_handlers/dispatch_click.ts +24 -25
  56. package/src/ts/event_handlers/expand_collapse.ts +7 -7
  57. package/src/ts/event_handlers/focus.ts +38 -35
  58. package/src/ts/event_handlers/header_click.ts +101 -62
  59. package/src/ts/event_handlers/keydown/edit_keydown.ts +49 -52
  60. package/src/ts/event_handlers/select_region.ts +144 -133
  61. package/src/ts/event_handlers/sort.ts +16 -24
  62. package/src/ts/model/column_overrides.ts +13 -4
  63. package/src/ts/model/create.ts +55 -59
  64. package/src/ts/model/toolbar.ts +23 -7
  65. package/src/ts/plugin/activate.ts +120 -92
  66. package/src/ts/plugin/column_style_controls.ts +1 -1
  67. package/src/ts/plugin/save.ts +1 -0
  68. package/src/ts/style_handlers/body.ts +56 -61
  69. package/src/ts/style_handlers/column_header.ts +16 -19
  70. package/src/ts/style_handlers/consolidated.ts +22 -123
  71. package/src/ts/style_handlers/editable.ts +10 -8
  72. package/src/ts/style_handlers/focus.ts +5 -5
  73. package/src/ts/style_handlers/group_header.ts +3 -2
  74. package/src/ts/style_handlers/table_cell/boolean.ts +3 -3
  75. package/src/ts/style_handlers/table_cell/cell_flash.ts +11 -11
  76. package/src/ts/style_handlers/table_cell/datetime.ts +14 -11
  77. package/src/ts/style_handlers/table_cell/numeric.ts +24 -25
  78. package/src/ts/style_handlers/table_cell/row_header.ts +2 -2
  79. package/src/ts/style_handlers/table_cell/string.ts +20 -18
  80. package/src/ts/style_handlers/types.ts +0 -10
  81. package/src/ts/types.ts +28 -20
  82. package/dist/esm/event_handlers/deselect_all.d.ts +0 -5
  83. package/dist/esm/event_handlers/row_select_click.d.ts +0 -4
  84. package/src/less/mitered-headers.less +0 -65
  85. package/src/less/regular_table.less +0 -526
  86. package/src/ts/event_handlers/deselect_all.ts +0 -28
  87. package/src/ts/event_handlers/row_select_click.ts +0 -92
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/utils.ts", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/constants.ts", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/dist/css/container.css", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/dist/css/sub-cell-offsets.css", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/scroll_panel.ts", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/view_model.ts", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/events.ts", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/thead.ts", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/tbody.ts", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/table.ts", "../../../../node_modules/.pnpm/regular-table@0.8.3/node_modules/regular-table/src/ts/regular-table.ts", "../../../../rust/perspective-viewer/src/ts/plugin.ts", "../../../../rust/perspective-viewer/src/ts/extensions.ts", "../../../../rust/perspective-viewer/dist/wasm/perspective-viewer.js", "../../../../rust/perspective-viewer/dist/wasm/snippets/perspective-viewer-d729f682ba5c19df/inline0.js", "../../../../rust/perspective-viewer/dist/wasm/snippets/perspective-viewer-d729f682ba5c19df/inline1.js", "../../../../rust/perspective-viewer/dist/wasm/snippets/perspective-viewer-d729f682ba5c19df/inline2.js", "../../../../rust/perspective-viewer/dist/wasm/snippets/perspective-viewer-d729f682ba5c19df/inline3.js", "../../../../node_modules/.pnpm/pro_self_extracting_wasm@0.0.9/node_modules/pro_self_extracting_wasm/extract.mjs", "../../../../rust/perspective-js/src/ts/wasm/decompress.ts", "../../../../rust/perspective-viewer/src/ts/bootstrap.ts", "../../../../rust/perspective-viewer/src/ts/perspective-viewer.ts", "../../src/ts/types.ts", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/limit.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/clip_rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/type.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/unpack.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/last.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/input.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/Color.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/version.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/chroma.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/colors/w3cx11.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hex/hex2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hex/rgb2hex.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/named/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/alpha.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/clipped.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/lab-constants.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/lab2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/rgb2lab.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lab/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/darken.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/get.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/luminance.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/mix.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/mix.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/premultiply.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/lch2lab.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/lch2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/hcl2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/lab2lch.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/rgb2lch.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/lch/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/saturate.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/set.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/ops/shade.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/lrgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/lab.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/_hsx.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/lch.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/num/num2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/num/rgb2num.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/num/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/num.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hcg/hcg2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hcg/rgb2hcg.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hcg/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/hcg.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsi/hsi2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsi/rgb2hsi.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsi/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/hsi.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsl/hsl2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsl/rgb2hsl.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsl/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/hsl.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsv/hsv2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsv/rgb2hsv.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hsv/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/hsv.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/multiply-matrices.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklab/oklab2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklab/rgb2oklab.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklab/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/oklab.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/interpolator/oklch.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/average.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/scale.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/bezier.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/rgb/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/blend.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/cubehelix.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/generator/random.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/analyze.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/contrast.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/contrastAPCA.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/delta-e.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/distance.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/valid.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/utils/scales.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/colors/colorbrewer.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/cmyk/cmyk2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/cmyk/rgb2cmyk.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/cmyk/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/hsl2css.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/lab2css.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/lch2css.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/oklab2css.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklch/rgb2oklch.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/oklch2css.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/rgb2css.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklch/oklch2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/css2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/css/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/gl/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/hex/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/temp/temperature2rgb.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/temp/rgb2temperature.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/temp/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/src/io/oklch/index.js", "../../../../node_modules/.pnpm/chroma-js@3.1.2/node_modules/chroma-js/index.js", "../../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/style_handlers/focus.ts", "../../src/ts/event_handlers/keydown/edit_keydown.ts", "../../src/ts/event_handlers/click.ts", "../../src/ts/event_handlers/focus.ts", "../../src/ts/get_cell_config.ts", "../../src/ts/event_handlers/row_select_click.ts", "../../src/ts/event_handlers/deselect_all.ts", "../../src/ts/event_handlers/dispatch_click.ts", "../../src/ts/event_handlers/select_region.ts", "../../src/ts/style_handlers/editable.ts", "../../src/ts/style_handlers/group_header.ts", "../../src/ts/style_handlers/table_cell/cell_flash.ts", "../../src/ts/style_handlers/table_cell/numeric.ts", "../../src/ts/style_handlers/table_cell/string.ts", "../../src/ts/style_handlers/table_cell/datetime.ts", "../../src/ts/style_handlers/table_cell/boolean.ts", "../../src/ts/style_handlers/table_cell/row_header.ts", "../../src/ts/style_handlers/body.ts", "../../src/ts/style_handlers/consolidated.ts", "../../src/ts/plugin/activate.ts", "../../src/ts/plugin/restore.ts", "../../src/ts/plugin/save.ts", "../../src/ts/plugin/draw.ts", "../../src/ts/plugin/column_style_controls.ts", "../css/perspective-viewer-datagrid.css", "../../src/ts/custom_elements/datagrid.ts", "../css/perspective-viewer-datagrid-toolbar.css", "../../src/ts/custom_elements/toolbar.ts", "../../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\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 * 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 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 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 = 19 } = 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 || 20) * (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 || 19;\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 (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\ntype VirtualMode = \"both\" | \"horizontal\" | \"vertical\" | \"none\";\n\nconst VIRTUAL_MODES: VirtualMode[] = [\"both\", \"horizontal\", \"vertical\", \"none\"];\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() {\n this._column_sizes.auto = [];\n this._column_sizes.override = {};\n this._column_sizes.indices = [];\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 || 19;\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 { View } from \"@perspective-dev/client\";\n\n// import type * as perspective from \"@perspective-dev/client\";\n\n/**\n * The `IPerspectiveViewerPlugin` interface defines the necessary API for a\n * `<perspective-viewer>` plugin, which also must be an `HTMLElement` via the\n * Custom Elements API or otherwise. Rather than implement this API from\n * scratch however, the simplest way is to inherit from\n * `<perspective-viewer-plugin>`, which implements `IPerspectiveViewerPlugin`\n * with non-offensive default implementations, where only the `draw()` and\n * `name()` methods need be overridden to get started with a simple plugin.\n *\n * Note that plugins are frozen once a `<perspective-viewer>` has been\n * instantiated, so generally new plugin code must be executed at the module\n * level (if packaged as a library), or during application init to ensure global\n * availability of a plugin.\n *\n * @example\n * ```javascript\n * const BasePlugin = customElements.get(\"perspective-viewer-plugin\");\n * class MyPlugin extends BasePlugin {\n * get name() {\n * return \"My Plugin\";\n * }\n * async draw(view) {\n * const count = await view.num_rows();\n * this.innerHTML = `View has ${count} rows`;\n * }\n * }\n *\n * customElements.define(\"my-plugin\", MyPlugin);\n * const Viewer = customElements.get(\"perspective-viewer\");\n * Viewer.registerPlugin(\"my-plugin\");\n * ```\n * @noInheritDoc\n */\nexport interface IPerspectiveViewerPlugin {\n /**\n * The name for this plugin, which is used as both it's unique key for use\n * as a parameter for the `plugin` field of a `ViewerConfig`, and as the\n * display name for this plugin in the `<perspective-viewer>` UI.\n */\n get name(): string;\n\n /**\n * Select mode determines how column add/remove buttons behave for this\n * plugin. `\"select\"` mode exclusively selects the added column, removing\n * other columns. `\"toggle\"` mode toggles the column on or off (dependent\n * on column state), leaving existing columns alone.\n */\n get select_mode(): string | undefined;\n\n /**\n * The minimum number of columns required for this plugin to operate.\n * This mostly affects drag/drop and column remove button behavior,\n * preventing the use from applying configs which violate this min.\n *\n * While this option can technically be `undefined` (as in the case of\n * `@perspective-dev/viewer-datagrid`), doing so currently has nearly\n * identical behavior to 1.\n */\n get min_config_columns(): number | undefined;\n\n /**\n * The named column labels, if desired. Named columns behave differently\n * in drag/drop mode than unnamed columns, having replace/swap behavior\n * rather than insert. If provided, the length of `config_column_names`\n * _must_ be `>= min_config_columns`, as this is assumed by the drag/drop\n * logic.\n */\n get config_column_names(): string[] | undefined;\n\n /**\n * The load priority of the plugin. If the plugin shares priority with another,\n * the first to load has a higher priority.\n *\n * A larger number has a higher priority.\n *\n * The plugin with the highest priority will be loaded by default by the Perspective viewer.\n * If you would like to instead begin with a lower priority plugin, choose it explicitly with\n * a `HTMLPerspectiveViewerPluginElement.restore` call.\n */\n get priority(): number | undefined;\n\n /**\n * Given a column's grouping (determined by indexing it in `plugin.config_column_names`)\n * and its view type, determines whether or not to render column styles in the settings sidebar.\n * Implementing this function and `column_style_config` allows the plugin to interface with the viewer's column configuration API.\n */\n can_render_column_styles?: (view_type: string, group: string) => boolean;\n\n /**\n * Determines which column configuration controls are populated in the viewer.\n * Corresponds to the data the plugin will recieve on save.\n * Implementing this function and `can_render_column_styles` allows the plugin to interface with the viewer's column configuration API.\n */\n column_style_config?: (view_type: string, group: string) => any;\n\n /**\n * Render this plugin using the provided `View`. While there is no\n * provision to cancel a render in progress per se, calling a method on\n * a `View` which has been deleted will throw an exception.\n *\n * @example\n * ```\n * async draw(view: perspective.View): Promise<void> {\n * const csv = await view.to_csv();\n * this.innerHTML = `<pre>${csv}</pre>`;\n * }\n * ```\n */\n draw(view: View): Promise<void>;\n\n /**\n * Draw under the assumption that the `ViewConfig` has not changed since\n * the previous call to `draw()`, but the underlying data has. Defaults to\n * dispatch to `draw()`.\n *\n * @example\n * ```javascript\n * async update(view: perspective.View): Promise<void> {\n * return this.draw(view);\n * }\n * ```\n */\n update(view: View): Promise<void>;\n\n /**\n * Clear this plugin, though it is up to the discretion of the plugin\n * author to determine what this means. Defaults to resetting this\n * element's `innerHTML`, so be sure to override if you want custom\n * behavior.\n *\n * @example\n * ```javascript\n * async clear(): Promise<void> {\n * this.innerHTML = \"\";\n * }\n * ```\n */\n clear(): Promise<void>;\n\n /**\n * Like `update()`, but for when the dimensions of the plugin have changed\n * and the underlying data has not.\n */\n resize(): Promise<void>;\n\n /**\n * Notify the plugin that the style environment has changed. Useful for\n * plugins which read CSS styles via `window.getComputedStyle()`.\n */\n restyle(): Promise<void>;\n\n /**\n * Save this plugin's state to a JSON-serializable value. While this value\n * can be anything, it should work reciprocally with `restore()` to return\n * this plugin's renderer to the same state, though potentially with a\n * different `View`.\n *\n * `save()` should be used for user-persistent settings that are\n * data-agnostic, so the user can have persistent view during refresh or\n * reload. For example, `@perspective-dev/viewer-d3fc` uses\n * `plugin_config` to remember the user-repositionable legend coordinates.\n */\n save(): Promise<any>;\n\n /**\n * Restore this plugin to a state previously returned by `save()`.\n */\n restore(config: any): Promise<void>;\n\n /**\n * Free any resources acquired by this plugin and prepare to be deleted.\n */\n delete(): Promise<void>;\n}\n\n/**\n * The `<perspective-viewer-plugin>` element, the default perspective plugin\n * which is registered and activated automcatically when a\n * `<perspective-viewer>` is loaded without plugins. While you will not\n * typically instantiate this class directly, it is simple enough to function\n * as a good \"default\" plugin implementation which can be extended to create\n * custom plugins.\n *\n * @example\n * ```javascript\n * class MyPlugin extends customElements.get(\"perspective-viewer-plugin\") {\n * // Custom plugin overrides\n * }\n * ```\n * @noInheritDoc\n */\nexport class HTMLPerspectiveViewerPluginElement\n extends HTMLElement\n implements IPerspectiveViewerPlugin\n{\n constructor() {\n super();\n }\n\n get name(): string {\n return \"Debug\";\n }\n\n get select_mode(): \"select\" | \"toggle\" {\n return \"select\";\n }\n\n get min_config_columns(): number | undefined {\n return undefined;\n }\n\n get config_column_names(): string[] | undefined {\n return undefined;\n }\n\n get priority(): number {\n return 0;\n }\n\n can_render_column_styles(): boolean {\n return false;\n }\n\n column_style_config(): any {\n {\n }\n }\n\n async update(view: View): Promise<void> {\n return this.draw(view);\n }\n\n async draw(view: View): Promise<void> {\n this.style.backgroundColor = \"#fff\";\n const csv = await view.to_csv();\n const css = `margin:0;overflow:scroll;position:absolute;width:100%;height:100%`;\n this.innerHTML = `<pre style='${css}'>${csv}</pre>`;\n }\n\n async clear(): Promise<void> {\n this.innerHTML = \"\";\n }\n\n async resize(): Promise<void> {\n // Not Implemented\n }\n\n async restyle(): Promise<void> {\n // Not Implemented\n }\n\n async save(): Promise<any> {\n // Not Implemented\n }\n\n async restore(): Promise<void> {\n // Not Implemented\n }\n\n async delete(): Promise<void> {\n // Not Implemented\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\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}\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-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-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", "/* @ts-self-types=\"./perspective-viewer.wasm.d.ts\" */\nimport { ClipboardItem } from './snippets/perspective-viewer-d729f682ba5c19df/inline0.js';\nimport { ResizeObserver } from './snippets/perspective-viewer-d729f682ba5c19df/inline1.js';\nimport { IntersectionObserver } from './snippets/perspective-viewer-d729f682ba5c19df/inline2.js';\nimport { bootstrap } from './snippets/perspective-viewer-d729f682ba5c19df/inline3.js';\nimport { psp } from './snippets/perspective-viewer-d729f682ba5c19df/inline4.js';\n\n/**\n * An instance of a [`Client`] is a connection to a single\n * `perspective_server::Server`, whether locally in-memory or remote over some\n * transport like a WebSocket.\n *\n * The browser and node.js libraries both support the `websocket(url)`\n * constructor, which connects to a remote `perspective_server::Server`\n * instance over a WebSocket transport.\n *\n * In the browser, the `worker()` constructor creates a new Web Worker\n * `perspective_server::Server` and returns a [`Client`] connected to it.\n *\n * In node.js, a pre-instantied [`Client`] connected synhronously to a global\n * singleton `perspective_server::Server` is the default module export.\n *\n * # JavaScript Examples\n *\n * Create a Web Worker `perspective_server::Server` in the browser and return a\n * [`Client`] instance connected for it:\n *\n * ```javascript\n * import perspective from \"@perspective-dev/client\";\n * const client = await perspective.worker();\n * ```\n *\n * Create a WebSocket connection to a remote `perspective_server::Server`:\n *\n * ```javascript\n * import perspective from \"@perspective-dev/client\";\n * const client = await perspective.websocket(\"ws://locahost:8080/ws\");\n * ```\n *\n * Access the synchronous client in node.js:\n *\n * ```javascript\n * import { default as client } from \"@perspective-dev/client\";\n * ```\n */\nexport class Client {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(Client.prototype);\n obj.__wbg_ptr = ptr;\n ClientFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n ClientFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_client_free(ptr, 0);\n }\n /**\n * @returns {string}\n */\n __getClassname() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.client___getClassname(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var v1 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v1;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Retrieves the names of all tables that this client has access to.\n *\n * `name` is a string identifier unique to the [`Table`] (per [`Client`]),\n * which can be used in conjunction with [`Client::open_table`] to get\n * a [`Table`] instance without the use of [`Client::table`]\n * constructor directly (e.g., one created by another [`Client`]).\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const tables = await client.get_hosted_table_names();\n * ```\n * @returns {Promise<string[]>}\n */\n get_hosted_table_names() {\n const ret = wasm.client_get_hosted_table_names(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * @param {string} error\n * @param {Function | null} [reconnect]\n * @returns {Promise<void>}\n */\n handle_error(error, reconnect) {\n const ptr0 = passStringToWasm0(error, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.client_handle_error(this.__wbg_ptr, ptr0, len0, isLikeNone(reconnect) ? 0 : addHeapObject(reconnect));\n return takeObject(ret);\n }\n /**\n * @param {any} value\n * @returns {Promise<void>}\n */\n handle_response(value) {\n const ret = wasm.client_handle_response(this.__wbg_ptr, addHeapObject(value));\n return takeObject(ret);\n }\n /**\n * @param {Function} send_request\n * @param {Function | null} [close]\n */\n constructor(send_request, close) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.client_new(retptr, addHeapObject(send_request), isLikeNone(close) ? 0 : addHeapObject(close));\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n this.__wbg_ptr = r0 >>> 0;\n ClientFinalization.register(this, this.__wbg_ptr, this);\n return this;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {Function} on_response\n * @returns {ProxySession}\n */\n new_proxy_session(on_response) {\n try {\n const ret = wasm.client_new_proxy_session(this.__wbg_ptr, addBorrowedObject(on_response));\n return ProxySession.__wrap(ret);\n } finally {\n heap[stack_pointer++] = undefined;\n }\n }\n /**\n * @param {Function} callback\n * @returns {Promise<number>}\n */\n on_error(callback) {\n const ret = wasm.client_on_error(this.__wbg_ptr, addHeapObject(callback));\n return takeObject(ret);\n }\n /**\n * Register a callback which is invoked whenever [`Client::table`] (on this\n * [`Client`]) or [`Table::delete`] (on a [`Table`] belinging to this\n * [`Client`]) are called.\n * @param {Function} on_update_js\n * @returns {Promise<number>}\n */\n on_hosted_tables_update(on_update_js) {\n const ret = wasm.client_on_hosted_tables_update(this.__wbg_ptr, addHeapObject(on_update_js));\n return takeObject(ret);\n }\n /**\n * Opens a [`Table`] that is hosted on the `perspective_server::Server`\n * that is connected to this [`Client`].\n *\n * The `name` property of [`TableInitOptions`] is used to identify each\n * [`Table`]. [`Table`] `name`s can be looked up for each [`Client`]\n * via [`Client::get_hosted_table_names`].\n *\n * # JavaScript Examples\n *\n * Get a virtual [`Table`] named \"table_one\" from this [`Client`]\n *\n * ```javascript\n * const tables = await client.open_table(\"table_one\");\n * ```\n * @param {string} entity_id\n * @returns {Promise<Table>}\n */\n open_table(entity_id) {\n const ptr0 = passStringToWasm0(entity_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.client_open_table(this.__wbg_ptr, ptr0, len0);\n return takeObject(ret);\n }\n /**\n * Remove a callback previously registered via\n * `Client::on_hosted_tables_update`.\n * @param {number} update_id\n * @returns {Promise<void>}\n */\n remove_hosted_tables_update(update_id) {\n const ret = wasm.client_remove_hosted_tables_update(this.__wbg_ptr, update_id);\n return takeObject(ret);\n }\n /**\n * Provides the [`SystemInfo`] struct, implementation-specific metadata\n * about the [`perspective_server::Server`] runtime such as Memory and\n * CPU usage.\n *\n * For WebAssembly servers, this method includes the WebAssembly heap size.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const info = await client.system_info();\n * ```\n * @returns {Promise<SystemInfo>}\n */\n system_info() {\n const ret = wasm.client_system_info(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Creates a new [`Table`] from either a _schema_ or _data_.\n *\n * The [`Client::table`] factory function can be initialized with either a\n * _schema_ (see [`Table::schema`]), or data in one of these formats:\n *\n * - Apache Arrow\n * - CSV\n * - JSON row-oriented\n * - JSON column-oriented\n * - NDJSON\n *\n * When instantiated with _data_, the schema is inferred from this data.\n * While this is convenient, inferrence is sometimes imperfect e.g.\n * when the input is empty, null or ambiguous. For these cases,\n * [`Client::table`] can first be instantiated with a explicit schema.\n *\n * When instantiated with a _schema_, the resulting [`Table`] is empty but\n * with known column names and column types. When subsqeuently\n * populated with [`Table::update`], these columns will be _coerced_ to\n * the schema's type. This behavior can be useful when\n * [`Client::table`]'s column type inferences doesn't work.\n *\n * The resulting [`Table`] is _virtual_, and invoking its methods\n * dispatches events to the `perspective_server::Server` this\n * [`Client`] connects to, where the data is stored and all calculation\n * occurs.\n *\n * # Arguments\n *\n * - `arg` - Either _schema_ or initialization _data_.\n * - `options` - Optional configuration which provides one of:\n * - `limit` - The max number of rows the resulting [`Table`] can\n * store.\n * - `index` - The column name to use as an _index_ column. If this\n * `Table` is being instantiated by _data_, this column name must be\n * present in the data.\n * - `name` - The name of the table. This will be generated if it is\n * not provided.\n * - `format` - The explicit format of the input data, can be one of\n * `\"json\"`, `\"columns\"`, `\"csv\"` or `\"arrow\"`. This overrides\n * language-specific type dispatch behavior, which allows stringified\n * and byte array alternative inputs.\n *\n * # JavaScript Examples\n *\n * Load a CSV from a `string`:\n *\n * ```javascript\n * const table = await client.table(\"x,y\\n1,2\\n3,4\");\n * ```\n *\n * Load an Arrow from an `ArrayBuffer`:\n *\n * ```javascript\n * import * as fs from \"node:fs/promises\";\n * const table2 = await client.table(await fs.readFile(\"superstore.arrow\"));\n * ```\n *\n * Load a CSV from a `UInt8Array` (the default for this type is Arrow)\n * using a format override:\n *\n * ```javascript\n * const enc = new TextEncoder();\n * const table = await client.table(enc.encode(\"x,y\\n1,2\\n3,4\"), {\n * format: \"csv\",\n * });\n * ```\n *\n * Create a table with an `index`:\n *\n * ```javascript\n * const table = await client.table(data, { index: \"Row ID\" });\n * ```\n * @param {string | ArrayBuffer | Record<string, unknown[]> | Record<string, unknown>[] | Record<string, ColumnType>} value\n * @param {TableInitOptions | null} [options]\n * @returns {Promise<Table>}\n */\n table(value, options) {\n const ret = wasm.client_table(this.__wbg_ptr, addHeapObject(value), isLikeNone(options) ? 0 : addHeapObject(options));\n return takeObject(ret);\n }\n /**\n * Terminates this [`Client`], cleaning up any [`crate::View`] handles the\n * [`Client`] has open as well as its callbacks.\n * @returns {any}\n */\n terminate() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.client_terminate(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n return takeObject(r0);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n}\nif (Symbol.dispose) Client.prototype[Symbol.dispose] = Client.prototype.free;\n\nexport class ColumnDropDownElement {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n ColumnDropDownElementFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_columndropdownelement_free(ptr, 0);\n }\n}\nif (Symbol.dispose) ColumnDropDownElement.prototype[Symbol.dispose] = ColumnDropDownElement.prototype.free;\n\nexport class CopyDropDownMenuElement {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n CopyDropDownMenuElementFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_copydropdownmenuelement_free(ptr, 0);\n }\n /**\n * Internal Only.\n *\n * Set this custom element model's raw pointer.\n * @param {PerspectiveViewerElement} parent\n */\n __set_model(parent) {\n _assertClass(parent, PerspectiveViewerElement);\n wasm.copydropdownmenuelement___set_model(this.__wbg_ptr, parent.__wbg_ptr);\n }\n connected_callback() {\n wasm.copydropdownmenuelement_connected_callback(this.__wbg_ptr);\n }\n hide() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.copydropdownmenuelement_hide(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {HTMLElement} elem\n */\n constructor(elem) {\n const ret = wasm.copydropdownmenuelement_new(addHeapObject(elem));\n this.__wbg_ptr = ret >>> 0;\n CopyDropDownMenuElementFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @param {HTMLElement} target\n */\n open(target) {\n wasm.copydropdownmenuelement_open(this.__wbg_ptr, addHeapObject(target));\n }\n}\nif (Symbol.dispose) CopyDropDownMenuElement.prototype[Symbol.dispose] = CopyDropDownMenuElement.prototype.free;\n\nexport class ExportDropDownMenuElement {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n ExportDropDownMenuElementFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_exportdropdownmenuelement_free(ptr, 0);\n }\n /**\n * Internal Only.\n *\n * Set this custom element model's raw pointer.\n * @param {PerspectiveViewerElement} parent\n */\n __set_model(parent) {\n _assertClass(parent, PerspectiveViewerElement);\n wasm.exportdropdownmenuelement___set_model(this.__wbg_ptr, parent.__wbg_ptr);\n }\n connected_callback() {\n wasm.copydropdownmenuelement_connected_callback(this.__wbg_ptr);\n }\n hide() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.exportdropdownmenuelement_hide(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {HTMLElement} elem\n */\n constructor(elem) {\n const ret = wasm.copydropdownmenuelement_new(addHeapObject(elem));\n this.__wbg_ptr = ret >>> 0;\n ExportDropDownMenuElementFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @param {HTMLElement} target\n */\n open(target) {\n wasm.exportdropdownmenuelement_open(this.__wbg_ptr, addHeapObject(target));\n }\n}\nif (Symbol.dispose) ExportDropDownMenuElement.prototype[Symbol.dispose] = ExportDropDownMenuElement.prototype.free;\n\nexport class FilterDropDownElement {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n FilterDropDownElementFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_filterdropdownelement_free(ptr, 0);\n }\n}\nif (Symbol.dispose) FilterDropDownElement.prototype[Symbol.dispose] = FilterDropDownElement.prototype.free;\n\nexport class FunctionDropDownElement {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n FunctionDropDownElementFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_functiondropdownelement_free(ptr, 0);\n }\n}\nif (Symbol.dispose) FunctionDropDownElement.prototype[Symbol.dispose] = FunctionDropDownElement.prototype.free;\n\n/**\n * JavaScript-facing DuckDB SQL query builder.\n *\n * This struct wraps the Rust `DuckDBSqlBuilder` and exposes it to JavaScript\n * via wasm_bindgen.\n */\nexport class GenericSQLVirtualServerModel {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n GenericSQLVirtualServerModelFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_genericsqlvirtualservermodel_free(ptr, 0);\n }\n /**\n * Returns the SQL query to list all hosted tables.\n * @returns {string}\n */\n getHostedTables() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.genericsqlvirtualservermodel_getHostedTables(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v1 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v1;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Creates a new `JsDuckDBSqlBuilder` instance.\n * @param {any | null} [args]\n */\n constructor(args) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.genericsqlvirtualservermodel_new(retptr, isLikeNone(args) ? 0 : addHeapObject(args));\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n this.__wbg_ptr = r0 >>> 0;\n GenericSQLVirtualServerModelFinalization.register(this, this.__wbg_ptr, this);\n return this;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to create a view from a table with the given\n * configuration.\n * @param {string} table_id\n * @param {string} view_id\n * @param {any} config\n * @returns {string}\n */\n tableMakeView(table_id, view_id, config) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(table_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(view_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_tableMakeView(retptr, this.__wbg_ptr, ptr0, len0, ptr1, len1, addHeapObject(config));\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v3 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v3;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to describe a table's schema.\n * @param {string} table_id\n * @returns {string}\n */\n tableSchema(table_id) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(table_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_tableSchema(retptr, this.__wbg_ptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v2 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v2;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to get the row count of a table.\n * @param {string} table_id\n * @returns {string}\n */\n tableSize(table_id) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(table_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_tableSize(retptr, this.__wbg_ptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v2 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v2;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to validate an expression against a table.\n * @param {string} table_id\n * @param {string} expression\n * @returns {string}\n */\n tableValidateExpression(table_id, expression) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(table_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(expression, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_tableValidateExpression(retptr, this.__wbg_ptr, ptr0, len0, ptr1, len1);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v3 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v3;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to get the column count of a view.\n * @param {string} view_id\n * @returns {string}\n */\n viewColumnSize(view_id) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(view_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_viewColumnSize(retptr, this.__wbg_ptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v2 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v2;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to delete a view.\n * @param {string} view_id\n * @returns {string}\n */\n viewDelete(view_id) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(view_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_viewDelete(retptr, this.__wbg_ptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v2 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v2;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to fetch data from a view with the given viewport.\n * @param {string} view_id\n * @param {any} config\n * @param {any} viewport\n * @param {any} schema\n * @returns {string}\n */\n viewGetData(view_id, config, viewport, schema) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(view_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_viewGetData(retptr, this.__wbg_ptr, ptr0, len0, addHeapObject(config), addHeapObject(viewport), addHeapObject(schema));\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v2 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v2;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to describe a view's schema.\n * @param {string} view_id\n * @returns {string}\n */\n viewSchema(view_id) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(view_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_viewSchema(retptr, this.__wbg_ptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v2 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v2;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Returns the SQL query to get the row count of a view.\n * @param {string} view_id\n * @returns {string}\n */\n viewSize(view_id) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(view_id, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.genericsqlvirtualservermodel_viewSize(retptr, this.__wbg_ptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v2 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v2;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n}\nif (Symbol.dispose) GenericSQLVirtualServerModel.prototype[Symbol.dispose] = GenericSQLVirtualServerModel.prototype.free;\n\n/**\n * The `<perspective-viewer-plugin>` element.\n *\n * The default perspective plugin which is registered and activated\n * automcatically when a `<perspective-viewer>` is loaded without plugins.\n * While you will not typically instantiate this class directly, it is simple\n * enough to function as a good \"default\" plugin implementation which can be\n * extended to create custom plugins.\n *\n * # Example\n * ```javascript\n * class MyPlugin extends customElements.get(\"perspective-viewer-plugin\") {\n * // Custom plugin overrides\n * }\n * ```\n */\nexport class PerspectiveDebugPluginElement {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n PerspectiveDebugPluginElementFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_perspectivedebugpluginelement_free(ptr, 0);\n }\n /**\n * @returns {Promise<any>}\n */\n clear() {\n const ret = wasm.perspectivedebugpluginelement_clear(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * @returns {any}\n */\n get config_column_names() {\n const ret = wasm.perspectivedebugpluginelement_config_column_names(this.__wbg_ptr);\n return takeObject(ret);\n }\n connectedCallback() {\n wasm.perspectivedebugpluginelement_connectedCallback(this.__wbg_ptr);\n }\n /**\n * @returns {Promise<any>}\n */\n delete() {\n const ret = wasm.perspectivedebugpluginelement_clear(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * # Notes\n *\n * When you pass a `wasm_bindgen` wrapped type _into_ Rust, it acts like a\n * move. Ergo, if you replace the `&` in the `view` argument, the JS copy\n * of the `View` will be invalid\n * @param {View} view\n * @returns {Promise<any>}\n */\n draw(view) {\n _assertClass(view, View);\n const ret = wasm.perspectivedebugpluginelement_draw(this.__wbg_ptr, view.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * @returns {any}\n */\n get min_config_columns() {\n const ret = wasm.perspectivedebugpluginelement_config_column_names(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * @returns {string}\n */\n get name() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.perspectivedebugpluginelement_name(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var v1 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v1;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {HTMLElement} elem\n */\n constructor(elem) {\n const ret = wasm.perspectivedebugpluginelement_new(addHeapObject(elem));\n this.__wbg_ptr = ret >>> 0;\n PerspectiveDebugPluginElementFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @returns {Promise<any>}\n */\n resize() {\n const ret = wasm.perspectivedebugpluginelement_clear(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * @returns {Promise<any>}\n */\n restore() {\n const ret = wasm.perspectivedebugpluginelement_clear(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * @returns {Promise<any>}\n */\n restyle() {\n const ret = wasm.perspectivedebugpluginelement_clear(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * @returns {Promise<any>}\n */\n save() {\n const ret = wasm.perspectivedebugpluginelement_clear(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * @returns {string}\n */\n get select_mode() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.perspectivedebugpluginelement_select_mode(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var v1 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v1;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {View} view\n * @returns {Promise<any>}\n */\n update(view) {\n _assertClass(view, View);\n const ret = wasm.perspectivedebugpluginelement_draw(this.__wbg_ptr, view.__wbg_ptr);\n return takeObject(ret);\n }\n}\nif (Symbol.dispose) PerspectiveDebugPluginElement.prototype[Symbol.dispose] = PerspectiveDebugPluginElement.prototype.free;\n\n/**\n * The `<perspective-viewer>` custom element.\n *\n * # JavaScript Examples\n *\n * Create a new `<perspective-viewer>`:\n *\n * ```javascript\n * const viewer = document.createElement(\"perspective-viewer\");\n * window.body.appendChild(viewer);\n * ```\n *\n * Complete example including loading and restoring the [`Table`]:\n *\n * ```javascript\n * import perspective from \"@perspective-dev/viewer\";\n * import perspective from \"@perspective-dev/client\";\n *\n * const viewer = document.createElement(\"perspective-viewer\");\n * const worker = await perspective.worker();\n *\n * await worker.table(\"x\\n1\", {name: \"table_one\"});\n * await viewer.load(worker);\n * await viewer.restore({table: \"table_one\"});\n * ```\n */\nexport class PerspectiveViewerElement {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(PerspectiveViewerElement.prototype);\n obj.__wbg_ptr = ptr;\n PerspectiveViewerElementFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n PerspectiveViewerElementFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_perspectiveviewerelement_free(ptr, 0);\n }\n /**\n * Create a new JavaScript Heap reference for this model instance.\n * @returns {PerspectiveViewerElement}\n */\n __get_model() {\n const ret = wasm.perspectiveviewerelement___get_model(this.__wbg_ptr);\n return PerspectiveViewerElement.__wrap(ret);\n }\n connectedCallback() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.perspectiveviewerelement_connectedCallback(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Copy this viewer's `View` or `Table` data as CSV to the system\n * clipboard.\n *\n * # Arguments\n *\n * - `method` - The `ExportMethod` (serialized as a `String`) to use to\n * render the data to the Clipboard.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * myDownloadButton.addEventListener(\"click\", async () => {\n * await viewer.copy();\n * })\n * ```\n * @param {string | null} [method]\n * @returns {Promise<any>}\n */\n copy(method) {\n const ret = wasm.perspectiveviewerelement_copy(this.__wbg_ptr, isLikeNone(method) ? 0 : addHeapObject(method));\n return takeObject(ret);\n }\n /**\n * Delete the internal [`View`] and all associated state, rendering this\n * `<perspective-viewer>` unusable and freeing all associated resources.\n * Does not delete the supplied [`Table`] (as this is constructed by the\n * callee).\n *\n * Calling _any_ method on a `<perspective-viewer>` after [`Self::delete`]\n * will throw.\n *\n * <div class=\"warning\">\n *\n * Allowing a `<perspective-viewer>` to be garbage-collected\n * without calling [`PerspectiveViewerElement::delete`] will leak WASM\n * memory!\n *\n * </div>\n *\n * # JavaScript Examples\n *\n * ```javascript\n * await viewer.delete();\n * ```\n * @returns {Promise<any>}\n */\n delete() {\n const ptr = this.__destroy_into_raw();\n const ret = wasm.perspectiveviewerelement_delete(ptr);\n return takeObject(ret);\n }\n /**\n * Download this viewer's internal [`View`] data via a browser download\n * event.\n *\n * # Arguments\n *\n * - `method` - The `ExportMethod` to use to render the data to download.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * myDownloadButton.addEventListener(\"click\", async () => {\n * await viewer.download();\n * })\n * ```\n * @param {string | null} [method]\n * @returns {Promise<any>}\n */\n download(method) {\n const ret = wasm.perspectiveviewerelement_download(this.__wbg_ptr, isLikeNone(method) ? 0 : addHeapObject(method));\n return takeObject(ret);\n }\n /**\n * Restart this `<perspective-viewer>` to its initial state, before\n * `load()`.\n *\n * Use `Self::restart` if you plan to call `Self::load` on this viewer\n * again, or alternatively `Self::delete` if this viewer is no longer\n * needed.\n * @returns {Promise<any>}\n */\n eject() {\n const ret = wasm.perspectiveviewerelement_eject(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Exports this viewer's internal [`View`] as a JavaSript data, the\n * exact type of which depends on the `method` but defaults to `String`\n * in CSV format.\n *\n * This method is only really useful for the `\"plugin\"` method, which\n * will use the configured plugin's export (e.g. PNG for\n * `@perspective-dev/viewer-d3fc`). Otherwise, prefer to call the\n * equivalent method on the underlying [`View`] directly.\n *\n * # Arguments\n *\n * - `method` - The `ExportMethod` to use to render the data to download.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const data = await viewer.export(\"plugin\");\n * ```\n * @param {string | null} [method]\n * @returns {Promise<any>}\n */\n export(method) {\n const ret = wasm.perspectiveviewerelement_export(this.__wbg_ptr, isLikeNone(method) ? 0 : addHeapObject(method));\n return takeObject(ret);\n }\n /**\n * Flush any pending modifications to this `<perspective-viewer>`. Since\n * `<perspective-viewer>`'s API is almost entirely `async`, it may take\n * some milliseconds before any user-initiated changes to the [`View`]\n * affects the rendered element. If you want to make sure all pending\n * actions have been rendered, call and await [`Self::flush`].\n *\n * [`Self::flush`] will resolve immediately if there is no [`Table`] set.\n *\n * # JavaScript Examples\n *\n * In this example, [`Self::restore`] is called without `await`, but the\n * eventual render which results from this call can still be awaited by\n * immediately awaiting [`Self::flush`] instead.\n *\n * ```javascript\n * viewer.restore(config);\n * await viewer.flush();\n * ```\n * @returns {Promise<any>}\n */\n flush() {\n const ret = wasm.perspectiveviewerelement_flush(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Get an `Array` of all of the plugin custom elements registered for this\n * element. This may not include plugins which called\n * [`registerPlugin`] after the host has rendered for the first time.\n * @returns {Array<any>}\n */\n getAllPlugins() {\n const ret = wasm.perspectiveviewerelement_getAllPlugins(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Get the underlying [`Client`] for this viewer (as passed to, or\n * associated with the [`Table`] passed to,\n * [`PerspectiveViewerElement::load`]).\n *\n * # Arguments\n *\n * - `wait_for_client` - whether to wait for\n * [`PerspectiveViewerElement::load`] to be called, or fail immediately\n * if [`PerspectiveViewerElement::load`] has not yet been called.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const client = await viewer.getClient();\n * ```\n * @param {boolean | null} [wait_for_client]\n * @returns {Promise<any>}\n */\n getClient(wait_for_client) {\n const ret = wasm.perspectiveviewerelement_getClient(this.__wbg_ptr, isLikeNone(wait_for_client) ? 0xFFFFFF : wait_for_client ? 1 : 0);\n return takeObject(ret);\n }\n /**\n * Get this viewer's edit port for the currently loaded [`Table`] (see\n * [`Table::update`] for details on ports).\n * @returns {number}\n */\n getEditPort() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.perspectiveviewerelement_getEditPort(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getFloat64(retptr + 8 * 0, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n return r0;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Gets a plugin Custom Element with the `name` field, or get the active\n * plugin if no `name` is provided.\n *\n * # Arguments\n *\n * - `name` - The `name` property of a perspective plugin Custom Element,\n * or `None` for the active plugin's Custom Element.\n * @param {string | null} [name]\n * @returns {any}\n */\n getPlugin(name) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n var ptr0 = isLikeNone(name) ? 0 : passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n var len0 = WASM_VECTOR_LEN;\n wasm.perspectiveviewerelement_getPlugin(retptr, this.__wbg_ptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n return takeObject(r0);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Get render statistics. Some fields of the returned stats object are\n * relative to the last time [`PerspectiveViewerElement::getRenderStats`]\n * was called, ergo calling this method resets these fields.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const {virtual_fps, actual_fps} = await viewer.getRenderStats();\n * ```\n * @returns {any}\n */\n getRenderStats() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.perspectiveviewerelement_getRenderStats(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n return takeObject(r0);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Return a [`perspective_js::JsViewWindow`] for the currently selected\n * region.\n * @returns {ViewWindow | undefined}\n */\n getSelection() {\n const ret = wasm.perspectiveviewerelement_getSelection(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Get the underlying [`Table`] for this viewer (as passed to\n * [`PerspectiveViewerElement::load`] or as the `table` field to\n * [`PerspectiveViewerElement::restore`]).\n *\n * # Arguments\n *\n * - `wait_for_table` - whether to wait for\n * [`PerspectiveViewerElement::load`] to be called, or fail immediately\n * if [`PerspectiveViewerElement::load`] has not yet been called.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const table = await viewer.getTable();\n * ```\n * @param {boolean | null} [wait_for_table]\n * @returns {Promise<any>}\n */\n getTable(wait_for_table) {\n const ret = wasm.perspectiveviewerelement_getTable(this.__wbg_ptr, isLikeNone(wait_for_table) ? 0xFFFFFF : wait_for_table ? 1 : 0);\n return takeObject(ret);\n }\n /**\n * Get the underlying [`View`] for this viewer.\n *\n * Use this method to get promgrammatic access to the [`View`] as currently\n * configured by the user, for e.g. serializing as an\n * [Apache Arrow](https://arrow.apache.org/) before passing to another\n * library.\n *\n * The [`View`] returned by this method is owned by the\n * [`PerspectiveViewerElement`] and may be _invalidated_ by\n * [`View::delete`] at any time. Plugins which rely on this [`View`] for\n * their [`HTMLPerspectiveViewerPluginElement::draw`] implementations\n * should treat this condition as a _cancellation_ by silently aborting on\n * \"View already deleted\" errors from method calls.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const view = await viewer.getView();\n * ```\n * @returns {Promise<any>}\n */\n getView() {\n const ret = wasm.perspectiveviewerelement_getView(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Get a copy of the [`ViewConfig`] for the current [`View`]. This is\n * non-blocking as it does not need to access the plugin (unlike\n * [`PerspectiveViewerElement::save`]), and also makes no API calls to the\n * server (unlike [`PerspectiveViewerElement::getView`] followed by\n * [`View::get_config`])\n * @returns {Promise<any>}\n */\n getViewConfig() {\n const ret = wasm.perspectiveviewerelement_getViewConfig(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Loads a [`Client`], or optionally [`Table`], or optionally a Javascript\n * `Promise` which returns a [`Client`] or [`Table`], in this viewer.\n *\n * Loading a [`Client`] does not render, but subsequent calls to\n * [`PerspectiveViewerElement::restore`] will use this [`Client`] to look\n * up the proviced `table` name field for the provided\n * [`ViewerConfigUpdate`].\n *\n * Loading a [`Table`] is equivalent to subsequently calling\n * [`Self::restore`] with the `table` field set to [`Table::get_name`], and\n * will render the UI in its default state when [`Self::load`] resolves.\n * If you plan to call [`Self::restore`] anyway, prefer passing a\n * [`Client`] argument to [`Self::load`] as it will conserve one render.\n *\n * When [`PerspectiveViewerElement::load`] resolves, the first frame of the\n * UI + visualization is guaranteed to have been drawn. Awaiting the result\n * of this method in a `try`/`catch` block will capture any errors\n * thrown during the loading process, or from the [`Client`] `Promise`\n * itself.\n *\n * [`PerspectiveViewerElement::load`] may also be called with a [`Table`],\n * which is equivalent to:\n *\n * ```javascript\n * await viewer.load(await table.get_client());\n * await viewer.restore({name: await table.get_name()})\n * ```\n *\n * If you plan to call [`PerspectiveViewerElement::restore`] immediately\n * after [`PerspectiveViewerElement::load`] yourself, as is commonly\n * done when loading and configuring a new `<perspective-viewer>`, you\n * should use a [`Client`] as an argument and set the `table` field in the\n * restore call as\n *\n * A [`Table`] can be created using the\n * [`@perspective-dev/client`](https://www.npmjs.com/package/@perspective-dev/client)\n * library from NPM (see [`perspective_js`] documentation for details).\n *\n * # JavaScript Examples\n *\n * ```javascript\n * import perspective from \"@perspective-dev/client\";\n *\n * const worker = await perspective.worker();\n * viewer.load(worker);\n * ```\n *\n * ... or\n *\n * ```javascript\n * const table = await worker.table(data, {name: \"superstore\"});\n * viewer.load(table);\n * ```\n *\n * Complete example:\n *\n * ```javascript\n * const viewer = document.createElement(\"perspective-viewer\");\n * const worker = await perspective.worker();\n *\n * await worker.table(\"x\\n1\", {name: \"table_one\"});\n * await viewer.load(worker);\n * await viewer.restore({table: \"table_one\", columns: [\"x\"]});\n * ```\n *\n * ... or, if you don't want to pass your own arguments to `restore`:\n *\n * ```javascript\n * const viewer = document.createElement(\"perspective-viewer\");\n * const worker = await perspective.worker();\n *\n * const table = await worker.table(\"x\\n1\", {name: \"table_one\"});\n * await viewer.load(table);\n * ```\n * @param {any} table\n * @returns {Promise<any>}\n */\n load(table) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.perspectiveviewerelement_load(retptr, this.__wbg_ptr, addHeapObject(table));\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n return takeObject(r0);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {HTMLElement} elem\n */\n constructor(elem) {\n const ret = wasm.perspectiveviewerelement_new(addHeapObject(elem));\n this.__wbg_ptr = ret >>> 0;\n PerspectiveViewerElementFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * Force open the settings for a particular column. Pass `null` to close\n * the column settings panel. See [`Self::toggleColumnSettings`] for more.\n * @param {string | null} [column_name]\n * @param {boolean | null} [toggle]\n * @returns {Promise<any>}\n */\n openColumnSettings(column_name, toggle) {\n var ptr0 = isLikeNone(column_name) ? 0 : passStringToWasm0(column_name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n var len0 = WASM_VECTOR_LEN;\n const ret = wasm.perspectiveviewerelement_openColumnSettings(this.__wbg_ptr, ptr0, len0, isLikeNone(toggle) ? 0xFFFFFF : toggle ? 1 : 0);\n return takeObject(ret);\n }\n /**\n * Reset the viewer's `ViewerConfig` to the default.\n *\n * # Arguments\n *\n * - `reset_all` - If set, will clear expressions and column settings as\n * well.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * await viewer.reset();\n * ```\n * @param {boolean | null} [reset_all]\n * @returns {Promise<any>}\n */\n reset(reset_all) {\n const ret = wasm.perspectiveviewerelement_reset(this.__wbg_ptr, isLikeNone(reset_all) ? 0xFFFFFF : reset_all ? 1 : 0);\n return takeObject(ret);\n }\n /**\n * If this element is in an _errored_ state, this method will clear it and\n * re-render. Calling this method is equivalent to clicking the error reset\n * button in the UI.\n * @returns {Promise<any>}\n */\n resetError() {\n const ret = wasm.perspectiveviewerelement_resetError(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Set the available theme names available in the status bar UI.\n *\n * Calling [`Self::resetThemes`] may cause the current theme to switch,\n * if e.g. the new theme set does not contain the current theme.\n *\n * # JavaScript Examples\n *\n * Restrict `<perspective-viewer>` theme options to _only_ default light\n * and dark themes, regardless of what is auto-detected from the page's\n * CSS:\n *\n * ```javascript\n * viewer.resetThemes([\"Pro Light\", \"Pro Dark\"])\n * ```\n * @param {any[] | null} [themes]\n * @returns {Promise<any>}\n */\n resetThemes(themes) {\n var ptr0 = isLikeNone(themes) ? 0 : passArrayJsValueToWasm0(themes, wasm.__wbindgen_export);\n var len0 = WASM_VECTOR_LEN;\n const ret = wasm.perspectiveviewerelement_resetThemes(this.__wbg_ptr, ptr0, len0);\n return takeObject(ret);\n }\n /**\n * Recalculate the viewer's dimensions and redraw.\n *\n * Use this method to tell `<perspective-viewer>` its dimensions have\n * changed when auto-size mode has been disabled via [`Self::setAutoSize`].\n * [`Self::resize`] resolves when the resize-initiated redraw of this\n * element has completed.\n *\n * # Arguments\n *\n * - `force` - If [`Self::resize`] is called with `false` or without an\n * argument, and _auto-size_ mode is enabled via [`Self::setAutoSize`],\n * [`Self::resize`] will log a warning and auto-disable auto-size mode.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * await viewer.resize(true)\n * ```\n * @param {boolean | null} [force]\n * @returns {Promise<any>}\n */\n resize(force) {\n const ret = wasm.perspectiveviewerelement_resize(this.__wbg_ptr, isLikeNone(force) ? 0xFFFFFF : force ? 1 : 0);\n return takeObject(ret);\n }\n /**\n * Restores this element from a full/partial\n * [`perspective_js::JsViewConfig`] (this element's user-configurable\n * state, including the `Table` name).\n *\n * One of the best ways to use [`Self::restore`] is by first configuring\n * a `<perspective-viewer>` as you wish, then using either the `Debug`\n * panel or \"Copy\" -> \"config.json\" from the toolbar menu to snapshot\n * the [`Self::restore`] argument as JSON.\n *\n * # Arguments\n *\n * - `update` - The config to restore to, as returned by [`Self::save`] in\n * either \"json\", \"string\" or \"arraybuffer\" format.\n *\n * # JavaScript Examples\n *\n * Loads a default plugin for the table named `\"superstore\"`:\n *\n * ```javascript\n * await viewer.restore({table: \"superstore\"});\n * ```\n *\n * Apply a `group_by` to the same `viewer` element, without\n * modifying/resetting other fields - you can omit the `table` field,\n * this has already been set once and is not modified:\n *\n * ```javascript\n * await viewer.restore({group_by: [\"State\"]});\n * ```\n * @param {any} update\n * @returns {Promise<any>}\n */\n restore(update) {\n const ret = wasm.perspectiveviewerelement_restore(this.__wbg_ptr, addHeapObject(update));\n return takeObject(ret);\n }\n /**\n * Restyle all plugins from current document.\n *\n * <div class=\"warning\">\n *\n * [`Self::restyleElement`] _must_ be called for many runtime changes to\n * CSS properties to be reflected in an already-rendered\n * `<perspective-viewer>`.\n *\n * </div>\n *\n * # JavaScript Examples\n *\n * ```javascript\n * viewer.style = \"--icon--color: red\";\n * await viewer.restyleElement();\n * ```\n * @returns {Promise<any>}\n */\n restyleElement() {\n const ret = wasm.perspectiveviewerelement_restyleElement(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Save this element's user-configurable state to a serialized state\n * object, one which can be restored via the [`Self::restore`] method.\n *\n * # JavaScript Examples\n *\n * Get the current `group_by` setting:\n *\n * ```javascript\n * const {group_by} = await viewer.restore();\n * ```\n *\n * Reset workflow attached to an external button `myResetButton`:\n *\n * ```javascript\n * const token = await viewer.save();\n * myResetButton.addEventListener(\"clien\", async () => {\n * await viewer.restore(token);\n * });\n * ```\n * @returns {Promise<any>}\n */\n save() {\n const ret = wasm.perspectiveviewerelement_save(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Sets the auto-pause behavior of this component.\n *\n * When `true`, this `<perspective-viewer>` will register an\n * `IntersectionObserver` on itself and subsequently skip rendering\n * whenever its viewport visibility changes. Auto-pause is enabled by\n * default.\n *\n * # Arguments\n *\n * - `autopause` Whether to enable `auto-pause` behavior or not.\n *\n * # JavaScript Examples\n *\n * Disable auto-size behavior:\n *\n * ```javascript\n * viewer.setAutoPause(false);\n * ```\n * @param {boolean} autopause\n */\n setAutoPause(autopause) {\n wasm.perspectiveviewerelement_setAutoPause(this.__wbg_ptr, autopause);\n }\n /**\n * Sets the auto-size behavior of this component.\n *\n * When `true`, this `<perspective-viewer>` will register a\n * `ResizeObserver` on itself and call [`Self::resize`] whenever its own\n * dimensions change. However, when embedded in a larger application\n * context, you may want to call [`Self::resize`] manually to avoid\n * over-rendering; in this case auto-sizing can be disabled via this\n * method. Auto-size behavior is enabled by default.\n *\n * # Arguments\n *\n * - `autosize` - Whether to enable `auto-size` behavior or not.\n *\n * # JavaScript Examples\n *\n * Disable auto-size behavior:\n *\n * ```javascript\n * viewer.setAutoSize(false);\n * ```\n * @param {boolean} autosize\n */\n setAutoSize(autosize) {\n wasm.perspectiveviewerelement_setAutoSize(this.__wbg_ptr, autosize);\n }\n /**\n * Set the selection [`perspective_js::JsViewWindow`] for this element.\n * @param {ViewWindow | null} [window]\n */\n setSelection(window) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.perspectiveviewerelement_setSelection(retptr, this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Determines the render throttling behavior. Can be an integer, for\n * millisecond window to throttle render event; or, if `None`, adaptive\n * throttling will be calculated from the measured render time of the\n * last 5 frames.\n *\n * # Arguments\n *\n * - `throttle` - The throttle rate in milliseconds (f64), or `None` for\n * adaptive throttling.\n *\n * # JavaScript Examples\n *\n * Only draws at most 1 frame/sec:\n *\n * ```rust\n * viewer.setThrottle(1000);\n * ```\n * @param {number | null} [val]\n */\n setThrottle(val) {\n wasm.perspectiveviewerelement_setThrottle(this.__wbg_ptr, !isLikeNone(val), isLikeNone(val) ? 0 : val);\n }\n /**\n * Asynchronously opens the column settings for a specific column.\n * When finished, the `<perspective-viewer>` element will emit a\n * \"perspective-toggle-column-settings\" CustomEvent.\n * The event's details property has two fields: `{open: bool, column_name?:\n * string}`. The CustomEvent is also fired whenever the user toggles the\n * sidebar manually.\n * @param {string} column_name\n * @returns {Promise<any>}\n */\n toggleColumnSettings(column_name) {\n const ptr0 = passStringToWasm0(column_name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.perspectiveviewerelement_toggleColumnSettings(this.__wbg_ptr, ptr0, len0);\n return takeObject(ret);\n }\n /**\n * Toggle (or force) the config panel open/closed.\n *\n * # Arguments\n *\n * - `force` - Force the state of the panel open or closed, or `None` to\n * toggle.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * await viewer.toggleConfig();\n * ```\n * @param {boolean | null} [force]\n * @returns {Promise<any>}\n */\n toggleConfig(force) {\n const ret = wasm.perspectiveviewerelement_toggleConfig(this.__wbg_ptr, isLikeNone(force) ? 0xFFFFFF : force ? 1 : 0);\n return takeObject(ret);\n }\n}\nif (Symbol.dispose) PerspectiveViewerElement.prototype[Symbol.dispose] = PerspectiveViewerElement.prototype.free;\n\nexport class ProxySession {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(ProxySession.prototype);\n obj.__wbg_ptr = ptr;\n ProxySessionFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n ProxySessionFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_proxysession_free(ptr, 0);\n }\n /**\n * @returns {Promise<void>}\n */\n close() {\n const ptr = this.__destroy_into_raw();\n const ret = wasm.proxysession_close(ptr);\n return takeObject(ret);\n }\n /**\n * @param {any} value\n * @returns {Promise<void>}\n */\n handle_request(value) {\n const ret = wasm.proxysession_handle_request(this.__wbg_ptr, addHeapObject(value));\n return takeObject(ret);\n }\n /**\n * @param {Client} client\n * @param {Function} on_response\n */\n constructor(client, on_response) {\n try {\n _assertClass(client, Client);\n const ret = wasm.proxysession_new(client.__wbg_ptr, addBorrowedObject(on_response));\n this.__wbg_ptr = ret >>> 0;\n ProxySessionFinalization.register(this, this.__wbg_ptr, this);\n return this;\n } finally {\n heap[stack_pointer++] = undefined;\n }\n }\n}\nif (Symbol.dispose) ProxySession.prototype[Symbol.dispose] = ProxySession.prototype.free;\n\nexport class Table {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(Table.prototype);\n obj.__wbg_ptr = ptr;\n TableFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n TableFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_table_free(ptr, 0);\n }\n /**\n * @returns {string}\n */\n __getClassname() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.table___getClassname(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var v1 = getCachedStringFromWasm0(r0, r1);\n if (r0 !== 0) { wasm.__wbindgen_export4(r0, r1, 1); }\n return v1;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * Removes all the rows in the [`Table`], but preserves everything else\n * including the schema, index, and any callbacks or registered\n * [`View`] instances.\n *\n * Calling [`Table::clear`], like [`Table::update`] and [`Table::remove`],\n * will trigger an update event to any registered listeners via\n * [`View::on_update`].\n * @returns {Promise<void>}\n */\n clear() {\n const ret = wasm.table_clear(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Returns the column names of this [`Table`] in \"natural\" order (the\n * ordering implied by the input format).\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const columns = await table.columns();\n * ```\n * @returns {Promise<any>}\n */\n columns() {\n const ret = wasm.table_columns(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Delete this [`Table`] and cleans up associated resources.\n *\n * [`Table`]s do not stop consuming resources or processing updates when\n * they are garbage collected in their host language - you must call\n * this method to reclaim these.\n *\n * # Arguments\n *\n * - `options` An options dictionary.\n * - `lazy` Whether to delete this [`Table`] _lazily_. When false (the\n * default), the delete will occur immediately, assuming it has no\n * [`View`] instances registered to it (which must be deleted first,\n * otherwise this method will throw an error). When true, the\n * [`Table`] will only be marked for deltion once its [`View`]\n * dependency count reaches 0.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const table = await client.table(\"x,y\\n1,2\\n3,4\");\n *\n * // ...\n *\n * await table.delete({ lazy: true });\n * ```\n * @param {DeleteOptions | null} [options]\n * @returns {Promise<void>}\n */\n delete(options) {\n const ptr = this.__destroy_into_raw();\n const ret = wasm.table_delete(ptr, isLikeNone(options) ? 0 : addHeapObject(options));\n return takeObject(ret);\n }\n /**\n * Get a copy of the [`Client`] this [`Table`] came from.\n * @returns {Promise<Client>}\n */\n get_client() {\n const ret = wasm.table_get_client(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Returns the name of the index column for the table.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const table = await client.table(\"x,y\\n1,2\\n3,4\", { index: \"x\" });\n * const index = table.get_index(); // \"x\"\n * ```\n * @returns {Promise<string>}\n */\n get_index() {\n const ret = wasm.table_get_index(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Returns the user-specified row limit for this table.\n * @returns {Promise<number | undefined>}\n */\n get_limit() {\n const ret = wasm.table_get_limit(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Returns the user-specified name for this table, or the auto-generated\n * name if a name was not specified when the table was created.\n * @returns {Promise<string>}\n */\n get_name() {\n const ret = wasm.table_get_name(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Create a unique channel ID on this [`Table`], which allows\n * `View::on_update` callback calls to be associated with the\n * `Table::update` which caused them.\n * @returns {Promise<number>}\n */\n make_port() {\n const ret = wasm.table_make_port(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Register a callback which is called exactly once, when this [`Table`] is\n * deleted with the [`Table::delete`] method.\n *\n * [`Table::on_delete`] resolves when the subscription message is sent, not\n * when the _delete_ event occurs.\n * @param {Function} on_delete\n * @returns {Promise<any>}\n */\n on_delete(on_delete) {\n const ret = wasm.table_on_delete(this.__wbg_ptr, addHeapObject(on_delete));\n return takeObject(ret);\n }\n /**\n * Removes rows from this [`Table`] with the `index` column values\n * supplied.\n *\n * # Arguments\n *\n * - `indices` - A list of `index` column values for rows that should be\n * removed.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * await table.remove([1, 2, 3]);\n * ```\n * @param {any} value\n * @param {UpdateOptions | null} [options]\n * @returns {Promise<void>}\n */\n remove(value, options) {\n const ret = wasm.table_remove(this.__wbg_ptr, addHeapObject(value), isLikeNone(options) ? 0 : addHeapObject(options));\n return takeObject(ret);\n }\n /**\n * Removes a listener with a given ID, as returned by a previous call to\n * [`Table::on_delete`].\n * @param {number} callback_id\n * @returns {Promise<any>}\n */\n remove_delete(callback_id) {\n const ret = wasm.table_remove_delete(this.__wbg_ptr, callback_id);\n return takeObject(ret);\n }\n /**\n * Replace all rows in this [`Table`] with the input data, coerced to this\n * [`Table`]'s existing [`perspective_client::Schema`], notifying any\n * derived [`View`] and [`View::on_update`] callbacks.\n *\n * Calling [`Table::replace`] is an easy way to replace _all_ the data in a\n * [`Table`] without losing any derived [`View`] instances or\n * [`View::on_update`] callbacks. [`Table::replace`] does _not_ infer\n * data types like [`Client::table`] does, rather it _coerces_ input\n * data to the `Schema` like [`Table::update`]. If you need a [`Table`]\n * with a different `Schema`, you must create a new one.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * await table.replace(\"x,y\\n1,2\");\n * ```\n * @param {any} input\n * @param {UpdateOptions | null} [options]\n * @returns {Promise<void>}\n */\n replace(input, options) {\n const ret = wasm.table_replace(this.__wbg_ptr, addHeapObject(input), isLikeNone(options) ? 0 : addHeapObject(options));\n return takeObject(ret);\n }\n /**\n * Returns a table's [`Schema`], a mapping of column names to column types.\n *\n * The mapping of a [`Table`]'s column names to data types is referred to\n * as a [`Schema`]. Each column has a unique name and a data type, one\n * of:\n *\n * - `\"boolean\"` - A boolean type\n * - `\"date\"` - A timesonze-agnostic date type (month/day/year)\n * - `\"datetime\"` - A millisecond-precision datetime type in the UTC\n * timezone\n * - `\"float\"` - A 64 bit float\n * - `\"integer\"` - A signed 32 bit integer (the integer type supported by\n * JavaScript)\n * - `\"string\"` - A [`String`] data type (encoded internally as a\n * _dictionary_)\n *\n * Note that all [`Table`] columns are _nullable_, regardless of the data\n * type.\n * @returns {Record<string, ColumnType>}\n */\n schema() {\n const ret = wasm.table_schema(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Returns the number of rows in a [`Table`].\n * @returns {Promise<number>}\n */\n size() {\n const ret = wasm.table_size(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Updates the rows of this table and any derived [`View`] instances.\n *\n * Calling [`Table::update`] will trigger the [`View::on_update`] callbacks\n * register to derived [`View`], and the call itself will not resolve until\n * _all_ derived [`View`]'s are notified.\n *\n * When updating a [`Table`] with an `index`, [`Table::update`] supports\n * partial updates, by omitting columns from the update data.\n *\n * # Arguments\n *\n * - `input` - The input data for this [`Table`]. The schema of a [`Table`]\n * is immutable after creation, so this method cannot be called with a\n * schema.\n * - `options` - Options for this update step - see [`UpdateOptions`].\n *\n * # JavaScript Examples\n *\n * ```javascript\n * await table.update(\"x,y\\n1,2\");\n * ```\n * @param {string | ArrayBuffer | Record<string, unknown[]> | Record<string, unknown>[] | Record<string, ColumnType>} input\n * @param {UpdateOptions | null} [options]\n * @returns {Promise<any>}\n */\n update(input, options) {\n const ret = wasm.table_update(this.__wbg_ptr, addHeapObject(input), isLikeNone(options) ? 0 : addHeapObject(options));\n return takeObject(ret);\n }\n /**\n * Validates the given expressions.\n * @param {any} exprs\n * @returns {Promise<any>}\n */\n validate_expressions(exprs) {\n const ret = wasm.table_validate_expressions(this.__wbg_ptr, addHeapObject(exprs));\n return takeObject(ret);\n }\n /**\n * Create a new [`View`] from this table with a specified\n * [`ViewConfigUpdate`].\n *\n * See [`View`] struct.\n *\n * # JavaScript Examples\n *\n * ```javascript\n * const view = await table.view({\n * columns: [\"Sales\"],\n * aggregates: { Sales: \"sum\" },\n * group_by: [\"Region\", \"Country\"],\n * filter: [[\"Category\", \"in\", [\"Furniture\", \"Technology\"]]],\n * });\n * ```\n * @param {ViewConfigUpdate | null} [config]\n * @returns {Promise<View>}\n */\n view(config) {\n const ret = wasm.table_view(this.__wbg_ptr, isLikeNone(config) ? 0 : addHeapObject(config));\n return takeObject(ret);\n }\n}\nif (Symbol.dispose) Table.prototype[Symbol.dispose] = Table.prototype.free;\n\n/**\n * The [`View`] struct is Perspective's query and serialization interface. It\n * represents a query on the `Table`'s dataset and is always created from an\n * existing `Table` instance via the [`Table::view`] method.\n *\n * [`View`]s are immutable with respect to the arguments provided to the\n * [`Table::view`] method; to change these parameters, you must create a new\n * [`View`] on the same [`Table`]. However, each [`View`] is _live_ with\n * respect to the [`Table`]'s data, and will (within a conflation window)\n * update with the latest state as its parent [`Table`] updates, including\n * incrementally recalculating all aggregates, pivots, filters, etc. [`View`]\n * query parameters are composable, in that each parameter works independently\n * _and_ in conjunction with each other, and there is no limit to the number of\n * pivots, filters, etc. which can be applied.\n */\nexport class View {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(View.prototype);\n obj.__wbg_ptr = ptr;\n ViewFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n static __unwrap(jsValue) {\n if (!(jsValue instanceof View)) {\n return 0;\n }\n return jsValue.__destroy_into_raw();\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n ViewFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_view_free(ptr, 0);\n }\n /**\n * @returns {View}\n */\n __get_model() {\n const ret = wasm.view___get_model(this.__wbg_ptr);\n return View.__wrap(ret);\n }\n /**\n * Collapses the `group_by` row at `row_index`.\n * @param {number} row_index\n * @returns {Promise<number>}\n */\n collapse(row_index) {\n const ret = wasm.view_collapse(this.__wbg_ptr, row_index);\n return takeObject(ret);\n }\n /**\n * Returns an array of strings containing the column paths of the [`View`]\n * without any of the source columns.\n *\n * A column path shows the columns that a given cell belongs to after\n * pivots are applied.\n * @param {ColumnWindow | null} [window]\n * @returns {Promise<any>}\n */\n column_paths(window) {\n const ret = wasm.view_column_paths(this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n return takeObject(ret);\n }\n /**\n * Delete this [`View`] and clean up all resources associated with it.\n * [`View`] objects do not stop consuming resources or processing\n * updates when they are garbage collected - you must call this method\n * to reclaim these.\n * @returns {Promise<void>}\n */\n delete() {\n const ptr = this.__destroy_into_raw();\n const ret = wasm.view_delete(ptr);\n return takeObject(ret);\n }\n /**\n * Returns this [`View`]'s _dimensions_, row and column count, as well as\n * those of the [`crate::Table`] from which it was derived.\n *\n * - `num_table_rows` - The number of rows in the underlying\n * [`crate::Table`].\n * - `num_table_columns` - The number of columns in the underlying\n * [`crate::Table`] (including the `index` column if this\n * [`crate::Table`] was constructed with one).\n * - `num_view_rows` - The number of rows in this [`View`]. If this\n * [`View`] has a `group_by` clause, `num_view_rows` will also include\n * aggregated rows.\n * - `num_view_columns` - The number of columns in this [`View`]. If this\n * [`View`] has a `split_by` clause, `num_view_columns` will include all\n * _column paths_, e.g. the number of `columns` clause times the number\n * of `split_by` groups.\n * @returns {Promise<any>}\n */\n dimensions() {\n const ret = wasm.view_dimensions(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Expand the `group_by` row at `row_index`.\n * @param {number} row_index\n * @returns {Promise<number>}\n */\n expand(row_index) {\n const ret = wasm.view_expand(this.__wbg_ptr, row_index);\n return takeObject(ret);\n }\n /**\n * The expression schema of this [`View`], which contains only the\n * expressions created on this [`View`]. See [`View::schema`] for\n * details.\n * @returns {Promise<any>}\n */\n expression_schema() {\n const ret = wasm.view_expression_schema(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * A copy of the config object passed to the [`Table::view`] method which\n * created this [`View`].\n * @returns {Promise<any>}\n */\n get_config() {\n const ret = wasm.view_get_config(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Calculates the [min, max] of the leaf nodes of a column `column_name`.\n *\n * # Returns\n *\n * A tuple of [min, max], whose types are column and aggregate dependent.\n * @param {string} name\n * @returns {Promise<Array<any>>}\n */\n get_min_max(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.view_get_min_max(this.__wbg_ptr, ptr0, len0);\n return takeObject(ret);\n }\n /**\n * The number of aggregated columns in this [`View`]. This is affected by\n * the \"split_by\" configuration parameter supplied to this view's\n * contructor.\n *\n * # Returns\n *\n * The number of aggregated columns.\n * @returns {Promise<number>}\n */\n num_columns() {\n const ret = wasm.view_num_columns(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * The number of aggregated rows in this [`View`]. This is affected by the\n * \"group_by\" configuration parameter supplied to this view's contructor.\n *\n * # Returns\n *\n * The number of aggregated rows.\n * @returns {Promise<number>}\n */\n num_rows() {\n const ret = wasm.view_num_rows(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Register a callback with this [`View`]. Whenever the [`View`] is\n * deleted, this callback will be invoked.\n * @param {Function} on_delete\n * @returns {Promise<any>}\n */\n on_delete(on_delete) {\n const ret = wasm.view_on_delete(this.__wbg_ptr, addHeapObject(on_delete));\n return takeObject(ret);\n }\n /**\n * Register a callback with this [`View`]. Whenever the view's underlying\n * table emits an update, this callback will be invoked with an object\n * containing `port_id`, indicating which port the update fired on, and\n * optionally `delta`, which is the new data that was updated for each\n * cell or each row.\n *\n * # Arguments\n *\n * - `on_update` - A callback function invoked on update, which receives an\n * object with two keys: `port_id`, indicating which port the update was\n * triggered on, and `delta`, whose value is dependent on the mode\n * parameter.\n * - `options` - If this is provided as `OnUpdateOptions { mode:\n * Some(OnUpdateMode::Row) }`, then `delta` is an Arrow of the updated\n * rows. Otherwise `delta` will be [`Option::None`].\n *\n * # JavaScript Examples\n *\n * ```javascript\n * // Attach an `on_update` callback\n * view.on_update((updated) => console.log(updated.port_id));\n * ```\n *\n * ```javascript\n * // `on_update` with row deltas\n * view.on_update((updated) => console.log(updated.delta), { mode: \"row\" });\n * ```\n * @param {Function} on_update_js\n * @param {OnUpdateOptions | null} [options]\n * @returns {Promise<any>}\n */\n on_update(on_update_js, options) {\n const ret = wasm.view_on_update(this.__wbg_ptr, addHeapObject(on_update_js), isLikeNone(options) ? 0 : addHeapObject(options));\n return takeObject(ret);\n }\n /**\n * Unregister a previously registered [`View::on_delete`] callback.\n * @param {number} callback_id\n * @returns {Promise<any>}\n */\n remove_delete(callback_id) {\n const ret = wasm.view_remove_delete(this.__wbg_ptr, callback_id);\n return takeObject(ret);\n }\n /**\n * Unregister a previously registered update callback with this [`View`].\n *\n * # Arguments\n *\n * - `id` - A callback `id` as returned by a recipricol call to\n * [`View::on_update`].\n * @param {number} callback_id\n * @returns {Promise<void>}\n */\n remove_update(callback_id) {\n const ret = wasm.view_remove_update(this.__wbg_ptr, callback_id);\n return takeObject(ret);\n }\n /**\n * The schema of this [`View`].\n *\n * The [`View`] schema differs from the `schema` returned by\n * [`Table::schema`]; it may have different column names due to\n * `expressions` or `columns` configs, or it maye have _different\n * column types_ due to the application og `group_by` and `aggregates`\n * config. You can think of [`Table::schema`] as the _input_ schema and\n * [`View::schema`] as the _output_ schema of a Perspective pipeline.\n * @returns {Promise<any>}\n */\n schema() {\n const ret = wasm.view_schema(this.__wbg_ptr);\n return takeObject(ret);\n }\n /**\n * Set expansion `depth` of the `group_by` tree.\n * @param {number} depth\n * @returns {Promise<void>}\n */\n set_depth(depth) {\n const ret = wasm.view_set_depth(this.__wbg_ptr, depth);\n return takeObject(ret);\n }\n /**\n * Serializes a [`View`] to the Apache Arrow data format.\n * @param {ViewWindow | null} [window]\n * @returns {Promise<ArrayBuffer>}\n */\n to_arrow(window) {\n const ret = wasm.view_to_arrow(this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n return takeObject(ret);\n }\n /**\n * Serializes this [`View`] to JavaScript objects in a column-oriented\n * format.\n * @param {ViewWindow | null} [window]\n * @returns {Promise<object>}\n */\n to_columns(window) {\n const ret = wasm.view_to_columns(this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n return takeObject(ret);\n }\n /**\n * Serializes this [`View`] to a string of JSON data. Useful if you want to\n * save additional round trip serialize/deserialize cycles.\n * @param {ViewWindow | null} [window]\n * @returns {Promise<string>}\n */\n to_columns_string(window) {\n const ret = wasm.view_to_columns_string(this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n return takeObject(ret);\n }\n /**\n * Serializes this [`View`] to CSV data in a standard format.\n * @param {ViewWindow | null} [window]\n * @returns {Promise<string>}\n */\n to_csv(window) {\n const ret = wasm.view_to_csv(this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n return takeObject(ret);\n }\n /**\n * Serializes this [`View`] to JavaScript objects in a row-oriented\n * format.\n * @param {ViewWindow | null} [window]\n * @returns {Promise<Array<any>>}\n */\n to_json(window) {\n const ret = wasm.view_to_json(this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n return takeObject(ret);\n }\n /**\n * Render this `View` as a JSON string.\n * @param {ViewWindow | null} [window]\n * @returns {Promise<string>}\n */\n to_json_string(window) {\n const ret = wasm.view_to_json_string(this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n return takeObject(ret);\n }\n /**\n * Renders this [`View`] as an [NDJSON](https://github.com/ndjson/ndjson-spec)\n * formatted [`String`].\n * @param {ViewWindow | null} [window]\n * @returns {Promise<string>}\n */\n to_ndjson(window) {\n const ret = wasm.view_to_ndjson(this.__wbg_ptr, isLikeNone(window) ? 0 : addHeapObject(window));\n return takeObject(ret);\n }\n}\nif (Symbol.dispose) View.prototype[Symbol.dispose] = View.prototype.free;\n\nexport class VirtualDataSlice {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(VirtualDataSlice.prototype);\n obj.__wbg_ptr = ptr;\n VirtualDataSliceFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n VirtualDataSliceFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_virtualdataslice_free(ptr, 0);\n }\n /**\n * @param {ViewConfigUpdate} config\n */\n constructor(config) {\n const ret = wasm.virtualdataslice_new(addHeapObject(config));\n this.__wbg_ptr = ret >>> 0;\n VirtualDataSliceFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @param {string} name\n * @param {number} index\n * @param {any} val\n * @param {number | null} [group_by_index]\n */\n setBooleanCol(name, index, val, group_by_index) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.virtualdataslice_setBooleanCol(retptr, this.__wbg_ptr, ptr0, len0, index, addHeapObject(val), isLikeNone(group_by_index) ? 0x100000001 : (group_by_index) >>> 0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {string} dtype\n * @param {string} name\n * @param {number} index\n * @param {any} val\n * @param {number | null} [group_by_index]\n */\n setCol(dtype, name, index, val, group_by_index) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(dtype, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n wasm.virtualdataslice_setCol(retptr, this.__wbg_ptr, ptr0, len0, ptr1, len1, index, addHeapObject(val), isLikeNone(group_by_index) ? 0x100000001 : (group_by_index) >>> 0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {string} name\n * @param {number} index\n * @param {any} val\n * @param {number | null} [group_by_index]\n */\n setDatetimeCol(name, index, val, group_by_index) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.virtualdataslice_setDatetimeCol(retptr, this.__wbg_ptr, ptr0, len0, index, addHeapObject(val), isLikeNone(group_by_index) ? 0x100000001 : (group_by_index) >>> 0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {string} name\n * @param {number} index\n * @param {any} val\n * @param {number | null} [group_by_index]\n */\n setFloatCol(name, index, val, group_by_index) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.virtualdataslice_setFloatCol(retptr, this.__wbg_ptr, ptr0, len0, index, addHeapObject(val), isLikeNone(group_by_index) ? 0x100000001 : (group_by_index) >>> 0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {string} name\n * @param {number} index\n * @param {any} val\n * @param {number | null} [group_by_index]\n */\n setIntegerCol(name, index, val, group_by_index) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.virtualdataslice_setIntegerCol(retptr, this.__wbg_ptr, ptr0, len0, index, addHeapObject(val), isLikeNone(group_by_index) ? 0x100000001 : (group_by_index) >>> 0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n /**\n * @param {string} name\n * @param {number} index\n * @param {any} val\n * @param {number | null} [group_by_index]\n */\n setStringCol(name, index, val, group_by_index) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.virtualdataslice_setStringCol(retptr, this.__wbg_ptr, ptr0, len0, index, addHeapObject(val), isLikeNone(group_by_index) ? 0x100000001 : (group_by_index) >>> 0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n}\nif (Symbol.dispose) VirtualDataSlice.prototype[Symbol.dispose] = VirtualDataSlice.prototype.free;\n\nexport class VirtualServer {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n VirtualServerFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_virtualserver_free(ptr, 0);\n }\n /**\n * @param {Uint8Array} bytes\n * @returns {Promise<any>}\n */\n handleRequest(bytes) {\n const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.virtualserver_handleRequest(this.__wbg_ptr, ptr0, len0);\n return takeObject(ret);\n }\n /**\n * @param {object} handler\n */\n constructor(handler) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.virtualserver_new(retptr, addHeapObject(handler));\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n this.__wbg_ptr = r0 >>> 0;\n VirtualServerFinalization.register(this, this.__wbg_ptr, this);\n return this;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n}\nif (Symbol.dispose) VirtualServer.prototype[Symbol.dispose] = VirtualServer.prototype.free;\n\n/**\n * Register this crate's Custom Elements in the browser's current session.\n *\n * This must occur before calling any public API methods on these Custom\n * Elements from JavaScript, as the methods themselves won't be defined yet.\n * By default, this crate does not register `PerspectiveViewerElement` (as to\n * preserve backwards-compatible synchronous API).\n */\nexport function init() {\n wasm.init();\n}\n\n/**\n * Register a plugin globally.\n * @param {string} name\n */\nexport function registerPlugin(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len0 = WASM_VECTOR_LEN;\n wasm.registerPlugin(ptr0, len0);\n}\n\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg_Error_8c4e43fe74559d73: function(arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n const ret = Error(v0);\n return addHeapObject(ret);\n },\n __wbg_Number_04624de7d0e8332d: function(arg0) {\n const ret = Number(getObject(arg0));\n return ret;\n },\n __wbg_String_8f0eb39a4a4c2f66: function(arg0, arg1) {\n const ret = String(getObject(arg1));\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2: function(arg0, arg1) {\n const v = getObject(arg1);\n const ret = typeof(v) === 'bigint' ? v : undefined;\n getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n },\n __wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25: function(arg0) {\n const v = getObject(arg0);\n const ret = typeof(v) === 'boolean' ? v : undefined;\n return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;\n },\n __wbg___wbindgen_debug_string_0bc8482c6e3508ae: function(arg0, arg1) {\n const ret = debugString(getObject(arg1));\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_in_47fa6863be6f2f25: function(arg0, arg1) {\n const ret = getObject(arg0) in getObject(arg1);\n return ret;\n },\n __wbg___wbindgen_is_bigint_31b12575b56f32fc: function(arg0) {\n const ret = typeof(getObject(arg0)) === 'bigint';\n return ret;\n },\n __wbg___wbindgen_is_function_0095a73b8b156f76: function(arg0) {\n const ret = typeof(getObject(arg0)) === 'function';\n return ret;\n },\n __wbg___wbindgen_is_null_ac34f5003991759a: function(arg0) {\n const ret = getObject(arg0) === null;\n return ret;\n },\n __wbg___wbindgen_is_object_5ae8e5880f2c1fbd: function(arg0) {\n const val = getObject(arg0);\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n },\n __wbg___wbindgen_is_string_cd444516edc5b180: function(arg0) {\n const ret = typeof(getObject(arg0)) === 'string';\n return ret;\n },\n __wbg___wbindgen_is_undefined_9e4d92534c42d778: function(arg0) {\n const ret = getObject(arg0) === undefined;\n return ret;\n },\n __wbg___wbindgen_jsval_eq_11888390b0186270: function(arg0, arg1) {\n const ret = getObject(arg0) === getObject(arg1);\n return ret;\n },\n __wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811: function(arg0, arg1) {\n const ret = getObject(arg0) == getObject(arg1);\n return ret;\n },\n __wbg___wbindgen_number_get_8ff4255516ccad3e: function(arg0, arg1) {\n const obj = getObject(arg1);\n const ret = typeof(obj) === 'number' ? obj : undefined;\n getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n },\n __wbg___wbindgen_string_get_72fb696202c56729: function(arg0, arg1) {\n const obj = getObject(arg1);\n const ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_throw_be289d5034ed271b: function(arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n throw new Error(v0);\n },\n __wbg__wbg_cb_unref_d9b87ff7982e3b21: function(arg0) {\n getObject(arg0)._wbg_cb_unref();\n },\n __wbg_activeElement_d9d2a80dfafa67ed: function(arg0) {\n const ret = getObject(arg0).activeElement;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_addEventListener_3acb0aad4483804c: function() { return handleError(function (arg0, arg1, arg2, arg3) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).addEventListener(v0, getObject(arg3));\n }, arguments); },\n __wbg_addEventListener_c917b5aafbcf493f: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).addEventListener(v0, getObject(arg3), getObject(arg4));\n }, arguments); },\n __wbg_add_5be83378df680c25: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).add(v0);\n }, arguments); },\n __wbg_add_9c3286ac8f8abf5a: function() { return handleError(function (arg0, arg1) {\n getObject(arg0).add(...getObject(arg1));\n }, arguments); },\n __wbg_appendChild_dea38765a26d346d: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).appendChild(getObject(arg1));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_apply_2e22c45cb4f12415: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = Reflect.apply(getObject(arg0), getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_apply_ada2ee1a60ac7b3c: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = getObject(arg0).apply(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_at_dfc235641cc0e40c: function(arg0, arg1) {\n const ret = getObject(arg0).at(arg1);\n return addHeapObject(ret);\n },\n __wbg_attachShadow_d31cd520620b24d6: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).attachShadow(getObject(arg1));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_blur_07f34335e06e5234: function() { return handleError(function (arg0) {\n getObject(arg0).blur();\n }, arguments); },\n __wbg_body_f67922363a220026: function(arg0) {\n const ret = getObject(arg0).body;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_bootstrap_dc3931100800daf0: function(arg0, arg1, arg2, arg3, arg4, arg5) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n const ret = bootstrap(getObject(arg0), v0, v1, takeObject(arg5));\n return addHeapObject(ret);\n },\n __wbg_bubbles_ad88192d3c29e6f9: function(arg0) {\n const ret = getObject(arg0).bubbles;\n return ret;\n },\n __wbg_buffer_26d0910f3a5bc899: function(arg0) {\n const ret = getObject(arg0).buffer;\n return addHeapObject(ret);\n },\n __wbg_button_d86841d0a03adc44: function(arg0) {\n const ret = getObject(arg0).button;\n return ret;\n },\n __wbg_cache_key_577df69a33f9a3fb: function(arg0) {\n const ret = getObject(arg0).__yew_subtree_cache_key;\n return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;\n },\n __wbg_call_389efe28435a9388: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).call(getObject(arg1));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_call_4708e0c13bdc8e95: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_call_812d25f1510c13c8: function() { return handleError(function (arg0, arg1, arg2, arg3) {\n const ret = getObject(arg0).call(getObject(arg1), getObject(arg2), getObject(arg3));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_can_render_column_styles_d7fad9805e1dba21: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n const ret = getObject(arg0).can_render_column_styles(v0, v1);\n return ret;\n }, arguments); },\n __wbg_cancelBubble_d93ec09e9c46cd6f: function(arg0) {\n const ret = getObject(arg0).cancelBubble;\n return ret;\n },\n __wbg_category_8000a0b2872b6c33: function(arg0, arg1) {\n const ret = getObject(arg1).category;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_checked_04db83ac6810bc82: function(arg0) {\n const ret = getObject(arg0).checked;\n return ret;\n },\n __wbg_childNodes_75d35de33c9f6fbb: function(arg0) {\n const ret = getObject(arg0).childNodes;\n return addHeapObject(ret);\n },\n __wbg_children_54099e7692eefa29: function(arg0) {\n const ret = getObject(arg0).children;\n return addHeapObject(ret);\n },\n __wbg_classList_1a87c34c6d81421e: function(arg0) {\n const ret = getObject(arg0).classList;\n return addHeapObject(ret);\n },\n __wbg_click_0e9c20848b655ed3: function(arg0) {\n getObject(arg0).click();\n },\n __wbg_clientHeight_6432ff0d61ccfe7d: function(arg0) {\n const ret = getObject(arg0).clientHeight;\n return ret;\n },\n __wbg_clientWidth_dcf89c40d88df4a3: function(arg0) {\n const ret = getObject(arg0).clientWidth;\n return ret;\n },\n __wbg_clientX_a3c5f4ff30e91264: function(arg0) {\n const ret = getObject(arg0).clientX;\n return ret;\n },\n __wbg_clientY_e28509acb9b4a42a: function(arg0) {\n const ret = getObject(arg0).clientY;\n return ret;\n },\n __wbg_client_new: function(arg0) {\n const ret = Client.__wrap(arg0);\n return addHeapObject(ret);\n },\n __wbg_clipboard_98c5a32249fa8416: function(arg0) {\n const ret = getObject(arg0).clipboard;\n return addHeapObject(ret);\n },\n __wbg_cloneNode_b85e9102a9a31b29: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).cloneNode(arg1 !== 0);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_cloneNode_eaf4ea08ebf633a5: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).cloneNode();\n return addHeapObject(ret);\n }, arguments); },\n __wbg_code_dee0dae4730408e1: function(arg0, arg1) {\n const ret = getObject(arg1).code;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_column_style_controls_2b25c1013ae3cfc1: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n const ret = getObject(arg0).column_style_controls(v0, v1);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_composedPath_9154ab2547c668d5: function(arg0) {\n const ret = getObject(arg0).composedPath();\n return addHeapObject(ret);\n },\n __wbg_config_column_names_fbacaa5f5f0ca1b5: function(arg0) {\n const ret = getObject(arg0).config_column_names;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_contains_1056459c33f961e8: function(arg0, arg1) {\n const ret = getObject(arg0).contains(getObject(arg1));\n return ret;\n },\n __wbg_contentRect_09678d1953f97d27: function(arg0) {\n const ret = getObject(arg0).contentRect;\n return addHeapObject(ret);\n },\n __wbg_createElementNS_ee00621496b30ec2: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n const ret = getObject(arg0).createElementNS(v0, v1);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_createElement_49f60fdcaae809c8: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n const ret = getObject(arg0).createElement(v0);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_createObjectURL_918185db6a10a0c8: function() { return handleError(function (arg0, arg1) {\n const ret = URL.createObjectURL(getObject(arg1));\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n }, arguments); },\n __wbg_createTextNode_55029686c9591bf3: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n const ret = getObject(arg0).createTextNode(v0);\n return addHeapObject(ret);\n },\n __wbg_cssRules_554f47f3049cf066: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).cssRules;\n return addHeapObject(ret);\n }, arguments); },\n __wbg_dataTransfer_d924a622fbe51b06: function(arg0) {\n const ret = getObject(arg0).dataTransfer;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_dataset_20cb5c72458ae3fc: function(arg0) {\n const ret = getObject(arg0).dataset;\n return addHeapObject(ret);\n },\n __wbg_debug_46a93995fc6f8820: function(arg0, arg1, arg2, arg3) {\n console.debug(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3));\n },\n __wbg_debug_a4099fa12db6cd61: function(arg0) {\n console.debug(getObject(arg0));\n },\n __wbg_delete_0f1d5ff3bf623320: function(arg0) {\n getObject(arg0).delete();\n },\n __wbg_delete_8318b529ff42aa20: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n delete getObject(arg0)[v0];\n },\n __wbg_dispatchEvent_dc8dcc7ddca11378: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).dispatchEvent(getObject(arg1));\n return ret;\n }, arguments); },\n __wbg_document_ee35a3d3ae34ef6c: function(arg0) {\n const ret = getObject(arg0).document;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_done_57b39ecd9addfe81: function(arg0) {\n const ret = getObject(arg0).done;\n return ret;\n },\n __wbg_draw_97da639ae7394c1f: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n const ret = getObject(arg0).draw(View.__wrap(arg1), arg2 === 0x100000001 ? undefined : arg2, arg3 === 0x100000001 ? undefined : arg3, arg4 !== 0);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_entries_58c7934c745daac7: function(arg0) {\n const ret = Object.entries(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_error_3c7d958458bf649b: function(arg0, arg1) {\n var v0 = getArrayJsValueFromWasm0(arg0, arg1).slice();\n wasm.__wbindgen_export4(arg0, arg1 * 4, 4);\n console.error(...v0);\n },\n __wbg_error_7534b8e9a36f1ab4: function(arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n if (arg0 !== 0) { wasm.__wbindgen_export4(arg0, arg1, 1); }\n console.error(v0);\n },\n __wbg_error_794d0ffc9d00d5c3: function(arg0, arg1, arg2, arg3) {\n console.error(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3));\n },\n __wbg_error_9a7fe3f932034cde: function(arg0) {\n console.error(getObject(arg0));\n },\n __wbg_error_f852e41c69b0bd84: function(arg0, arg1) {\n console.error(getObject(arg0), getObject(arg1));\n },\n __wbg_family_345f1736ce506756: function(arg0, arg1) {\n const ret = getObject(arg1).family;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_focus_128ff465f65677cc: function() { return handleError(function (arg0) {\n getObject(arg0).focus();\n }, arguments); },\n __wbg_fonts_ba4bc521c555025e: function(arg0) {\n const ret = getObject(arg0).fonts;\n return addHeapObject(ret);\n },\n __wbg_format_7c97ddc401dae52f: function(arg0) {\n const ret = getObject(arg0).format;\n return addHeapObject(ret);\n },\n __wbg_from_bddd64e7d5ff6941: function(arg0) {\n const ret = Array.from(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_getAttribute_b9f6fc4b689c71b0: function(arg0, arg1, arg2, arg3) {\n var v0 = getCachedStringFromWasm0(arg2, arg3);\n const ret = getObject(arg1).getAttribute(v0);\n var ptr2 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n var len2 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len2, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr2, true);\n },\n __wbg_getBoundingClientRect_b5c8c34d07878818: function(arg0) {\n const ret = getObject(arg0).getBoundingClientRect();\n return addHeapObject(ret);\n },\n __wbg_getComputedStyle_2d1f9dfe4ee7e0b9: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).getComputedStyle(getObject(arg1));\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n }, arguments); },\n __wbg_getEntriesByName_02488cff0bc7581c: function(arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n const ret = getObject(arg0).getEntriesByName(v0, v1);\n return addHeapObject(ret);\n },\n __wbg_getPropertyValue_d6911b2a1f9acba9: function() { return handleError(function (arg0, arg1, arg2, arg3) {\n var v0 = getCachedStringFromWasm0(arg2, arg3);\n const ret = getObject(arg1).getPropertyValue(v0);\n const ptr2 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len2 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len2, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr2, true);\n }, arguments); },\n __wbg_getRandomValues_1c61fac11405ffdc: function() { return handleError(function (arg0, arg1) {\n globalThis.crypto.getRandomValues(getArrayU8FromWasm0(arg0, arg1));\n }, arguments); },\n __wbg_getTime_1e3cd1391c5c3995: function(arg0) {\n const ret = getObject(arg0).getTime();\n return ret;\n },\n __wbg_getTimezoneOffset_81776d10a4ec18a8: function(arg0) {\n const ret = getObject(arg0).getTimezoneOffset();\n return ret;\n },\n __wbg_get_5dd1ee4c9f462865: function(arg0, arg1, arg2, arg3) {\n var v0 = getCachedStringFromWasm0(arg2, arg3);\n const ret = getObject(arg1)[v0];\n var ptr2 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n var len2 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len2, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr2, true);\n },\n __wbg_get_76e04509d1922a04: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n const ret = getObject(arg0)[v0];\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_get_9b94d73e6221f75c: function(arg0, arg1) {\n const ret = getObject(arg0)[arg1 >>> 0];\n return addHeapObject(ret);\n },\n __wbg_get_b3ed3ad4be2bc8ac: function() { return handleError(function (arg0, arg1) {\n const ret = Reflect.get(getObject(arg0), getObject(arg1));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_get_with_index_d26da38d2c038e1a: function(arg0, arg1) {\n const ret = getObject(arg0)[arg1 >>> 0];\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_get_with_ref_key_1dc361bd10053bfe: function(arg0, arg1) {\n const ret = getObject(arg0)[getObject(arg1)];\n return addHeapObject(ret);\n },\n __wbg_group_rollups_60504c5a2b1cb8ba: function(arg0) {\n const ret = getObject(arg0).group_rollups;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_hasAttribute_5d8f52cb4c739280: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n const ret = getObject(arg0).hasAttribute(v0);\n return ret;\n },\n __wbg_has_d4e53238966c12b6: function() { return handleError(function (arg0, arg1) {\n const ret = Reflect.has(getObject(arg0), getObject(arg1));\n return ret;\n }, arguments); },\n __wbg_height_45209601b4c4ede6: function(arg0) {\n const ret = getObject(arg0).height;\n return ret;\n },\n __wbg_height_c2027cf67d1c9b11: function(arg0) {\n const ret = getObject(arg0).height;\n return ret;\n },\n __wbg_host_fb29f8be35c2517d: function(arg0) {\n const ret = getObject(arg0).host;\n return addHeapObject(ret);\n },\n __wbg_info_148d043840582012: function(arg0) {\n console.info(getObject(arg0));\n },\n __wbg_info_9e602cf10c5c690b: function(arg0, arg1, arg2, arg3) {\n console.info(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3));\n },\n __wbg_innerHeight_54aa104da08becd2: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).innerHeight;\n return addHeapObject(ret);\n }, arguments); },\n __wbg_innerWidth_fa95c57321f4f033: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).innerWidth;\n return addHeapObject(ret);\n }, arguments); },\n __wbg_insertBefore_1468142836e61a51: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = getObject(arg0).insertBefore(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_instanceof_ArrayBuffer_c367199e2fa2aa04: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof ArrayBuffer;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Array_d9eac779cd191cbc: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Array;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_CssStyleRule_23e59108346af0df: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof CSSStyleRule;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Date_1b9f15b87f10aa4c: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Date;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Element_9e662f49ab6c6beb: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Element;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Error_8573fe0b0b480f46: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Error;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_FontFace_90d3e62f39397791: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof FontFace;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Map_53af74335dec57f4: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Map;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Object_1c6af87502b733ed: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Object;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Promise_0094681e3519d6ec: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Promise;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_ShadowRoot_5285adde3587c73e: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof ShadowRoot;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Uint8Array_9b9075935c74707c: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Uint8Array;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Window_ed49b2db8df90359: function(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Window;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_isArray_d314bb98fcf08331: function(arg0) {\n const ret = Array.isArray(getObject(arg0));\n return ret;\n },\n __wbg_isConnected_6110bc2c5462f90e: function(arg0) {\n const ret = getObject(arg0).isConnected;\n return ret;\n },\n __wbg_isIntersecting_722e650606718ba1: function(arg0) {\n const ret = getObject(arg0).isIntersecting;\n return ret;\n },\n __wbg_isSafeInteger_bfbc7332a9768d2a: function(arg0) {\n const ret = Number.isSafeInteger(getObject(arg0));\n return ret;\n },\n __wbg_is_f29129f676e5410c: function(arg0, arg1) {\n const ret = Object.is(getObject(arg0), getObject(arg1));\n return ret;\n },\n __wbg_item_00ae26320b80a11f: function(arg0, arg1, arg2) {\n const ret = getObject(arg1).item(arg2 >>> 0);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_item_48715d3212ed96cb: function(arg0, arg1) {\n const ret = getObject(arg0).item(arg1 >>> 0);\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_item_5c82f52b014b3056: function(arg0, arg1) {\n const ret = getObject(arg0).item(arg1 >>> 0);\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_item_ca823df8214b9e2b: function(arg0, arg1) {\n const ret = getObject(arg0).item(arg1 >>> 0);\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_iterator_6ff6560ca1568e55: function() {\n const ret = Symbol.iterator;\n return addHeapObject(ret);\n },\n __wbg_keyCode_155291a11654466e: function(arg0) {\n const ret = getObject(arg0).keyCode;\n return ret;\n },\n __wbg_key_d41e8e825e6bb0e9: function(arg0, arg1) {\n const ret = getObject(arg1).key;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_keys_b50a709a76add04e: function(arg0) {\n const ret = Object.keys(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_languages_5a69df7551d1a803: function(arg0) {\n const ret = getObject(arg0).languages;\n return addHeapObject(ret);\n },\n __wbg_lastChild_132d67597d5e4aef: function(arg0) {\n const ret = getObject(arg0).lastChild;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_left_3b7c3c1030d5ca7a: function(arg0) {\n const ret = getObject(arg0).left;\n return ret;\n },\n __wbg_length_25851a48867b2afc: function(arg0) {\n const ret = getObject(arg0).length;\n return ret;\n },\n __wbg_length_32ed9a279acd054c: function(arg0) {\n const ret = getObject(arg0).length;\n return ret;\n },\n __wbg_length_35a7bace40f36eac: function(arg0) {\n const ret = getObject(arg0).length;\n return ret;\n },\n __wbg_length_b5aa6c69c842d6a6: function(arg0) {\n const ret = getObject(arg0).length;\n return ret;\n },\n __wbg_length_e455564ce5cbf46e: function(arg0) {\n const ret = getObject(arg0).length;\n return ret;\n },\n __wbg_length_edae0cd13a8d3b71: function(arg0) {\n const ret = getObject(arg0).length;\n return ret;\n },\n __wbg_listener_id_e93527b90229a898: function(arg0) {\n const ret = getObject(arg0).__yew_listener_id;\n return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;\n },\n __wbg_loaded_27fa3bdfd9239e89: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).loaded;\n return addHeapObject(ret);\n }, arguments); },\n __wbg_mark_3b530a64b09ba08a: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).mark(v0);\n }, arguments); },\n __wbg_matches_852ba8b2b4592069: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n const ret = getObject(arg0).matches(v0);\n return ret;\n }, arguments); },\n __wbg_max_cells_a02ba7c674d4b3ee: function(arg0) {\n const ret = getObject(arg0).max_cells;\n return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;\n },\n __wbg_max_columns_a46ba05a4c123b4f: function(arg0) {\n const ret = getObject(arg0).max_columns;\n return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;\n },\n __wbg_measure_288b48c082eae0fe: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n getObject(arg0).measure(v0, v1);\n }, arguments); },\n __wbg_message_9ddc4b9a62a7c379: function(arg0) {\n const ret = getObject(arg0).message;\n return addHeapObject(ret);\n },\n __wbg_min_config_columns_2476b685bb856d93: function(arg0) {\n const ret = getObject(arg0).min_config_columns;\n return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;\n },\n __wbg_name_ff665338b71d2feb: function(arg0, arg1) {\n const ret = getObject(arg1).name;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_namespaceURI_86e2062c65f0f341: function(arg0, arg1) {\n const ret = getObject(arg1).namespaceURI;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_navigator_43be698ba96fc088: function(arg0) {\n const ret = getObject(arg0).navigator;\n return addHeapObject(ret);\n },\n __wbg_new_16c83877745f8d12: function() { return handleError(function (arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n const ret = new InputEvent(v0);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_new_1d5bd472c706b768: function() { return handleError(function () {\n const ret = new CSSStyleSheet();\n return addHeapObject(ret);\n }, arguments); },\n __wbg_new_245cd5c49157e602: function(arg0) {\n const ret = new Date(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_new_361308b2356cecd0: function() {\n const ret = new Object();\n return addHeapObject(ret);\n },\n __wbg_new_3646026290f426a4: function(arg0) {\n const ret = new IntersectionObserver(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_new_384a230f8673183c: function() { return handleError(function (arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n const ret = new CustomEvent(v0);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_new_3eb36ae241fe6f44: function() {\n const ret = new Array();\n return addHeapObject(ret);\n },\n __wbg_new_72b49615380db768: function(arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n const ret = new Error(v0);\n return addHeapObject(ret);\n },\n __wbg_new_86c8f0b79e48927d: function(arg0, arg1) {\n const ret = new Intl.NumberFormat(getObject(arg0), getObject(arg1));\n return addHeapObject(ret);\n },\n __wbg_new_8a6f238a6ece86ea: function() {\n const ret = new Error();\n return addHeapObject(ret);\n },\n __wbg_new_ab46db28ed0cb0c7: function(arg0) {\n const ret = new ResizeObserver(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_new_b5d9e2fb389fef91: function(arg0, arg1) {\n try {\n var state0 = {a: arg0, b: arg1};\n var cb0 = (arg0, arg1) => {\n const a = state0.a;\n state0.a = 0;\n try {\n return __wasm_bindgen_func_elem_20888(a, state0.b, arg0, arg1);\n } finally {\n state0.a = a;\n }\n };\n const ret = new Promise(cb0);\n return addHeapObject(ret);\n } finally {\n state0.a = state0.b = 0;\n }\n },\n __wbg_new_c155239f1b113b68: function(arg0, arg1) {\n const ret = new Intl.DateTimeFormat(getObject(arg0), getObject(arg1));\n return addHeapObject(ret);\n },\n __wbg_new_dca287b076112a51: function() {\n const ret = new Map();\n return addHeapObject(ret);\n },\n __wbg_new_dd2b680c8bf6ae29: function(arg0) {\n const ret = new Uint8Array(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_new_ee28d0c54b26ba74: function(arg0) {\n const ret = new ClipboardItem(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_new_from_slice_a3d2629dc1826784: function(arg0, arg1) {\n const ret = new Uint8Array(getArrayU8FromWasm0(arg0, arg1));\n return addHeapObject(ret);\n },\n __wbg_new_no_args_1c7c842f08d00ebb: function(arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n const ret = new Function(v0);\n return addHeapObject(ret);\n },\n __wbg_new_with_event_init_dict_48877e7ca125f3c1: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n const ret = new CustomEvent(v0, getObject(arg2));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_new_with_str_sequence_and_options_9b8b0bee99ec6b0f: function() { return handleError(function (arg0, arg1) {\n const ret = new Blob(getObject(arg0), getObject(arg1));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_new_with_u8_array_sequence_08b2096a9f3117c0: function() { return handleError(function (arg0) {\n const ret = new Blob(getObject(arg0));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_nextSibling_2e988d9bbe3e06f0: function(arg0) {\n const ret = getObject(arg0).nextSibling;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_next_3482f54c49e8af19: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).next();\n return addHeapObject(ret);\n }, arguments); },\n __wbg_next_418f80d8f5303233: function(arg0) {\n const ret = getObject(arg0).next;\n return addHeapObject(ret);\n },\n __wbg_next_a74fa8e233e5b7bf: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).next();\n return addHeapObject(ret);\n }, arguments); },\n __wbg_now_ebffdf7e580f210d: function(arg0) {\n const ret = getObject(arg0).now();\n return ret;\n },\n __wbg_observe_63c84d0029f5dff9: function(arg0, arg1) {\n getObject(arg0).observe(getObject(arg1));\n },\n __wbg_observe_d923c52c68a84121: function(arg0, arg1) {\n getObject(arg0).observe(getObject(arg1));\n },\n __wbg_offsetHeight_34f7abc1686733cc: function(arg0) {\n const ret = getObject(arg0).offsetHeight;\n return ret;\n },\n __wbg_offsetParent_9627ebca6b03e8b2: function(arg0) {\n const ret = getObject(arg0).offsetParent;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_offsetWidth_f37b33a53e513101: function(arg0) {\n const ret = getObject(arg0).offsetWidth;\n return ret;\n },\n __wbg_offsetX_b76b9bb1f9235de9: function(arg0) {\n const ret = getObject(arg0).offsetX;\n return ret;\n },\n __wbg_offsetY_db5c1ddb866e1b82: function(arg0) {\n const ret = getObject(arg0).offsetY;\n return ret;\n },\n __wbg_parentElement_75863410a8617953: function(arg0) {\n const ret = getObject(arg0).parentElement;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_parentNode_d44bd5ec58601e45: function(arg0) {\n const ret = getObject(arg0).parentNode;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_parse_708461a1feddfb38: function() { return handleError(function (arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n const ret = JSON.parse(v0);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_performance_06f12ba62483475d: function(arg0) {\n const ret = getObject(arg0).performance;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_pointerId_466b1bdcaf2fe835: function(arg0) {\n const ret = getObject(arg0).pointerId;\n return ret;\n },\n __wbg_pop_80fa29128215a463: function(arg0) {\n const ret = getObject(arg0).pop();\n return addHeapObject(ret);\n },\n __wbg_preventDefault_cdcfcd7e301b9702: function(arg0) {\n getObject(arg0).preventDefault();\n },\n __wbg_priority_c510f025842b0e45: function(arg0) {\n const ret = getObject(arg0).priority;\n return isLikeNone(ret) ? 0x100000001 : (ret) >> 0;\n },\n __wbg_prototypesetcall_bdcdcc5842e4d77d: function(arg0, arg1, arg2) {\n Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), getObject(arg2));\n },\n __wbg_push_8ffdcb2063340ba5: function(arg0, arg1) {\n const ret = getObject(arg0).push(getObject(arg1));\n return ret;\n },\n __wbg_queueMicrotask_0aa0a927f78f5d98: function(arg0) {\n const ret = getObject(arg0).queueMicrotask;\n return addHeapObject(ret);\n },\n __wbg_queueMicrotask_5bb536982f78a56f: function(arg0) {\n queueMicrotask(getObject(arg0));\n },\n __wbg_readText_b9ac81623f153a62: function(arg0) {\n const ret = getObject(arg0).readText();\n return addHeapObject(ret);\n },\n __wbg_readyState_cf11f0728fc7b46c: function(arg0, arg1) {\n const ret = getObject(arg1).readyState;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_reject_a2176de7f1212be5: function(arg0) {\n const ret = Promise.reject(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_relatedTarget_1557cded94b97af2: function(arg0) {\n const ret = getObject(arg0).relatedTarget;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_releasePointerCapture_420ef33c7c5fb6f4: function() { return handleError(function (arg0, arg1) {\n getObject(arg0).releasePointerCapture(arg1);\n }, arguments); },\n __wbg_removeAttribute_87259aab06d9f286: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).removeAttribute(v0);\n }, arguments); },\n __wbg_removeChild_2f0b06213dbc49ca: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).removeChild(getObject(arg1));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_removeEventListener_e63328781a5b9af9: function() { return handleError(function (arg0, arg1, arg2, arg3) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).removeEventListener(v0, getObject(arg3));\n }, arguments); },\n __wbg_remove_d7cc81bb2f6f2fb9: function() { return handleError(function (arg0, arg1) {\n getObject(arg0).remove(...getObject(arg1));\n }, arguments); },\n __wbg_remove_f9451697e0bc6ca0: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).remove(v0);\n }, arguments); },\n __wbg_render_warning_fc90544f6a10954c: function(arg0) {\n const ret = getObject(arg0).render_warning;\n return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;\n },\n __wbg_replaceSync_54e9ce897fe6ab6a: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).replaceSync(v0);\n }, arguments); },\n __wbg_requestAnimationFrame_43682f8e1c5e5348: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).requestAnimationFrame(getObject(arg1));\n return ret;\n }, arguments); },\n __wbg_resize_ea7a1ab25045549c: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).resize();\n return addHeapObject(ret);\n }, arguments); },\n __wbg_resolve_002c4b7d9d8f6b64: function(arg0) {\n const ret = Promise.resolve(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_resolvedOptions_4c36dbfa1c4ba2bf: function(arg0) {\n const ret = getObject(arg0).resolvedOptions();\n return addHeapObject(ret);\n },\n __wbg_restore_f356a474f27bb87f: function() { return handleError(function (arg0, arg1, arg2) {\n getObject(arg0).restore(getObject(arg1), getObject(arg2));\n }, arguments); },\n __wbg_restyle_d811a2b6df1b0006: function() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).restyle(View.__wrap(arg1));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_save_b7a8787620b3c359: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).save();\n return addHeapObject(ret);\n }, arguments); },\n __wbg_scrollLeft_2b817c7719d17438: function(arg0) {\n const ret = getObject(arg0).scrollLeft;\n return ret;\n },\n __wbg_scrollTop_0a3a77f9fcbe038e: function(arg0) {\n const ret = getObject(arg0).scrollTop;\n return ret;\n },\n __wbg_scrollTop_4161d2a08060cb06: function(arg0) {\n const ret = getObject(arg0).scrollTop;\n return ret;\n },\n __wbg_select_mode_d897b403d4c991af: function(arg0) {\n const ret = getObject(arg0).select_mode;\n return addHeapObject(ret);\n },\n __wbg_selectedIndex_b1465d243fcb7142: function(arg0) {\n const ret = getObject(arg0).selectedIndex;\n return ret;\n },\n __wbg_selectionEnd_f3cba543517b4aa8: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).selectionEnd;\n return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;\n }, arguments); },\n __wbg_selectionStart_9cd0aeff14a21252: function() { return handleError(function (arg0) {\n const ret = getObject(arg0).selectionStart;\n return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;\n }, arguments); },\n __wbg_selectorText_4ebdf4f8074dafea: function(arg0, arg1) {\n const ret = getObject(arg1).selectorText;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_setAttribute_cc8e4c8a2a008508: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n getObject(arg0).setAttribute(v0, v1);\n }, arguments); },\n __wbg_setData_c6fb07ac0e13293c: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n getObject(arg0).setData(v0, v1);\n }, arguments); },\n __wbg_setDragImage_76defbcc7ff30178: function(arg0, arg1, arg2, arg3) {\n getObject(arg0).setDragImage(getObject(arg1), arg2, arg3);\n },\n __wbg_setPointerCapture_420db6f6826eb74b: function() { return handleError(function (arg0, arg1) {\n getObject(arg0).setPointerCapture(arg1);\n }, arguments); },\n __wbg_setProperty_cbb25c4e74285b39: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n getObject(arg0).setProperty(v0, v1);\n }, arguments); },\n __wbg_setSelectionRange_301eef1c51e01d2a: function() { return handleError(function (arg0, arg1, arg2) {\n getObject(arg0).setSelectionRange(arg1 >>> 0, arg2 >>> 0);\n }, arguments); },\n __wbg_setTimeout_eff32631ea138533: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = getObject(arg0).setTimeout(getObject(arg1), arg2);\n return ret;\n }, arguments); },\n __wbg_set_1eb0999cf5d27fc8: function(arg0, arg1, arg2) {\n const ret = getObject(arg0).set(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n },\n __wbg_set_3f1d0b984ed272ed: function(arg0, arg1, arg2) {\n getObject(arg0)[takeObject(arg1)] = takeObject(arg2);\n },\n __wbg_set_6cb8631f80447a67: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2));\n return ret;\n }, arguments); },\n __wbg_set_cache_key_07879d8e1ddc3687: function(arg0, arg1) {\n getObject(arg0).__yew_subtree_cache_key = arg1 >>> 0;\n },\n __wbg_set_capture_d52e7a585f2933c8: function(arg0, arg1) {\n getObject(arg0).capture = arg1 !== 0;\n },\n __wbg_set_checked_4b2468680005fbf7: function(arg0, arg1) {\n getObject(arg0).checked = arg1 !== 0;\n },\n __wbg_set_defaultValue_ad528b0a65ceef4a: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).defaultValue = v0;\n }, arguments); },\n __wbg_set_detail_fa3b358526be3a85: function(arg0, arg1) {\n getObject(arg0).detail = getObject(arg1);\n },\n __wbg_set_dropEffect_042402609f0b7c6b: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).dropEffect = v0;\n },\n __wbg_set_f43e577aea94465b: function(arg0, arg1, arg2) {\n getObject(arg0)[arg1 >>> 0] = takeObject(arg2);\n },\n __wbg_set_fb27b296001e2de9: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n var v1 = getCachedStringFromWasm0(arg3, arg4);\n getObject(arg0)[v0] = v1;\n }, arguments); },\n __wbg_set_innerHTML_edd39677e3460291: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).innerHTML = v0;\n },\n __wbg_set_innerText_2f1502f2d0780499: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).innerText = v0;\n },\n __wbg_set_listener_id_673485d61ca64e47: function(arg0, arg1) {\n getObject(arg0).__yew_listener_id = arg1 >>> 0;\n },\n __wbg_set_mode_6a55f972d62a3c88: function(arg0, arg1) {\n getObject(arg0).mode = __wbindgen_enum_ShadowRootMode[arg1];\n },\n __wbg_set_nodeValue_d947eb0a476b80d7: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).nodeValue = v0;\n },\n __wbg_set_passive_f411e67e6f28687b: function(arg0, arg1) {\n getObject(arg0).passive = arg1 !== 0;\n },\n __wbg_set_render_warning_847e8e9ffe932bc2: function(arg0, arg1) {\n getObject(arg0).render_warning = arg1 !== 0;\n },\n __wbg_set_scrollLeft_8de8fc187e3a6808: function(arg0, arg1) {\n getObject(arg0).scrollLeft = arg1;\n },\n __wbg_set_scrollTop_bebe746cd217a3d1: function(arg0, arg1) {\n getObject(arg0).scrollTop = arg1;\n },\n __wbg_set_selectionEnd_01e3269db03d5d2e: function() { return handleError(function (arg0, arg1) {\n getObject(arg0).selectionEnd = arg1 === 0x100000001 ? undefined : arg1;\n }, arguments); },\n __wbg_set_selectionStart_d68d6955c07c2be1: function() { return handleError(function (arg0, arg1) {\n getObject(arg0).selectionStart = arg1 === 0x100000001 ? undefined : arg1;\n }, arguments); },\n __wbg_set_subtree_id_7f776f86c6337160: function(arg0, arg1) {\n getObject(arg0).__yew_subtree_id = arg1 >>> 0;\n },\n __wbg_set_type_148de20768639245: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).type = v0;\n },\n __wbg_set_value_62a965e38b22b38c: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).value = v0;\n },\n __wbg_set_value_c3556fce049236f0: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).value = v0;\n },\n __wbg_set_value_ddc3bd01a8467bf1: function(arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n getObject(arg0).value = v0;\n },\n __wbg_shadowRoot_14828067c5922da7: function(arg0) {\n const ret = getObject(arg0).shadowRoot;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_shiftKey_5558a3288542c985: function(arg0) {\n const ret = getObject(arg0).shiftKey;\n return ret;\n },\n __wbg_shiftKey_564be91ec842bcc4: function(arg0) {\n const ret = getObject(arg0).shiftKey;\n return ret;\n },\n __wbg_splice_7cecda643e9c2204: function(arg0, arg1, arg2, arg3) {\n const ret = getObject(arg0).splice(arg1 >>> 0, arg2 >>> 0, getObject(arg3));\n return addHeapObject(ret);\n },\n __wbg_stack_0ed75d68575b0f3c: function(arg0, arg1) {\n const ret = getObject(arg1).stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_startTime_248495bfbcb427d3: function(arg0) {\n const ret = getObject(arg0).startTime;\n return ret;\n },\n __wbg_static_accessor_GLOBAL_12837167ad935116: function() {\n const ret = typeof global === 'undefined' ? null : global;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f: function() {\n const ret = typeof globalThis === 'undefined' ? null : globalThis;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_static_accessor_PSP_f02e68781161ab22: function() {\n const ret = psp;\n return addHeapObject(ret);\n },\n __wbg_static_accessor_SELF_a621d3dfbb60d0ce: function() {\n const ret = typeof self === 'undefined' ? null : self;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_static_accessor_WINDOW_f8727f0cf888e0bd: function() {\n const ret = typeof window === 'undefined' ? null : window;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_stopPropagation_6e5e2a085214ac63: function(arg0) {\n getObject(arg0).stopPropagation();\n },\n __wbg_stringify_2fdc12d5545a89d9: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = JSON.stringify(getObject(arg0), getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_stringify_8d1cc6ff383e8bae: function() { return handleError(function (arg0) {\n const ret = JSON.stringify(getObject(arg0));\n return addHeapObject(ret);\n }, arguments); },\n __wbg_styleSheets_54de627270238f6f: function(arg0) {\n const ret = getObject(arg0).styleSheets;\n return addHeapObject(ret);\n },\n __wbg_style_0b7c9bd318f8b807: function(arg0) {\n const ret = getObject(arg0).style;\n return addHeapObject(ret);\n },\n __wbg_style_fa56cf251a93275a: function(arg0) {\n const ret = getObject(arg0).style;\n return addHeapObject(ret);\n },\n __wbg_subtree_id_bb66e5e9d0f64dbd: function(arg0) {\n const ret = getObject(arg0).__yew_subtree_id;\n return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;\n },\n __wbg_supportedValuesOf_38788e17038320e4: function(arg0) {\n const ret = Intl.supportedValuesOf(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_table_new: function(arg0) {\n const ret = Table.__wrap(arg0);\n return addHeapObject(ret);\n },\n __wbg_tagName_0cf6d7b647352f04: function(arg0, arg1) {\n const ret = getObject(arg1).tagName;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_target_521be630ab05b11e: function(arg0) {\n const ret = getObject(arg0).target;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n },\n __wbg_then_0d9fe2c7b1857d32: function(arg0, arg1, arg2) {\n const ret = getObject(arg0).then(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n },\n __wbg_then_b9e7b3b5f1a9e1b5: function(arg0, arg1) {\n const ret = getObject(arg0).then(getObject(arg1));\n return addHeapObject(ret);\n },\n __wbg_toString_964ff7fe6eca8362: function(arg0) {\n const ret = getObject(arg0).toString();\n return addHeapObject(ret);\n },\n __wbg_toggleAttribute_d89e5c9e9053c9c4: function() { return handleError(function (arg0, arg1, arg2, arg3) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n const ret = getObject(arg0).toggleAttribute(v0, arg3 !== 0);\n return ret;\n }, arguments); },\n __wbg_toggle_52417ca95b874e83: function() { return handleError(function (arg0, arg1, arg2) {\n var v0 = getCachedStringFromWasm0(arg1, arg2);\n const ret = getObject(arg0).toggle(v0);\n return ret;\n }, arguments); },\n __wbg_top_3d27ff6f468cf3fc: function(arg0) {\n const ret = getObject(arg0).top;\n return ret;\n },\n __wbg_trace_9007714a6fbee374: function(arg0) {\n console.trace(getObject(arg0));\n },\n __wbg_trace_bd16b570941b54fb: function(arg0, arg1, arg2, arg3) {\n console.trace(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3));\n },\n __wbg_type_4edffca24c42b74d: function(arg0, arg1) {\n const ret = getObject(arg1).type;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_unobserve_476684195d1e0cb9: function(arg0, arg1) {\n getObject(arg0).unobserve(getObject(arg1));\n },\n __wbg_unobserve_8859f8b68ea88562: function(arg0, arg1) {\n getObject(arg0).unobserve(getObject(arg1));\n },\n __wbg_update_2dda71464c659adc: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n const ret = getObject(arg0).update(View.__wrap(arg1), arg2 === 0x100000001 ? undefined : arg2, arg3 === 0x100000001 ? undefined : arg3, arg4 !== 0);\n return addHeapObject(ret);\n }, arguments); },\n __wbg_valueAsNumber_5292e7ed56db5658: function(arg0) {\n const ret = getObject(arg0).valueAsNumber;\n return ret;\n },\n __wbg_value_0546255b415e96c1: function(arg0) {\n const ret = getObject(arg0).value;\n return addHeapObject(ret);\n },\n __wbg_value_15684899da869c95: function(arg0, arg1) {\n const ret = getObject(arg1).value;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_value_e506a07878790ca0: function(arg0, arg1) {\n const ret = getObject(arg1).value;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_values_5da93bc719d272cf: function(arg0) {\n const ret = Object.values(getObject(arg0));\n return addHeapObject(ret);\n },\n __wbg_values_725507e0ae05aa44: function(arg0) {\n const ret = getObject(arg0).values();\n return addHeapObject(ret);\n },\n __wbg_view_new: function(arg0) {\n const ret = View.__wrap(arg0);\n return addHeapObject(ret);\n },\n __wbg_view_unwrap: function(arg0) {\n const ret = View.__unwrap(getObject(arg0));\n return ret;\n },\n __wbg_virtualdataslice_new: function(arg0) {\n const ret = VirtualDataSlice.__wrap(arg0);\n return addHeapObject(ret);\n },\n __wbg_warn_a40b971467b219c7: function(arg0, arg1, arg2, arg3) {\n console.warn(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3));\n },\n __wbg_warn_f7ae1b2e66ccb930: function(arg0) {\n console.warn(getObject(arg0));\n },\n __wbg_weight_984b87b81f2dde65: function(arg0, arg1) {\n const ret = getObject(arg1).weight;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_which_78ecd90ab7c6bdd6: function(arg0) {\n const ret = getObject(arg0).which;\n return ret;\n },\n __wbg_width_7444cca5dfea0645: function(arg0) {\n const ret = getObject(arg0).width;\n return ret;\n },\n __wbg_width_ae46cb8e98ee102f: function(arg0) {\n const ret = getObject(arg0).width;\n return ret;\n },\n __wbg_write_d429ce72e918e180: function(arg0, arg1) {\n const ret = getObject(arg0).write(getObject(arg1));\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000001: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 3716, function: Function { arguments: [], shim_idx: 3730, ret: NamedExternref(\"Promise<any>\"), inner_ret: Some(NamedExternref(\"Promise<any>\")) }, mutable: false }) -> Externref`.\n const ret = makeClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_13482, __wasm_bindgen_func_elem_14371);\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000002: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 38, function: Function { arguments: [Externref], shim_idx: 75, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`.\n const ret = makeClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_3123, __wasm_bindgen_func_elem_5237);\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000003: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 39, function: Function { arguments: [NamedExternref(\"Array<any>\")], shim_idx: 76, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.\n const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_3124, __wasm_bindgen_func_elem_5238);\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000004: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 39, function: Function { arguments: [NamedExternref(\"FocusEvent\")], shim_idx: 76, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.\n const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_3124, __wasm_bindgen_func_elem_5238);\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000005: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 39, function: Function { arguments: [NamedExternref(\"MouseEvent\")], shim_idx: 75, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`.\n const ret = makeClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_3124, __wasm_bindgen_func_elem_5237);\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000006: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 39, function: Function { arguments: [], shim_idx: 77, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.\n const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_3124, __wasm_bindgen_func_elem_5235);\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000007: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 4449, function: Function { arguments: [Ref(NamedExternref(\"Event\"))], shim_idx: 4451, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`.\n const ret = makeClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_18167, __wasm_bindgen_func_elem_18286);\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000008: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 4553, function: Function { arguments: [], shim_idx: 4554, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.\n const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_18937, __wasm_bindgen_func_elem_18940);\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000009: function(arg0, arg1) {\n // Cast intrinsic for `Closure(Closure { dtor_idx: 4558, function: Function { arguments: [Externref], shim_idx: 4559, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.\n const ret = makeMutClosure(arg0, arg1, wasm.__wasm_bindgen_func_elem_18961, __wasm_bindgen_func_elem_18978);\n return addHeapObject(ret);\n },\n __wbindgen_cast_000000000000000a: function(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return addHeapObject(ret);\n },\n __wbindgen_cast_000000000000000b: function(arg0) {\n // Cast intrinsic for `I64 -> Externref`.\n const ret = arg0;\n return addHeapObject(ret);\n },\n __wbindgen_cast_000000000000000c: function(arg0, arg1) {\n var v0 = getCachedStringFromWasm0(arg0, arg1);\n // Cast intrinsic for `Ref(CachedString) -> Externref`.\n const ret = v0;\n return addHeapObject(ret);\n },\n __wbindgen_cast_000000000000000d: function(arg0, arg1) {\n // Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref(\"Uint8Array\")`.\n const ret = getArrayU8FromWasm0(arg0, arg1);\n return addHeapObject(ret);\n },\n __wbindgen_cast_000000000000000e: function(arg0) {\n // Cast intrinsic for `U64 -> Externref`.\n const ret = BigInt.asUintN(64, arg0);\n return addHeapObject(ret);\n },\n __wbindgen_cast_000000000000000f: function(arg0, arg1) {\n var v0 = getArrayJsValueFromWasm0(arg0, arg1).slice();\n wasm.__wbindgen_export4(arg0, arg1 * 4, 4);\n // Cast intrinsic for `Vector(NamedExternref(\"string\")) -> Externref`.\n const ret = v0;\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000010: function(arg0, arg1) {\n var v0 = getArrayU8FromWasm0(arg0, arg1).slice();\n wasm.__wbindgen_export4(arg0, arg1 * 1, 1);\n // Cast intrinsic for `Vector(U8) -> Externref`.\n const ret = v0;\n return addHeapObject(ret);\n },\n __wbindgen_object_clone_ref: function(arg0) {\n const ret = getObject(arg0);\n return addHeapObject(ret);\n },\n __wbindgen_object_drop_ref: function(arg0) {\n takeObject(arg0);\n },\n };\n return {\n __proto__: null,\n \"./perspective-viewer.wasm_bg.js\": import0,\n };\n}\n\nfunction __wasm_bindgen_func_elem_18940(arg0, arg1) {\n wasm.__wasm_bindgen_func_elem_18940(arg0, arg1);\n}\n\nfunction __wasm_bindgen_func_elem_14371(arg0, arg1) {\n const ret = wasm.__wasm_bindgen_func_elem_14371(arg0, arg1);\n return takeObject(ret);\n}\n\nfunction __wasm_bindgen_func_elem_5237(arg0, arg1, arg2) {\n wasm.__wasm_bindgen_func_elem_5237(arg0, arg1, addHeapObject(arg2));\n}\n\nfunction __wasm_bindgen_func_elem_5238(arg0, arg1, arg2) {\n wasm.__wasm_bindgen_func_elem_5238(arg0, arg1, addHeapObject(arg2));\n}\n\nfunction __wasm_bindgen_func_elem_5235(arg0, arg1) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.__wasm_bindgen_func_elem_5235(retptr, arg0, arg1);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n if (r1) {\n throw takeObject(r0);\n }\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n}\n\nfunction __wasm_bindgen_func_elem_18286(arg0, arg1, arg2) {\n try {\n wasm.__wasm_bindgen_func_elem_18286(arg0, arg1, addBorrowedObject(arg2));\n } finally {\n heap[stack_pointer++] = undefined;\n }\n}\n\nfunction __wasm_bindgen_func_elem_18978(arg0, arg1, arg2) {\n wasm.__wasm_bindgen_func_elem_18978(arg0, arg1, addHeapObject(arg2));\n}\n\nfunction __wasm_bindgen_func_elem_20888(arg0, arg1, arg2, arg3) {\n wasm.__wasm_bindgen_func_elem_20888(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));\n}\n\n\nconst __wbindgen_enum_ShadowRootMode = [\"open\", \"closed\"];\nconst ClientFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_client_free(ptr >>> 0, 1));\nconst ColumnDropDownElementFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_columndropdownelement_free(ptr >>> 0, 1));\nconst CopyDropDownMenuElementFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_copydropdownmenuelement_free(ptr >>> 0, 1));\nconst ExportDropDownMenuElementFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_exportdropdownmenuelement_free(ptr >>> 0, 1));\nconst FilterDropDownElementFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_filterdropdownelement_free(ptr >>> 0, 1));\nconst FunctionDropDownElementFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_functiondropdownelement_free(ptr >>> 0, 1));\nconst GenericSQLVirtualServerModelFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_genericsqlvirtualservermodel_free(ptr >>> 0, 1));\nconst PerspectiveDebugPluginElementFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_perspectivedebugpluginelement_free(ptr >>> 0, 1));\nconst PerspectiveViewerElementFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_perspectiveviewerelement_free(ptr >>> 0, 1));\nconst ProxySessionFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_proxysession_free(ptr >>> 0, 1));\nconst TableFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_table_free(ptr >>> 0, 1));\nconst ViewFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_view_free(ptr >>> 0, 1));\nconst VirtualDataSliceFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_virtualdataslice_free(ptr >>> 0, 1));\nconst VirtualServerFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_virtualserver_free(ptr >>> 0, 1));\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nfunction _assertClass(instance, klass) {\n if (!(instance instanceof klass)) {\n throw new Error(`expected instance of ${klass.name}`);\n }\n}\n\nfunction addBorrowedObject(obj) {\n if (stack_pointer == 1) throw new Error('out of js stack');\n heap[--stack_pointer] = obj;\n return stack_pointer;\n}\n\nconst CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(state => state.dtor(state.a, state.b));\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches && builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction dropObject(idx) {\n if (idx < 132) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction getArrayJsValueFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n const mem = getDataViewMemory0();\n const result = [];\n for (let i = ptr; i < ptr + 4 * len; i += 4) {\n result.push(takeObject(mem.getUint32(i, true)));\n }\n return result;\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nfunction getCachedStringFromWasm0(ptr, len) {\n if (ptr === 0) {\n return getObject(len);\n } else {\n return getStringFromWasm0(ptr, len);\n }\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n wasm.__wbindgen_export3(addHeapObject(e));\n }\n}\n\nlet heap = new Array(128).fill(undefined);\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction makeClosure(arg0, arg1, dtor, f) {\n const state = { a: arg0, b: arg1, cnt: 1, dtor };\n const real = (...args) => {\n\n // First up with a closure we increment the internal reference\n // count. This ensures that the Rust closure environment won't\n // be deallocated while we're invoking it.\n state.cnt++;\n try {\n return f(state.a, state.b, ...args);\n } finally {\n real._wbg_cb_unref();\n }\n };\n real._wbg_cb_unref = () => {\n if (--state.cnt === 0) {\n state.dtor(state.a, state.b);\n state.a = 0;\n CLOSURE_DTORS.unregister(state);\n }\n };\n CLOSURE_DTORS.register(real, state, state);\n return real;\n}\n\nfunction makeMutClosure(arg0, arg1, dtor, f) {\n const state = { a: arg0, b: arg1, cnt: 1, dtor };\n const real = (...args) => {\n\n // First up with a closure we increment the internal reference\n // count. This ensures that the Rust closure environment won't\n // be deallocated while we're invoking it.\n state.cnt++;\n const a = state.a;\n state.a = 0;\n try {\n return f(a, state.b, ...args);\n } finally {\n state.a = a;\n real._wbg_cb_unref();\n }\n };\n real._wbg_cb_unref = () => {\n if (--state.cnt === 0) {\n state.dtor(state.a, state.b);\n state.a = 0;\n CLOSURE_DTORS.unregister(state);\n }\n };\n CLOSURE_DTORS.register(real, state, state);\n return real;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArrayJsValueToWasm0(array, malloc) {\n const ptr = malloc(array.length * 4, 4) >>> 0;\n const mem = getDataViewMemory0();\n for (let i = 0; i < array.length; i++) {\n mem.setUint32(ptr + 4 * i, addHeapObject(array[i]), true);\n }\n WASM_VECTOR_LEN = array.length;\n return ptr;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet stack_pointer = 128;\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n wasmModule = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = module.ok && expectedResponseType(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (module !== undefined) {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (module_or_path !== undefined) {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n", "export const ClipboardItem = window.ClipboardItem", "export const ResizeObserver = window.ResizeObserver", "export const IntersectionObserver = window.IntersectionObserver", "\n export function bootstrap(psp, name, clsname, statics) {\n const cls = psp[clsname];\n const proto = cls.prototype;\n class x extends HTMLElement {\n constructor() {\n super();\n this._instance = new cls(this);\n }\n }\n\n const names = Object.getOwnPropertyNames(proto);\n for (const key of names) {\n if ('get' in Object.getOwnPropertyDescriptor(proto, key)) {\n Object.defineProperty(x.prototype, key, {\n get: function() {\n return this._instance[key];\n }\n });\n } else {\n Object.defineProperty(x.prototype, key, {\n value: function(...args) {\n return this._instance[key].call(this._instance, ...args);\n }\n });\n }\n }\n\n for (const key of statics) {\n Object.defineProperty(x, key, {\n value: function(...args) {\n return psp[key].call(psp, ...args);\n }\n });\n }\n\n Object.defineProperty(x, '__wasm_module__', {\n get() {\n return psp;\n },\n });\n\n customElements.define(name, x);\n }\n", "// \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n// \u2502 \u2502\n// \u2502 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 Copyright (C) 2025, The Prospective Company \u2502\n// \u2502 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2502\n// \u2502 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551 This file is part of the Procss library, \u2502\n// \u2502 \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 distributed under the terms of the \u2502\n// \u2502 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D Apache License 2.0. The full license can \u2502\n// \u2502 \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D be found in the LICENSE file. \u2502\n// \u2502 \u2502\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\nexport async function extract(input) {\n let bin;\n if (typeof input?.then === \"function\") {\n input = await input;\n }\n\n if (input instanceof Response) {\n bin = await WebAssembly.instantiateStreaming(input);\n } else if (typeof input === \"string\") {\n bin = await WebAssembly.instantiateStreaming(fetch(input));\n } else if (input instanceof ArrayBuffer) {\n bin = await WebAssembly.instantiate(input);\n } else if (input instanceof Uint8Array) {\n bin = await WebAssembly.instantiate(input.buffer);\n } else {\n bin = input;\n }\n\n const inst = bin.instance.exports;\n const [payload] = WebAssembly.Module.customSections(bin.module, \"psp-runtime\");\n const [raw_length_view] = WebAssembly.Module.customSections(bin.module, \"psp-len\");\n const raw_length = new DataView(raw_length_view).getUint32(0, true);\n const ptr = inst.resize(payload.byteLength);\n new Uint8Array(inst.memory.buffer).set(new Uint8Array(payload), ptr);\n const offset = inst.compile(payload.byteLength, raw_length);\n return new Uint8Array(inst.memory.buffer).slice(offset, raw_length + offset);\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// @ts-ignore\nimport { extract } from \"pro_self_extracting_wasm\";\n\nif (typeof WebAssembly === \"undefined\") {\n throw new Error(\"WebAssembly not supported.\");\n}\n\ninterface Module extends WebAssembly.Exports {\n size(): number;\n offset(): number;\n memory: WebAssembly.Memory;\n}\n\n// Perform a silly dance to deal with the different ways webpack and esbuild\n// load binary, as this may either be an `ArrayBuffer` or `URL` depending\n// on whether `inline` option was specified to `perspective-esbuild-plugin`.\nasync function compile(\n buffer: ArrayBuffer | Response | WebAssembly.Module | WebAssembly.Exports,\n): Promise<Module> {\n if (buffer instanceof Response) {\n return (await WebAssembly.instantiateStreaming(buffer)).instance\n .exports as Module;\n } else if (buffer instanceof WebAssembly.Module) {\n return (await WebAssembly.instantiate(buffer)).exports as Module;\n } else if (buffer instanceof WebAssembly.Instance) {\n return buffer.exports as Module;\n } else if (buffer instanceof ArrayBuffer) {\n return (await WebAssembly.instantiate(buffer as BufferSource)).instance\n .exports as Module;\n } else {\n return buffer as Module;\n }\n}\n\nexport async function load_wasm_stage_0(\n wasm:\n | ArrayBuffer\n | Response\n | WebAssembly.Module\n | (() => Promise<ArrayBuffer>),\n): Promise<Uint8Array> {\n if (wasm instanceof Function) {\n wasm = await wasm();\n }\n\n try {\n return await extract(wasm as ArrayBuffer);\n } catch (e) {\n console.warn(\"Stage 0 wasm loading failed, skipping\");\n return new Uint8Array(wasm as ArrayBuffer);\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 wasm_module from \"../../dist/wasm/perspective-viewer.js\";\nimport { load_wasm_stage_0 } from \"@perspective-dev/client/src/ts/wasm/decompress.ts\";\n\nexport async function init_client(\n wasm_binary:\n | Promise<Response | ArrayBuffer | Uint8Array>\n | Response\n | ArrayBuffer\n | Uint8Array,\n) {\n const module_or_path = await load_wasm_stage_0(wasm_binary);\n await wasm_module.default({ module_or_path });\n await wasm_module.init();\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 * Module for the `<perspective-viewer>` custom element. This module has no\n * (real) exports, but importing it has a side effect: the\n * `PerspectiveViewerElement` class is registered as a custom element, after\n * which it can be used as a standard DOM element.\n *\n * Though `<perspective-viewer>` is written mostly in Rust, the nature\n * of WebAssembly's compilation makes it a dynamic module; in order to\n * guarantee that the Custom Elements extension methods are registered\n * synchronously with this package's import, we need perform said registration\n * within this wrapper module. As a result, the API methods of the Custom\n * Elements are all `async` (as they must await the wasm module instance).\n *\n * The documentation in this module defines the instance structure of a\n * `<perspective-viewer>` 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 *\n * @module perspective-viewer\n */\n\nexport { IPerspectiveViewerPlugin } from \"./plugin\";\nexport { HTMLPerspectiveViewerPluginElement } from \"./plugin\";\n\nexport type * from \"./extensions.ts\";\nexport { PerspectiveSelectDetail } from \"./extensions.ts\";\nexport type * from \"./ts-rs/ViewerConfigUpdate.d.ts\";\nexport type * from \"./ts-rs/ColumnConfigValues.d.ts\";\nexport type * from \"./ts-rs/Filter.d.ts\";\nexport type * from \"./ts-rs/FilterTerm.d.ts\";\nexport type * from \"./ts-rs/FilterReducer.d.ts\";\n\nexport { init_client } from \"./bootstrap\";\nimport { init_client } from \"./bootstrap\";\n\nexport default { init_client };\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type {\n View,\n Table,\n ViewConfig,\n ColumnType,\n SortDir,\n ViewWindow,\n ViewConfigUpdate,\n} from \"@perspective-dev/client\";\nimport { RegularTableElement } from \"regular-table\";\nimport { CellMetadata, DataResponse } from \"regular-table/dist/esm/types\";\n\n// Re-export types from regular-table for use throughout the codebase\nexport type { RegularTableElement as RegularTable };\n\nexport function get_psp_type(\n model: DatagridModel,\n metadata: CellMetadata,\n): ColumnType {\n if (\n metadata.type === \"body\" ||\n metadata.type === \"column_header\" ||\n metadata.type === \"corner\"\n ) {\n return model._column_types[metadata.x];\n } else {\n return model._row_header_types[(metadata.row_header_x ?? 0) - 1];\n }\n}\n\n// Edit mode for the datagrid\nexport type EditMode =\n | \"READ_ONLY\"\n | \"EDIT\"\n | \"SELECT_COLUMN\"\n | \"SELECT_ROW\"\n | \"SELECT_REGION\";\n\n// Color record for styling - tuple returned by make_color_record\nexport type ColorRecord = [\n string, // hex color\n number, // red\n number, // green\n number, // blue\n string, // gradient\n string, // rgba solid\n string, // rgba transparent\n];\n\nexport type SortTerm = [string, SortDir];\n\n// Selection state for mouse-based region selection\nexport interface SelectionArea {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n}\n\nexport interface SelectionState {\n selected_areas: SelectionArea[];\n dirty: boolean;\n CURRENT_MOUSEDOWN_COORDINATES?: { x?: number; y?: number };\n old_selected_areas?: SelectionArea[];\n potential_selection?: SelectionArea;\n}\n\n// Position tracking for cell focus\nexport interface SelectedPosition {\n x: number;\n y: number;\n content?: string;\n}\n\n// Column configuration values from viewer\nexport interface ColumnConfig {\n color?: string;\n pos_fg_color?: string;\n neg_fg_color?: string;\n pos_bg_color?: string;\n neg_bg_color?: string;\n fg_gradient?: number;\n bg_gradient?: number;\n number_fg_mode?: string;\n number_bg_mode?: string;\n string_color_mode?: string;\n datetime_color_mode?: string;\n fixed?: number;\n aggregate_depth?: number;\n column_size_override?: number;\n format?: string;\n date_format?: DateFormatConfig;\n number_format?: NumberFormatConfig;\n}\n\n// Date format configuration for column styling\nexport interface DateFormatConfig {\n format?: \"custom\" | string;\n timeZone?: string;\n dateStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n timeStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n second?: \"numeric\" | \"2-digit\" | \"disabled\";\n minute?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour?: \"numeric\" | \"2-digit\" | \"disabled\";\n day?: \"numeric\" | \"2-digit\" | \"disabled\";\n weekday?: \"narrow\" | \"short\" | \"long\" | \"disabled\";\n month?: \"numeric\" | \"2-digit\" | \"narrow\" | \"short\" | \"long\" | \"disabled\";\n year?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour12?: boolean;\n fractionalSecondDigits?: 1 | 2 | 3;\n}\n\n// Number format configuration for column styling\nexport interface NumberFormatConfig {\n style?: \"decimal\" | \"currency\" | \"percent\" | \"unit\";\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n minimumIntegerDigits?: number;\n minimumSignificantDigits?: number;\n maximumSignificantDigits?: number;\n currency?: string;\n currencyDisplay?: \"code\" | \"symbol\" | \"narrowSymbol\" | \"name\";\n notation?: \"standard\" | \"scientific\" | \"engineering\" | \"compact\";\n compactDisplay?: \"short\" | \"long\";\n useGrouping?: boolean;\n}\n\nexport type ColumnsConfig = Record<string, ColumnConfig>;\n\n// Plugin save state\nexport interface DatagridPluginConfig {\n columns?: ColumnsConfig;\n editable?: boolean;\n scroll_lock?: boolean;\n edit_mode?: EditMode;\n column_size_override?: Record<string, number>;\n}\n\n// Element factory for reusing DOM elements\nexport interface ElemFactory {\n clear(): void;\n get(): HTMLElement;\n}\n\nexport type Schema = Record<string, ColumnType>;\n\n// Model object stored on regular-table\nexport interface DatagridModel {\n _edit_port: number;\n _view: View;\n _table: Table;\n _table_schema: Schema;\n _config: ViewConfig;\n _num_rows: number;\n _num_columns?: number;\n _schema: Schema;\n _ids: unknown[][];\n _plugin_background: number[];\n _color: ColorRecord;\n _pos_fg_color: ColorRecord;\n _neg_fg_color: ColorRecord;\n _pos_bg_color: ColorRecord;\n _neg_bg_color: ColorRecord;\n _column_paths: string[];\n _column_types: ColumnType[];\n _is_editable: boolean[];\n _edit_mode: EditMode;\n _selection_state: SelectionState;\n _row_header_types: ColumnType[];\n _series_color_map: Map<string, Map<string, number>>;\n _series_color_seed: Map<string, number>;\n _div_factory: ElemFactory;\n _last_window?: ViewWindow;\n _is_old_viewport?: boolean;\n _reverse_columns?: Map<string, number>;\n _reverse_ids?: Map<string, number>;\n last_column_paths?: string[];\n last_meta?: unknown[][];\n last_ids?: unknown[][];\n last_reverse_ids?: Map<string, number>;\n last_reverse_columns?: Map<string, number>;\n get_psp_type(metadata: CellMetadata): ColumnType;\n _column_settings_selected_column?: string;\n}\n\n// Symbol for private plugin data on regular-table\nexport const PRIVATE_PLUGIN_SYMBOL: unique symbol = Symbol(\n \"Perspective Column Config\",\n);\n\n// Data listener function type\nexport type DataListener = (\n regularTable: RegularTableElement,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse>;\n\n// Style listener function type\nexport type StyleListener = () => void;\n\n// Perspective viewer element interface (subset)\nexport interface PerspectiveViewerElement extends HTMLElement {\n getView(): Promise<View>;\n getTable(): Promise<Table>;\n getEditPort(): Promise<number>;\n restore(config: Partial<ViewConfig>): Promise<void>;\n toggleColumnSettings(columnName?: string): Promise<void>;\n hasAttribute(name: string): boolean;\n setSelection(viewport?: ViewWindow): void;\n dispatchEvent(event: Event): boolean;\n children: HTMLCollectionOf<HTMLElement>;\n}\n\n// Toolbar element interface\nexport interface DatagridToolbarElement extends HTMLElement {\n setEditButton(button: HTMLElement): void;\n setScrollLockButton(button: HTMLElement): void;\n}\n\n// Column override for persisting column sizes\nexport type ColumnOverrides = Record<string, number | undefined>;\n\n// Formatter cache types\nexport interface FormatterCacheEntry {\n format(value: unknown): string;\n}\n\nexport type FormatterCache = Map<string, FormatterCacheEntry>;\n\n// Cell config result from getCellConfig\nexport interface CellConfigResult {\n row: Record<string, unknown>;\n column_names: string[];\n config: ViewConfigUpdate;\n}\n\n// Custom event detail types\nexport interface PerspectiveClickDetail {\n row: Record<string, unknown>;\n column_names: string[];\n config: Partial<ViewConfig>;\n}\n\nexport { PerspectiveSelectDetail } from \"@perspective-dev/viewer\";\n\n// Mouse event with handled flag\nexport interface HandledMouseEvent extends MouseEvent {\n handled?: boolean;\n}\n\n// Sort order mappings\nexport type SortRotationOrder = Record<string, SortDir | undefined>;\n\n// Datagrid plugin element interface for toolbar\nexport interface DatagridPluginElement extends HTMLElement {\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n}\n\n// Map types for selected rows and positions\nexport type SelectedRowsMap = WeakMap<RegularTableElement, Set<number>>;\nexport type SelectedPositionMap = WeakMap<\n RegularTableElement,\n SelectedPosition\n>;\n", "const { min, max } = Math;\n\nexport default (x, low = 0, high = 1) => {\n return min(max(low, x), high);\n};\n", "import limit from './limit.js';\n\nexport default (rgb) => {\n rgb._clipped = false;\n rgb._unclipped = rgb.slice(0);\n for (let i = 0; i <= 3; i++) {\n if (i < 3) {\n if (rgb[i] < 0 || rgb[i] > 255) rgb._clipped = true;\n rgb[i] = limit(rgb[i], 0, 255);\n } else if (i === 3) {\n rgb[i] = limit(rgb[i], 0, 1);\n }\n }\n return rgb;\n};\n", "// ported from jQuery's $.type\nconst classToType = {};\nfor (let name of [\n 'Boolean',\n 'Number',\n 'String',\n 'Function',\n 'Array',\n 'Date',\n 'RegExp',\n 'Undefined',\n 'Null'\n]) {\n classToType[`[object ${name}]`] = name.toLowerCase();\n}\nexport default function (obj) {\n return classToType[Object.prototype.toString.call(obj)] || 'object';\n}\n", "import type from './type.js';\n\nexport default (args, keyOrder = null) => {\n // if called with more than 3 arguments, we return the arguments\n if (args.length >= 3) return Array.prototype.slice.call(args);\n // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder\n .split('')\n .filter((k) => args[0][k] !== undefined)\n .map((k) => args[0][k]);\n }\n // otherwise we just return the first argument\n // (which we suppose is an array of args)\n return args[0].slice(0);\n};\n", "import type from './type.js';\n\nexport default (args) => {\n if (args.length < 2) return null;\n const l = args.length - 1;\n if (type(args[l]) == 'string') return args[l].toLowerCase();\n return null;\n};\n", "const { PI, min, max } = Math;\n\nconst rnd2 = (a) => Math.round(a * 100) / 100;\nconst rnd3 = (a) => Math.round(a * 100) / 100;\n\nexport { default as clip_rgb } from './clip_rgb.js';\nexport { default as limit } from './limit.js';\nexport { default as type } from './type.js';\nexport { default as unpack } from './unpack.js';\nexport { default as last } from './last.js';\n\nconst TWOPI = PI * 2;\nconst PITHIRD = PI / 3;\nconst DEG2RAD = PI / 180;\nconst RAD2DEG = 180 / PI;\n\n/**\n * Reverse the first three elements of an array\n *\n * @param {any[]} arr\n * @returns {any[]}\n */\nfunction reverse3(arr) {\n return [...arr.slice(0, 3).reverse(), ...arr.slice(3)];\n}\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max, rnd2, rnd3, reverse3 };\n", "export default {\n format: {},\n autodetect: []\n};\n", "import { last, clip_rgb, type } from './utils/index.js';\nimport _input from './io/input.js';\n\nclass Color {\n constructor(...args) {\n const me = this;\n if (\n type(args[0]) === 'object' &&\n args[0].constructor &&\n args[0].constructor === this.constructor\n ) {\n // the argument is already a Color instance\n return args[0];\n }\n // last argument could be the mode\n let mode = last(args);\n let autodetect = false;\n if (!mode) {\n autodetect = true;\n\n if (!_input.sorted) {\n _input.autodetect = _input.autodetect.sort((a, b) => b.p - a.p);\n _input.sorted = true;\n }\n\n // auto-detect format\n for (let chk of _input.autodetect) {\n mode = chk.test(...args);\n if (mode) break;\n }\n }\n if (_input.format[mode]) {\n const rgb = _input.format[mode].apply(\n null,\n autodetect ? args : args.slice(0, -1)\n );\n me._rgb = clip_rgb(rgb);\n } else {\n throw new Error('unknown format: ' + args);\n }\n // add alpha channel\n if (me._rgb.length === 3) me._rgb.push(1);\n }\n toString() {\n if (type(this.hex) == 'function') return this.hex();\n return `[${this._rgb.join(',')}]`;\n }\n}\nexport default Color;\n", "// this gets updated automatically\nexport const version = '3.1.2';\n", "import Color from './Color.js';\nimport { version } from './version.js';\n\nconst chroma = (...args) => {\n return new Color(...args);\n};\n\nchroma.version = version;\n\nexport default chroma;\n", "/**\n\tX11 color names\n\n\thttp://www.w3.org/TR/css3-color/#svg-color\n*/\n\nconst w3cx11 = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n laserlemon: '#ffff54',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrod: '#fafad2',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n maroon2: '#7f0000',\n maroon3: '#b03060',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n purple2: '#7f007f',\n purple3: '#a020f0',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n};\n\nexport default w3cx11;\n", "const RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\nconst RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\nconst hex2rgb = (hex) => {\n if (hex.match(RE_HEX)) {\n // remove optional leading #\n if (hex.length === 4 || hex.length === 7) {\n hex = hex.substr(1);\n }\n // expand short-notation to full six-digit\n if (hex.length === 3) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const u = parseInt(hex, 16);\n const r = u >> 16;\n const g = (u >> 8) & 0xff;\n const b = u & 0xff;\n return [r, g, b, 1];\n }\n\n // match rgba hex format, eg #FF000077\n if (hex.match(RE_HEXA)) {\n if (hex.length === 5 || hex.length === 9) {\n // remove optional leading #\n hex = hex.substr(1);\n }\n // expand short-notation to full eight-digit\n if (hex.length === 4) {\n hex = hex.split('');\n hex =\n hex[0] +\n hex[0] +\n hex[1] +\n hex[1] +\n hex[2] +\n hex[2] +\n hex[3] +\n hex[3];\n }\n const u = parseInt(hex, 16);\n const r = (u >> 24) & 0xff;\n const g = (u >> 16) & 0xff;\n const b = (u >> 8) & 0xff;\n const a = Math.round(((u & 0xff) / 0xff) * 100) / 100;\n return [r, g, b, a];\n }\n\n // we used to check for css colors here\n // if _input.css? and rgb = _input.css hex\n // return rgb\n\n throw new Error(`unknown hex color: ${hex}`);\n};\n\nexport default hex2rgb;\n", "import { unpack, last } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2hex = (...args) => {\n let [r, g, b, a] = unpack(args, 'rgba');\n let mode = last(args) || 'auto';\n if (a === undefined) a = 1;\n if (mode === 'auto') {\n mode = a < 1 ? 'rgba' : 'rgb';\n }\n r = round(r);\n g = round(g);\n b = round(b);\n const u = (r << 16) | (g << 8) | b;\n let str = '000000' + u.toString(16); //#.toUpperCase();\n str = str.substr(str.length - 6);\n let hxa = '0' + round(a * 255).toString(16);\n hxa = hxa.substr(hxa.length - 2);\n switch (mode.toLowerCase()) {\n case 'rgba':\n return `#${str}${hxa}`;\n case 'argb':\n return `#${hxa}${str}`;\n default:\n return `#${str}`;\n }\n};\n\nexport default rgb2hex;\n", "import Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport w3cx11 from '../../colors/w3cx11.js';\nimport hex2rgb from '../hex/hex2rgb.js';\nimport rgb2hex from '../hex/rgb2hex.js';\n\nColor.prototype.name = function () {\n const hex = rgb2hex(this._rgb, 'rgb');\n for (let n of Object.keys(w3cx11)) {\n if (w3cx11[n] === hex) return n.toLowerCase();\n }\n return hex;\n};\n\ninput.format.named = (name) => {\n name = name.toLowerCase();\n if (w3cx11[name]) return hex2rgb(w3cx11[name]);\n throw new Error('unknown color name: ' + name);\n};\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && w3cx11[h.toLowerCase()]) {\n return 'named';\n }\n }\n});\n", "import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.alpha = function (a, mutate = false) {\n if (a !== undefined && type(a) === 'number') {\n if (mutate) {\n this._rgb[3] = a;\n return this;\n }\n return new Color([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n }\n return this._rgb[3];\n};\n", "import Color from '../Color.js';\n\nColor.prototype.clipped = function () {\n return this._rgb._clipped || false;\n};\n", "const labConstants = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n\n // D65 standard referent\n labWhitePoint: 'd65',\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n\n t0: 0.137931034, // 4 / 29\n t1: 0.206896552, // 6 / 29\n t2: 0.12841855, // 3 * t1 * t1\n t3: 0.008856452, // t1 * t1 * t1,\n\n kE: 216.0 / 24389.0,\n kKE: 8.0,\n kK: 24389.0 / 27.0,\n\n RefWhiteRGB: {\n // sRGB\n X: 0.95047,\n Y: 1,\n Z: 1.08883\n },\n\n MtxRGB2XYZ: {\n m00: 0.4124564390896922,\n m01: 0.21267285140562253,\n m02: 0.0193338955823293,\n m10: 0.357576077643909,\n m11: 0.715152155287818,\n m12: 0.11919202588130297,\n m20: 0.18043748326639894,\n m21: 0.07217499330655958,\n m22: 0.9503040785363679\n },\n\n MtxXYZ2RGB: {\n m00: 3.2404541621141045,\n m01: -0.9692660305051868,\n m02: 0.055643430959114726,\n m10: -1.5371385127977166,\n m11: 1.8760108454466942,\n m12: -0.2040259135167538,\n m20: -0.498531409556016,\n m21: 0.041556017530349834,\n m22: 1.0572251882231791\n },\n\n // used in rgb2xyz\n As: 0.9414285350000001,\n Bs: 1.040417467,\n Cs: 1.089532651,\n\n MtxAdaptMa: {\n m00: 0.8951,\n m01: -0.7502,\n m02: 0.0389,\n m10: 0.2664,\n m11: 1.7135,\n m12: -0.0685,\n m20: -0.1614,\n m21: 0.0367,\n m22: 1.0296\n },\n\n MtxAdaptMaI: {\n m00: 0.9869929054667123,\n m01: 0.43230526972339456,\n m02: -0.008528664575177328,\n m10: -0.14705425642099013,\n m11: 0.5183602715367776,\n m12: 0.04004282165408487,\n m20: 0.15996265166373125,\n m21: 0.0492912282128556,\n m22: 0.9684866957875502\n }\n};\n\nexport default labConstants;\n\n// taken from https://de.mathworks.com/help/images/ref/whitepoint.html\nconst ILLUMINANTS = new Map([\n // ASTM E308-01\n ['a', [1.0985, 0.35585]],\n // Wyszecki & Stiles, p. 769\n ['b', [1.0985, 0.35585]],\n // C ASTM E308-01\n ['c', [0.98074, 1.18232]],\n // D50 (ASTM E308-01)\n ['d50', [0.96422, 0.82521]],\n // D55 (ASTM E308-01)\n ['d55', [0.95682, 0.92149]],\n // D65 (ASTM E308-01)\n ['d65', [0.95047, 1.08883]],\n // E (ASTM E308-01)\n ['e', [1, 1, 1]],\n // F2 (ASTM E308-01)\n ['f2', [0.99186, 0.67393]],\n // F7 (ASTM E308-01)\n ['f7', [0.95041, 1.08747]],\n // F11 (ASTM E308-01)\n ['f11', [1.00962, 0.6435]],\n ['icc', [0.96422, 0.82521]]\n]);\n\nexport function setLabWhitePoint(name) {\n const ill = ILLUMINANTS.get(String(name).toLowerCase());\n if (!ill) {\n throw new Error('unknown Lab illuminant ' + name);\n }\n labConstants.labWhitePoint = name;\n labConstants.Xn = ill[0];\n labConstants.Zn = ill[1];\n}\n\nexport function getLabWhitePoint() {\n return labConstants.labWhitePoint;\n}\n", "import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst lab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b] = args;\n const [x, y, z] = lab2xyz(L, a, b);\n const [r, g, b_] = xyz2rgb(x, y, z);\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst lab2xyz = (L, a, b) => {\n const { kE, kK, kKE, Xn, Yn, Zn } = LAB_CONSTANTS;\n\n const fy = (L + 16.0) / 116.0;\n const fx = 0.002 * a + fy;\n const fz = fy - 0.005 * b;\n\n const fx3 = fx * fx * fx;\n const fz3 = fz * fz * fz;\n\n const xr = fx3 > kE ? fx3 : (116.0 * fx - 16.0) / kK;\n const yr = L > kKE ? Math.pow((L + 16.0) / 116.0, 3.0) : L / kK;\n const zr = fz3 > kE ? fz3 : (116.0 * fz - 16.0) / kK;\n\n const x = xr * Xn;\n const y = yr * Yn;\n const z = zr * Zn;\n\n return [x, y, z];\n};\n\nconst compand = (linear) => {\n /* sRGB */\n const sign = Math.sign(linear);\n linear = Math.abs(linear);\n return (\n (linear <= 0.0031308\n ? linear * 12.92\n : 1.055 * Math.pow(linear, 1.0 / 2.4) - 0.055) * sign\n );\n};\n\nconst xyz2rgb = (x, y, z) => {\n const { MtxAdaptMa, MtxAdaptMaI, MtxXYZ2RGB, RefWhiteRGB, Xn, Yn, Zn } =\n LAB_CONSTANTS;\n\n const As = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bs = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cs = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n const Ad =\n RefWhiteRGB.X * MtxAdaptMa.m00 +\n RefWhiteRGB.Y * MtxAdaptMa.m10 +\n RefWhiteRGB.Z * MtxAdaptMa.m20;\n const Bd =\n RefWhiteRGB.X * MtxAdaptMa.m01 +\n RefWhiteRGB.Y * MtxAdaptMa.m11 +\n RefWhiteRGB.Z * MtxAdaptMa.m21;\n const Cd =\n RefWhiteRGB.X * MtxAdaptMa.m02 +\n RefWhiteRGB.Y * MtxAdaptMa.m12 +\n RefWhiteRGB.Z * MtxAdaptMa.m22;\n\n const X1 =\n (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20) *\n (Ad / As);\n const Y1 =\n (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21) *\n (Bd / Bs);\n const Z1 =\n (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22) *\n (Cd / Cs);\n\n const X2 =\n X1 * MtxAdaptMaI.m00 + Y1 * MtxAdaptMaI.m10 + Z1 * MtxAdaptMaI.m20;\n const Y2 =\n X1 * MtxAdaptMaI.m01 + Y1 * MtxAdaptMaI.m11 + Z1 * MtxAdaptMaI.m21;\n const Z2 =\n X1 * MtxAdaptMaI.m02 + Y1 * MtxAdaptMaI.m12 + Z1 * MtxAdaptMaI.m22;\n\n const r = compand(\n X2 * MtxXYZ2RGB.m00 + Y2 * MtxXYZ2RGB.m10 + Z2 * MtxXYZ2RGB.m20\n );\n const g = compand(\n X2 * MtxXYZ2RGB.m01 + Y2 * MtxXYZ2RGB.m11 + Z2 * MtxXYZ2RGB.m21\n );\n const b = compand(\n X2 * MtxXYZ2RGB.m02 + Y2 * MtxXYZ2RGB.m12 + Z2 * MtxXYZ2RGB.m22\n );\n\n return [r * 255, g * 255, b * 255];\n};\n\nexport default lab2rgb;\nexport { xyz2rgb };\n", "import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\nconst rgb2lab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [x, y, z] = rgb2xyz(r, g, b);\n const [L, a, b_] = xyz2lab(x, y, z);\n return [L, a, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nfunction xyz2lab(x, y, z) {\n const { Xn, Yn, Zn, kE, kK } = LAB_CONSTANTS;\n const xr = x / Xn;\n const yr = y / Yn;\n const zr = z / Zn;\n\n const fx = xr > kE ? Math.pow(xr, 1.0 / 3.0) : (kK * xr + 16.0) / 116.0;\n const fy = yr > kE ? Math.pow(yr, 1.0 / 3.0) : (kK * yr + 16.0) / 116.0;\n const fz = zr > kE ? Math.pow(zr, 1.0 / 3.0) : (kK * zr + 16.0) / 116.0;\n\n return [116.0 * fy - 16.0, 500.0 * (fx - fy), 200.0 * (fy - fz)];\n}\n\nfunction gammaAdjustSRGB(companded) {\n const sign = Math.sign(companded);\n companded = Math.abs(companded);\n const linear =\n companded <= 0.04045\n ? companded / 12.92\n : Math.pow((companded + 0.055) / 1.055, 2.4);\n return linear * sign;\n}\n\nconst rgb2xyz = (r, g, b) => {\n // normalize and gamma adjust\n r = gammaAdjustSRGB(r / 255);\n g = gammaAdjustSRGB(g / 255);\n b = gammaAdjustSRGB(b / 255);\n\n const { MtxRGB2XYZ, MtxAdaptMa, MtxAdaptMaI, Xn, Yn, Zn, As, Bs, Cs } =\n LAB_CONSTANTS;\n\n let x = r * MtxRGB2XYZ.m00 + g * MtxRGB2XYZ.m10 + b * MtxRGB2XYZ.m20;\n let y = r * MtxRGB2XYZ.m01 + g * MtxRGB2XYZ.m11 + b * MtxRGB2XYZ.m21;\n let z = r * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;\n\n const Ad = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bd = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cd = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20;\n let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21;\n let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22;\n\n X *= Ad / As;\n Y *= Bd / Bs;\n Z *= Cd / Cs;\n\n x = X * MtxAdaptMaI.m00 + Y * MtxAdaptMaI.m10 + Z * MtxAdaptMaI.m20;\n y = X * MtxAdaptMaI.m01 + Y * MtxAdaptMaI.m11 + Z * MtxAdaptMaI.m21;\n z = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;\n\n return [x, y, z];\n};\n\nexport default rgb2lab;\nexport { rgb2xyz };\n", "import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lab2rgb from './lab2rgb.js';\nimport rgb2lab from './rgb2lab.js';\nimport { getLabWhitePoint, setLabWhitePoint } from './lab-constants.js';\n\nColor.prototype.lab = function () {\n return rgb2lab(this._rgb);\n};\n\nconst lab = (...args) => new Color(...args, 'lab');\nObject.assign(chroma, { lab, getLabWhitePoint, setLabWhitePoint });\n\ninput.format.lab = lab2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'lab');\n if (type(args) === 'array' && args.length === 3) {\n return 'lab';\n }\n }\n});\n\nexport { lab, getLabWhitePoint, setLabWhitePoint };\n", "import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.darken = function (amount = 1) {\n const me = this;\n const lab = me.lab();\n lab[0] -= LAB_CONSTANTS.Kn * amount;\n return new Color(lab, 'lab').alpha(me.alpha(), true);\n};\n\nColor.prototype.brighten = function (amount = 1) {\n return this.darken(-amount);\n};\n\nColor.prototype.darker = Color.prototype.darken;\nColor.prototype.brighter = Color.prototype.brighten;\n", "import Color from '../Color.js';\n\nColor.prototype.get = function (mc) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) return src[i];\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n", "import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nconst { pow } = Math;\n\nconst EPS = 1e-7;\nconst MAX_ITER = 20;\n\nColor.prototype.luminance = function (lum, mode = 'rgb') {\n if (lum !== undefined && type(lum) === 'number') {\n if (lum === 0) {\n // return pure black\n return new Color([0, 0, 0, this._rgb[3]], 'rgb');\n }\n if (lum === 1) {\n // return pure white\n return new Color([255, 255, 255, this._rgb[3]], 'rgb');\n }\n // compute new color using...\n let cur_lum = this.luminance();\n let max_iter = MAX_ITER;\n\n const test = (low, high) => {\n const mid = low.interpolate(high, 0.5, mode);\n const lm = mid.luminance();\n if (Math.abs(lum - lm) < EPS || !max_iter--) {\n // close enough\n return mid;\n }\n return lm > lum ? test(low, mid) : test(mid, high);\n };\n\n const rgb = (\n cur_lum > lum\n ? test(new Color([0, 0, 0]), this)\n : test(this, new Color([255, 255, 255]))\n ).rgb();\n return new Color([...rgb, this._rgb[3]]);\n }\n return rgb2luminance(...this._rgb.slice(0, 3));\n};\n\nconst rgb2luminance = (r, g, b) => {\n // relative luminance\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n r = luminance_x(r);\n g = luminance_x(g);\n b = luminance_x(b);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nconst luminance_x = (x) => {\n x /= 255;\n return x <= 0.03928 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n};\n", "export default {};\n", "import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nimport interpolator from '../interpolator/index.js';\n\nexport default (col1, col2, f = 0.5, ...rest) => {\n let mode = rest[0] || 'lrgb';\n if (!interpolator[mode] && !rest.length) {\n // fall back to the first supported mode\n mode = Object.keys(interpolator)[0];\n }\n if (!interpolator[mode]) {\n throw new Error(`interpolation mode ${mode} is not defined`);\n }\n if (type(col1) !== 'object') col1 = new Color(col1);\n if (type(col2) !== 'object') col2 = new Color(col2);\n return interpolator[mode](col1, col2, f).alpha(\n col1.alpha() + f * (col2.alpha() - col1.alpha())\n );\n};\n", "import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.mix = Color.prototype.interpolate = function (\n col2,\n f = 0.5,\n ...rest\n) {\n return mix(this, col2, f, ...rest);\n};\n", "import Color from '../Color.js';\n\nColor.prototype.premultiply = function (mutate = false) {\n const rgb = this._rgb;\n const a = rgb[3];\n if (mutate) {\n this._rgb = [rgb[0] * a, rgb[1] * a, rgb[2] * a, a];\n return this;\n } else {\n return new Color([rgb[0] * a, rgb[1] * a, rgb[2] * a, a], 'rgb');\n }\n};\n", "import { unpack, DEG2RAD } from '../../utils/index.js';\nconst { sin, cos } = Math;\n\nconst lch2lab = (...args) => {\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n\n A saturation multiplier was added by Gregor Aisch\n */\n let [l, c, h] = unpack(args, 'lch');\n if (isNaN(h)) h = 0;\n h = h * DEG2RAD;\n return [l, cos(h) * c, sin(h) * c];\n};\n\nexport default lch2lab;\n", "import { unpack } from '../../utils/index.js';\nimport lch2lab from './lch2lab.js';\nimport lab2rgb from '../lab/lab2rgb.js';\n\nconst lch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = lab2rgb(L, a, b_);\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default lch2rgb;\n", "import { unpack, reverse3 } from '../../utils/index.js';\nimport lch2rgb from './lch2rgb.js';\n\nconst hcl2rgb = (...args) => {\n const hcl = reverse3(unpack(args, 'hcl'));\n return lch2rgb(...hcl);\n};\n\nexport default hcl2rgb;\n", "import { unpack, RAD2DEG } from '../../utils/index.js';\nconst { sqrt, atan2, round } = Math;\n\nconst lab2lch = (...args) => {\n const [l, a, b] = unpack(args, 'lab');\n const c = sqrt(a * a + b * b);\n let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n if (round(c * 10000) === 0) h = Number.NaN;\n return [l, c, h];\n};\n\nexport default lab2lch;\n", "import { unpack } from '../../utils/index.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lab2lch from './lab2lch.js';\n\nconst rgb2lch = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2lab(r, g, b);\n const [L, c, h] = lab2lch(l, a, b_);\n return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2lch;\n", "import { unpack, type, reverse3 } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lch2rgb from './lch2rgb.js';\nimport hcl2rgb from './hcl2rgb.js';\nimport rgb2lch from './rgb2lch.js';\n\nColor.prototype.lch = function () {\n return rgb2lch(this._rgb);\n};\nColor.prototype.hcl = function () {\n return reverse3(rgb2lch(this._rgb));\n};\n\nconst lch = (...args) => new Color(...args, 'lch');\nconst hcl = (...args) => new Color(...args, 'hcl');\n\nObject.assign(chroma, { lch, hcl });\n\ninput.format.lch = lch2rgb;\ninput.format.hcl = hcl2rgb;\n['lch', 'hcl'].forEach((m) =>\n input.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, m);\n if (type(args) === 'array' && args.length === 3) {\n return m;\n }\n }\n })\n);\n\nexport { lch, hcl };\n", "import '../io/lch/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.saturate = function (amount = 1) {\n const me = this;\n const lch = me.lch();\n lch[1] += LAB_CONSTANTS.Kn * amount;\n if (lch[1] < 0) lch[1] = 0;\n return new Color(lch, 'lch').alpha(me.alpha(), true);\n};\n\nColor.prototype.desaturate = function (amount = 1) {\n return this.saturate(-amount);\n};\n", "import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.set = function (mc, value, mutate = false) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) {\n if (type(value) == 'string') {\n switch (value.charAt(0)) {\n case '+':\n src[i] += +value;\n break;\n case '-':\n src[i] += +value;\n break;\n case '*':\n src[i] *= +value.substr(1);\n break;\n case '/':\n src[i] /= +value.substr(1);\n break;\n default:\n src[i] = +value;\n }\n } else if (type(value) === 'number') {\n src[i] = value;\n } else {\n throw new Error(`unsupported value for Color.set`);\n }\n const out = new Color(src, mode);\n if (mutate) {\n this._rgb = out._rgb;\n return this;\n }\n return out;\n }\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n", "import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.tint = function (f = 0.5, ...rest) {\n return mix(this, 'white', f, ...rest);\n};\n\nColor.prototype.shade = function (f = 0.5, ...rest) {\n return mix(this, 'black', f, ...rest);\n};\n", "import Color from '../Color.js';\nimport index from './index.js';\n\nconst rgb = (col1, col2, f) => {\n const xyz0 = col1._rgb;\n const xyz1 = col2._rgb;\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.rgb = rgb;\n\nexport default rgb;\n", "import Color from '../Color.js';\nconst { sqrt, pow } = Math;\nimport index from './index.js';\n\nconst lrgb = (col1, col2, f) => {\n const [x1, y1, z1] = col1._rgb;\n const [x2, y2, z2] = col2._rgb;\n return new Color(\n sqrt(pow(x1, 2) * (1 - f) + pow(x2, 2) * f),\n sqrt(pow(y1, 2) * (1 - f) + pow(y2, 2) * f),\n sqrt(pow(z1, 2) * (1 - f) + pow(z2, 2) * f),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.lrgb = lrgb;\n\nexport default lrgb;\n", "import '../io/lab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst lab = (col1, col2, f) => {\n const xyz0 = col1.lab();\n const xyz1 = col2.lab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'lab'\n );\n};\n\n// register interpolator\nindex.lab = lab;\n\nexport default lab;\n", "import Color from '../Color.js';\n\nexport default (col1, col2, f, m) => {\n let xyz0, xyz1;\n if (m === 'hsl') {\n xyz0 = col1.hsl();\n xyz1 = col2.hsl();\n } else if (m === 'hsv') {\n xyz0 = col1.hsv();\n xyz1 = col2.hsv();\n } else if (m === 'hcg') {\n xyz0 = col1.hcg();\n xyz1 = col2.hcg();\n } else if (m === 'hsi') {\n xyz0 = col1.hsi();\n xyz1 = col2.hsi();\n } else if (m === 'lch' || m === 'hcl') {\n m = 'hcl';\n xyz0 = col1.hcl();\n xyz1 = col2.hcl();\n } else if (m === 'oklch') {\n xyz0 = col1.oklch().reverse();\n xyz1 = col2.oklch().reverse();\n }\n\n let hue0, hue1, sat0, sat1, lbv0, lbv1;\n if (m.substr(0, 1) === 'h' || m === 'oklch') {\n [hue0, sat0, lbv0] = xyz0;\n [hue1, sat1, lbv1] = xyz1;\n }\n\n let sat, hue, lbv, dh;\n\n if (!isNaN(hue0) && !isNaN(hue1)) {\n // both colors have hue\n if (hue1 > hue0 && hue1 - hue0 > 180) {\n dh = hue1 - (hue0 + 360);\n } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n dh = hue1 + 360 - hue0;\n } else {\n dh = hue1 - hue0;\n }\n hue = hue0 + f * dh;\n } else if (!isNaN(hue0)) {\n hue = hue0;\n if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') sat = sat0;\n } else if (!isNaN(hue1)) {\n hue = hue1;\n if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') sat = sat1;\n } else {\n hue = Number.NaN;\n }\n\n if (sat === undefined) sat = sat0 + f * (sat1 - sat0);\n lbv = lbv0 + f * (lbv1 - lbv0);\n return m === 'oklch'\n ? new Color([lbv, sat, hue], m)\n : new Color([hue, sat, lbv], m);\n};\n", "import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst lch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'lch');\n};\n\n// register interpolator\nindex.lch = lch;\nindex.hcl = lch;\n\nexport default lch;\n", "import { type } from '../../utils/index.js';\n\nconst num2rgb = (num) => {\n if (type(num) == 'number' && num >= 0 && num <= 0xffffff) {\n const r = num >> 16;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return [r, g, b, 1];\n }\n throw new Error('unknown num color: ' + num);\n};\n\nexport default num2rgb;\n", "import { unpack } from '../../utils/index.js';\n\nconst rgb2num = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n return (r << 16) + (g << 8) + b;\n};\n\nexport default rgb2num;\n", "import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\nimport num2rgb from './num2rgb.js';\nimport rgb2num from './rgb2num.js';\n\nColor.prototype.num = function () {\n return rgb2num(this._rgb);\n};\n\nconst num = (...args) => new Color(...args, 'num');\n\nObject.assign(chroma, { num });\n\ninput.format.num = num2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (...args) => {\n if (\n args.length === 1 &&\n type(args[0]) === 'number' &&\n args[0] >= 0 &&\n args[0] <= 0xffffff\n ) {\n return 'num';\n }\n }\n});\n\nexport { num };\n", "import '../io/num/index.js';\nimport index from './index.js';\n\nimport Color from '../Color.js';\n\nconst num = (col1, col2, f) => {\n const c1 = col1.num();\n const c2 = col2.num();\n return new Color(c1 + f * (c2 - c1), 'num');\n};\n\n// register interpolator\nindex.num = num;\n\nexport default num;\n", "import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\n/*\n * this is basically just HSV with some minor tweaks\n *\n * hue.. [0..360]\n * chroma .. [0..1]\n * grayness .. [0..1]\n */\n\nconst hcg2rgb = (...args) => {\n args = unpack(args, 'hcg');\n let [h, c, _g] = args;\n let r, g, b;\n _g = _g * 255;\n const _c = c * 255;\n if (c === 0) {\n r = g = b = _g;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n const i = floor(h);\n const f = h - i;\n const p = _g * (1 - c);\n const q = p + _c * (1 - f);\n const t = p + _c * f;\n const v = p + _c;\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hcg2rgb;\n", "import { unpack, max, min } from '../../utils/index.js';\n\nconst rgb2hcg = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n const delta = maxRgb - minRgb;\n const c = (delta * 100) / 255;\n const _g = (minRgb / (255 - delta)) * 100;\n let h;\n if (delta === 0) {\n h = Number.NaN;\n } else {\n if (r === maxRgb) h = (g - b) / delta;\n if (g === maxRgb) h = 2 + (b - r) / delta;\n if (b === maxRgb) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, c, _g];\n};\n\nexport default rgb2hcg;\n", "import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hcg2rgb from './hcg2rgb.js';\nimport rgb2hcg from './rgb2hcg.js';\n\nColor.prototype.hcg = function () {\n return rgb2hcg(this._rgb);\n};\n\nconst hcg = (...args) => new Color(...args, 'hcg');\nchroma.hcg = hcg;\n\ninput.format.hcg = hcg2rgb;\n\ninput.autodetect.push({\n p: 1,\n test: (...args) => {\n args = unpack(args, 'hcg');\n if (type(args) === 'array' && args.length === 3) {\n return 'hcg';\n }\n }\n});\n\nexport { hcg };\n", "import '../io/hcg/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hcg = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hcg');\n};\n\n// register interpolator\nindex.hcg = hcg;\n\nexport default hcg;\n", "import { unpack, limit, TWOPI, PITHIRD } from '../../utils/index.js';\nconst { cos } = Math;\n\n/*\n * hue [0..360]\n * saturation [0..1]\n * intensity [0..1]\n */\nconst hsi2rgb = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n */\n args = unpack(args, 'hsi');\n let [h, s, i] = args;\n let r, g, b;\n\n if (isNaN(h)) h = 0;\n if (isNaN(s)) s = 0;\n // normalize hue\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 360;\n if (h < 1 / 3) {\n b = (1 - s) / 3;\n r = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n g = 1 - (b + r);\n } else if (h < 2 / 3) {\n h -= 1 / 3;\n r = (1 - s) / 3;\n g = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n b = 1 - (r + g);\n } else {\n h -= 2 / 3;\n g = (1 - s) / 3;\n b = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n r = 1 - (g + b);\n }\n r = limit(i * r * 3);\n g = limit(i * g * 3);\n b = limit(i * b * 3);\n return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsi2rgb;\n", "import { unpack, TWOPI } from '../../utils/index.js';\nconst { min, sqrt, acos } = Math;\n\nconst rgb2hsi = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n */\n let [r, g, b] = unpack(args, 'rgb');\n r /= 255;\n g /= 255;\n b /= 255;\n let h;\n const min_ = min(r, g, b);\n const i = (r + g + b) / 3;\n const s = i > 0 ? 1 - min_ / i : 0;\n if (s === 0) {\n h = NaN;\n } else {\n h = (r - g + (r - b)) / 2;\n h /= sqrt((r - g) * (r - g) + (r - b) * (g - b));\n h = acos(h);\n if (b > g) {\n h = TWOPI - h;\n }\n h /= TWOPI;\n }\n return [h * 360, s, i];\n};\n\nexport default rgb2hsi;\n", "import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsi2rgb from './hsi2rgb.js';\nimport rgb2hsi from './rgb2hsi.js';\n\nColor.prototype.hsi = function () {\n return rgb2hsi(this._rgb);\n};\n\nconst hsi = (...args) => new Color(...args, 'hsi');\nchroma.hsi = hsi;\n\ninput.format.hsi = hsi2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsi');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsi';\n }\n }\n});\n\nexport { hsi };\n", "import '../io/hsi/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsi = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsi');\n};\n\n// register interpolator\nindex.hsi = hsi;\n\nexport default hsi;\n", "import { unpack } from '../../utils/index.js';\n\nconst hsl2rgb = (...args) => {\n args = unpack(args, 'hsl');\n const [h, s, l] = args;\n let r, g, b;\n if (s === 0) {\n r = g = b = l * 255;\n } else {\n const t3 = [0, 0, 0];\n const c = [0, 0, 0];\n const t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const t1 = 2 * l - t2;\n const h_ = h / 360;\n t3[0] = h_ + 1 / 3;\n t3[1] = h_;\n t3[2] = h_ - 1 / 3;\n for (let i = 0; i < 3; i++) {\n if (t3[i] < 0) t3[i] += 1;\n if (t3[i] > 1) t3[i] -= 1;\n if (6 * t3[i] < 1) c[i] = t1 + (t2 - t1) * 6 * t3[i];\n else if (2 * t3[i] < 1) c[i] = t2;\n else if (3 * t3[i] < 2) c[i] = t1 + (t2 - t1) * (2 / 3 - t3[i]) * 6;\n else c[i] = t1;\n }\n [r, g, b] = [c[0] * 255, c[1] * 255, c[2] * 255];\n }\n if (args.length > 3) {\n // keep alpha channel\n return [r, g, b, args[3]];\n }\n return [r, g, b, 1];\n};\n\nexport default hsl2rgb;\n", "import { unpack, min, max } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - rgb2hsl(r,g,b)\n * - rgb2hsl(r,g,b,a)\n * - rgb2hsl([r,g,b])\n * - rgb2hsl([r,g,b,a])\n * - rgb2hsl({r,g,b,a})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgba');\n let [r, g, b] = args;\n\n r /= 255;\n g /= 255;\n b /= 255;\n\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n\n const l = (maxRgb + minRgb) / 2;\n let s, h;\n\n if (maxRgb === minRgb) {\n s = 0;\n h = Number.NaN;\n } else {\n s =\n l < 0.5\n ? (maxRgb - minRgb) / (maxRgb + minRgb)\n : (maxRgb - minRgb) / (2 - maxRgb - minRgb);\n }\n\n if (r == maxRgb) h = (g - b) / (maxRgb - minRgb);\n else if (g == maxRgb) h = 2 + (b - r) / (maxRgb - minRgb);\n else if (b == maxRgb) h = 4 + (r - g) / (maxRgb - minRgb);\n\n h *= 60;\n if (h < 0) h += 360;\n if (args.length > 3 && args[3] !== undefined) return [h, s, l, args[3]];\n return [h, s, l];\n};\n\nexport default rgb2hsl;\n", "import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsl2rgb from './hsl2rgb.js';\nimport rgb2hsl from './rgb2hsl.js';\n\nColor.prototype.hsl = function () {\n return rgb2hsl(this._rgb);\n};\n\nconst hsl = (...args) => new Color(...args, 'hsl');\nchroma.hsl = hsl;\n\ninput.format.hsl = hsl2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsl');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsl';\n }\n }\n});\n\nexport { hsl };\n", "import '../io/hsl/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsl = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsl');\n};\n\n// register interpolator\nindex.hsl = hsl;\n\nexport default hsl;\n", "import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\nconst hsv2rgb = (...args) => {\n args = unpack(args, 'hsv');\n let [h, s, v] = args;\n let r, g, b;\n v *= 255;\n if (s === 0) {\n r = g = b = v;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n\n const i = floor(h);\n const f = h - i;\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsv2rgb;\n", "import { unpack } from '../../utils/index.js';\nconst { min, max } = Math;\n\n/*\n * supported arguments:\n * - rgb2hsv(r,g,b)\n * - rgb2hsv([r,g,b])\n * - rgb2hsv({r,g,b})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgb');\n let [r, g, b] = args;\n const min_ = min(r, g, b);\n const max_ = max(r, g, b);\n const delta = max_ - min_;\n let h, s, v;\n v = max_ / 255.0;\n if (max_ === 0) {\n h = Number.NaN;\n s = 0;\n } else {\n s = delta / max_;\n if (r === max_) h = (g - b) / delta;\n if (g === max_) h = 2 + (b - r) / delta;\n if (b === max_) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, s, v];\n};\n\nexport default rgb2hsl;\n", "import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsv2rgb from './hsv2rgb.js';\nimport rgb2hsv from './rgb2hsv.js';\n\nColor.prototype.hsv = function () {\n return rgb2hsv(this._rgb);\n};\n\nconst hsv = (...args) => new Color(...args, 'hsv');\nchroma.hsv = hsv;\n\ninput.format.hsv = hsv2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsv');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsv';\n }\n }\n});\n\nexport { hsv };\n", "import '../io/hsv/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsv = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsv');\n};\n\n// register interpolator\nindex.hsv = hsv;\n\nexport default hsv;\n", "// from https://www.w3.org/TR/css-color-4/multiply-matrices.js\nexport default function multiplyMatrices(A, B) {\n let m = A.length;\n\n if (!Array.isArray(A[0])) {\n // A is vector, convert to [[a, b, c, ...]]\n A = [A];\n }\n\n if (!Array.isArray(B[0])) {\n // B is vector, convert to [[a], [b], [c], ...]]\n B = B.map((x) => [x]);\n }\n\n let p = B[0].length;\n let B_cols = B[0].map((_, i) => B.map((x) => x[i])); // transpose B\n let product = A.map((row) =>\n B_cols.map((col) => {\n if (!Array.isArray(row)) {\n return col.reduce((a, c) => a + c * row, 0);\n }\n\n return row.reduce((a, c, i) => a + c * (col[i] || 0), 0);\n })\n );\n\n if (m === 1) {\n product = product[0]; // Avoid [[a, b, c, ...]]\n }\n\n if (p === 1) {\n return product.map((x) => x[0]); // Avoid [[a], [b], [c], ...]]\n }\n\n return product;\n}\n", "import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { xyz2rgb } from '../lab/lab2rgb.js';\n\nconst oklab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b, ...rest] = args;\n const [X, Y, Z] = OKLab_to_XYZ([L, a, b]);\n const [r, g, b_] = xyz2rgb(X, Y, Z);\n return [r, g, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction OKLab_to_XYZ(OKLab) {\n // Given OKLab, convert to XYZ relative to D65\n var LMStoXYZ = [\n [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],\n [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],\n [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816]\n ];\n var OKLabtoLMS = [\n [1.0, 0.3963377773761749, 0.2158037573099136],\n [1.0, -0.1055613458156586, -0.0638541728258133],\n [1.0, -0.0894841775298119, -1.2914855480194092]\n ];\n\n var LMSnl = multiplyMatrices(OKLabtoLMS, OKLab);\n return multiplyMatrices(\n LMStoXYZ,\n LMSnl.map((c) => c ** 3)\n );\n}\n\nexport default oklab2rgb;\n", "import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { rgb2xyz } from '../lab/rgb2lab.js';\n\nconst rgb2oklab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const xyz = rgb2xyz(r, g, b);\n const oklab = XYZ_to_OKLab(xyz);\n return [...oklab, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction XYZ_to_OKLab(XYZ) {\n // Given XYZ relative to D65, convert to OKLab\n const XYZtoLMS = [\n [0.819022437996703, 0.3619062600528904, -0.1288737815209879],\n [0.0329836539323885, 0.9292868615863434, 0.0361446663506424],\n [0.0481771893596242, 0.2642395317527308, 0.6335478284694309]\n ];\n const LMStoOKLab = [\n [0.210454268309314, 0.7936177747023054, -0.0040720430116193],\n [1.9779985324311684, -2.4285922420485799, 0.450593709617411],\n [0.0259040424655478, 0.7827717124575296, -0.8086757549230774]\n ];\n\n const LMS = multiplyMatrices(XYZtoLMS, XYZ);\n // JavaScript Math.cbrt returns a sign-matched cube root\n // beware if porting to other languages\n // especially if tempted to use a general power function\n return multiplyMatrices(\n LMStoOKLab,\n LMS.map((c) => Math.cbrt(c))\n );\n // L in range [0,1]. For use in CSS, multiply by 100 and add a percent\n}\n\nexport default rgb2oklab;\n", "import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklab2rgb from './oklab2rgb.js';\nimport rgb2oklab from './rgb2oklab.js';\n\nColor.prototype.oklab = function () {\n return rgb2oklab(this._rgb);\n};\n\nconst oklab = (...args) => new Color(...args, 'oklab');\nObject.assign(chroma, { oklab });\n\ninput.format.oklab = oklab2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'oklab');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklab';\n }\n }\n});\n\nexport { oklab };\n", "import '../io/oklab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst oklab = (col1, col2, f) => {\n const xyz0 = col1.oklab();\n const xyz1 = col2.oklab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'oklab'\n );\n};\n\n// register interpolator\nindex.oklab = oklab;\n\nexport default oklab;\n", "import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst oklch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'oklch');\n};\n\n// register interpolator\nindex.oklch = oklch;\n\nexport default oklch;\n", "import Color from '../Color.js';\nimport { clip_rgb } from '../utils/index.js';\n\nconst { pow, sqrt, PI, cos, sin, atan2 } = Math;\n\nexport default (colors, mode = 'lrgb', weights = null) => {\n const l = colors.length;\n if (!weights) weights = Array.from(new Array(l)).map(() => 1);\n // normalize weights\n const k =\n l /\n weights.reduce(function (a, b) {\n return a + b;\n });\n weights.forEach((w, i) => {\n weights[i] *= k;\n });\n // convert colors to Color objects\n colors = colors.map((c) => new Color(c));\n if (mode === 'lrgb') {\n return _average_lrgb(colors, weights);\n }\n const first = colors.shift();\n const xyz = first.get(mode);\n const cnt = [];\n let dx = 0;\n let dy = 0;\n // initial color\n for (let i = 0; i < xyz.length; i++) {\n xyz[i] = (xyz[i] || 0) * weights[0];\n cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n const A = (xyz[i] / 180) * PI;\n dx += cos(A) * weights[0];\n dy += sin(A) * weights[0];\n }\n }\n\n let alpha = first.alpha() * weights[0];\n colors.forEach((c, ci) => {\n const xyz2 = c.get(mode);\n alpha += c.alpha() * weights[ci + 1];\n for (let i = 0; i < xyz.length; i++) {\n if (!isNaN(xyz2[i])) {\n cnt[i] += weights[ci + 1];\n if (mode.charAt(i) === 'h') {\n const A = (xyz2[i] / 180) * PI;\n dx += cos(A) * weights[ci + 1];\n dy += sin(A) * weights[ci + 1];\n } else {\n xyz[i] += xyz2[i] * weights[ci + 1];\n }\n }\n }\n });\n\n for (let i = 0; i < xyz.length; i++) {\n if (mode.charAt(i) === 'h') {\n let A = (atan2(dy / cnt[i], dx / cnt[i]) / PI) * 180;\n while (A < 0) A += 360;\n while (A >= 360) A -= 360;\n xyz[i] = A;\n } else {\n xyz[i] = xyz[i] / cnt[i];\n }\n }\n alpha /= l;\n return new Color(xyz, mode).alpha(alpha > 0.99999 ? 1 : alpha, true);\n};\n\nconst _average_lrgb = (colors, weights) => {\n const l = colors.length;\n const xyz = [0, 0, 0, 0];\n for (let i = 0; i < colors.length; i++) {\n const col = colors[i];\n const f = weights[i] / l;\n const rgb = col._rgb;\n xyz[0] += pow(rgb[0], 2) * f;\n xyz[1] += pow(rgb[1], 2) * f;\n xyz[2] += pow(rgb[2], 2) * f;\n xyz[3] += rgb[3] * f;\n }\n xyz[0] = sqrt(xyz[0]);\n xyz[1] = sqrt(xyz[1]);\n xyz[2] = sqrt(xyz[2]);\n if (xyz[3] > 0.9999999) xyz[3] = 1;\n return new Color(clip_rgb(xyz));\n};\n", "// minimal multi-purpose interface\n\n// @requires utils color analyze\nimport chroma from '../chroma.js';\nimport { limit, type } from '../utils/index.js';\n\nconst { pow } = Math;\n\nexport default function (colors) {\n // constructor\n let _mode = 'rgb';\n let _nacol = chroma('#ccc');\n let _spread = 0;\n // const _fixed = false;\n let _domain = [0, 1];\n let _pos = [];\n let _padding = [0, 0];\n let _classes = false;\n let _colors = [];\n let _out = false;\n let _min = 0;\n let _max = 1;\n let _correctLightness = false;\n let _colorCache = {};\n let _useCache = true;\n let _gamma = 1;\n\n // private methods\n\n const setColors = function (colors) {\n colors = colors || ['#fff', '#000'];\n if (\n colors &&\n type(colors) === 'string' &&\n chroma.brewer &&\n chroma.brewer[colors.toLowerCase()]\n ) {\n colors = chroma.brewer[colors.toLowerCase()];\n }\n if (type(colors) === 'array') {\n // handle single color\n if (colors.length === 1) {\n colors = [colors[0], colors[0]];\n }\n // make a copy of the colors\n colors = colors.slice(0);\n // convert to chroma classes\n for (let c = 0; c < colors.length; c++) {\n colors[c] = chroma(colors[c]);\n }\n // auto-fill color position\n _pos.length = 0;\n for (let c = 0; c < colors.length; c++) {\n _pos.push(c / (colors.length - 1));\n }\n }\n resetCache();\n return (_colors = colors);\n };\n\n const getClass = function (value) {\n if (_classes != null) {\n const n = _classes.length - 1;\n let i = 0;\n while (i < n && value >= _classes[i]) {\n i++;\n }\n return i - 1;\n }\n return 0;\n };\n\n let tMapLightness = (t) => t;\n let tMapDomain = (t) => t;\n\n // const classifyValue = function(value) {\n // let val = value;\n // if (_classes.length > 2) {\n // const n = _classes.length-1;\n // const i = getClass(value);\n // const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5))); // center of 1st class\n // const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5))); // center of last class\n // val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n // }\n // return val;\n // };\n\n const getColor = function (val, bypassMap) {\n let col, t;\n if (bypassMap == null) {\n bypassMap = false;\n }\n if (isNaN(val) || val === null) {\n return _nacol;\n }\n if (!bypassMap) {\n if (_classes && _classes.length > 2) {\n // find the class\n const c = getClass(val);\n t = c / (_classes.length - 2);\n } else if (_max !== _min) {\n // just interpolate between min/max\n t = (val - _min) / (_max - _min);\n } else {\n t = 1;\n }\n } else {\n t = val;\n }\n\n // domain map\n t = tMapDomain(t);\n\n if (!bypassMap) {\n t = tMapLightness(t); // lightness correction\n }\n\n if (_gamma !== 1) {\n t = pow(t, _gamma);\n }\n\n t = _padding[0] + t * (1 - _padding[0] - _padding[1]);\n\n t = limit(t, 0, 1);\n\n const k = Math.floor(t * 10000);\n\n if (_useCache && _colorCache[k]) {\n col = _colorCache[k];\n } else {\n if (type(_colors) === 'array') {\n //for i in [0.._pos.length-1]\n for (let i = 0; i < _pos.length; i++) {\n const p = _pos[i];\n if (t <= p) {\n col = _colors[i];\n break;\n }\n if (t >= p && i === _pos.length - 1) {\n col = _colors[i];\n break;\n }\n if (t > p && t < _pos[i + 1]) {\n t = (t - p) / (_pos[i + 1] - p);\n col = chroma.interpolate(\n _colors[i],\n _colors[i + 1],\n t,\n _mode\n );\n break;\n }\n }\n } else if (type(_colors) === 'function') {\n col = _colors(t);\n }\n if (_useCache) {\n _colorCache[k] = col;\n }\n }\n return col;\n };\n\n var resetCache = () => (_colorCache = {});\n\n setColors(colors);\n\n // public interface\n\n const f = function (v) {\n const c = chroma(getColor(v));\n if (_out && c[_out]) {\n return c[_out]();\n } else {\n return c;\n }\n };\n\n f.classes = function (classes) {\n if (classes != null) {\n if (type(classes) === 'array') {\n _classes = classes;\n _domain = [classes[0], classes[classes.length - 1]];\n } else {\n const d = chroma.analyze(_domain);\n if (classes === 0) {\n _classes = [d.min, d.max];\n } else {\n _classes = chroma.limits(d, 'e', classes);\n }\n }\n return f;\n }\n return _classes;\n };\n\n f.domain = function (domain) {\n if (!arguments.length) {\n return _domain;\n }\n _min = domain[0];\n _max = domain[domain.length - 1];\n _pos = [];\n const k = _colors.length;\n if (domain.length === k && _min !== _max) {\n // update positions\n for (let d of Array.from(domain)) {\n _pos.push((d - _min) / (_max - _min));\n }\n } else {\n for (let c = 0; c < k; c++) {\n _pos.push(c / (k - 1));\n }\n if (domain.length > 2) {\n // set domain map\n const tOut = domain.map((d, i) => i / (domain.length - 1));\n const tBreaks = domain.map((d) => (d - _min) / (_max - _min));\n if (!tBreaks.every((val, i) => tOut[i] === val)) {\n tMapDomain = (t) => {\n if (t <= 0 || t >= 1) return t;\n let i = 0;\n while (t >= tBreaks[i + 1]) i++;\n const f =\n (t - tBreaks[i]) / (tBreaks[i + 1] - tBreaks[i]);\n const out = tOut[i] + f * (tOut[i + 1] - tOut[i]);\n return out;\n };\n }\n }\n }\n _domain = [_min, _max];\n return f;\n };\n\n f.mode = function (_m) {\n if (!arguments.length) {\n return _mode;\n }\n _mode = _m;\n resetCache();\n return f;\n };\n\n f.range = function (colors, _pos) {\n setColors(colors, _pos);\n return f;\n };\n\n f.out = function (_o) {\n _out = _o;\n return f;\n };\n\n f.spread = function (val) {\n if (!arguments.length) {\n return _spread;\n }\n _spread = val;\n return f;\n };\n\n f.correctLightness = function (v) {\n if (v == null) {\n v = true;\n }\n _correctLightness = v;\n resetCache();\n if (_correctLightness) {\n tMapLightness = function (t) {\n const L0 = getColor(0, true).lab()[0];\n const L1 = getColor(1, true).lab()[0];\n const pol = L0 > L1;\n let L_actual = getColor(t, true).lab()[0];\n const L_ideal = L0 + (L1 - L0) * t;\n let L_diff = L_actual - L_ideal;\n let t0 = 0;\n let t1 = 1;\n let max_iter = 20;\n while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n (function () {\n if (pol) {\n L_diff *= -1;\n }\n if (L_diff < 0) {\n t0 = t;\n t += (t1 - t) * 0.5;\n } else {\n t1 = t;\n t += (t0 - t) * 0.5;\n }\n L_actual = getColor(t, true).lab()[0];\n return (L_diff = L_actual - L_ideal);\n })();\n }\n return t;\n };\n } else {\n tMapLightness = (t) => t;\n }\n return f;\n };\n\n f.padding = function (p) {\n if (p != null) {\n if (type(p) === 'number') {\n p = [p, p];\n }\n _padding = p;\n return f;\n } else {\n return _padding;\n }\n };\n\n f.colors = function (numColors, out) {\n // If no arguments are given, return the original colors that were provided\n if (arguments.length < 2) {\n out = 'hex';\n }\n let result = [];\n\n if (arguments.length === 0) {\n result = _colors.slice(0);\n } else if (numColors === 1) {\n result = [f(0.5)];\n } else if (numColors > 1) {\n const dm = _domain[0];\n const dd = _domain[1] - dm;\n result = __range__(0, numColors, false).map((i) =>\n f(dm + (i / (numColors - 1)) * dd)\n );\n } else {\n // returns all colors based on the defined classes\n colors = [];\n let samples = [];\n if (_classes && _classes.length > 2) {\n for (\n let i = 1, end = _classes.length, asc = 1 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n }\n } else {\n samples = _domain;\n }\n result = samples.map((v) => f(v));\n }\n\n if (chroma[out]) {\n result = result.map((c) => c[out]());\n }\n return result;\n };\n\n f.cache = function (c) {\n if (c != null) {\n _useCache = c;\n return f;\n } else {\n return _useCache;\n }\n };\n\n f.gamma = function (g) {\n if (g != null) {\n _gamma = g;\n return f;\n } else {\n return _gamma;\n }\n };\n\n f.nodata = function (d) {\n if (d != null) {\n _nacol = chroma(d);\n return f;\n } else {\n return _nacol;\n }\n };\n\n return f;\n}\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n", "//\n// interpolates between a set of colors uzing a bezier spline\n//\n\n// @requires utils lab\nimport Color from '../Color.js';\nimport '../io/lab/index.js';\nimport scale from './scale.js';\n\n// nth row of the pascal triangle\nconst binom_row = function (n) {\n let row = [1, 1];\n for (let i = 1; i < n; i++) {\n let newrow = [1];\n for (let j = 1; j <= row.length; j++) {\n newrow[j] = (row[j] || 0) + row[j - 1];\n }\n row = newrow;\n }\n return row;\n};\n\nconst bezier = function (colors) {\n let I, lab0, lab1, lab2;\n colors = colors.map((c) => new Color(c));\n if (colors.length === 2) {\n // linear interpolation\n [lab0, lab1] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map((i) => lab0[i] + t * (lab1[i] - lab0[i]));\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 3) {\n // quadratic bezier interpolation\n [lab0, lab1, lab2] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * lab0[i] +\n 2 * (1 - t) * t * lab1[i] +\n t * t * lab2[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 4) {\n // cubic bezier interpolation\n let lab3;\n [lab0, lab1, lab2, lab3] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * (1 - t) * lab0[i] +\n 3 * (1 - t) * (1 - t) * t * lab1[i] +\n 3 * (1 - t) * t * t * lab2[i] +\n t * t * t * lab3[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length >= 5) {\n // general case (degree n bezier)\n let labs, row, n;\n labs = colors.map((c) => c.lab());\n n = colors.length - 1;\n row = binom_row(n);\n I = function (t) {\n const u = 1 - t;\n const lab = [0, 1, 2].map((i) =>\n labs.reduce(\n (sum, el, j) =>\n sum + row[j] * u ** (n - j) * t ** j * el[i],\n 0\n )\n );\n return new Color(lab, 'lab');\n };\n } else {\n throw new RangeError('No point in running bezier with only one color.');\n }\n return I;\n};\n\nexport default (colors) => {\n const f = bezier(colors);\n f.scale = () => scale(f);\n return f;\n};\n", "import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nconst { round } = Math;\n\nColor.prototype.rgb = function (rnd = true) {\n if (rnd === false) return this._rgb.slice(0, 3);\n return this._rgb.slice(0, 3).map(round);\n};\n\nColor.prototype.rgba = function (rnd = true) {\n return this._rgb.slice(0, 4).map((v, i) => {\n return i < 3 ? (rnd === false ? v : round(v)) : v;\n });\n};\n\nconst rgb = (...args) => new Color(...args, 'rgb');\nObject.assign(chroma, { rgb });\n\ninput.format.rgb = (...args) => {\n const rgba = unpack(args, 'rgba');\n if (rgba[3] === undefined) rgba[3] = 1;\n return rgba;\n};\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'rgba');\n if (\n type(args) === 'array' &&\n (args.length === 3 ||\n (args.length === 4 &&\n type(args[3]) == 'number' &&\n args[3] >= 0 &&\n args[3] <= 1))\n ) {\n return 'rgb';\n }\n }\n});\n\nexport { rgb };\n", "/*\n * interpolates between a set of colors uzing a bezier spline\n * blend mode formulas taken from https://web.archive.org/web/20180110014946/http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n */\n\nimport '../io/rgb/index.js';\nimport chroma from '../chroma.js';\n\nconst blend = (bottom, top, mode) => {\n if (!blend[mode]) {\n throw new Error('unknown blend mode ' + mode);\n }\n return blend[mode](bottom, top);\n};\n\nconst blend_f = (f) => (bottom, top) => {\n const c0 = chroma(top).rgb();\n const c1 = chroma(bottom).rgb();\n return chroma.rgb(f(c0, c1));\n};\n\nconst each = (f) => (c0, c1) => {\n const out = [];\n out[0] = f(c0[0], c1[0]);\n out[1] = f(c0[1], c1[1]);\n out[2] = f(c0[2], c1[2]);\n return out;\n};\n\nconst normal = (a) => a;\nconst multiply = (a, b) => (a * b) / 255;\nconst darken = (a, b) => (a > b ? b : a);\nconst lighten = (a, b) => (a > b ? a : b);\nconst screen = (a, b) => 255 * (1 - (1 - a / 255) * (1 - b / 255));\nconst overlay = (a, b) =>\n b < 128 ? (2 * a * b) / 255 : 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\nconst burn = (a, b) => 255 * (1 - (1 - b / 255) / (a / 255));\nconst dodge = (a, b) => {\n if (a === 255) return 255;\n a = (255 * (b / 255)) / (1 - a / 255);\n return a > 255 ? 255 : a;\n};\n\n// # add = (a,b) ->\n// # if (a + b > 255) then 255 else a + b\n\nblend.normal = blend_f(each(normal));\nblend.multiply = blend_f(each(multiply));\nblend.screen = blend_f(each(screen));\nblend.overlay = blend_f(each(overlay));\nblend.darken = blend_f(each(darken));\nblend.lighten = blend_f(each(lighten));\nblend.dodge = blend_f(each(dodge));\nblend.burn = blend_f(each(burn));\n// blend.add = blend_f(each(add));\n\nexport default blend;\n", "// cubehelix interpolation\n// based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n// http://astron-soc.in/bulletin/11June/289392011.pdf\nimport { type, clip_rgb, TWOPI } from '../utils/index.js';\nimport chroma from '../chroma.js';\nconst { pow, sin, cos } = Math;\n\nexport default function (\n start = 300,\n rotations = -1.5,\n hue = 1,\n gamma = 1,\n lightness = [0, 1]\n) {\n let dh = 0,\n dl;\n if (type(lightness) === 'array') {\n dl = lightness[1] - lightness[0];\n } else {\n dl = 0;\n lightness = [lightness, lightness];\n }\n const f = function (fract) {\n const a = TWOPI * ((start + 120) / 360 + rotations * fract);\n const l = pow(lightness[0] + dl * fract, gamma);\n const h = dh !== 0 ? hue[0] + fract * dh : hue;\n const amp = (h * l * (1 - l)) / 2;\n const cos_a = cos(a);\n const sin_a = sin(a);\n const r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n const g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n const b = l + amp * (+1.97294 * cos_a);\n return chroma(clip_rgb([r * 255, g * 255, b * 255, 1]));\n };\n f.start = function (s) {\n if (s == null) {\n return start;\n }\n start = s;\n return f;\n };\n f.rotations = function (r) {\n if (r == null) {\n return rotations;\n }\n rotations = r;\n return f;\n };\n f.gamma = function (g) {\n if (g == null) {\n return gamma;\n }\n gamma = g;\n return f;\n };\n f.hue = function (h) {\n if (h == null) {\n return hue;\n }\n hue = h;\n if (type(hue) === 'array') {\n dh = hue[1] - hue[0];\n if (dh === 0) {\n hue = hue[1];\n }\n } else {\n dh = 0;\n }\n return f;\n };\n f.lightness = function (h) {\n if (h == null) {\n return lightness;\n }\n if (type(h) === 'array') {\n lightness = h;\n dl = h[1] - h[0];\n } else {\n lightness = [h, h];\n dl = 0;\n }\n return f;\n };\n f.scale = () => chroma.scale(f);\n f.hue(hue);\n return f;\n}\n", "import Color from '../Color.js';\nconst digits = '0123456789abcdef';\n\nconst { floor, random } = Math;\n\nexport default () => {\n let code = '#';\n for (let i = 0; i < 6; i++) {\n code += digits.charAt(floor(random() * 16));\n }\n return new Color(code, 'hex');\n};\n", "import type from './type.js';\n\nconst { log, pow, floor, abs } = Math;\n\nexport function analyze(data, key = null) {\n const r = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n if (type(data) === 'object') {\n data = Object.values(data);\n }\n data.forEach((val) => {\n if (key && type(val) === 'object') val = val[key];\n if (val !== undefined && val !== null && !isNaN(val)) {\n r.values.push(val);\n r.sum += val;\n if (val < r.min) r.min = val;\n if (val > r.max) r.max = val;\n r.count += 1;\n }\n });\n\n r.domain = [r.min, r.max];\n\n r.limits = (mode, num) => limits(r, mode, num);\n\n return r;\n}\n\nexport function limits(data, mode = 'equal', num = 7) {\n if (type(data) == 'array') {\n data = analyze(data);\n }\n const { min, max } = data;\n const values = data.values.sort((a, b) => a - b);\n\n if (num === 1) {\n return [min, max];\n }\n\n const limits = [];\n\n if (mode.substr(0, 1) === 'c') {\n // continuous\n limits.push(min);\n limits.push(max);\n }\n\n if (mode.substr(0, 1) === 'e') {\n // equal interval\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(min + (i / num) * (max - min));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'l') {\n // log scale\n if (min <= 0) {\n throw new Error(\n 'Logarithmic scales are only possible for values > 0'\n );\n }\n const min_log = Math.LOG10E * log(min);\n const max_log = Math.LOG10E * log(max);\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'q') {\n // quantile scale\n limits.push(min);\n for (let i = 1; i < num; i++) {\n const p = ((values.length - 1) * i) / num;\n const pb = floor(p);\n if (pb === p) {\n limits.push(values[pb]);\n } else {\n // p > pb\n const pr = p - pb;\n limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n }\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'k') {\n // k-means clustering\n /*\n implementation based on\n http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n simplified for 1-d input values\n */\n let cluster;\n const n = values.length;\n const assignments = new Array(n);\n const clusterSizes = new Array(num);\n let repeat = true;\n let nb_iters = 0;\n let centroids = null;\n\n // get seed values\n centroids = [];\n centroids.push(min);\n for (let i = 1; i < num; i++) {\n centroids.push(min + (i / num) * (max - min));\n }\n centroids.push(max);\n\n while (repeat) {\n // assignment step\n for (let j = 0; j < num; j++) {\n clusterSizes[j] = 0;\n }\n for (let i = 0; i < n; i++) {\n const value = values[i];\n let mindist = Number.MAX_VALUE;\n let best;\n for (let j = 0; j < num; j++) {\n const dist = abs(centroids[j] - value);\n if (dist < mindist) {\n mindist = dist;\n best = j;\n }\n clusterSizes[best]++;\n assignments[i] = best;\n }\n }\n\n // update centroids step\n const newCentroids = new Array(num);\n for (let j = 0; j < num; j++) {\n newCentroids[j] = null;\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n if (newCentroids[cluster] === null) {\n newCentroids[cluster] = values[i];\n } else {\n newCentroids[cluster] += values[i];\n }\n }\n for (let j = 0; j < num; j++) {\n newCentroids[j] *= 1 / clusterSizes[j];\n }\n\n // check convergence\n repeat = false;\n for (let j = 0; j < num; j++) {\n if (newCentroids[j] !== centroids[j]) {\n repeat = true;\n break;\n }\n }\n\n centroids = newCentroids;\n nb_iters++;\n\n if (nb_iters > 200) {\n repeat = false;\n }\n }\n\n // finished k-means clustering\n // the next part is borrowed from gabrielflor.it\n const kClusters = {};\n for (let j = 0; j < num; j++) {\n kClusters[j] = [];\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n kClusters[cluster].push(values[i]);\n }\n let tmpKMeansBreaks = [];\n for (let j = 0; j < num; j++) {\n tmpKMeansBreaks.push(kClusters[j][0]);\n tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n }\n tmpKMeansBreaks = tmpKMeansBreaks.sort((a, b) => a - b);\n limits.push(tmpKMeansBreaks[0]);\n for (let i = 1; i < tmpKMeansBreaks.length; i += 2) {\n const v = tmpKMeansBreaks[i];\n if (!isNaN(v) && limits.indexOf(v) === -1) {\n limits.push(v);\n }\n }\n }\n return limits;\n}\n", "import Color from '../Color.js';\nimport '../ops/luminance.js';\n\nexport default (a, b) => {\n // WCAG contrast ratio\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n a = new Color(a);\n b = new Color(b);\n const l1 = a.luminance();\n const l2 = b.luminance();\n return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n};\n", "import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\n/**\n * @license\n *\n * The APCA contrast prediction algorithm is based of the formulas published\n * in the APCA-1.0.98G specification by Myndex. The specification is available at:\n * https://raw.githubusercontent.com/Myndex/apca-w3/master/images/APCAw3_0.1.17_APCA0.0.98G.svg\n *\n * Note that the APCA implementation is still beta, so please update to\n * future versions of chroma.js when they become available.\n *\n * You can read more about the APCA Readability Criterion at\n * https://readtech.org/ARC/\n */\n\n// constants\nconst W_offset = 0.027;\nconst P_in = 0.0005;\nconst P_out = 0.1;\nconst R_scale = 1.14;\nconst B_threshold = 0.022;\nconst B_exp = 1.414;\n\nexport default (text, bg) => {\n // parse input colors\n text = new Color(text);\n bg = new Color(bg);\n // if text color has alpha, blend against background\n if (text.alpha() < 1) {\n text = mix(bg, text, text.alpha(), 'rgb');\n }\n const l_text = lum(...text.rgb());\n const l_bg = lum(...bg.rgb());\n\n // soft clamp black levels\n const Y_text =\n l_text >= B_threshold\n ? l_text\n : l_text + Math.pow(B_threshold - l_text, B_exp);\n const Y_bg =\n l_bg >= B_threshold ? l_bg : l_bg + Math.pow(B_threshold - l_bg, B_exp);\n\n // normal polarity (dark text on light background)\n const S_norm = Math.pow(Y_bg, 0.56) - Math.pow(Y_text, 0.57);\n // reverse polarity (light text on dark background)\n const S_rev = Math.pow(Y_bg, 0.65) - Math.pow(Y_text, 0.62);\n // clamp noise then scale\n const C =\n Math.abs(Y_bg - Y_text) < P_in\n ? 0\n : Y_text < Y_bg\n ? S_norm * R_scale\n : S_rev * R_scale;\n // clamp minimum contrast then offset\n const S_apc = Math.abs(C) < P_out ? 0 : C > 0 ? C - W_offset : C + W_offset;\n // scale to 100\n return S_apc * 100;\n};\n\nfunction lum(r, g, b) {\n return (\n 0.2126729 * Math.pow(r / 255, 2.4) +\n 0.7151522 * Math.pow(g / 255, 2.4) +\n 0.072175 * Math.pow(b / 255, 2.4)\n );\n}\n", "import Color from '../Color.js';\nconst { sqrt, pow, min, max, atan2, abs, cos, sin, exp, PI } = Math;\n\nexport default function (a, b, Kl = 1, Kc = 1, Kh = 1) {\n // Delta E (CIE 2000)\n // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html\n var rad2deg = function (rad) {\n return (360 * rad) / (2 * PI);\n };\n var deg2rad = function (deg) {\n return (2 * PI * deg) / 360;\n };\n a = new Color(a);\n b = new Color(b);\n const [L1, a1, b1] = Array.from(a.lab());\n const [L2, a2, b2] = Array.from(b.lab());\n const avgL = (L1 + L2) / 2;\n const C1 = sqrt(pow(a1, 2) + pow(b1, 2));\n const C2 = sqrt(pow(a2, 2) + pow(b2, 2));\n const avgC = (C1 + C2) / 2;\n const G = 0.5 * (1 - sqrt(pow(avgC, 7) / (pow(avgC, 7) + pow(25, 7))));\n const a1p = a1 * (1 + G);\n const a2p = a2 * (1 + G);\n const C1p = sqrt(pow(a1p, 2) + pow(b1, 2));\n const C2p = sqrt(pow(a2p, 2) + pow(b2, 2));\n const avgCp = (C1p + C2p) / 2;\n const arctan1 = rad2deg(atan2(b1, a1p));\n const arctan2 = rad2deg(atan2(b2, a2p));\n const h1p = arctan1 >= 0 ? arctan1 : arctan1 + 360;\n const h2p = arctan2 >= 0 ? arctan2 : arctan2 + 360;\n const avgHp =\n abs(h1p - h2p) > 180 ? (h1p + h2p + 360) / 2 : (h1p + h2p) / 2;\n const T =\n 1 -\n 0.17 * cos(deg2rad(avgHp - 30)) +\n 0.24 * cos(deg2rad(2 * avgHp)) +\n 0.32 * cos(deg2rad(3 * avgHp + 6)) -\n 0.2 * cos(deg2rad(4 * avgHp - 63));\n let deltaHp = h2p - h1p;\n deltaHp =\n abs(deltaHp) <= 180\n ? deltaHp\n : h2p <= h1p\n ? deltaHp + 360\n : deltaHp - 360;\n deltaHp = 2 * sqrt(C1p * C2p) * sin(deg2rad(deltaHp) / 2);\n const deltaL = L2 - L1;\n const deltaCp = C2p - C1p;\n const sl = 1 + (0.015 * pow(avgL - 50, 2)) / sqrt(20 + pow(avgL - 50, 2));\n const sc = 1 + 0.045 * avgCp;\n const sh = 1 + 0.015 * avgCp * T;\n const deltaTheta = 30 * exp(-pow((avgHp - 275) / 25, 2));\n const Rc = 2 * sqrt(pow(avgCp, 7) / (pow(avgCp, 7) + pow(25, 7)));\n const Rt = -Rc * sin(2 * deg2rad(deltaTheta));\n const result = sqrt(\n pow(deltaL / (Kl * sl), 2) +\n pow(deltaCp / (Kc * sc), 2) +\n pow(deltaHp / (Kh * sh), 2) +\n Rt * (deltaCp / (Kc * sc)) * (deltaHp / (Kh * sh))\n );\n return max(0, min(100, result));\n}\n", "import Color from '../Color.js';\n\n// simple Euclidean distance\nexport default function (a, b, mode = 'lab') {\n // Delta E (CIE 1976)\n // see http://www.brucelindbloom.com/index.html?Equations.html\n a = new Color(a);\n b = new Color(b);\n const l1 = a.get(mode);\n const l2 = b.get(mode);\n let sum_sq = 0;\n for (let i in l1) {\n const d = (l1[i] || 0) - (l2[i] || 0);\n sum_sq += d * d;\n }\n return Math.sqrt(sum_sq);\n}\n", "import Color from '../Color.js';\n\nexport default (...args) => {\n try {\n new Color(...args);\n return true;\n // eslint-disable-next-line\n } catch (e) {\n return false;\n }\n};\n", "// some pre-defined color scales:\nimport chroma from '../chroma.js';\nimport '../io/hsl/index.js';\nimport scale from '../generator/scale.js';\n\nexport default {\n cool() {\n return scale([chroma.hsl(180, 1, 0.9), chroma.hsl(250, 0.7, 0.4)]);\n },\n hot() {\n return scale(['#000', '#f00', '#ff0', '#fff'], [0, 0.25, 0.75, 1]).mode(\n 'rgb'\n );\n }\n};\n", "/**\n ColorBrewer colors for chroma.js\n\n Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n Pennsylvania State University.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software distributed\n under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n CONDITIONS OF ANY KIND, either express or implied. See the License for the\n specific language governing permissions and limitations under the License.\n*/\n\nconst colorbrewer = {\n // sequential\n OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n\n // diverging\n Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n\n // qualitative\n Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n};\n\nconst colorbrewerTypes = Object.keys(colorbrewer);\nconst typeMap = new Map(colorbrewerTypes.map((key) => [key.toLowerCase(), key]));\n\n// use Proxy to allow case-insensitive access to palettes\nconst colorbrewerProxy =\n typeof Proxy === 'function'\n ? new Proxy(colorbrewer, {\n get(target, prop) {\n const lower = prop.toLowerCase();\n if (typeMap.has(lower)) {\n return target[typeMap.get(lower)];\n }\n },\n getOwnPropertyNames() {\n return Object.getOwnPropertyNames(colorbrewerTypes);\n }\n })\n : colorbrewer;\n\nexport default colorbrewerProxy;\n", "import { unpack } from '../../utils/index.js';\n\nconst cmyk2rgb = (...args) => {\n args = unpack(args, 'cmyk');\n const [c, m, y, k] = args;\n const alpha = args.length > 4 ? args[4] : 1;\n if (k === 1) return [0, 0, 0, alpha];\n return [\n c >= 1 ? 0 : 255 * (1 - c) * (1 - k), // r\n m >= 1 ? 0 : 255 * (1 - m) * (1 - k), // g\n y >= 1 ? 0 : 255 * (1 - y) * (1 - k), // b\n alpha\n ];\n};\n\nexport default cmyk2rgb;\n", "import { unpack } from '../../utils/index.js';\nconst { max } = Math;\n\nconst rgb2cmyk = (...args) => {\n let [r, g, b] = unpack(args, 'rgb');\n r = r / 255;\n g = g / 255;\n b = b / 255;\n const k = 1 - max(r, max(g, b));\n const f = k < 1 ? 1 / (1 - k) : 0;\n const c = (1 - r - k) * f;\n const m = (1 - g - k) * f;\n const y = (1 - b - k) * f;\n return [c, m, y, k];\n};\n\nexport default rgb2cmyk;\n", "import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nimport cmyk2rgb from './cmyk2rgb.js';\nimport rgb2cmyk from './rgb2cmyk.js';\n\nColor.prototype.cmyk = function () {\n return rgb2cmyk(this._rgb);\n};\n\nconst cmyk = (...args) => new Color(...args, 'cmyk');\nObject.assign(chroma, { cmyk });\n\ninput.format.cmyk = cmyk2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'cmyk');\n if (type(args) === 'array' && args.length === 4) {\n return 'cmyk';\n }\n }\n});\n\nexport { cmyk };\n", "import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - hsl2css(h,s,l)\n * - hsl2css(h,s,l,a)\n * - hsl2css([h,s,l], mode)\n * - hsl2css([h,s,l,a], mode)\n * - hsl2css({h,s,l,a}, mode)\n */\nconst hsl2css = (...args) => {\n const hsla = unpack(args, 'hsla');\n let mode = last(args) || 'lsa';\n hsla[0] = rnd2(hsla[0] || 0) + 'deg';\n hsla[1] = rnd2(hsla[1] * 100) + '%';\n hsla[2] = rnd2(hsla[2] * 100) + '%';\n if (mode === 'hsla' || (hsla.length > 3 && hsla[3] < 1)) {\n hsla[3] = '/ ' + (hsla.length > 3 ? hsla[3] : 1);\n mode = 'hsla';\n } else {\n hsla.length = 3;\n }\n return `${mode.substr(0, 3)}(${hsla.join(' ')})`;\n};\n\nexport default hsl2css;\n", "import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - lab2css(l,a,b)\n * - lab2css(l,a,b,alpha)\n * - lab2css([l,a,b], mode)\n * - lab2css([l,a,b,alpha], mode)\n */\nconst lab2css = (...args) => {\n const laba = unpack(args, 'lab');\n let mode = last(args) || 'lab';\n laba[0] = rnd2(laba[0]) + '%';\n laba[1] = rnd2(laba[1]);\n laba[2] = rnd2(laba[2]);\n if (mode === 'laba' || (laba.length > 3 && laba[3] < 1)) {\n laba[3] = '/ ' + (laba.length > 3 ? laba[3] : 1);\n } else {\n laba.length = 3;\n }\n return `lab(${laba.join(' ')})`;\n};\n\nexport default lab2css;\n", "import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - lab2css(l,a,b)\n * - lab2css(l,a,b,alpha)\n * - lab2css([l,a,b], mode)\n * - lab2css([l,a,b,alpha], mode)\n */\nconst lch2css = (...args) => {\n const lcha = unpack(args, 'lch');\n let mode = last(args) || 'lab';\n lcha[0] = rnd2(lcha[0]) + '%';\n lcha[1] = rnd2(lcha[1]);\n lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue\n if (mode === 'lcha' || (lcha.length > 3 && lcha[3] < 1)) {\n lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);\n } else {\n lcha.length = 3;\n }\n return `lch(${lcha.join(' ')})`;\n};\n\nexport default lch2css;\n", "import { unpack, rnd2, rnd3 } from '../../utils/index.js';\n\nconst oklab2css = (...args) => {\n const laba = unpack(args, 'lab');\n laba[0] = rnd2(laba[0] * 100) + '%';\n laba[1] = rnd3(laba[1]);\n laba[2] = rnd3(laba[2]);\n if (laba.length > 3 && laba[3] < 1) {\n laba[3] = '/ ' + (laba.length > 3 ? laba[3] : 1);\n } else {\n laba.length = 3;\n }\n return `oklab(${laba.join(' ')})`;\n};\n\nexport default oklab2css;\n", "import { unpack } from '../../utils/index.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport lab2lch from '../lch/lab2lch.js';\n\nconst rgb2oklch = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2oklab(r, g, b);\n const [L, c, h] = lab2lch(l, a, b_);\n return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2oklch;\n", "import { unpack, rnd2, rnd3 } from '../../utils/index.js';\n\nconst oklch2css = (...args) => {\n const lcha = unpack(args, 'lch');\n lcha[0] = rnd2(lcha[0] * 100) + '%';\n lcha[1] = rnd3(lcha[1]);\n lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue\n if (lcha.length > 3 && lcha[3] < 1) {\n lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);\n } else {\n lcha.length = 3;\n }\n return `oklch(${lcha.join(' ')})`;\n};\n\nexport default oklch2css;\n", "import { unpack, last } from '../../utils/index.js';\nimport hsl2css from './hsl2css.js';\nimport rgb2hsl from '../hsl/rgb2hsl.js';\nimport lab2css from './lab2css.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lch2css from './lch2css.js';\nimport rgb2lch from '../lch/rgb2lch.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport oklab2css from './oklab2css.js';\nimport rgb2oklch from '../oklch/rgb2oklch.js';\nimport oklch2css from './oklch2css.js';\nimport { getLabWhitePoint, setLabWhitePoint } from '../lab/lab-constants.js';\nconst { round } = Math;\n\n/*\n * supported arguments:\n * - rgb2css(r,g,b)\n * - rgb2css(r,g,b,a)\n * - rgb2css([r,g,b], mode)\n * - rgb2css([r,g,b,a], mode)\n * - rgb2css({r,g,b,a}, mode)\n */\nconst rgb2css = (...args) => {\n const rgba = unpack(args, 'rgba');\n let mode = last(args) || 'rgb';\n if (mode.substr(0, 3) === 'hsl') {\n return hsl2css(rgb2hsl(rgba), mode);\n }\n if (mode.substr(0, 3) === 'lab') {\n // change to D50 lab whitepoint since this is what W3C is using for CSS Lab colors\n const prevWhitePoint = getLabWhitePoint();\n setLabWhitePoint('d50');\n const cssColor = lab2css(rgb2lab(rgba), mode);\n setLabWhitePoint(prevWhitePoint);\n return cssColor;\n }\n if (mode.substr(0, 3) === 'lch') {\n // change to D50 lab whitepoint since this is what W3C is using for CSS Lab colors\n const prevWhitePoint = getLabWhitePoint();\n setLabWhitePoint('d50');\n const cssColor = lch2css(rgb2lch(rgba), mode);\n setLabWhitePoint(prevWhitePoint);\n return cssColor;\n }\n if (mode.substr(0, 5) === 'oklab') {\n return oklab2css(rgb2oklab(rgba));\n }\n if (mode.substr(0, 5) === 'oklch') {\n return oklch2css(rgb2oklch(rgba));\n }\n rgba[0] = round(rgba[0]);\n rgba[1] = round(rgba[1]);\n rgba[2] = round(rgba[2]);\n if (mode === 'rgba' || (rgba.length > 3 && rgba[3] < 1)) {\n rgba[3] = '/ ' + (rgba.length > 3 ? rgba[3] : 1);\n mode = 'rgba';\n }\n return `${mode.substr(0, 3)}(${rgba.slice(0, mode === 'rgb' ? 3 : 4).join(' ')})`;\n};\n\nexport default rgb2css;\n", "import { unpack } from '../../utils/index.js';\nimport lch2lab from '../lch/lch2lab.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\n\nconst oklch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h, ...rest] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = oklab2rgb(L, a, b_);\n return [r, g, b, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default oklch2rgb;\n", "import hsl2rgb from '../hsl/hsl2rgb.js';\nimport lab2rgb from '../lab/lab2rgb.js';\nimport lch2rgb from '../lch/lch2rgb.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\nimport oklch2rgb from '../oklch/oklch2rgb.js';\nimport input from '../input.js';\nimport limit from '../../utils/limit.js';\nimport { getLabWhitePoint, setLabWhitePoint } from '../lab/lab-constants.js';\n\nconst INT_OR_PCT = /((?:-?\\d+)|(?:-?\\d+(?:\\.\\d+)?)%|none)/.source;\nconst FLOAT_OR_PCT = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%?)|none)/.source;\nconst PCT = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%)|none)/.source;\nconst RE_S = /\\s*/.source;\nconst SEP = /\\s+/.source;\nconst COMMA = /\\s*,\\s*/.source;\nconst ANLGE = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:deg)?)|none)/.source;\nconst ALPHA = /\\s*(?:\\/\\s*((?:[01]|[01]?\\.\\d+)|\\d+(?:\\.\\d+)?%))?/.source;\n\n// e.g. rgb(250 20 0), rgb(100% 50% 20%), rgb(100% 50% 20% / 0.5)\nconst RE_RGB = new RegExp(\n '^rgba?\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_RGB_LEGACY = new RegExp(\n '^rgb\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(COMMA) +\n RE_S +\n '\\\\)$'\n);\nconst RE_RGBA_LEGACY = new RegExp(\n '^rgba\\\\(' +\n RE_S +\n [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT, FLOAT_OR_PCT].join(COMMA) +\n RE_S +\n '\\\\)$'\n);\n\nconst RE_HSL = new RegExp(\n '^hsla?\\\\(' + RE_S + [ANLGE, PCT, PCT].join(SEP) + ALPHA + '\\\\)$'\n);\nconst RE_HSL_LEGACY = new RegExp(\n '^hsl?\\\\(' + RE_S + [ANLGE, PCT, PCT].join(COMMA) + RE_S + '\\\\)$'\n);\nconst RE_HSLA_LEGACY =\n /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\nconst RE_LAB = new RegExp(\n '^lab\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_LCH = new RegExp(\n '^lch\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_OKLAB = new RegExp(\n '^oklab\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\nconst RE_OKLCH = new RegExp(\n '^oklch\\\\(' +\n RE_S +\n [FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +\n ALPHA +\n '\\\\)$'\n);\n\nconst { round } = Math;\n\nconst roundRGB = (rgb) => {\n return rgb.map((v, i) => (i <= 2 ? limit(round(v), 0, 255) : v));\n};\n\nconst percentToAbsolute = (pct, min = 0, max = 100, signed = false) => {\n if (typeof pct === 'string' && pct.endsWith('%')) {\n pct = parseFloat(pct.substring(0, pct.length - 1)) / 100;\n if (signed) {\n // signed percentages are in the range -100% to 100%\n pct = min + (pct + 1) * 0.5 * (max - min);\n } else {\n pct = min + pct * (max - min);\n }\n }\n return +pct;\n};\n\nconst noneToValue = (v, noneValue) => {\n return v === 'none' ? noneValue : v;\n};\n\nconst css2rgb = (css) => {\n css = css.toLowerCase().trim();\n\n if (css === 'transparent') {\n return [0, 0, 0, 0];\n }\n\n let m;\n\n if (input.format.named) {\n try {\n return input.format.named(css);\n // eslint-disable-next-line\n } catch (e) {}\n }\n\n // rgb(250 20 0) or rgb(250,20,0)\n if ((m = css.match(RE_RGB)) || (m = css.match(RE_RGB_LEGACY))) {\n let rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = +percentToAbsolute(noneToValue(rgb[i], 0), 0, 255);\n }\n rgb = roundRGB(rgb);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha; // default alpha\n return rgb;\n }\n\n // rgba(250,20,0,0.4)\n if ((m = css.match(RE_RGBA_LEGACY))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 4; i++) {\n rgb[i] = +percentToAbsolute(rgb[i], 0, 255);\n }\n return rgb;\n }\n\n // hsl(0,100%,50%)\n if ((m = css.match(RE_HSL)) || (m = css.match(RE_HSL_LEGACY))) {\n const hsl = m.slice(1, 4);\n hsl[0] = +noneToValue(hsl[0].replace('deg', ''), 0);\n hsl[1] = +percentToAbsolute(noneToValue(hsl[1], 0), 0, 100) * 0.01;\n hsl[2] = +percentToAbsolute(noneToValue(hsl[2], 0), 0, 100) * 0.01;\n const rgb = roundRGB(hsl2rgb(hsl));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n // hsla(0,100%,50%,0.5)\n if ((m = css.match(RE_HSLA_LEGACY))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i]);\n }\n rgb[3] = +m[4]; // default alpha = 1\n return rgb;\n }\n\n if ((m = css.match(RE_LAB))) {\n const lab = m.slice(1, 4);\n lab[0] = percentToAbsolute(noneToValue(lab[0], 0), 0, 100);\n lab[1] = percentToAbsolute(noneToValue(lab[1], 0), -125, 125, true);\n lab[2] = percentToAbsolute(noneToValue(lab[2], 0), -125, 125, true);\n // convert to D50 Lab whitepoint\n const wp = getLabWhitePoint();\n setLabWhitePoint('d50');\n const rgb = roundRGB(lab2rgb(lab));\n // convert back to original Lab whitepoint\n setLabWhitePoint(wp);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_LCH))) {\n const lch = m.slice(1, 4);\n lch[0] = percentToAbsolute(lch[0], 0, 100);\n lch[1] = percentToAbsolute(noneToValue(lch[1], 0), 0, 150, false);\n lch[2] = +noneToValue(lch[2].replace('deg', ''), 0);\n // convert to D50 Lab whitepoint\n const wp = getLabWhitePoint();\n setLabWhitePoint('d50');\n const rgb = roundRGB(lch2rgb(lch));\n // convert back to original Lab whitepoint\n setLabWhitePoint(wp);\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_OKLAB))) {\n const oklab = m.slice(1, 4);\n oklab[0] = percentToAbsolute(noneToValue(oklab[0], 0), 0, 1);\n oklab[1] = percentToAbsolute(noneToValue(oklab[1], 0), -0.4, 0.4, true);\n oklab[2] = percentToAbsolute(noneToValue(oklab[2], 0), -0.4, 0.4, true);\n const rgb = roundRGB(oklab2rgb(oklab));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n\n if ((m = css.match(RE_OKLCH))) {\n const oklch = m.slice(1, 4);\n oklch[0] = percentToAbsolute(noneToValue(oklch[0], 0), 0, 1);\n oklch[1] = percentToAbsolute(noneToValue(oklch[1], 0), 0, 0.4, false);\n oklch[2] = +noneToValue(oklch[2].replace('deg', ''), 0);\n const rgb = roundRGB(oklch2rgb(oklch));\n const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n rgb[3] = alpha;\n return rgb;\n }\n};\n\ncss2rgb.test = (s) => {\n return (\n // modern\n RE_RGB.test(s) ||\n RE_HSL.test(s) ||\n RE_LAB.test(s) ||\n RE_LCH.test(s) ||\n RE_OKLAB.test(s) ||\n RE_OKLCH.test(s) ||\n // legacy\n RE_RGB_LEGACY.test(s) ||\n RE_RGBA_LEGACY.test(s) ||\n RE_HSL_LEGACY.test(s) ||\n RE_HSLA_LEGACY.test(s) ||\n s === 'transparent'\n );\n};\n\nexport default css2rgb;\n", "import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport rgb2css from './rgb2css.js';\nimport css2rgb from './css2rgb.js';\n\nColor.prototype.css = function (mode) {\n return rgb2css(this._rgb, mode);\n};\n\nconst css = (...args) => new Color(...args, 'css');\nchroma.css = css;\n\ninput.format.css = css2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && css2rgb.test(h)) {\n return 'css';\n }\n }\n});\n\nexport { css };\n", "import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport input from '../input.js';\nimport { unpack } from '../../utils/index.js';\n\ninput.format.gl = (...args) => {\n const rgb = unpack(args, 'rgba');\n rgb[0] *= 255;\n rgb[1] *= 255;\n rgb[2] *= 255;\n return rgb;\n};\n\nconst gl = (...args) => new Color(...args, 'gl');\nchroma.gl = gl;\n\nColor.prototype.gl = function () {\n const rgb = this._rgb;\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n};\n\nexport { gl };\n", "import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport { type } from '../../utils/index.js';\nimport input from '../input.js';\nimport hex2rgb from './hex2rgb.js';\nimport rgb2hex from './rgb2hex.js';\n\nColor.prototype.hex = function (mode) {\n return rgb2hex(this._rgb, mode);\n};\n\nconst hex = (...args) => new Color(...args, 'hex');\nchroma.hex = hex;\n\ninput.format.hex = hex2rgb;\ninput.autodetect.push({\n p: 4,\n test: (h, ...rest) => {\n if (\n !rest.length &&\n type(h) === 'string' &&\n [3, 4, 5, 6, 7, 8, 9].indexOf(h.length) >= 0\n ) {\n return 'hex';\n }\n }\n});\n\nexport { hex };\n", "/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n */\n\nconst { log } = Math;\n\nconst temperature2rgb = (kelvin) => {\n const temp = kelvin / 100;\n let r, g, b;\n if (temp < 66) {\n r = 255;\n g =\n temp < 6\n ? 0\n : -155.25485562709179 -\n 0.44596950469579133 * (g = temp - 2) +\n 104.49216199393888 * log(g);\n b =\n temp < 20\n ? 0\n : -254.76935184120902 +\n 0.8274096064007395 * (b = temp - 10) +\n 115.67994401066147 * log(b);\n } else {\n r =\n 351.97690566805693 +\n 0.114206453784165 * (r = temp - 55) -\n 40.25366309332127 * log(r);\n g =\n 325.4494125711974 +\n 0.07943456536662342 * (g = temp - 50) -\n 28.0852963507957 * log(g);\n b = 255;\n }\n return [r, g, b, 1];\n};\n\nexport default temperature2rgb;\n", "/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n **/\n\nimport temperature2rgb from './temperature2rgb.js';\nimport { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2temperature = (...args) => {\n const rgb = unpack(args, 'rgb');\n const r = rgb[0],\n b = rgb[2];\n let minTemp = 1000;\n let maxTemp = 40000;\n const eps = 0.4;\n let temp;\n while (maxTemp - minTemp > eps) {\n temp = (maxTemp + minTemp) * 0.5;\n const rgb = temperature2rgb(temp);\n if (rgb[2] / rgb[0] >= b / r) {\n maxTemp = temp;\n } else {\n minTemp = temp;\n }\n }\n return round(temp);\n};\n\nexport default rgb2temperature;\n", "import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport temperature2rgb from './temperature2rgb.js';\nimport rgb2temperature from './rgb2temperature.js';\n\nColor.prototype.temp =\n Color.prototype.kelvin =\n Color.prototype.temperature =\n function () {\n return rgb2temperature(this._rgb);\n };\n\nconst temp = (...args) => new Color(...args, 'temp');\nObject.assign(chroma, { temp, kelvin: temp, temperature: temp });\n\ninput.format.temp =\n input.format.kelvin =\n input.format.temperature =\n temperature2rgb;\n\nexport { temp, temp as kelvin, temp as temperature };\n", "import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklch2rgb from './oklch2rgb.js';\nimport rgb2oklch from './rgb2oklch.js';\n\nColor.prototype.oklch = function () {\n return rgb2oklch(this._rgb);\n};\n\nconst oklch = (...args) => new Color(...args, 'oklch');\nObject.assign(chroma, { oklch });\n\ninput.format.oklch = oklch2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'oklch');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklch';\n }\n }\n});\n\nexport { oklch };\n", "// feel free to comment out anything to rollup\n// a smaller chroma.js bundle\nimport chroma from './src/chroma.js';\n\n// io --> convert colors\nimport './src/io/named/index.js';\n\n// operators --> modify existing Colors\nimport './src/ops/alpha.js';\nimport './src/ops/clipped.js';\nimport './src/ops/darken.js';\nimport './src/ops/get.js';\nimport './src/ops/luminance.js';\nimport './src/ops/mix.js';\nimport './src/ops/premultiply.js';\nimport './src/ops/saturate.js';\nimport './src/ops/set.js';\nimport './src/ops/shade.js';\n\n// interpolators\nimport './src/interpolator/rgb.js';\nimport './src/interpolator/lrgb.js';\nimport './src/interpolator/lab.js';\nimport './src/interpolator/lch.js';\nimport './src/interpolator/num.js';\nimport './src/interpolator/hcg.js';\nimport './src/interpolator/hsi.js';\nimport './src/interpolator/hsl.js';\nimport './src/interpolator/hsv.js';\nimport './src/interpolator/oklab.js';\nimport './src/interpolator/oklch.js';\n\n// generators -- > create new colors\nimport average from './src/generator/average.js';\nimport bezier from './src/generator/bezier.js';\nimport blend from './src/generator/blend.js';\nimport cubehelix from './src/generator/cubehelix.js';\nimport mix from './src/generator/mix.js';\nimport random from './src/generator/random.js';\nimport scale from './src/generator/scale.js';\n\n// other utility methods\nimport { analyze } from './src/utils/analyze.js';\nimport contrast from './src/utils/contrast.js';\nimport contrastAPCA from './src/utils/contrastAPCA.js';\nimport deltaE from './src/utils/delta-e.js';\nimport distance from './src/utils/distance.js';\nimport { limits } from './src/utils/analyze.js';\nimport valid from './src/utils/valid.js';\nimport input from './src/io/input.js';\n\n// scale\nimport scales from './src/utils/scales.js';\n\n// colors\nimport colors from './src/colors/w3cx11.js';\nimport brewer from './src/colors/colorbrewer.js';\nimport Color from './src/Color.js';\n\nObject.assign(chroma, {\n analyze,\n average,\n bezier,\n blend,\n brewer,\n Color,\n colors,\n contrast,\n contrastAPCA,\n cubehelix,\n deltaE,\n distance,\n input,\n interpolate: mix,\n limits,\n mix,\n random,\n scale,\n scales,\n valid\n});\n\nexport default chroma;\n\nexport {\n analyze,\n average,\n bezier,\n blend,\n brewer,\n Color,\n colors,\n contrast,\n contrastAPCA,\n cubehelix,\n deltaE,\n distance,\n input,\n limits,\n mix,\n mix as interpolate,\n random,\n scale,\n scales,\n valid\n};\n\nexport * from './src/io/cmyk/index.js';\nexport * from './src/io/css/index.js';\nexport * from './src/io/gl/index.js';\nexport * from './src/io/hcg/index.js';\nexport * from './src/io/hex/index.js';\nexport * from './src/io/hsi/index.js';\nexport * from './src/io/hsl/index.js';\nexport * from './src/io/hsv/index.js';\nexport * from './src/io/lab/index.js';\nexport * from './src/io/lch/index.js';\nexport * from './src/io/num/index.js';\nexport * from './src/io/rgb/index.js';\nexport * from './src/io/temp/index.js';\nexport * from './src/io/oklab/index.js';\nexport * from './src/io/oklch/index.js';\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { ColumnType } from \"@perspective-dev/client\";\nimport type { ColumnConfig } from \"../types.js\";\n\nexport interface Formatter {\n format(val: unknown): string;\n}\n\nclass BooleanFormatter implements Formatter {\n format(val: unknown): string {\n return val ? \"true\" : \"false\";\n }\n}\n\n// PluginConfig is a subset of ColumnConfig with the formatting properties\ntype PluginConfig = Pick<ColumnConfig, \"date_format\" | \"number_format\">;\n\nconst LEGACY_CONFIG: Record<\n string,\n { format: Intl.NumberFormatOptions | Intl.DateTimeFormatOptions }\n> = {\n float: {\n format: {\n style: \"decimal\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n },\n },\n datetime: {\n format: {\n dateStyle: \"short\",\n timeStyle: \"medium\",\n } as Intl.DateTimeFormatOptions,\n },\n date: {\n format: {\n dateStyle: \"short\",\n } as Intl.DateTimeFormatOptions,\n },\n};\n\nexport class FormatterCache {\n private _formatters: Map<string, Formatter | false>;\n\n constructor() {\n this._formatters = new Map();\n }\n\n private create_datetime_formatter(\n _type: ColumnType,\n plugin: PluginConfig,\n ): Intl.DateTimeFormat {\n if (plugin.date_format?.format !== \"custom\") {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: plugin.date_format?.timeZone,\n dateStyle:\n plugin.date_format?.dateStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.dateStyle ?? \"short\"),\n timeStyle:\n plugin.date_format?.timeStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.timeStyle ?? \"medium\"),\n };\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n } else {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: plugin.date_format?.timeZone,\n hour12: plugin.date_format?.hour12 ?? true,\n fractionalSecondDigits:\n plugin.date_format?.fractionalSecondDigits,\n };\n\n if (plugin.date_format?.year !== \"disabled\") {\n options.year = plugin.date_format?.year ?? \"2-digit\";\n }\n if (plugin.date_format?.month !== \"disabled\") {\n options.month = plugin.date_format?.month ?? \"numeric\";\n }\n if (plugin.date_format?.day !== \"disabled\") {\n options.day = plugin.date_format?.day ?? \"numeric\";\n }\n if (\n plugin.date_format?.weekday &&\n plugin.date_format?.weekday !== \"disabled\"\n ) {\n options.weekday = plugin.date_format.weekday;\n }\n if (plugin.date_format?.hour !== \"disabled\") {\n options.hour = plugin.date_format?.hour ?? \"numeric\";\n }\n if (plugin.date_format?.minute !== \"disabled\") {\n options.minute = plugin.date_format?.minute ?? \"numeric\";\n }\n if (plugin.date_format?.second !== \"disabled\") {\n options.second = plugin.date_format?.second ?? \"numeric\";\n }\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n }\n }\n\n private create_date_formatter(\n _type: ColumnType,\n plugin: PluginConfig,\n ): Intl.DateTimeFormat {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: \"utc\",\n dateStyle:\n plugin.date_format?.dateStyle === \"disabled\"\n ? undefined\n : (plugin.date_format?.dateStyle ?? \"short\"),\n };\n\n return new Intl.DateTimeFormat(\n navigator.languages as string[],\n options,\n );\n }\n\n private create_number_formatter(\n type: ColumnType,\n plugin: PluginConfig,\n ): Intl.NumberFormat {\n const format =\n plugin.number_format ??\n (LEGACY_CONFIG[type]?.format as Intl.NumberFormatOptions);\n return new Intl.NumberFormat(navigator.languages as string[], format);\n }\n\n private create_boolean_formatter(\n _type: ColumnType,\n _plugin: PluginConfig,\n ): Formatter {\n return new BooleanFormatter();\n }\n\n get(type: ColumnType, plugin: PluginConfig): Formatter | false | undefined {\n const formatter_key = [\n type,\n ...Object.values(plugin.date_format ?? {}),\n ...Object.values(plugin.number_format ?? {}),\n ].join(\"-\");\n\n if (!this._formatters.has(formatter_key)) {\n if (type === \"date\") {\n this._formatters.set(\n formatter_key,\n this.create_date_formatter(type, plugin),\n );\n } else if (type === \"datetime\") {\n this._formatters.set(\n formatter_key,\n this.create_datetime_formatter(type, plugin),\n );\n } else if (type === \"integer\" || type === \"float\") {\n this._formatters.set(\n formatter_key,\n this.create_number_formatter(type, plugin),\n );\n } else if (type === \"boolean\") {\n this._formatters.set(\n formatter_key,\n this.create_boolean_formatter(type, plugin),\n );\n } else {\n this._formatters.set(formatter_key, false);\n }\n }\n\n return this._formatters.get(formatter_key);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { FormatterCache, Formatter } from \"./formatter_cache.js\";\nimport type { DatagridModel, ColumnsConfig, ColumnConfig } from \"../types.js\";\nimport { ColumnType } from \"@perspective-dev/client\";\n\nconst FORMAT_CACHE = new FormatterCache();\nconst MAX_BAR_WIDTH_PCT = 1;\n\nexport function format_raw(\n type: ColumnType,\n value: ColumnConfig,\n): Formatter | false | undefined {\n return FORMAT_CACHE.get(type, value);\n}\n\n/**\n * Format a single cell's text content as the content of a `<td>` or `<th>`.\n */\nexport function format_cell(\n this: DatagridModel,\n title: string,\n val: unknown,\n plugins: ColumnsConfig = {},\n use_table_schema = false,\n): string | HTMLElement | null {\n if (val === null) {\n return null;\n }\n\n const type: ColumnType = ((use_table_schema && this._table_schema[title]) ||\n this._schema[title] ||\n \"string\") as ColumnType;\n const plugin: ColumnConfig = plugins[title] || {};\n const is_numeric = type === \"integer\" || type === \"float\";\n\n if (is_numeric && plugin?.number_fg_mode === \"bar\") {\n const a = Math.max(\n 0,\n Math.min(\n MAX_BAR_WIDTH_PCT,\n Math.abs((val as number) / plugin.fg_gradient!) *\n MAX_BAR_WIDTH_PCT,\n ),\n );\n\n const div = this._div_factory.get();\n const anchor = (val as number) >= 0 ? \"left\" : \"right\";\n const pct = (a * 100).toFixed(2);\n div.setAttribute(\n \"style\",\n `width:calc(${pct}% - 4px);position:absolute;${anchor}:2px;height:80%;top:10%;pointer-events:none;`,\n );\n\n return div;\n } else if (plugin?.format === \"link\" && type === \"string\") {\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"href\", val as string);\n anchor.setAttribute(\"target\", \"_blank\");\n anchor.textContent = val as string;\n return anchor;\n } else if (plugin?.format === \"bold\" && type === \"string\") {\n const bold = document.createElement(\"b\");\n bold.textContent = val as string;\n return bold;\n } else if (plugin?.format === \"italics\" && type === \"string\") {\n const italic = document.createElement(\"i\");\n italic.textContent = val as string;\n return italic;\n } else {\n const formatter = FORMAT_CACHE.get(type, plugin);\n return formatter ? formatter.format(val) : (val as string);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../types.js\";\nimport { format_cell } from \"./format_cell.js\";\nimport type { DatagridModel, RegularTable, ColumnsConfig } from \"../types.js\";\n\ntype RowHeaderCell = string | HTMLElement | { toString(): string };\n\n/**\n * Format a single cell of the `group_by` tree header for __ROW_PATH__ data.\n */\nexport function* format_tree_header_row_path(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<RowHeaderCell[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n for (let path of paths) {\n const fullPath: unknown[] = [\"TOTAL\", ...path];\n const last = fullPath[fullPath.length - 1];\n let newPath: RowHeaderCell[] = fullPath\n .slice(0, fullPath.length - 1)\n .fill(\"\") as string[];\n const formatted = format_cell.call(\n this,\n row_headers[newPath.length - 1],\n last,\n plugins,\n true,\n );\n\n if (formatted instanceof HTMLElement) {\n newPath = newPath.concat(formatted);\n } else {\n newPath = newPath.concat({ toString: () => formatted as string });\n }\n\n newPath.length = row_headers.length + 1;\n yield newPath;\n }\n}\n\nexport function* format_flat_header_row_path(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<RowHeaderCell[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n\n for (let path of paths) {\n yield path.map((part, i) =>\n format_cell.call(this, row_headers[i], part, plugins, true),\n ) as RowHeaderCell[];\n }\n}\n\n/**\n * Format a single cell of the `group_by` tree header.\n */\nexport function* format_tree_header(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<unknown[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n for (const path of paths) {\n const new_path: unknown[] = [\"\"];\n for (const idx in path) {\n new_path.push(\n format_cell.call(\n this,\n row_headers[idx],\n path[idx],\n plugins,\n true,\n ),\n );\n }\n\n yield path;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../types.js\";\nimport { format_cell } from \"./format_cell.js\";\nimport {\n format_flat_header_row_path,\n format_tree_header,\n format_tree_header_row_path,\n} from \"./format_tree_header.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n RegularTable,\n Schema,\n} from \"../types.js\";\nimport type { CellScalar, DataResponse } from \"regular-table/dist/esm/types.js\";\nimport { ViewConfig, ViewWindow } from \"@perspective-dev/client\";\n\ninterface ColumnData {\n __ROW_PATH__?: unknown[][];\n __ID__?: unknown[][];\n [key: string]: unknown[] | undefined;\n}\n\n/**\n * Creates a new DataListener, suitable for passing to `regular-table`'s\n * `.setDataListener()` method. This should be called as a method on the\n * plugin.\n *\n * @returns A data listener for the plugin.\n */\nexport function createDataListener(\n viewer: PerspectiveViewerElement,\n): (\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse> {\n let last_meta: unknown[][] | undefined;\n let last_column_paths: string[] | undefined;\n let last_ids: unknown[][] | undefined;\n let last_reverse_ids: Map<string, number> | undefined;\n let last_reverse_columns: Map<string, number> | undefined;\n\n return async function dataListener(\n this: DatagridModel,\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n ): Promise<DataResponse> {\n let columns: ColumnData = {};\n const new_window: ViewWindow = {\n start_row: y0,\n start_col: x0,\n end_row: y1,\n end_col: x1,\n id: true,\n };\n\n let num_columns: number | null = null;\n\n if (x1 - x0 > 0 && y1 - y0 > 0) {\n this._is_old_viewport =\n this._last_window?.start_row === y0 &&\n this._last_window?.end_row === y1 &&\n this._last_window?.start_col === x0 &&\n this._last_window?.end_col === x1;\n\n const [x, z] = await Promise.all([\n this._view.to_columns_string(new_window as any),\n this._view.num_columns(),\n ]);\n\n num_columns = z;\n columns = JSON.parse(x as string) as ColumnData;\n const y = Object.keys(columns);\n const new_col_paths = y.filter(\n (x) => x !== \"__ROW_PATH__\" && x !== \"__ID__\",\n );\n\n let changed_cols = false;\n for (let i = 0; i < new_col_paths.length; i++) {\n if (\n this._column_paths[new_window.start_col! + i] !==\n new_col_paths[i]\n ) {\n changed_cols = true;\n this._column_paths[new_window.start_col! + i] =\n new_col_paths[i];\n }\n }\n\n if (changed_cols) {\n const [a, b] = await Promise.all([\n this._view.schema(),\n this._view.expression_schema(),\n ]);\n\n this._schema = { ...(a as Schema), ...(b as Schema) };\n for (let i = 0; i < new_col_paths.length; i++) {\n const column_path_parts = new_col_paths[i].split(\"|\");\n const column =\n column_path_parts[this._config.split_by.length];\n\n this._is_editable[i + new_window.start_col!] =\n !!this._table_schema[column];\n\n this._column_types[i + new_window.start_col!] =\n this._schema[column];\n }\n }\n\n this._last_window = new_window;\n this._ids =\n columns.__ID__ ||\n Array(y1 - y0)\n .fill(null)\n .map((_, index) => [index + y0]);\n\n this._reverse_columns = this._column_paths\n .slice(x0, x1)\n .reduce((acc, x, i) => {\n acc.set(x, i);\n return acc;\n }, new Map<string, number>());\n\n this._reverse_ids = this._ids?.reduce((acc, x, i) => {\n acc.set(x?.join(\"|\"), i);\n return acc;\n }, new Map<string, number>());\n } else {\n this._div_factory.clear();\n num_columns = await this._view.num_columns();\n }\n\n const data: (string | HTMLElement)[][] = [];\n const metadata: unknown[][] = [];\n const column_headers: string[][] = [];\n const column_paths: string[] = [];\n\n const is_settings_open = viewer.hasAttribute(\"settings\");\n for (\n let ipath = x0;\n ipath < Math.min(x1, this._column_paths.length);\n ++ipath\n ) {\n const path = this._column_paths[ipath];\n const path_parts = path.split(\"|\");\n const column = columns[path] || new Array(y1 - y0).fill(null);\n const agg_depth = Math.min(\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL]?.[\n path_parts[this._config.split_by.length]\n ]?.aggregate_depth || 0,\n this._config.group_by.length,\n );\n\n data.push(\n column.map((x, i) => {\n if ((columns?.__ROW_PATH__?.[i]?.length ?? 0) < agg_depth) {\n return \"\";\n } else {\n return format_cell.call(\n this,\n path_parts[this._config.split_by.length],\n x,\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {},\n ) as string | HTMLElement;\n }\n }),\n );\n\n metadata.push(column as unknown[]);\n if (is_settings_open) {\n path_parts.push(\"\");\n }\n\n column_headers.push(path_parts);\n column_paths.push(path);\n }\n\n const is_dim_call = x1 - x0 > 0 && y1 - y0 > 0;\n\n // Only update the last state if this is not a \"phantom\" call.\n if (is_dim_call) {\n this.last_column_paths = last_column_paths;\n this.last_meta = last_meta;\n this.last_ids = last_ids;\n this.last_reverse_ids = last_reverse_ids;\n this.last_reverse_columns = last_reverse_columns;\n\n last_column_paths = column_paths;\n last_meta = metadata;\n last_ids = this._ids;\n last_reverse_ids = this._reverse_ids;\n last_reverse_columns = this._reverse_columns;\n }\n\n const is_row_path = columns.__ROW_PATH__ !== undefined;\n const is_flat = this._config.group_rollup_mode === \"flat\";\n const row_headers = Array.from(\n (is_row_path\n ? is_flat\n ? format_flat_header_row_path\n : format_tree_header_row_path\n : format_tree_header\n ).call(\n this,\n columns.__ROW_PATH__,\n this._config.group_by,\n regularTable,\n ),\n ) as (string | HTMLElement)[][];\n\n const num_row_headers = !is_dim_call\n ? row_header_depth(this._config)\n : row_headers[0]?.length;\n\n const result: DataResponse = {\n num_column_headers:\n this._config.split_by.length + (is_settings_open ? 2 : 1),\n num_row_headers,\n num_rows: this._num_rows,\n num_columns,\n row_headers: row_headers as CellScalar[][], // Add `HTMLElement`\n column_headers,\n data: data as CellScalar[][],\n metadata,\n column_header_merge_depth: Math.max(\n 0,\n this._config.split_by.length,\n ),\n };\n\n return result;\n };\n}\n\nfunction row_header_depth(config: ViewConfig) {\n if (config.group_rollup_mode === \"flat\") {\n return config.group_by.length;\n } else if (config.group_rollup_mode === \"total\") {\n return 0;\n } else if (config.group_by.length === 0) {\n return 0;\n } else {\n return config.group_by.length + 1;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport type { ColorRecord } from \"./types.js\";\n\nexport function blend(a: string, b: number[]): string {\n return chroma.mix(a, `rgb(${b[0]},${b[1]},${b[2]})`, 0.5).hex();\n}\n\n// AFAICT `chroma-js` has no alpha-aware blending? So we need a function to get\n// the color of a heatmap cell over the background.\nexport function rgbaToRgb(\n [r, g, b, a]: [number, number, number, number],\n source: [number, number, number] = [255, 255, 255],\n): [number, number, number] {\n function f(i: number, c: number): number {\n return ((1 - a) * (source[i] / 255) + a * (c / 255)) * 255;\n }\n\n return [f(0, r), f(1, g), f(2, b)];\n}\n\n// Chroma does this but why bother?\nexport function infer_foreground_from_background([r, g, b]: [\n number,\n number,\n number,\n]): string {\n // TODO Implement dark/light themes.\n return Math.sqrt(r * r * 0.299 + g * g * 0.587 + b * b * 0.114) > 130\n ? \"#161616\"\n : \"#ffffff\";\n}\n\nfunction make_gradient(chromahex: chroma.Color): string {\n const [r, g, b] = chromahex.rgb();\n const [r1, g1, b1] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") - 15) % 360)\n .rgb();\n const [r2, g2, b2] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") + 15) % 360)\n .rgb();\n return `linear-gradient(to right top,rgb(${r1},${g1},${b1}),rgb(${r},${g},${b}) 50%,rgb(${r2},${g2},${b2}))`;\n}\n\nexport function make_color_record(color: string): ColorRecord {\n const chroma_neg = chroma(color);\n const _neg_grad = make_gradient(chroma_neg);\n const rgb = chroma_neg.rgb();\n return [\n color,\n rgb[0],\n rgb[1],\n rgb[2],\n _neg_grad,\n `rgba(${rgb[0]},${rgb[1]},${rgb[2]},1)`,\n `rgba(${rgb[0]},${rgb[1]},${rgb[2]},0)`,\n ];\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport { createDataListener } from \"../data_listener/index.js\";\nimport { blend, make_color_record } from \"../color_utils.js\";\nimport type {\n ColumnType,\n Table,\n View,\n ViewConfig,\n} from \"@perspective-dev/client\";\nimport {\n type DatagridModel,\n type DatagridPluginElement,\n type RegularTable,\n type Schema,\n type ElemFactory,\n type EditMode,\n type PerspectiveViewerElement,\n get_psp_type,\n} from \"../types.js\";\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\n\nfunction get_rule(regular: HTMLElement, tag: string, def: string): string {\n const color = window.getComputedStyle(regular).getPropertyValue(tag).trim();\n if (color.length > 0) {\n return color;\n } else {\n return def;\n }\n}\n\nclass ElemFactoryImpl implements ElemFactory {\n private _name: string;\n private _elements: HTMLElement[];\n private _index: number;\n\n constructor(name: string) {\n this._name = name;\n this._elements = [];\n this._index = 0;\n }\n\n clear(): void {\n this._index = 0;\n }\n\n get(): HTMLElement {\n if (!this._elements[this._index]) {\n this._elements[this._index] = document.createElement(this._name);\n }\n const elem = this._elements[this._index];\n this._index += 1;\n return elem;\n }\n}\n\nexport async function createModel(\n this: DatagridPluginElement,\n regular: RegularTable,\n table: Table,\n view: View,\n extend: Partial<DatagridModel> = {},\n): Promise<DatagridModel> {\n const config = (await view.get_config()) as ViewConfig;\n if (this?.model?._config) {\n const old = this.model._config;\n let group_by_changed = old.group_by.length !== config.group_by.length;\n const type_changed =\n (old.group_by.length === 0 || config.group_by.length === 0) &&\n group_by_changed;\n\n if (!group_by_changed) {\n for (const lvl in old.group_by) {\n group_by_changed ||= config.group_by[lvl] !== old.group_by[lvl];\n }\n }\n\n let split_by_changed = old.split_by.length !== config.split_by.length;\n if (!split_by_changed) {\n for (const lvl in old.split_by) {\n split_by_changed ||= config.split_by[lvl] !== old.split_by[lvl];\n }\n }\n\n let columns_changed = old.columns.length !== config.columns.length;\n if (!columns_changed) {\n for (const lvl in old.columns) {\n columns_changed ||= config.columns[lvl] !== old.columns[lvl];\n }\n }\n\n let filter_changed = old.filter.length !== config.filter.length;\n if (!filter_changed) {\n for (const lvl in old.filter) {\n for (const i in config.filter[lvl]) {\n filter_changed ||=\n config.filter[lvl][i as unknown as number] !==\n old.filter[lvl][i as unknown as number];\n }\n }\n }\n\n let sort_changed = old.sort.length !== config.sort.length;\n if (!sort_changed) {\n for (const lvl in old.sort) {\n for (const i in config.sort[lvl]) {\n sort_changed ||=\n config.sort[lvl][i as unknown as number] !==\n old.sort[lvl][i as unknown as number];\n }\n }\n }\n\n const group_rollup_mode_changed =\n old.group_rollup_mode !== config.group_rollup_mode;\n\n this._reset_scroll_top = group_by_changed;\n this._reset_scroll_left = split_by_changed;\n this._reset_select =\n group_by_changed ||\n split_by_changed ||\n filter_changed ||\n sort_changed ||\n columns_changed;\n\n this._reset_column_size =\n group_rollup_mode_changed ||\n split_by_changed ||\n group_by_changed ||\n columns_changed ||\n type_changed;\n }\n\n const [table_schema, num_rows, schema, expression_schema, _edit_port] =\n await Promise.all([\n table.schema(),\n view.num_rows(),\n view.schema(),\n view.expression_schema(),\n (this.parentElement as PerspectiveViewerElement).getEditPort(),\n ]);\n\n const _plugin_background = chroma(\n get_rule(regular, \"--plugin--background\", \"#FFFFFF\"),\n ).rgb();\n\n const _pos_fg_color = make_color_record(\n get_rule(regular, \"--rt-pos-cell--color\", \"#338DCD\"),\n );\n\n const _neg_fg_color = make_color_record(\n get_rule(regular, \"--rt-neg-cell--color\", \"#FF5942\"),\n );\n\n const _pos_bg_color = make_color_record(\n blend(_pos_fg_color[0], _plugin_background),\n );\n\n const _neg_bg_color = make_color_record(\n blend(_neg_fg_color[0], _plugin_background),\n );\n\n const _color = make_color_record(\n get_rule(regular, \"--active--color\", \"#ff0000\"),\n );\n\n const _schema: Schema = {\n ...(schema as Schema),\n ...(expression_schema as Schema),\n };\n const _table_schema: Schema = {\n ...(table_schema as Schema),\n ...(expression_schema as Schema),\n };\n\n const _column_paths: string[] = [];\n const _is_editable: boolean[] = [];\n const _column_types: ColumnType[] = [];\n\n const _edit_mode: EditMode = this._edit_mode || \"READ_ONLY\";\n this._edit_button!.dataset.editMode = _edit_mode;\n\n const model: DatagridModel = Object.assign(extend, {\n _edit_port,\n _view: view,\n _table: table,\n _table_schema,\n _config: config,\n _num_rows: num_rows,\n _schema,\n _ids: [],\n _plugin_background,\n _color,\n _pos_fg_color,\n _neg_fg_color,\n _pos_bg_color,\n _neg_bg_color,\n _column_paths,\n _column_types,\n _is_editable,\n _edit_mode,\n _selection_state: {\n selected_areas: [],\n dirty: false,\n },\n _row_header_types: config.group_by.map((column_path) => {\n return _table_schema[column_path];\n }),\n _series_color_map: new Map<string, string>(),\n _series_color_seed: new Map<string, number>(),\n // get_psp_type,\n _div_factory: extend._div_factory || new ElemFactoryImpl(\"div\"),\n }) as DatagridModel;\n\n regular.setDataListener(\n createDataListener(this.parentElement as PerspectiveViewerElement).bind(\n model,\n regular,\n ) as any,\n {\n virtual_mode: (window\n .getComputedStyle(regular)\n .getPropertyValue(\"--datagrid-virtual-mode\")\n ?.trim() || \"both\") as\n | \"both\"\n | \"horizontal\"\n | \"vertical\"\n | \"none\",\n },\n );\n\n return model;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { DatagridPluginElement, EditMode } from \"../types.js\";\n\nexport const EDIT_MODES: readonly EditMode[] = [\n \"READ_ONLY\",\n \"EDIT\",\n \"SELECT_ROW\",\n \"SELECT_COLUMN\",\n \"SELECT_REGION\",\n] as const;\n\nexport function toggle_edit_mode(\n this: DatagridPluginElement,\n mode?: EditMode,\n): void {\n if (typeof mode === \"undefined\") {\n mode =\n EDIT_MODES[\n (EDIT_MODES.indexOf(this._edit_mode) + 1) % EDIT_MODES.length\n ];\n }\n\n (this.parentElement as any)?.setSelection?.();\n this._edit_mode = mode;\n if (this.model) {\n this.model._edit_mode = mode;\n this.model._selection_state = {\n selected_areas: [],\n dirty: true,\n };\n }\n\n if (this._edit_button !== undefined) {\n this._edit_button.dataset.editMode = mode;\n }\n\n this.dataset.editMode = mode;\n}\n\nexport function toggle_scroll_lock(\n this: DatagridPluginElement,\n force?: boolean,\n): void {\n if (typeof force === \"undefined\") {\n force = !this._is_scroll_lock;\n }\n\n this._is_scroll_lock = force;\n this.classList.toggle(\"sub-cell-scroll-disabled\", force);\n if (this._scroll_lock !== undefined) {\n this._scroll_lock.classList.toggle(\"lock-scroll\", force);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type {\n ColumnOverrides,\n DatagridPluginElement,\n RegularTable,\n} from \"../types.js\";\n\ninterface RegularTableWithOverrides {\n restoreColumnSizes(overrides: Record<number, number | undefined>): void;\n saveColumnSizes(): Record<number, number | undefined>;\n}\n\ninterface DatagridPluginWithCache extends DatagridPluginElement {\n _cached_column_sizes?: ColumnOverrides;\n}\n\n/**\n * Restore a saved column width override token.\n *\n * @param old_sizes An object previously returned by a call to\n * `save_column_size_overrides()`\n * @param cache A flag indicating whether this value should\n * be cached so a future `resetAutoSize()` call does not clear it.\n */\nexport function restore_column_size_overrides(\n this: DatagridPluginWithCache,\n old_sizes: ColumnOverrides,\n cache = false,\n): void {\n if (!this._initialized) {\n return;\n }\n\n if (cache) {\n this._cached_column_sizes = old_sizes;\n }\n\n const overrides: Record<number, number | undefined> = {};\n const { group_by } = this.model!._config;\n const tree_header_offset = group_by?.length > 0 ? group_by.length + 1 : 0;\n\n for (const key of Object.keys(old_sizes)) {\n if (key === \"__ROW_PATH__\") {\n overrides[tree_header_offset - 1] = old_sizes[key] as\n | number\n | undefined;\n } else {\n const index = this.model!._column_paths.indexOf(key);\n overrides[index + tree_header_offset] = old_sizes[key] as\n | number\n | undefined;\n }\n }\n\n (this.regular_table as RegularTableWithOverrides).restoreColumnSizes(\n overrides,\n );\n}\n\n/**\n * Extract the current user-overriden column widths from\n * `regular-table`. This function depends on the internal\n * implementation of `regular-table` and may break!\n *\n * @returns An Object-as-dictionary keyed by column_path string, and\n * valued by the column's user-overridden pixel width.\n */\nexport function save_column_size_overrides(\n this: DatagridPluginWithCache,\n): ColumnOverrides {\n if (!this._initialized) {\n return {};\n }\n\n if (this._cached_column_sizes) {\n const x = this._cached_column_sizes;\n this._cached_column_sizes = undefined;\n return x;\n }\n\n const overrides = (\n this.regular_table as RegularTableWithOverrides\n ).saveColumnSizes();\n const { group_by } = this.model!._config;\n const tree_header_offset = group_by?.length > 0 ? group_by.length + 1 : 0;\n\n const old_sizes: ColumnOverrides = {};\n for (const key of Object.keys(overrides)) {\n const numKey = Number(key);\n if (overrides[numKey] !== undefined) {\n const index = numKey - tree_header_offset;\n if (index > -1) {\n old_sizes[this.model!._column_paths[index]] = overrides[numKey];\n } else if (index === -1) {\n old_sizes[\"__ROW_PATH__\"] = overrides[numKey];\n }\n }\n }\n\n return old_sizes;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport {\n get_psp_type,\n type DatagridModel,\n type PerspectiveViewerElement,\n} from \"../types.js\";\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply selected column styling in response to column settings toggle events.\n * This is called directly (not as a style listener) when the user opens/closes\n * the column settings panel.\n */\nexport function style_selected_column(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selectedColumn: string | undefined,\n): void {\n const group_header_trs = Array.from(\n regularTable.children[0].children[0].children,\n ) as HTMLTableRowElement[];\n\n const len = group_header_trs.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n if (len <= 1) {\n group_header_trs[0]?.removeAttribute(\"id\");\n } else {\n group_header_trs.forEach((tr, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? tr.setAttribute(\"id\", id) : tr.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n if (settings_open && len >= 2) {\n const titles = Array.from(\n group_header_trs[len - 2].children,\n ) as HTMLElement[];\n const editBtns = Array.from(\n group_header_trs[len - 1].children,\n ) as HTMLElement[];\n if (titles && editBtns) {\n group_header_trs.slice(0, len - 2).forEach((tr) => {\n Array.from(tr.children).forEach((th) => {\n th.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titles.length; i++) {\n const title = titles[i];\n const editBtn = editBtns[i];\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n if (this._config.columns.length > 1) {\n for (const r of regularTable.querySelectorAll(\"td\")) {\n const meta = regularTable.getMeta(r);\n if (!meta?.column_header) continue;\n const isOpen =\n meta.column_header[\n meta.column_header.length - 2\n ] === selectedColumn;\n r.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n }\n }\n }\n}\n\n/**\n * Style a single column header row.\n */\nexport function styleColumnHeaderRow(\n this: DatagridModel,\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n): void {\n const header_depth =\n this._config.group_by.length -\n (this._config.group_rollup_mode === \"flat\" ? 1 : 0);\n\n const selectedColumn = this._column_settings_selected_column;\n for (const { element: td, metadata } of headerRow.cells) {\n if (\n !metadata ||\n metadata.type === \"body\" ||\n metadata.type === \"row_header\"\n )\n continue;\n\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n\n const sort = this._config.sort.find((x) => x[0] === column_name);\n const is_corner = typeof metadata.x === \"undefined\";\n const needs_border =\n (metadata.type === \"corner\" &&\n metadata.row_header_x === header_depth) ||\n (!is_corner &&\n (metadata.x + 1) % this._config.columns.length === 0);\n\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\"psp-header-group\", false);\n td.classList.toggle(\"psp-header-leaf\", true);\n td.classList.toggle(\"psp-is-top\", false);\n td.classList.toggle(\"psp-header-corner\", is_corner);\n td.classList.toggle(\n \"psp-header-sort-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc abs\",\n );\n\n const type = get_psp_type(this, metadata);\n const is_numeric = type === \"integer\" || type === \"float\";\n const is_string = type === \"string\";\n const is_date = type === \"date\";\n const is_datetime = type === \"datetime\";\n\n td.classList.toggle(\"psp-align-right\", is_numeric);\n td.classList.toggle(\"psp-align-left\", !is_numeric);\n td.classList.toggle(\n \"psp-menu-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length + 1,\n );\n td.classList.toggle(\n \"psp-sort-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length,\n );\n td.classList.toggle(\n \"psp-is-width-override\",\n regularTable.saveColumnSizes()[metadata.size_key!] !== undefined,\n );\n\n // Apply menu-open for selected column\n if (this._config.columns.length > 1 && selectedColumn) {\n const isOpen =\n metadata.column_header?.[metadata.column_header.length - 2] ===\n selectedColumn;\n td.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SortRotationOrder,\n SortTerm,\n} from \"../types.js\";\nimport { SortDir } from \"@perspective-dev/client\";\n\nconst ROW_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: undefined,\n \"desc abs\": \"asc abs\",\n \"asc abs\": undefined,\n};\n\nconst ROW_COL_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: undefined,\n \"desc abs\": \"asc abs\",\n \"asc abs\": undefined,\n // \"col desc\": \"col asc\",\n // \"col asc\": undefined,\n // \"col desc abs\": \"col asc abs\",\n // \"col asc abs\": undefined,\n};\n\nexport async function sortHandler(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n target: HTMLElement,\n): Promise<void> {\n const meta = regularTable.getMeta(target);\n if (!meta?.column_header) return;\n const column_name = meta.column_header[this._config.split_by.length];\n const sort_method =\n event.ctrlKey ||\n (event as MouseEvent & { metaKey?: boolean }).metaKey ||\n event.altKey\n ? append_sort\n : override_sort;\n\n const abs = event.shiftKey;\n const sort = sort_method.call(this, `${column_name}`, abs);\n await viewer.restore({ sort });\n}\n\nexport function append_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n const sort: SortTerm[] = [];\n let found = false;\n for (const sort_term of this._config.sort) {\n const [_column_name, _sort_dir] = sort_term;\n if (_column_name === column_name) {\n found = true;\n const term = create_sort.call(this, column_name, _sort_dir, abs);\n if (term) {\n sort.push(term);\n }\n } else {\n sort.push(sort_term);\n }\n }\n\n if (!found) {\n sort.push([column_name, abs ? \"desc abs\" : \"desc\"]);\n }\n\n return sort;\n}\n\nexport function override_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n for (const [_column_name, _sort_dir] of this._config.sort) {\n if (_column_name === column_name) {\n const sort = create_sort.call(this, column_name, _sort_dir, abs);\n return sort ? [sort] : [];\n }\n }\n\n return [[column_name, abs ? \"desc abs\" : \"desc\"]];\n}\n\nexport function create_sort(\n this: DatagridModel,\n column_name: string,\n sort_dir: SortDir | undefined,\n _abs: boolean,\n): SortTerm | undefined {\n const is_col_sortable = this._config.split_by.length > 0;\n const order = is_col_sortable ? ROW_COL_SORT_ORDER : ROW_SORT_ORDER;\n const inc_sort_dir: SortDir | undefined = sort_dir\n ? order[sort_dir]\n : \"desc\";\n\n if (inc_sort_dir) {\n return [column_name, inc_sort_dir];\n }\n\n return undefined;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { RegularTable, DatagridModel } from \"../types.js\";\n\nexport async function expandCollapseHandler(\n this: DatagridModel,\n regularTable: RegularTable,\n event: MouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as HTMLElement);\n if (!meta || meta.type !== \"row_header\") return;\n const is_collapse = (event.target as Element).classList.contains(\n \"psp-tree-label-collapse\",\n );\n\n if (event.shiftKey && is_collapse) {\n this._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 2,\n );\n } else if (event.shiftKey) {\n this._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 1,\n );\n } else if (is_collapse) {\n this._view.collapse(meta.y);\n } else {\n this._view.expand(meta.y);\n }\n\n this._num_rows = await this._view.num_rows();\n this._num_columns = await this._view.num_columns();\n regularTable.draw();\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { sortHandler } from \"./sort.js\";\nimport { expandCollapseHandler } from \"./expand_collapse.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nexport async function mousedown_listener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n if (event.which !== 1) {\n return;\n }\n\n let target = event.target as HTMLElement | null;\n if (target?.tagName === \"A\") {\n return;\n }\n\n while (target && target.tagName !== \"TD\" && target.tagName !== \"TH\") {\n target = target.parentElement;\n if (!target || !regularTable.contains(target)) {\n return;\n }\n }\n\n if (!target) return;\n\n if (target.classList.contains(\"psp-tree-label\")) {\n expandCollapseHandler.call(this, regularTable, event);\n return;\n }\n\n if (target.classList.contains(\"psp-menu-enabled\")) {\n const meta = regularTable.getMeta(target);\n const column_name = meta?.column_header?.[this._config.split_by.length];\n await viewer.toggleColumnSettings(`${column_name}`);\n } else if (target.classList.contains(\"psp-sort-enabled\")) {\n sortHandler.call(this, regularTable, viewer, event, target);\n }\n}\n\nexport function click_listener(\n regularTable: RegularTable,\n event: MouseEvent,\n): void {\n if (event.which !== 1) {\n return;\n }\n\n let target = event.target as HTMLElement | null;\n while (target && target.tagName !== \"TD\" && target.tagName !== \"TH\") {\n target = target.parentElement;\n if (!target || !regularTable.contains(target)) {\n return;\n }\n }\n\n if (!target) return;\n\n if (target.classList.contains(\"psp-tree-label\") && event.offsetX < 26) {\n event.stopImmediatePropagation();\n } else if (\n target.classList.contains(\"psp-header-leaf\") &&\n !target.classList.contains(\"psp-header-corner\")\n ) {\n event.stopImmediatePropagation();\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport {\n type RegularTable,\n type DatagridModel,\n type PerspectiveViewerElement,\n get_psp_type,\n} from \"../../types.js\";\n\nexport function write_cell(\n table: RegularTable,\n model: DatagridModel,\n active_cell: HTMLElement,\n): boolean {\n const meta = table.getMeta(active_cell) as CellMetadataBody;\n if (!meta) {\n return false;\n }\n const type = model._schema[model._column_paths[meta.x!]];\n let text: string | number | boolean | null = active_cell.textContent || \"\";\n const id = model._ids[meta.y! - meta.y0][0];\n if (type === \"float\" || type === \"integer\") {\n const parsed = parseFloat(text.replace(/,/g, \"\"));\n if (isNaN(parsed)) {\n return false;\n }\n text = parsed;\n } else if (type === \"date\" || type === \"datetime\") {\n const parsed = Date.parse(text);\n if (isNaN(parsed)) {\n return false;\n }\n text = parsed;\n } else if (type === \"boolean\") {\n text = text === \"true\" ? false : text === \"false\" ? true : null;\n }\n\n const msg = {\n __INDEX__: id,\n [model._column_paths[meta.x]]: text,\n };\n\n model._table.update([msg], { port_id: model._edit_port, format: null });\n return true;\n}\n\nexport function clickListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): void {\n const meta = table.getMeta(event.target as HTMLElement);\n if (meta?.type === \"body\" || meta?.type === \"column_header\") {\n const is_editable2 = this._is_editable[meta.x];\n const is_bool = get_psp_type(this, meta) === \"boolean\";\n const is_null = (event.target as Element).classList.contains(\n \"psp-null\",\n );\n\n if (is_editable2 && is_bool && !is_null) {\n write_cell(table, this, event.target as HTMLElement);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel, SelectedPosition } from \"../types.js\";\nimport { CollectedCell, LocalSelectedPositionMap } from \"./types.js\";\n\n/**\n * Apply focus style to the selected cell.\n * Optimized to use collected cells instead of querySelectorAll.\n */\nexport function applyFocusStyle(\n this: DatagridModel,\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n): void {\n const selected_position = selectedPositionMap.get(regularTable);\n const host = regularTable.getRootNode() as Document;\n\n if (selected_position) {\n for (const { element: td, metadata } of cells) {\n if (\n metadata.type === \"body\" &&\n metadata.x === selected_position.x &&\n metadata.y === selected_position.y\n ) {\n if (host.activeElement !== td) {\n td.focus({ preventScroll: true });\n }\n return;\n }\n }\n\n // If we didn't find the cell to focus, blur current\n if (\n document.activeElement !== document.body &&\n regularTable.contains(host.activeElement)\n ) {\n (host.activeElement as HTMLElement).blur();\n }\n }\n}\n\n/**\n * Standalone function to focus the selected cell.\n * This collects cells from the table and tries to focus the selected position.\n * Returns true if focus was successful, false otherwise.\n *\n * Used by edit_keydown.ts for keyboard navigation.\n */\nexport function focusSelectedCell(\n regularTable: RegularTableElement,\n selectedPositionMap: Map<RegularTableElement, SelectedPosition>,\n): boolean {\n const selected_position = selectedPositionMap.get(regularTable);\n if (!selected_position) {\n return false;\n }\n\n const host = regularTable.getRootNode() as Document;\n const tbody = regularTable.children[0]?.children[1];\n\n if (tbody) {\n for (const tr of tbody.children) {\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(cell as HTMLElement);\n if (\n metadata?.type === \"body\" &&\n metadata.x === selected_position.x &&\n metadata.y === selected_position.y\n ) {\n if (host.activeElement !== cell) {\n (cell as HTMLElement).focus({ preventScroll: true });\n }\n return true;\n }\n }\n }\n }\n\n // If we didn't find the cell to focus, blur current\n if (\n document.activeElement !== document.body &&\n regularTable.contains(host.activeElement)\n ) {\n (host.activeElement as HTMLElement).blur();\n }\n\n return false;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { focusSelectedCell } from \"../../style_handlers/focus.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../../types.js\";\n\ntype SelectedPositionMap = Map<RegularTable, SelectedPosition>;\n\ntype AsyncFunction<T extends unknown[], R> = (\n this: DatagridModel,\n ...args: T\n) => Promise<R>;\n\nfunction lock<T extends unknown[], R>(\n body: AsyncFunction<T, R>,\n): AsyncFunction<T, R | undefined> {\n let lockPromise: Promise<void> | undefined;\n return async function (\n this: DatagridModel,\n ...args: T\n ): Promise<R | undefined> {\n if (lockPromise) {\n await lockPromise;\n return;\n }\n\n let resolve: () => void;\n lockPromise = new Promise((x) => (resolve = x));\n const result = await body.apply(this, args);\n lockPromise = undefined;\n resolve!();\n return result;\n };\n}\n\ninterface ContentEditableElement extends HTMLElement {\n isContentEditable: boolean;\n selectionStart?: number;\n}\n\nfunction getPos(this: ContentEditableElement): number {\n if (this.isContentEditable) {\n const _range = (this.getRootNode() as Document)\n .getSelection()\n ?.getRangeAt(0);\n if (!_range) return 0;\n const range = _range.cloneRange();\n range.selectNodeContents(this);\n range.setEnd(_range.endContainer, _range.endOffset);\n return range.toString().length;\n } else {\n return this.selectionStart || 0;\n }\n}\n\nconst moveSelection = lock(async function (\n this: DatagridModel,\n table: RegularTable,\n selected_position_map: SelectedPositionMap,\n active_cell: HTMLElement,\n dx: number,\n dy: number,\n): Promise<void> {\n const meta = table.getMeta(active_cell);\n if (!meta || meta.type !== \"body\") return;\n const num_columns = this._column_paths.length;\n const num_rows = this._num_rows;\n const selected_position = selected_position_map.get(table);\n if (!selected_position) {\n return;\n }\n\n if (meta.x + dx < num_columns && 0 <= meta.x + dx) {\n selected_position.x = meta.x + dx;\n }\n\n if (meta.y + dy < num_rows && 0 <= meta.y + dy) {\n selected_position.y = meta.y + dy;\n }\n\n const xmin = Math.max(meta.x0 - 10, 0);\n const xmax = Math.min(meta.x0 + 10, num_columns);\n const ymin = Math.max(meta.y0 - 5, 0);\n const ymax = Math.min(meta.y0 + 10, num_rows);\n let x = meta.x0 + dx,\n y = meta.y0 + dy;\n while (\n !focusSelectedCell(table, selected_position_map) &&\n x >= xmin &&\n x < xmax &&\n y >= ymin &&\n y < ymax\n ) {\n await table.scrollToCell(x, y);\n selected_position_map.set(table, selected_position);\n x += dx;\n y += dy;\n }\n});\n\nfunction isLastCell(\n model: DatagridModel,\n table: RegularTable,\n target: HTMLElement,\n): boolean {\n const meta = table.getMeta(target);\n return meta?.type === \"body\" && meta.y === model._num_rows - 1;\n}\n\nexport function keydownListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: KeyboardEvent,\n): void {\n const target = (table.getRootNode() as Document)\n .activeElement as HTMLElement;\n (event.target as HTMLElement).classList.remove(\"psp-error\");\n switch (event.key) {\n case \"Enter\":\n event.preventDefault();\n if (isLastCell(this, table, target)) {\n target.blur();\n selected_position_map.delete(table);\n } else if (event.shiftKey) {\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n } else {\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n }\n break;\n case \"ArrowLeft\":\n if (getPos.call(target as ContentEditableElement) === 0) {\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n -1,\n 0,\n );\n }\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n break;\n case \"ArrowRight\":\n if (\n getPos.call(target as ContentEditableElement) ===\n (target.textContent?.length || 0)\n ) {\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 1,\n 0,\n );\n }\n break;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n break;\n default:\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport * as edit_click from \"./click/edit_click.js\";\nimport * as edit_keydown from \"./keydown/edit_keydown.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\nimport { HTMLPerspectiveViewerDatagridPluginElement } from \"../custom_elements/datagrid.js\";\n\ntype SelectedPositionMap = Map<RegularTableElement, SelectedPosition>;\n\nexport function is_editable(\n this: DatagridModel,\n viewer: PerspectiveViewerElement,\n allowed: boolean = false,\n): boolean {\n const has_pivots =\n this._config.group_by.length === 0 &&\n this._config.split_by.length === 0;\n const selectable = viewer.hasAttribute(\"selectable\");\n const plugin = viewer.children[0] as\n | HTMLPerspectiveViewerDatagridPluginElement\n | undefined;\n const editable = allowed || !!(plugin?._edit_mode === \"EDIT\");\n return has_pivots && !selectable && editable;\n}\n\nexport function keydownListener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: KeyboardEvent,\n): void {\n if (this._edit_mode === \"EDIT\") {\n if (!is_editable.call(this, viewer)) {\n return;\n }\n\n edit_keydown.keydownListener.call(\n this,\n table,\n viewer,\n selected_position_map,\n event,\n );\n } else {\n console.debug(\n `Mode ${this._edit_mode} for \"keydown\" event not yet implemented`,\n );\n }\n}\n\nexport function clickListener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): void {\n if (this._edit_mode === \"EDIT\") {\n if (!is_editable.call(this, viewer)) {\n return;\n }\n\n edit_click.clickListener.call(this, table, viewer, event);\n } else if (this._edit_mode === \"READ_ONLY\") {\n // No-op for read-only mode\n } else if (this._edit_mode === \"SELECT_COLUMN\") {\n // Not yet implemented\n } else if (this._edit_mode === \"SELECT_ROW\") {\n // Not yet implemented\n } else if (this._edit_mode === \"SELECT_REGION\") {\n // Not yet implemented\n } else {\n console.debug(\n `Mode ${this._edit_mode} for \"click\" event not yet implemented`,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { is_editable } from \"./click.js\";\nimport { write_cell } from \"./click/edit_click.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\n\ntype SelectedPositionMap = Map<RegularTable, SelectedPosition>;\n\nexport function focusoutListener(\n this: DatagridModel,\n table: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: FocusEvent,\n): void {\n if (is_editable.call(this, viewer) && selected_position_map.has(table)) {\n const target = event.target as HTMLElement;\n target.classList.remove(\"psp-error\");\n const selectedPosition = selected_position_map.get(table)!;\n selected_position_map.delete(table);\n if (selectedPosition.content !== target.textContent) {\n if (!write_cell(table, this, target)) {\n target.textContent = selectedPosition.content || \"\";\n target.classList.add(\"psp-error\");\n target.focus();\n }\n }\n }\n}\n\nexport function focusinListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: FocusEvent,\n): void {\n const target = event.target as HTMLElement;\n const meta = table.getMeta(target);\n if (meta?.type === \"body\") {\n const new_state: SelectedPosition = {\n x: meta.x,\n y: meta.y,\n content: target.textContent || undefined,\n };\n selected_position_map.set(table, new_state);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { View, ViewConfig, Filter, Scalar } from \"@perspective-dev/client\";\nimport type { CellConfigResult } from \"./types.js\";\n\ninterface ModelWithViewAndConfig {\n _view: View;\n _config: ViewConfig;\n}\n\ninterface RowData {\n __ROW_PATH__?: unknown[];\n [key: string]: unknown;\n}\n\nexport default async function getCellConfig(\n { _view, _config }: ModelWithViewAndConfig,\n row_idx: number,\n col_idx: number,\n): Promise<CellConfigResult> {\n const group_by = _config.group_by;\n const split_by = _config.split_by;\n const start_row = row_idx >= 0 ? row_idx : 0;\n const end_row = start_row + 1;\n const r = (await _view.to_json({ start_row, end_row })) as RowData[];\n const row_paths = r.map((x) => x.__ROW_PATH__);\n const group_by_values = (row_paths[0] || []) as Scalar[];\n const row_filters = group_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = group_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined);\n\n const column_index = group_by.length > 0 ? col_idx + 1 : col_idx;\n const column_paths = Object.keys(r[0])[column_index];\n const result: CellConfigResult = {\n row: r[0] as Record<string, unknown>,\n column_names: [],\n config: { filter: [] },\n };\n\n let column_filters: Filter[] = [];\n if (column_paths) {\n const split_by_values = column_paths.split(\"|\");\n result.column_names = [split_by_values[split_by.length]];\n column_filters = split_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = split_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined)\n .filter(([, , value]) => value !== \"__ROW_PATH__\");\n }\n\n const filter = _config.filter.concat(row_filters).concat(column_filters);\n result.config = { filter };\n return result;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport getCellConfig from \"../get_cell_config.js\";\nimport {\n type RegularTable,\n type DatagridModel,\n type PerspectiveViewerElement,\n type HandledMouseEvent,\n PerspectiveSelectDetail,\n} from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTable, unknown[]>;\n\nexport async function selectionListener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n event: HandledMouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as HTMLElement);\n if (!viewer.hasAttribute(\"selectable\")) return;\n if (event.handled) return;\n if (event.shiftKey) return;\n if (event.button !== 0) {\n return;\n }\n\n event.stopImmediatePropagation();\n\n if (!meta) {\n return;\n }\n\n if ((meta.type === \"body\" || meta.type === \"row_header\") && meta.y >= 0) {\n const id = this._ids?.[meta.y - meta.y0];\n const selected = selected_rows_map.get(regularTable);\n const key_match =\n !!selected &&\n selected.reduce<boolean>((agg, x, i) => agg && x === id[i], true);\n\n const is_deselect =\n !!selected && id.length === selected.length && key_match;\n\n const { row, column_names, config } = await getCellConfig(\n this,\n meta.y,\n meta.type === \"body\" ? meta.x : 0,\n );\n\n let detail: PerspectiveSelectDetail;\n if (is_deselect) {\n selected_rows_map.delete(regularTable);\n detail = new PerspectiveSelectDetail(\n false,\n row,\n [],\n [],\n [{ filter: structuredClone(this._config.filter) }],\n );\n } else {\n selected_rows_map.set(regularTable, id);\n detail = new PerspectiveSelectDetail(\n true,\n row,\n column_names,\n [],\n [config],\n );\n }\n\n await regularTable.draw({ preserve_width: true });\n event.handled = true;\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveSelectDetail>(\"perspective-select\", {\n bubbles: true,\n composed: true,\n detail,\n }),\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { PerspectiveViewerElement } from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTableElement, unknown[]>;\n\nexport async function deselect_all_listener(\n regularTable: RegularTableElement,\n _viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n): Promise<void> {\n selected_rows_map.delete(regularTable);\n for (const td of regularTable.querySelectorAll(\"td,th\")) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport getCellConfig from \"../get_cell_config.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n PerspectiveClickDetail,\n} from \"../types.js\";\n\nexport async function dispatch_click_listener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n const meta = table.getMeta(event.target as HTMLElement);\n if (!meta || meta.type !== \"body\") return;\n const { x, y } = meta;\n const { row, column_names, config } = await getCellConfig(this, y, x);\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveClickDetail>(\"perspective-click\", {\n bubbles: true,\n composed: true,\n detail: {\n row,\n column_names,\n config,\n },\n }),\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectionArea,\n} from \"../types.js\";\nimport { ViewWindow } from \"@perspective-dev/client\";\n\nconst MOUSE_SELECTED_AREA_CLASS = \"mouse-selected-area\";\n\ninterface AddAreaMouseSelectionOptions {\n className?: string;\n selected?: SelectionArea[];\n}\n\nexport const addAreaMouseSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n {\n className = MOUSE_SELECTED_AREA_CLASS,\n selected = [],\n }: AddAreaMouseSelectionOptions = {},\n): RegularTableElement => {\n datagrid.model!._selection_state = {\n selected_areas: selected,\n dirty: true,\n };\n\n table.addEventListener(\n \"mousedown\",\n getMousedownListener(datagrid, table, className),\n );\n\n table.addEventListener(\n \"mouseover\",\n getMouseoverListener(datagrid, table, className),\n );\n\n table.addEventListener(\n \"mouseup\",\n getMouseupListener(datagrid, table, className),\n );\n\n table.addStyleListener(() =>\n applyMouseAreaSelections(datagrid, table, className),\n );\n\n return table;\n};\n\nconst getMousedownListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n mouseEvent.button === 0 &&\n (datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\")\n ) {\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES = {};\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {\n x: meta.x,\n y: meta.y,\n };\n\n datagrid.model!._selection_state.old_selected_areas =\n datagrid.model!._selection_state.selected_areas;\n datagrid.model!._selection_state.selected_areas = [];\n\n const start: SelectionArea = {\n x0: meta.x,\n x1: meta.x,\n y0: meta.y,\n y1: meta.y,\n };\n datagrid.model!._selection_state.potential_selection = start;\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n datagrid.model!._selection_state.selected_areas.concat([\n start,\n ]),\n );\n\n return;\n }\n }\n\n datagrid.model!._selection_state.selected_areas = [];\n };\n\nconst getMouseoverListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n if (\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES &&\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES\n .x !== undefined\n ) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n const potentialSelection: SelectionArea = {\n x0: Math.min(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n x1: Math.max(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n y0: Math.min(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n y1: Math.max(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n };\n\n datagrid.model!._selection_state.potential_selection =\n potentialSelection;\n\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n datagrid.model!._selection_state.selected_areas.concat([\n potentialSelection,\n ]),\n );\n }\n }\n }\n };\n\nconst getMouseupListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (!meta) return;\n\n if (\n (datagrid.model!._selection_state.old_selected_areas?.length ??\n 0) > 0\n ) {\n const selected =\n datagrid.model!._selection_state.old_selected_areas![0];\n if (\n selected.x0 === selected.x1 &&\n selected.y0 === selected.y1 &&\n meta?.type === \"body\" &&\n selected.x0 === meta.x &&\n selected.y0 === meta.y\n ) {\n datagrid.model!._selection_state.selected_areas = [];\n datagrid.model!._selection_state.old_selected_areas = [];\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {};\n datagrid.model!._selection_state.potential_selection =\n undefined;\n applyMouseAreaSelections(datagrid, table, className, []);\n return;\n }\n }\n\n datagrid.model!._selection_state.old_selected_areas = [];\n\n if (\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES &&\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES\n .x !== undefined &&\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n const selection: SelectionArea = {\n x0: Math.min(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n x1: Math.max(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n y0: Math.min(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n y1: Math.max(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n };\n datagrid.model!._selection_state.selected_areas.push(selection);\n applyMouseAreaSelections(datagrid, table, className);\n }\n\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES = {};\n datagrid.model!._selection_state.potential_selection = undefined;\n }\n };\n\nfunction set_psp_selection(\n viewer: PerspectiveViewerElement,\n datagrid: DatagridPluginElement,\n { x0, x1, y0, y1 }: SelectionArea,\n): void {\n const viewport: ViewWindow = {};\n const mode = datagrid.model!._edit_mode;\n if (\n x0 !== undefined &&\n [\"SELECT_COLUMN\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.start_col = x0;\n }\n\n if (\n x1 !== undefined &&\n [\"SELECT_COLUMN\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.end_col = x1 + 1;\n }\n\n if (\n y0 !== undefined &&\n [\"SELECT_ROW\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.start_row = y0;\n }\n\n if (\n y1 !== undefined &&\n [\"SELECT_ROW\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.end_row = y1 + 1;\n }\n\n viewer.setSelection(viewport);\n}\n\nexport const applyMouseAreaSelections = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n selected?: SelectionArea[],\n): void => {\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n selected = datagrid.model!._selection_state.selected_areas.slice(0);\n if (datagrid.model!._selection_state.potential_selection) {\n selected.push(datagrid.model!._selection_state.potential_selection);\n }\n\n const tds = table.querySelectorAll(\"tbody td\");\n\n if (selected.length > 0) {\n set_psp_selection(\n datagrid.parentElement as any,\n datagrid,\n selected[0],\n );\n applyMouseAreaSelection(datagrid, table, selected, className);\n } else {\n (datagrid.parentElement as any).setSelection();\n for (const td of tds) {\n td.classList.remove(className);\n }\n }\n } else if (datagrid.model!._selection_state.dirty) {\n datagrid.model!._selection_state.dirty = false;\n const tds = table.querySelectorAll(\"tbody td\");\n for (const td of tds) {\n td.classList.remove(className);\n }\n }\n};\n\nconst applyMouseAreaSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n selected: SelectionArea[],\n className: string,\n): void => {\n if (datagrid.model!._edit_mode === \"SELECT_REGION\" && selected.length > 0) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta || meta.type !== \"body\") continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined\n ) {\n if (\n x0 <= meta.x &&\n meta.x <= x1 &&\n y0 <= meta.y &&\n meta.y <= y1\n ) {\n rendered = true;\n datagrid.model!._selection_state.dirty = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n } else if (\n datagrid.model!._edit_mode === \"SELECT_ROW\" &&\n selected.length > 0\n ) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta) continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined &&\n meta?.type === \"body\"\n ) {\n if (y0 <= meta.y && meta.y <= y1) {\n datagrid.model!._selection_state.dirty = true;\n rendered = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n } else if (\n datagrid.model!._edit_mode === \"SELECT_COLUMN\" &&\n selected.length > 0\n ) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta) continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined &&\n meta?.type === \"body\"\n ) {\n if (x0 <= meta.x && meta.x <= x1) {\n datagrid.model!._selection_state.dirty = true;\n rendered = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n }\n};\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\n\nimport type { DatagridModel, PerspectiveViewerElement } from \"../types.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to column header rows.\n */\nexport function applyColumnHeaderStyles(\n this: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n): void {\n if (headerRows.length === 0) return;\n\n // Style selected column for settings panel\n const selectedColumn = this._column_settings_selected_column;\n const len = headerRows.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n\n // Set row IDs\n if (len <= 1) {\n headerRows[0]?.row.removeAttribute(\"id\");\n } else {\n headerRows.forEach(({ row }, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? row.setAttribute(\"id\", id) : row.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n\n // Style column titles and edit buttons when settings open\n if (settings_open && len >= 2) {\n const titlesRow = headerRows[len - 2];\n const editBtnsRow = headerRows[len - 1];\n\n if (titlesRow && editBtnsRow) {\n // Clear menu-open from other rows\n headerRows.slice(0, len - 2).forEach(({ cells }) => {\n cells.forEach(({ element }) => {\n element.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titlesRow.cells.length; i++) {\n const title = titlesRow.cells[i]?.element;\n const editBtn = editBtnsRow.cells[i]?.element;\n if (!title || !editBtn) continue;\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n }\n }\n }\n\n // Style the actual column header rows\n const colHeadersIndex = this._config.split_by.length;\n if (colHeadersIndex < headerRows.length) {\n const colHeaders = headerRows[colHeadersIndex];\n if (colHeaders) {\n this._styleColumnHeaderRow(colHeaders, regularTable, false);\n }\n }\n\n const menuHeadersIndex = this._config.split_by.length + 1;\n if (menuHeadersIndex < headerRows.length) {\n const menuHeaders = headerRows[menuHeadersIndex];\n if (menuHeaders) {\n this._styleColumnHeaderRow(menuHeaders, regularTable, true);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel } from \"../types.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to group header rows.\n */\nexport function applyGroupHeaderStyles(\n this: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n): void {\n const header_depth = this._config.group_by.length;\n const m: boolean[][] = [];\n let marked = new Set<number>();\n\n for (let y = 0; y < headerRows.length; y++) {\n const { row, cells } = headerRows[y];\n const tops = new Set<number>();\n\n for (let x = 0; x < cells.length; x++) {\n const { element: td, metadata } = cells[x];\n if (!metadata) continue;\n\n td.style.backgroundColor = \"\";\n\n const needs_border =\n (metadata.type === \"corner\" &&\n header_depth > 0 &&\n metadata.row_header_x === header_depth) ||\n (metadata.type === \"column_header\" && metadata.x >= 0);\n\n td.classList.toggle(\"psp-align-right\", false);\n td.classList.toggle(\"psp-align-left\", false);\n td.classList.toggle(\"psp-header-group\", true);\n td.classList.toggle(\"psp-header-leaf\", false);\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\n \"psp-header-group-corner\",\n metadata.type === \"corner\",\n );\n\n td.classList.toggle(\"psp-color-mode-bar\", false);\n td.classList.toggle(\"psp-header-sort-asc\", false);\n td.classList.toggle(\"psp-header-sort-desc\", false);\n td.classList.toggle(\"psp-header-sort-col-asc\", false);\n td.classList.toggle(\"psp-header-sort-col-desc\", false);\n td.classList.toggle(\"psp-sort-enabled\", false);\n\n // Calculate spanning for psp-is-top\n let xx = x;\n for (; m[y] && m[y][xx]; ++xx);\n tops.add(xx);\n\n const cell = td;\n for (let tx = xx; tx < xx + cell.colSpan; ++tx) {\n for (let ty = y; ty < y + cell.rowSpan; ++ty) {\n if (!m[ty]) m[ty] = [];\n m[ty][tx] = true;\n }\n }\n\n cell.classList.toggle(\"psp-is-top\", y === 0 || !marked.has(xx));\n }\n\n marked = tops;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel, ColorRecord } from \"../../types.js\";\n\nexport function style_cell_flash(\n this: DatagridModel,\n metadata: CellMetadataBody,\n td: HTMLElement,\n [, , , , , pos_s, pos_e]: ColorRecord,\n [, , , , , neg_s, neg_e]: ColorRecord,\n is_settings_open: boolean,\n): void {\n const id = this._ids?.[metadata.dy ?? 0]?.join(\"|\");\n const metadata_path = (\n is_settings_open\n ? (metadata.column_header ?? []).slice(0, -1)\n : (metadata.column_header ?? [])\n ).join(\"|\");\n\n if (\n this.last_reverse_columns?.has(metadata_path) &&\n this.last_reverse_ids?.has(id)\n ) {\n const row_idx = this.last_reverse_ids?.get(id);\n const col_idx = this.last_reverse_columns.get(metadata_path);\n if (!this._is_old_viewport) {\n td.style.animation = \"\";\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (this.last_meta![col_idx]![row_idx] as number) >\n ((metadata.user ?? 0) as number)\n ) {\n td.style.setProperty(\"--pulse--background-color-start\", neg_s);\n td.style.setProperty(\"--pulse--background-color-end\", neg_e);\n if (td.style.animationName === \"pulse_neg\") {\n td.style.animation = \"pulse_neg2 0.5s linear\";\n } else {\n td.style.animation = \"pulse_neg 0.5s linear\";\n }\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (this.last_meta![col_idx]![row_idx] as number) <\n ((metadata.user ?? 0) as number)\n ) {\n td.style.setProperty(\"--pulse--background-color-start\", pos_s);\n td.style.setProperty(\"--pulse--background-color-end\", pos_e);\n if (td.style.animationName === \"pulse_pos\") {\n td.style.animation = \"pulse_pos2 0.5s linear\";\n } else {\n td.style.animation = \"pulse_pos 0.5s linear\";\n }\n } else if (row_idx !== metadata.dy) {\n td.style.animation = \"\";\n }\n } else {\n td.style.animation = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_cell_flash } from \"./cell_flash.js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\ninterface CellMetaWithExtras {\n _is_hidden_by_aggregate_depth?: boolean;\n user?: number;\n dy: number;\n column_header?: string[];\n}\n\ninterface PluginWithColors\n extends Omit<\n ColumnConfig,\n \"pos_fg_color\" | \"neg_fg_color\" | \"pos_bg_color\" | \"neg_bg_color\"\n > {\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n}\n\nexport function cell_style_numeric(\n this: DatagridModel,\n plugin: PluginWithColors | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n is_settings_open: boolean,\n): void {\n const is_positive = (metadata.user ?? 0) > 0;\n const is_negative = (metadata.user ?? 0) < 0;\n\n let pos_bg_color: ColorRecord;\n if (plugin?.pos_bg_color !== undefined) {\n pos_bg_color = plugin.pos_bg_color;\n } else {\n pos_bg_color = this._pos_bg_color;\n }\n\n let neg_bg_color: ColorRecord;\n if (plugin?.neg_bg_color !== undefined) {\n neg_bg_color = plugin.neg_bg_color;\n } else {\n neg_bg_color = this._neg_bg_color;\n }\n\n const bg_tuple: ColorRecord = is_positive\n ? pos_bg_color\n : is_negative\n ? neg_bg_color\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n\n {\n const [hex, r, g, b] = bg_tuple;\n\n td.style.position = \"\";\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n } else if (plugin?.number_bg_mode === \"color\") {\n td.style.animation = \"\";\n td.style.backgroundColor = hex;\n } else if (plugin?.number_bg_mode === \"gradient\") {\n const a = Math.max(\n 0,\n Math.min(\n 1,\n Math.abs((metadata.user ?? 0) / (plugin.bg_gradient ?? 1)),\n ),\n );\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, a], source),\n );\n\n td.style.animation = \"\";\n td.style.color = foreground;\n td.style.backgroundColor = `rgba(${r},${g},${b},${a})`;\n } else if (plugin?.number_bg_mode === \"pulse\") {\n style_cell_flash.call(\n this,\n metadata as any,\n td,\n pos_bg_color,\n neg_bg_color,\n is_settings_open,\n );\n td.style.backgroundColor = \"\";\n } else if (\n plugin?.number_bg_mode === \"disabled\" ||\n !plugin?.number_bg_mode\n ) {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n } else {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n }\n }\n\n const fg_tuple: ColorRecord = (() => {\n if (plugin?.pos_fg_color !== undefined) {\n return is_positive\n ? plugin.pos_fg_color\n : is_negative\n ? plugin.neg_fg_color!\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n } else {\n return is_positive\n ? this._pos_fg_color\n : is_negative\n ? this._neg_fg_color\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n }\n })();\n\n const [hex, , , , gradhex] = fg_tuple;\n\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (plugin?.number_fg_mode === \"disabled\") {\n if (plugin?.number_bg_mode === \"color\") {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([bg_tuple[1], bg_tuple[2], bg_tuple[3], 1], source),\n );\n td.style.color = foreground;\n } else if (plugin?.number_bg_mode === \"gradient\") {\n // Color already set above\n } else {\n td.style.color = \"\";\n }\n } else if (plugin?.number_fg_mode === \"bar\") {\n td.style.color = \"\";\n td.style.position = \"relative\";\n if (\n gradhex !== \"\" &&\n td.children.length > 0 &&\n td.children[0].nodeType === Node.ELEMENT_NODE\n ) {\n (td.children[0] as HTMLElement).style.background = gradhex;\n }\n } else if (plugin?.number_fg_mode === \"color\" || !plugin?.number_fg_mode) {\n td.style.color = hex;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\ninterface CellMetaWithExtras {\n _is_hidden_by_aggregate_depth?: boolean;\n user?: string | null;\n column_header?: string[];\n}\n\ninterface PluginWithColor extends Omit<ColumnConfig, \"color\"> {\n color?: ColorRecord;\n}\n\nexport function cell_style_string(\n this: DatagridModel,\n plugin: PluginWithColor | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n): void {\n const column_name = metadata.column_header?.[this._config.split_by.length];\n const colorRecord: ColorRecord = (() => {\n if (plugin?.color !== undefined) {\n return plugin.color;\n } else {\n return this._color;\n }\n })();\n\n const [hex, r, g, b] = colorRecord;\n\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (\n plugin?.string_color_mode === \"foreground\" &&\n metadata.user !== null\n ) {\n td.style.color = hex;\n td.style.backgroundColor = \"\";\n if (plugin?.format === \"link\" && td.children[0]) {\n (td.children[0] as HTMLElement).style.color = hex;\n }\n } else if (\n plugin?.string_color_mode === \"background\" &&\n metadata.user !== null\n ) {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex;\n } else if (\n plugin?.string_color_mode === \"series\" &&\n metadata.user !== null &&\n column_name\n ) {\n if (!this._series_color_map.has(column_name)) {\n this._series_color_map.set(column_name, new Map());\n this._series_color_seed.set(column_name, 0);\n }\n\n const series_map = this._series_color_map.get(column_name)!;\n if (metadata.user && !series_map.has(metadata.user)) {\n const seed = this._series_color_seed.get(column_name) ?? 0;\n series_map.set(metadata.user, seed);\n this._series_color_seed.set(column_name, seed + 1);\n }\n\n const color_seed = series_map.get(metadata.user!) ?? 0;\n let [h, s, l] = chroma(hex).hsl();\n h = h + ((color_seed * 150) % 360);\n const color2 = chroma(h, s, l, \"hsl\");\n const [r2, g2, b2] = color2.rgb();\n const hex2 = color2.hex();\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r2, g2, b2, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex2;\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\nexport function cell_style_datetime(\n this: DatagridModel,\n plugin: ColumnConfig,\n td: HTMLElement,\n metadata: CellMetadata,\n): void {\n const colorRecord: ColorRecord = //(() => {\n // if (plugin?.color !== undefined) {\n // return plugin.color;\n // } else {\n // return\n this._color;\n // }\n // })();\n\n const [hex, r, g, b] = colorRecord;\n\n // @ts-ignore\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (\n plugin?.datetime_color_mode === \"foreground\" &&\n metadata.user !== null\n ) {\n td.style.color = hex;\n td.style.backgroundColor = \"\";\n } else if (\n plugin?.datetime_color_mode === \"background\" &&\n metadata.user !== null\n ) {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex;\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\nexport function cell_style_boolean(\n this: DatagridModel,\n _plugin: ColumnConfig | undefined,\n td: HTMLElement,\n metadata: CellMetadata,\n): void {\n // @ts-ignore\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else {\n const [hex]: ColorRecord | [string, number, number, number, string] =\n metadata.user === true\n ? this._pos_fg_color\n : metadata.user === false\n ? this._neg_fg_color\n : [\"\", 0, 0, 0, \"\"];\n td.style.backgroundColor = \"\";\n td.style.color = hex;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n CellMetadata,\n CellMetadataRowHeader,\n} from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel } from \"../../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\nexport function cell_style_row_header(\n this: DatagridModel,\n regularTable: RegularTableElement,\n td: HTMLElement,\n metadata: CellMetadataRowHeader,\n): void {\n const is_not_empty =\n metadata.value !== undefined &&\n metadata.value !== null &&\n metadata.value?.toString()?.trim().length > 0;\n const is_leaf =\n (metadata.row_header_x ?? 0) >= this._config.group_by.length;\n const next = regularTable.getMeta({\n dx: 0,\n dy: (metadata.y ?? 0) - (metadata.y0 ?? 0) + 1,\n } as CellMetadata);\n\n const is_collapse =\n next &&\n next.row_header &&\n typeof next.row_header[(metadata.row_header_x ?? 0) + 1] !==\n \"undefined\";\n\n td.classList.toggle(\"psp-tree-label\", is_not_empty && !is_leaf);\n td.classList.toggle(\n \"psp-tree-label-expand\",\n is_not_empty && !is_leaf && !is_collapse,\n );\n\n td.classList.toggle(\n \"psp-tree-label-collapse\",\n is_not_empty && !is_leaf && is_collapse,\n );\n td.classList.toggle(\"psp-tree-leaf\", is_not_empty && is_leaf);\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\n\nimport {\n type DatagridModel,\n type PerspectiveViewerElement,\n type ColumnsConfig,\n type DatagridPluginElement,\n get_psp_type,\n} from \"../types.js\";\n\nimport { cell_style_numeric } from \"./table_cell/numeric.js\";\nimport { cell_style_string } from \"./table_cell/string.js\";\nimport { cell_style_datetime } from \"./table_cell/datetime.js\";\nimport { cell_style_boolean } from \"./table_cell/boolean.js\";\nimport { cell_style_row_header } from \"./table_cell/row_header.js\";\nimport {\n CollectedCell,\n LocalSelectedPositionMap,\n LocalSelectedRowsMap,\n} from \"./types.js\";\n\n/**\n * Apply styles to all body cells in a single pass.\n */\nexport function applyBodyCellStyles(\n this: DatagridModel,\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n): void {\n const hasSelected = selectedRowsMap.has(regularTable);\n const selected = selectedRowsMap.get(regularTable);\n\n regularTable.classList.toggle(\n \"flat-group-rollup-mode\",\n this._config.group_rollup_mode === \"flat\",\n );\n\n for (const { element: td, metadata, isHeader } of cells) {\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n const type = get_psp_type(this, metadata);\n const plugin = column_name\n ? plugins[column_name.toString()]\n : undefined;\n const is_numeric = type === \"integer\" || type === \"float\";\n\n // Calculate aggregate depth visibility\n // @ts-ignore\n metadata._is_hidden_by_aggregate_depth = ((x?: number) =>\n x === 0 || x === undefined\n ? false\n : x - 1 <\n Math.min(\n this._config.group_by.length,\n plugin?.aggregate_depth || 0,\n ))(\n (metadata.row_header as unknown[] | undefined)?.filter(\n (x) => x !== undefined,\n )?.length,\n );\n\n // Apply type-specific cell styling\n if (is_numeric) {\n cell_style_numeric.call(\n this,\n plugin as any,\n td,\n metadata as any,\n isSettingsOpen,\n );\n } else if (type === \"boolean\") {\n cell_style_boolean.call(this, plugin, td, metadata as any);\n } else if (type === \"string\") {\n cell_style_string.call(this, plugin as any, td, metadata as any);\n } else if (type === \"date\" || type === \"datetime\") {\n cell_style_datetime.call(this, plugin as any, td, metadata as any);\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n\n // Apply common cell classes\n td.classList.toggle(\n \"psp-bool-type\",\n type === \"boolean\" && metadata.user !== null,\n );\n\n td.classList.toggle(\"psp-null\", metadata.value === null);\n td.classList.toggle(\"psp-align-right\", !isHeader && is_numeric);\n td.classList.toggle(\"psp-align-left\", isHeader || !is_numeric);\n if (this._column_settings_selected_column) {\n td.classList.toggle(\n \"psp-menu-open\",\n column_name === this._column_settings_selected_column,\n );\n } else {\n td.classList.toggle(\"psp-menu-open\", false);\n }\n\n td.classList.toggle(\n \"psp-color-mode-bar\",\n plugin?.number_fg_mode === \"bar\" && is_numeric,\n );\n\n // Apply row header styling\n if (isHeader) {\n cell_style_row_header.call(this, regularTable, td, metadata as any);\n }\n\n // Set data attributes\n const tr = td.parentElement as HTMLElement;\n if (tr) {\n tr.dataset.y = String(metadata.y);\n }\n\n if (\n metadata.type !== \"row_header\" ||\n metadata.row_header_x ===\n (metadata.row_header as unknown[]).length - 1 ||\n (metadata.row_header as unknown[])[metadata.row_header_x + 1] ===\n undefined\n ) {\n td.dataset.y = String(metadata.y);\n if (metadata.type !== \"row_header\") {\n td.dataset.x = String(metadata.x);\n } else {\n delete td.dataset.x;\n }\n } else {\n delete td.dataset.y;\n delete td.dataset.x;\n }\n\n // Apply selection styling (if selectable)\n if (isSelectable) {\n if (!hasSelected) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n } else {\n const id = this._ids[(metadata.y ?? 0) - (metadata.y0 ?? 0)];\n const key_match = (selected as unknown[]).reduce<boolean>(\n (agg, x, i) => agg && x === id[i],\n true,\n );\n\n const selectedArr = selected as unknown[];\n if (isHeader) {\n if (\n metadata.type === \"row_header\" &&\n metadata.row_header_x !== undefined &&\n !!id[metadata.row_header_x]\n ) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n } else {\n td.classList.toggle(\n \"psp-row-selected\",\n id.length === selectedArr.length && key_match,\n );\n td.classList.toggle(\n \"psp-row-subselected\",\n id.length !== selectedArr.length && key_match,\n );\n }\n } else {\n td.classList.toggle(\n \"psp-row-selected\",\n id.length === selectedArr.length && key_match,\n );\n td.classList.toggle(\n \"psp-row-subselected\",\n id.length !== selectedArr.length && key_match,\n );\n }\n }\n }\n\n // Apply editable styling (if editable)\n if (!isHeader && metadata.type === \"body\") {\n if (isEditable && this._is_editable[metadata.x]) {\n const col_name =\n metadata.column_header?.[this._config.split_by.length];\n const col_name_str = col_name?.toString();\n if (\n col_name_str &&\n type === \"string\" &&\n plugins[col_name_str]?.format === \"link\"\n ) {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\"boolean-editable\", false);\n } else if (type === \"boolean\") {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\n \"boolean-editable\",\n (metadata as { user?: unknown }).user !== null,\n );\n } else {\n if (isEditable !== td.hasAttribute(\"contenteditable\")) {\n td.toggleAttribute(\"contenteditable\", isEditable);\n }\n td.classList.toggle(\"boolean-editable\", false);\n }\n } else {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\"boolean-editable\", false);\n }\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n ColumnsConfig,\n DatagridPluginElement,\n SelectedPosition,\n} from \"../types.js\";\n\nimport { applyFocusStyle } from \"./focus.js\";\nimport { styleColumnHeaderRow } from \"./column_header.js\";\nimport { applyColumnHeaderStyles } from \"./editable.js\";\nimport { applyGroupHeaderStyles } from \"./group_header.js\";\nimport { applyBodyCellStyles } from \"./body.js\";\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\n\ninterface CollectedCell {\n element: HTMLElement;\n metadata: CellMetadata;\n isHeader: boolean;\n}\n\ninterface CollectedHeaderRow {\n row: HTMLTableRowElement;\n cells: Array<{\n element: HTMLTableCellElement;\n metadata: CellMetadata | undefined;\n }>;\n}\n\n/**\n * Context object passed through consolidated styling\n */\nexport interface StyleContext {\n model: DatagridModel;\n regularTable: RegularTableElement;\n viewer: PerspectiveViewerElement;\n datagrid: DatagridPluginElement;\n plugins: ColumnsConfig;\n isSettingsOpen: boolean;\n isSelectable: boolean;\n isEditable: boolean;\n selectedRowsMap: Map<RegularTableElement, unknown[]>;\n selectedPositionMap: Map<RegularTableElement, SelectedPosition>;\n}\n\n// Local types for selection maps - match the actual runtime usage\n// (activate.ts uses `as any` casts when passing these)\ntype LocalSelectedRowsMap = WeakMap<RegularTableElement, unknown[]>;\ntype LocalSelectedPositionMap = WeakMap<RegularTableElement, SelectedPosition>;\n\nfunction isEditableMode(\n model: DatagridModel,\n viewer: PerspectiveViewerElement,\n allowed: boolean = false,\n): boolean {\n const has_pivots =\n model._config.group_by.length === 0 &&\n model._config.split_by.length === 0;\n const selectable = viewer.hasAttribute(\"selectable\");\n const plugin = viewer.children[0] as\n | (DatagridPluginElement & { dataset: DOMStringMap })\n | undefined;\n const editable = allowed || plugin?.dataset?.editMode === \"EDIT\";\n return has_pivots && !selectable && editable;\n}\n\n/**\n * Consolidated style listener that handles all cell styling in a single pass.\n * This eliminates redundant DOM traversals and reduces layout thrashing by:\n * 1. Collecting all cell metadata in a read phase\n * 2. Applying all styles in a write phase\n */\nexport function createConsolidatedStyleListener(\n datagrid: DatagridPluginElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n): (\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n) => void {\n return function consolidatedStyleListener(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n const isSettingsOpen = viewer.hasAttribute(\"settings\");\n const isSelectable = viewer.hasAttribute(\"selectable\");\n const isEditable = isEditableMode(this, viewer);\n const isEditableAllowed = isEditableMode(this, viewer, true);\n\n // Toggle edit mode class on datagrid\n datagrid.classList.toggle(\"edit-mode-allowed\", isEditableAllowed);\n const bodyCells: CollectedCell[] = [];\n const groupHeaderRows: CollectedHeaderRow[] = [];\n const tbody = regularTable.children[0]?.children[1];\n if (tbody) {\n for (const tr of tbody.children) {\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(\n cell as HTMLElement,\n ) as CellMetadata | undefined;\n\n if (metadata) {\n const isHeader = cell.tagName === \"TH\";\n bodyCells.push({\n element: cell as HTMLElement,\n metadata,\n isHeader,\n });\n }\n }\n }\n }\n\n // Collect header rows (thead)\n const thead = regularTable.children[0]?.children[0];\n if (thead) {\n for (const tr of thead.children) {\n const rowData: CollectedHeaderRow = {\n row: tr as HTMLTableRowElement,\n cells: [],\n };\n\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(\n cell as HTMLElement,\n ) as CellMetadata | undefined;\n\n rowData.cells.push({\n element: cell as HTMLTableCellElement,\n metadata,\n });\n }\n groupHeaderRows.push(rowData);\n }\n }\n\n this._applyBodyCellStyles(\n bodyCells,\n plugins,\n isSettingsOpen,\n isSelectable,\n isEditable,\n regularTable,\n selectedRowsMap,\n selectedPositionMap,\n viewer,\n );\n\n this._applyGroupHeaderStyles(groupHeaderRows, regularTable);\n this._applyColumnHeaderStyles(groupHeaderRows, regularTable, viewer);\n this._applyFocusStyle(bodyCells, regularTable, selectedPositionMap);\n };\n}\n\ndeclare module \"../types.js\" {\n interface DatagridModel {\n _applyBodyCellStyles(\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyGroupHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n ): void;\n _applyColumnHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyFocusStyle(\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n ): void;\n _styleColumnHeaderRow(\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n ): void;\n }\n}\n\n/**\n * Install the styling methods on the DatagridModel prototype.\n * This should be called once during module initialization.\n */\nexport function installConsolidatedStyleMethods(modelPrototype: any): void {\n modelPrototype._applyBodyCellStyles = applyBodyCellStyles;\n modelPrototype._applyGroupHeaderStyles = applyGroupHeaderStyles;\n modelPrototype._applyColumnHeaderStyles = applyColumnHeaderStyles;\n modelPrototype._applyFocusStyle = applyFocusStyle;\n modelPrototype._styleColumnHeaderRow = styleColumnHeaderRow;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_selected_column } from \"../style_handlers/column_header.js\";\nimport {\n click_listener,\n mousedown_listener,\n} from \"../event_handlers/header_click.js\";\n\nimport { focusinListener, focusoutListener } from \"../event_handlers/focus.js\";\nimport { keydownListener, clickListener } from \"../event_handlers/click.js\";\n\nimport { selectionListener } from \"../event_handlers/row_select_click.js\";\nimport { deselect_all_listener } from \"../event_handlers/deselect_all.js\";\n\nimport { createModel } from \"../model/create.js\";\nimport { dispatch_click_listener } from \"../event_handlers/dispatch_click.js\";\n\nimport { addAreaMouseSelection } from \"../event_handlers/select_region.js\";\n\nimport {\n createConsolidatedStyleListener,\n installConsolidatedStyleMethods,\n} from \"../style_handlers/consolidated.js\";\n\nimport type { View } from \"@perspective-dev/client\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport type { RegularTableElement } from \"regular-table\";\n\ninterface ToggleColumnSettingsEvent extends CustomEvent {\n detail: {\n column_name: string | null;\n open: boolean;\n };\n}\n\n/**\n * Lazy initialize this plugin with various listeners.\n */\nexport async function activate(\n this: DatagridPluginElement,\n view: View,\n): Promise<void> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const table = await viewer.getTable();\n\n if (!this._initialized) {\n this.innerHTML = \"\";\n if (this.shadowRoot) {\n this.shadowRoot.appendChild(this.regular_table);\n } else {\n this.appendChild(this.regular_table);\n }\n\n this.model = await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n );\n\n if (!this.model) {\n return;\n }\n\n addAreaMouseSelection(this, this.regular_table, {\n className: \"psp-select-region\",\n });\n\n // Create shared state maps for selection and focus tracking\n const selected_rows_map = new WeakMap<\n RegularTableElement,\n Set<number>\n >();\n const selected_position_map = new WeakMap<\n RegularTableElement,\n SelectedPosition\n >();\n\n // Install consolidated style methods on model prototype\n installConsolidatedStyleMethods(this.model);\n\n // Single consolidated style listener replaces:\n // - table_cell_style_listener\n // - group_header_style_listener\n // - column_header_style_listener\n // - selectionStyleListener\n // - editable_style_listener\n // - focus_style_listener\n this.regular_table.addStyleListener(\n createConsolidatedStyleListener(\n this,\n selected_rows_map as any,\n selected_position_map as any,\n ).bind(this.model, this.regular_table, viewer),\n );\n\n // uh ..\n this.regular_table.addEventListener(\n \"click\",\n click_listener.bind(\n this.model,\n this.regular_table,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"mousedown\",\n selectionListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"psp-deselect-all\",\n deselect_all_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n // User event click\n this.regular_table.addEventListener(\n \"click\",\n dispatch_click_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // tree collapse, expand, edit button headers\n this.regular_table.addEventListener(\n \"mousedown\",\n mousedown_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // Editing event handlers (style handling is now in consolidated listener)\n // TODO relies on this.model._is_editable\n this.regular_table.addEventListener(\n \"click\",\n clickListener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusin\",\n focusinListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusout\",\n focusoutListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"keydown\",\n keydownListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n // viewer event listeners\n viewer.addEventListener(\n \"perspective-toggle-column-settings\",\n (event: Event) => {\n const toggleEvent = event as ToggleColumnSettingsEvent;\n if (this.isConnected) {\n style_selected_column.call(\n this.model!,\n this.regular_table,\n viewer,\n toggleEvent.detail.column_name ?? undefined,\n );\n if (!toggleEvent.detail.open) {\n this.model!._column_settings_selected_column =\n undefined;\n return;\n }\n\n this.model!._column_settings_selected_column =\n toggleEvent.detail.column_name ?? undefined;\n }\n },\n );\n\n this._initialized = true;\n } else {\n await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n this.model,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { restore_column_size_overrides } from \"../model/column_overrides.js\";\nimport {\n EDIT_MODES,\n toggle_edit_mode,\n toggle_scroll_lock,\n} from \"../model/toolbar.js\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { make_color_record } from \"../color_utils.js\";\nimport type {\n DatagridPluginElement,\n ColumnOverrides,\n EditMode,\n ColumnsConfig,\n ColorRecord,\n} from \"../types.js\";\n\ninterface RestoreToken {\n columns?: Record<string, { column_size_override?: number }>;\n edit_mode?: EditMode;\n scroll_lock?: boolean;\n}\n\n// interface ColumnConfigWithColors {\n// pos_fg_color?: string;\n// neg_fg_color?: string;\n// pos_bg_color?: string;\n// neg_bg_color?: string;\n// color?: string;\n// [key: string]: unknown;\n// }\n\ninterface StylesConfig {\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n color?: ColorRecord;\n [key: string]: unknown;\n}\n\nexport function restore(\n this: DatagridPluginElement,\n token: RestoreToken,\n columns: ColumnsConfig,\n): void {\n token = JSON.parse(JSON.stringify(token));\n columns = JSON.parse(JSON.stringify(columns));\n const overrides: ColumnOverrides = {};\n\n if (token.columns) {\n for (const [col, value] of Object.entries(token.columns)) {\n if (value.column_size_override !== undefined) {\n overrides[col] = value.column_size_override;\n delete value[\"column_size_override\"];\n }\n }\n }\n\n const styles: Record<string, StylesConfig> = {};\n if (columns) {\n for (const [col_name, controls] of Object.entries(columns)) {\n styles[col_name] = {\n ...controls,\n pos_fg_color: controls.pos_fg_color\n ? make_color_record(controls.pos_fg_color)\n : undefined,\n neg_fg_color: controls.neg_fg_color\n ? make_color_record(controls.neg_fg_color)\n : undefined,\n pos_bg_color: controls.pos_bg_color\n ? make_color_record(controls.pos_bg_color)\n : undefined,\n neg_bg_color: controls.neg_bg_color\n ? make_color_record(controls.neg_bg_color)\n : undefined,\n color: controls.color\n ? make_color_record(controls.color)\n : undefined,\n };\n }\n }\n\n if (\"edit_mode\" in token && token.edit_mode) {\n if (EDIT_MODES.indexOf(token.edit_mode) !== -1) {\n toggle_edit_mode.call(this, token.edit_mode);\n } else {\n console.error(\"Unknown edit mode \" + token.edit_mode);\n }\n }\n\n if (\"scroll_lock\" in token) {\n toggle_scroll_lock.call(this, token.scroll_lock);\n }\n\n const datagrid = this.regular_table;\n restore_column_size_overrides.call(this, overrides, true);\n (datagrid as any)[PRIVATE_PLUGIN_SYMBOL] = styles as ColumnsConfig;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { save_column_size_overrides } from \"../model/column_overrides.js\";\nimport type {\n DatagridPluginElement,\n DatagridPluginConfig,\n EditMode,\n} from \"../types.js\";\n\nexport function save(\n this: DatagridPluginElement,\n): DatagridPluginConfig | Record<string, never> {\n if (this.regular_table) {\n const token: DatagridPluginConfig = {\n columns: {},\n scroll_lock: !!this._is_scroll_lock,\n edit_mode: this._edit_mode,\n };\n\n const column_size_overrides = save_column_size_overrides.call(this);\n\n for (const col of Object.keys(column_size_overrides || {})) {\n if (!token.columns?.[col]) {\n token.columns = token.columns || {};\n token.columns[col] = {};\n }\n\n token.columns[col].column_size_override =\n column_size_overrides[col];\n }\n\n return JSON.parse(JSON.stringify(token));\n }\n return {};\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n restore_column_size_overrides,\n save_column_size_overrides,\n} from \"../model/column_overrides.js\";\nimport type { View } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface DatagridPluginWithActivate extends DatagridPluginElement {\n activate(view: View): Promise<void>;\n}\n\nexport async function draw(\n this: DatagridPluginWithActivate,\n view: View,\n): Promise<void> {\n if (this.parentElement) {\n await this.activate(view);\n }\n\n if (!this.isConnected || this.offsetParent == null || !this.model) {\n return;\n }\n\n const old_sizes = save_column_size_overrides.call(this);\n const drawPromise = this.regular_table.draw({\n invalid_columns: true,\n } as any);\n\n if (this._reset_scroll_top) {\n this.regular_table.scrollTop = 0;\n this._reset_scroll_top = false;\n }\n\n if (this._reset_scroll_left) {\n this.regular_table.scrollLeft = 0;\n this._reset_scroll_left = false;\n }\n if (this._reset_select) {\n this.regular_table.dispatchEvent(\n new CustomEvent(\"psp-deselect-all\", { bubbles: false }),\n );\n this._reset_select = false;\n }\n\n if (this._reset_column_size) {\n this.regular_table.resetAutoSize();\n this._reset_column_size = false;\n }\n\n restore_column_size_overrides.call(this, old_sizes);\n await drawPromise;\n\n this._toolbar?.classList.toggle(\n \"aggregated\",\n this.model._config.group_by.length > 0 ||\n this.model._config.split_by.length > 0,\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { ColumnType } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface NumberStyleOpts {\n datagrid_number_style: {\n fg_gradient: number;\n pos_fg_color: string;\n neg_fg_color: string;\n number_fg_mode: string;\n bg_gradient: number;\n pos_bg_color: string;\n neg_bg_color: string;\n number_bg_mode: string;\n };\n number_string_format: boolean;\n}\n\ninterface DatetimeStyleOpts {\n datagrid_datetime_style?: {\n color: string;\n bg_color: string;\n };\n datagrid_string_style?: {\n color: string;\n bg_color: string;\n };\n}\n\nexport type ColumnStyleOpts = NumberStyleOpts | DatetimeStyleOpts | null;\n\nexport default function column_style_opts(\n this: DatagridPluginElement,\n type: ColumnType,\n _group: string,\n): ColumnStyleOpts {\n if (type === \"integer\" || type === \"float\") {\n return {\n datagrid_number_style: {\n fg_gradient: 0,\n pos_fg_color: this.model!._pos_fg_color[0],\n neg_fg_color: this.model!._neg_fg_color[0],\n number_fg_mode: \"color\",\n bg_gradient: 0,\n pos_bg_color: this.model!._pos_bg_color[0],\n neg_bg_color: this.model!._neg_bg_color[0],\n number_bg_mode: \"disabled\",\n },\n number_string_format: true,\n };\n } else if (type === \"date\" || type === \"datetime\" || type === \"string\") {\n const control =\n type === \"date\" || type === \"datetime\"\n ? \"datagrid_datetime_style\"\n : `datagrid_string_style`;\n return {\n [control]: {\n color: this.model!._color[0],\n bg_color: this.model!._color[0],\n },\n } as DatetimeStyleOpts;\n } else {\n return null;\n }\n}\n", "regular-table{padding:0;margin:12px 0 0 12px;font-family:inherit;--rt-hover--border-color:var(--inactive--color,#c5c9d080);}regular-table div[tabindex]{outline:none;}regular-table>div{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden;}regular-table th{text-align:center;}regular-table thead tr:not(.rt-autosize) th{overflow:hidden;max-width:0px;}regular-table thead tr:last-child .rt-float,regular-table tbody .rt-float{text-align:right;}regular-table thead .rt-integer,regular-table tbody .rt-integer{text-align:right;}regular-table tbody th{text-align:left;}regular-table span.rt-tree-container{display:flex;align-items:center;height:100%;}regular-table thead .rt-string,regular-table tbody .rt-string,regular-table thead .rt-date,regular-table tbody .rt-date,regular-table thead .rt-datetime,regular-table tbody .rt-datetime{text-align:left;}regular-table thead tr:last-child th{border-bottom:1px solid#8b868045;}regular-table tbody tr:first-child td,regular-table tbody tr:first-child th{border-top:1px solid transparent!important;}regular-table th{position:relative;}regular-table tr th span.rt-tree-group{margin-left:5px;margin-right:15px;border-left:1px solid#eee;height:100%;}regular-table td,regular-table th{white-space:nowrap;font-size:12px;padding-right:5px;padding-left:5px;padding-top:0px;padding-bottom:0px;height:19px;}regular-table table *{box-sizing:border-box;}regular-table table{position:absolute;color:#666;outline:none;}regular-table span.rt-row-header-icon{color:#aaa;padding-right:4px;font-family:var(--button--font-family);}regular-table span.rt-column-header-icon{font-size:10px;padding-left:3px;display:inline-block;width:10px;font-family:var(--button--font-family);}regular-table span.rt-row-header-icon:hover{color:#1a7da1;text-shadow:0px 0px 3px#1a7da1;}regular-table .rt-selected td{background-color:#eee;}regular-table .rt-cell-clip{overflow:hidden;text-overflow:ellipsis;}regular-table td span.rt-group-name,regular-table th span.rt-group-name{margin-right:-5px;padding-right:5px;padding-left:8px;flex:1;height:100%;}regular-table th span.rt-group-name{text-align:left;}regular-table td th span.rt-group-leaf,regular-table th span.rt-group-leaf{margin-left:16px;height:100%;}regular-table .rt-column-resize{height:100%;width:10px;position:absolute;top:0;right:0;cursor:col-resize;}regular-table a{color:var(--rt-pos-cell--color);}regular-table a:visited{color:var(--active--color);}regular-table td.psp-null:after,regular-table th.psp-null:after{content:var(--null--content,\"-\");}.psp-header-border:not(.psp-is-top):not(.psp-header-leaf){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-group{box-shadow:0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-is-top{box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045);}.psp-is-top.psp-header-group:not(.psp-header-group-corner){box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-header-border.psp-header-group:not(.psp-is-top):not(.psp-header-group-corner){box-shadow:1px 0px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}perspective-viewer[settings] tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer[settings]) tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-leaf.psp-header-border{box-shadow:5px -4px 0px -4px var(--inactive--border-color,#8b868045);}tr:only-child th{box-shadow:none!important;}regular-table tbody tr:hover th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover:after{border-color:var(--rt-hover--border-color,#c5c9d080)!important;box-shadow:0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover th.psp-tree-leaf.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr.psp-menu-open:hover:after{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:last-child:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover+tr th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td:not(.psp-row-selected):not(.psp-row-subselected){border-top-color:transparent;}regular-table tbody tr th:first-child:not(:empty),regular-table tbody tr th:first-child:empty+th:not(:empty),regular-table tbody tr th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr td:first-child{border-left-width:1px;border-left-color:transparent;}regular-table tbody tr th:last-child,regular-table tbody tr td:last-child{border-right-width:0px;border-right-color:transparent;}regular-table tbody tr:hover{color:inherit;}regular-table tbody tr:hover th:first-child:not(:empty),regular-table tbody tr:hover th:first-child:empty+th:not(:empty),regular-table tbody tr:hover th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr:hover td:first-child{border-left-color:var(--rt-hover--border-color,#c5c9d080)!important;}regular-table tbody tr:hover th:last-child,regular-table tbody tr:hover td:last-child{border-right-color:var(--rt-hover--border-color,#c5c9d080)!important;}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody td,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead th:not(.rt-group-corner){transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody{transform:translate(0,var(--regular-table--transform-y,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child th,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child th,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) var(--regular-table--clip-y,0),var(--regular-table--clip-x,0) 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr:last-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr:last-child:after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:not(:first-child):after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:not(:first-child):after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:hover:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:hover:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner){clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}regular-table{outline:none;}regular-table::-webkit-scrollbar,regular-table::-webkit-scrollbar-corner{background-color:transparent;height:12px;width:12px;}regular-table::-webkit-scrollbar-thumb{background-clip:content-box;background:var(--icon--color);border:5.5px solid var(--plugin--background);max-height:50%;max-width:50%;min-width:10%;min-height:10%;}perspective-viewer .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}perspective-viewer .psp-menu-enabled:hover,perspective-viewer tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}perspective-viewer tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}perspective-viewer td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}perspective-viewer tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}perspective-viewer tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}:host .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}:host .psp-menu-enabled:hover,:host tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}:host tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}:host td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}:host tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}:host tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}perspective-viewer regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer) regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}.psp-sort-enabled:hover{cursor:pointer;}.psp-row-selected,:hover .psp-row-selected,:hover th.psp-tree-leaf.psp-row-selected,:hover th.psp-tree-label.psp-row-selected{color:white!important;background-color:var(--selected-row--background-color,#ea7319)!important;border-color:var(--selected-row--background-color,#ea7319)!important;}regular-table.flat-group-rollup-mode.vertical-row-headers th.psp-tree-label:not(:last-of-type){writing-mode:vertical-lr;}.psp-row-selected.psp-tree-label:not(:hover):before{color:white;}regular-table:not(.flat-group-rollup-mode) .psp-row-selected.psp-tree-label:not(:hover):before{color:white;}.psp-row-subselected,:hover .psp-row-subselected,:hover th.psp-tree-leaf.psp-row-subselected,:hover th.psp-tree-label.psp-row-subselected{background:rgba(234,115,25,0.2)!important;}.psp-error{color:red;}td:focus{outline:#666;outline-style:dotted;outline-width:1px;}perspective-viewer.dragging regular-table{pointer-events:none;}:host-context(perspective-viewer.dragging) regular-table{pointer-events:none;}.psp-header-border:last-child{border-right-width:0px;}.psp-header-sort-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-desc-icon--mask-image);mask-image:var(--sort-desc-icon--mask-image);}.psp-header-sort-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-asc-icon--mask-image);mask-image:var(--sort-asc-icon--mask-image);}.psp-header-sort-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-desc-icon--mask-image);mask-image:var(--sort-col-desc-icon--mask-image);}.psp-header-sort-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-asc-icon--mask-image);mask-image:var(--sort-col-asc-icon--mask-image);}.psp-header-sort-abs-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-desc-icon--mask-image);mask-image:var(--sort-abs-desc-icon--mask-image);}.psp-header-sort-abs-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-asc-icon--mask-image);mask-image:var(--sort-abs-asc-icon--mask-image);}.psp-header-sort-abs-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-desc-icon--mask-image);mask-image:var(--sort-abs-col-desc-icon--mask-image);}.psp-header-sort-abs-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-asc-icon--mask-image);mask-image:var(--sort-abs-col-asc-icon--mask-image);}tbody th:last-of-type{border-right:1px solid var(--inactive--border-color,#8b868045);overflow:hidden;text-overflow:ellipsis;}tbody th:empty{background-image:linear-gradient(to right,transparent 9px,var(--inactive--border-color,#eee) 10px,transparent 11px);background-repeat:no-repeat;min-width:20px;max-width:20px;pointer-events:none;}regular-table:not(.flat-group-rollup-mode) .psp-tree-label{max-width:0px;min-width:0px;}regular-table:not(.flat-group-rollup-mode) .psp-tree-label:before{color:var(--icon--color);font-family:var(--button--font-family,inherit);padding-right:11px;}regular-table:not(.flat-group-rollup-mode) .psp-tree-label-expand:before{content:var(--tree-label-expand--content,\"+\");}regular-table:not(.flat-group-rollup-mode) .psp-tree-label-collapse:before{content:var(--tree-label-collapse--content,\"-\");}regular-table:not(.flat-group-rollup-mode) .psp-tree-label-expand,regular-table:not(.flat-group-rollup-mode) .psp-tree-label-collapse{cursor:pointer;}regular-table:not(.flat-group-rollup-mode) .psp-tree-label:hover:before{color:var(--active--color);text-shadow:0px 0px 5px var(--active--color);}.psp-tree-leaf{padding-left:24px;}.psp-align-right{text-align:right;}.psp-align-left{text-align:left;}.psp-positive:not(:focus){color:var(--rt-pos-cell--color);}.psp-negative:not(:focus){color:var(--rt-neg-cell--color);}regular-table table tbody td{min-width:52px!important;}.psp-is-width-override .rt-column-resize,.rt-column-resize:hover{border:1px dashed#999;border-bottom-width:0px;border-left-width:0px;}.boolean-editable{cursor:pointer;}regular-table table{user-select:none;color:inherit;border-collapse:separate;}regular-table table th{font-weight:400;}regular-table table td,regular-table table th{border-color:var(--inactive--border-color,#8b868045);height:23px;}regular-table table .psp-header-group{text-overflow:ellipsis;}regular-table table th.psp-header-leaf{border-bottom-width:0px;}regular-table table th.psp-header-leaf span{height:23px;min-height:23px;}regular-table table td,regular-table table th.psp-tree-label,regular-table table th.psp-tree-label,regular-table table th.psp-tree-leaf,regular-table table tbody tr:first-child th{border-style:solid;border-width:0px;border-top-width:1px;}regular-table table tbody th:empty{background-position:0px -10px;}regular-table table td.psp-select-region,regular-table table th.psp-select-region{background-color:var(--icon--color)!important;color:var(--plugin--background)!important;border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected){border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}:host-context(perspective-viewer[settings]) td.psp-select-region.psp-menu-open{box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}regular-table #psp-column-edit-buttons th:not(.rt-group-corner) span:not(.rt-column-resize):before{content:var(--datagrid-column-edit-button--content,\"Edit\");}perspective-viewer:not([settings]) regular-table #psp-column-edit-buttons:after{content:none;}:host-context(perspective-viewer:not([settings])) regular-table #psp-column-edit-buttons:after{content:none;}regular-table table thead tr:last-child:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-bottom:1px solid var(--inactive--border-color);}regular-table table tbody tr:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-top:1px solid transparent;}regular-table table tbody tr:not(:first-child):after{border-top:1px solid var(--inactive--border-color);}regular-table table tbody tr:hover:not(:first-child):after{border-top:1px solid var(--rt-hover--border-color);}regular-table table tbody tr:hover+tr:after{border-top:1px solid var(--rt-hover--border-color);}@keyframes pulse_pos{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_pos2{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_neg{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}@keyframes pulse_neg2{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { activate } from \"../plugin/activate.js\";\nimport { restore } from \"../plugin/restore.js\";\nimport { save } from \"../plugin/save.js\";\nimport { draw } from \"../plugin/draw.js\";\nimport column_style_controls, {\n ColumnStyleOpts,\n} from \"../plugin/column_style_controls.js\";\nimport datagridStyles from \"../../../dist/css/perspective-viewer-datagrid.css\";\nimport { format_raw } from \"../data_listener/format_cell.js\";\n\nimport type { View, ViewWindow } from \"@perspective-dev/client\";\nimport type { IPerspectiveViewerPlugin } from \"@perspective-dev/viewer\";\nimport type {\n DatagridModel,\n DatagridToolbarElement,\n EditMode,\n PerspectiveViewerElement,\n DatagridPluginConfig,\n ColumnsConfig,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\ntype RenderTarget = \"shadow\" | \"light\";\n\n/**\n * The custom element class for this plugin. The interface methods for this\n */\nexport class HTMLPerspectiveViewerDatagridPluginElement\n extends HTMLElement\n implements IPerspectiveViewerPlugin\n{\n private static _global_stylesheet_installed: boolean = false;\n private static _sheet: CSSStyleSheet | undefined;\n\n // Determines whether this datagrid renders in the light DOM. This will\n // break style encapsulation and may cause inconsistent behavior.\n static renderTarget: RenderTarget =\n window.CSS?.supports &&\n window.CSS?.supports(\"selector(:host-context(foo))\")\n ? \"shadow\"\n : \"light\";\n\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n\n constructor() {\n super();\n this.regular_table = document.createElement(\n \"regular-table\",\n ) as RegularTableElement;\n this.regular_table.part = \"regular-table\";\n this._is_scroll_lock = false;\n this._edit_mode = \"READ_ONLY\";\n const Elem = HTMLPerspectiveViewerDatagridPluginElement;\n if (!Elem._sheet) {\n Elem._sheet = new CSSStyleSheet();\n Elem._sheet.replaceSync(datagridStyles);\n }\n\n if (Elem.renderTarget === \"shadow\") {\n const shadow = this.attachShadow({ mode: \"open\" });\n shadow.adoptedStyleSheets.push(Elem._sheet);\n } else if (\n Elem.renderTarget === \"light\" &&\n !Elem._global_stylesheet_installed\n ) {\n Elem._global_stylesheet_installed = true;\n document.adoptedStyleSheets.push(Elem._sheet);\n }\n }\n\n connectedCallback(): void {\n if (!this._toolbar) {\n this._toolbar = document.createElement(\n \"perspective-viewer-datagrid-toolbar\",\n ) as DatagridToolbarElement;\n }\n\n const parent = this.parentElement;\n if (parent) {\n parent.appendChild(this._toolbar);\n }\n }\n\n disconnectedCallback(): void {\n this._toolbar?.parentElement?.removeChild?.(this._toolbar);\n }\n\n async activate(view: View): Promise<void> {\n return await activate.call(this, view);\n }\n\n get name(): string {\n return \"Datagrid\";\n }\n\n get category(): string {\n return \"Basic\";\n }\n\n get select_mode(): string {\n return \"toggle\";\n }\n\n get min_config_columns(): number | undefined {\n return undefined;\n }\n\n get config_column_names(): string[] {\n return [\"Columns\"];\n }\n\n get group_rollups(): string[] {\n return [\"rollup\", \"flat\", \"total\"];\n }\n\n /**\n * Give the Datagrid a higher priority so it is loaded\n * over the default charts by default.\n */\n get priority(): number {\n return 1;\n }\n\n can_render_column_styles(type: string, _group: string): boolean {\n return type !== \"boolean\";\n }\n\n column_style_controls(type: string, group: string): ColumnStyleOpts {\n return column_style_controls.call(this, type as any, group);\n }\n\n async draw(view: View): Promise<void> {\n return await draw.call(this, view);\n }\n\n async update(view: View): Promise<void> {\n if (this.model === undefined) {\n await this.draw(view);\n } else if (this.model._config.split_by?.length > 0) {\n const dimensions = await view.dimensions();\n this.model._num_rows = dimensions.num_view_rows;\n await this.regular_table.draw();\n } else {\n this.model._num_rows = await view.num_rows();\n await this.regular_table.draw();\n }\n }\n\n async render(viewport?: ViewWindow): Promise<string> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const view = await viewer.getView();\n const json = await view.to_columns(viewport as any);\n const cols = await view.column_paths(viewport as any);\n\n const nrows =\n viewport?.end_row !== undefined &&\n viewport?.end_row !== null &&\n viewport?.start_row !== undefined &&\n viewport?.start_row !== null\n ? viewport.end_row - viewport.start_row\n : await view.num_rows();\n\n let out = \"\";\n for (let ridx = 0; ridx < nrows; ridx++) {\n for (const col_name of cols) {\n const col = (json as Record<string, unknown[]>)[col_name];\n const type = this.model!._schema[col_name];\n const pluginConfig = (this.regular_table as any)[\n PRIVATE_PLUGIN_SYMBOL\n ] as ColumnsConfig | undefined;\n const columnName = col_name.split(\"|\").at(-1)!;\n const formatter = format_raw(\n type,\n pluginConfig?.[columnName] || {},\n );\n\n if (formatter) {\n out += formatter.format(col[ridx]) + \"\\t\";\n } else {\n out += col[ridx] + \"\\t\";\n }\n }\n out += \"\\n\";\n }\n\n return out.trim();\n }\n\n async resize(): Promise<void> {\n if (!this.isConnected || this.offsetParent == null) {\n return;\n }\n\n if (this._initialized) {\n await this.regular_table.draw();\n }\n }\n\n async clear(): Promise<void> {\n this.regular_table.resetAutoSize();\n this.regular_table.clear();\n }\n\n async save(): Promise<any> {\n return save.call(this);\n }\n\n async restore(\n token: DatagridPluginConfig,\n columns_config?: ColumnsConfig,\n ): Promise<any> {\n return restore.call(this, token, columns_config ?? {});\n }\n\n async restyle(): Promise<void> {\n // Get view from model if available, otherwise no-op\n if (this.model?._view) {\n await this.draw(this.model._view);\n }\n }\n\n async delete(): Promise<void> {\n this.disconnectedCallback();\n this._toolbar = undefined;\n if ((this.regular_table as any).table_model) {\n this.regular_table.resetAutoSize();\n }\n\n this.regular_table.clear();\n }\n}\n", ":host{position:relative;display:block;height:100%;}:host #container{position:absolute;display:flex;flex-direction:column;justify-content:stretch;align-items:stretch;top:0;left:0;right:0;bottom:0;}:host #toolbar{display:flex;align-items:stretch;height:100%;}:host #toolbar .hover-target{margin:0;display:inline-flex;align-items:center;cursor:pointer;}:host #toolbar .hover-target:hover{box-shadow:-4px 0 0 var(--icon--color),4px 0 0 var(--icon--color);background-color:var(--icon--color);}:host #slot-container{flex:1;position:relative;}#scroll_lock.lock-scroll:before{-webkit-mask-image:var(--toolbar-scroll-lock-active--content);}#scroll_lock:before{-webkit-mask-image:var(--toolbar-scroll-lock--content);}#select_mode:before{content:\"highlight_alt\";}#edit_mode:before{-webkit-mask-image:\"\";}#edit_mode[data-edit-mode=\"READ_ONLY\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--edit--content);}:host(.aggregated) #toolbar #edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"SELECT_ROW\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-row--content);}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-column--content);}#edit_mode[data-edit-mode=\"SELECT_REGION\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-region--content);}#edit_mode[data-edit-mode=\"READ_ONLY\"] span:before{content:var(--edit-mode--read-only--content,\"Read Only\");}#edit_mode[data-edit-mode=\"EDIT\"] span:before{content:var(--edit-mode--edit--content,\"Editable\");}#edit_mode[data-edit-mode=\"SELECT_ROW\"] span:before{content:var(--edit-mode--select-row--content,\"Row Select\");}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"] span:before{content:var(--edit-mode--select-column--content,\"Column Select\");}#edit_mode[data-edit-mode=\"SELECT_REGION\"] span:before{content:var(--edit-mode--select-region--content,\"Region Select\");}#scroll_lock span:before{content:var(--scroll-lock-toggle--content,\"Free Scroll\");}#scroll_lock.lock-scroll span:before{content:var(--scroll-lock-alt-toggle--content,\"Align Scroll\");}.button:before{width:21px;height:21px;content:\"\";-webkit-mask-size:cover;mask-size:cover;background-color:var(--icon--color);}.button.editable:before,.button.lock-scroll:before{color:inherit;}.button{display:inline-flex;justify-content:center;align-items:center;user-select:none;padding:0 5px;border:1px solid transparent;border-radius:3px;border:1px solid transparent;box-sizing:border-box;display:inline-flex;font-size:var(--label--font-size,0.75em);height:22px;user-select:none;white-space:nowrap;width:37px;}.button>span{display:none;margin:0;padding:0;}.hover-target:focus-within .button,.hover-target:hover .button{position:relative;background-color:var(--icon--color);color:var(--plugin--background);opacity:1;display:flex;align-items:center;cursor:pointer;}.hover-target:focus-within .button:before,.hover-target:hover .button:before{background-color:var(--plugin--background);}.hover-target:focus-within .button>span,.hover-target:hover .button>span{display:block;position:absolute;top:calc(100% + 3px);left:50%;translate:-50%;margin:0;padding:5px;height:auto;white-space:pre-wrap;line-height:1;font-size:9px;background-color:var(--icon--color);width:35px;text-align:center;border-radius:0 0 3px 3px;}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport TOOLBAR_STYLE from \"../../../dist/css/perspective-viewer-datagrid-toolbar.css\";\nimport { toggle_edit_mode, toggle_scroll_lock } from \"../model/toolbar.js\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nconst stylesheet = new CSSStyleSheet();\nstylesheet.replaceSync(TOOLBAR_STYLE);\n\n/**\n * The custom element for this plugin's toolbar, a component which displays in\n * the host `<perspective-viewer>`'s status bar when this plugin is active.\n * In the case of Datagrid, this comprises \"Editable\" and \"Scroll Lock\" toggle\n * buttons.\n */\nexport class HTMLPerspectiveViewerDatagridToolbarElement extends HTMLElement {\n private _initialized: boolean = false;\n\n connectedCallback(): void {\n if (this._initialized) {\n return;\n }\n\n this._initialized = true;\n this.setAttribute(\"slot\", \"statusbar-extra\");\n this.attachShadow({ mode: \"open\" });\n this.shadowRoot!.adoptedStyleSheets.push(stylesheet);\n this.shadowRoot!.innerHTML = `\n <div id=\"toolbar\">\n <span class=\"hover-target\">\n <span id=\"scroll_lock\" class=\"button\">\n <span></span>\n </span>\n </span>\n <span class=\"hover-target\">\n <span id=\"edit_mode\" class=\"button\" data-edit-mode=\"READ_ONLY\">\n <span></span>\n </span>\n </span>\n </div>\n `;\n\n const viewer = this.parentElement as PerspectiveViewerElement;\n const plugin = this.previousElementSibling as DatagridPluginElement;\n\n plugin._scroll_lock = this.shadowRoot!.querySelector(\n \"#scroll_lock\",\n ) as HTMLElement;\n plugin._scroll_lock.addEventListener(\"click\", () =>\n toggle_scroll_lock.call(plugin),\n );\n\n plugin._edit_button = this.shadowRoot!.querySelector(\n \"#edit_mode\",\n ) as HTMLElement;\n plugin._edit_button.addEventListener(\"click\", () => {\n toggle_edit_mode.call(plugin);\n plugin.regular_table.draw();\n viewer.dispatchEvent(new Event(\"perspective-config-update\"));\n });\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\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", "options", "internal_draw", "_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", "tr", "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", "tbody", "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", "perspective_viewer_exports", "__export", "Client", "ColumnDropDownElement", "CopyDropDownMenuElement", "ExportDropDownMenuElement", "FilterDropDownElement", "FunctionDropDownElement", "GenericSQLVirtualServerModel", "PerspectiveDebugPluginElement", "PerspectiveViewerElement", "ProxySession", "Table", "View", "VirtualDataSlice", "VirtualServer", "__wbg_init", "init", "initSync", "registerPlugin", "ClipboardItem", "ResizeObserver", "IntersectionObserver", "bootstrap", "psp", "name", "clsname", "statics", "cls", "proto", "names", "key", "args", "_Client", "ptr", "obj", "ClientFinalization", "wasm", "retptr", "r0", "getDataViewMemory0", "r1", "v1", "getCachedStringFromWasm0", "ret", "takeObject", "error", "reconnect", "ptr0", "passStringToWasm0", "len0", "WASM_VECTOR_LEN", "isLikeNone", "addHeapObject", "value", "send_request", "close", "r2", "on_response", "addBorrowedObject", "heap", "stack_pointer", "callback", "on_update_js", "entity_id", "update_id", "options", "ColumnDropDownElementFinalization", "CopyDropDownMenuElementFinalization", "parent", "_assertClass", "elem", "target", "ExportDropDownMenuElementFinalization", "FilterDropDownElementFinalization", "FunctionDropDownElementFinalization", "GenericSQLVirtualServerModelFinalization", "r3", "table_id", "view_id", "config", "ptr1", "len1", "v3", "v2", "expression", "viewport", "schema", "PerspectiveDebugPluginElementFinalization", "view", "_PerspectiveViewerElement", "PerspectiveViewerElementFinalization", "method", "wait_for_client", "wait_for_table", "table", "column_name", "toggle", "reset_all", "themes", "passArrayJsValueToWasm0", "force", "update", "autopause", "autosize", "window", "val", "_ProxySession", "ProxySessionFinalization", "client", "_Table", "TableFinalization", "on_delete", "callback_id", "input", "exprs", "_View", "ViewFinalization", "jsValue", "row_index", "depth", "_VirtualDataSlice", "VirtualDataSliceFinalization", "index", "group_by_index", "dtype", "VirtualServerFinalization", "bytes", "passArray8ToWasm0", "handler", "__wbg_get_imports", "arg0", "arg1", "v0", "getObject", "v", "debugString", "handleError", "arg2", "arg3", "arg4", "arg5", "getArrayJsValueFromWasm0", "ptr2", "len2", "getArrayU8FromWasm0", "result", "state0", "cb0", "a", "__wasm_bindgen_func_elem_20888", "__wbindgen_enum_ShadowRootMode", "makeClosure", "__wasm_bindgen_func_elem_14371", "__wasm_bindgen_func_elem_5237", "makeMutClosure", "__wasm_bindgen_func_elem_5238", "__wasm_bindgen_func_elem_5235", "__wasm_bindgen_func_elem_18286", "__wasm_bindgen_func_elem_18940", "__wasm_bindgen_func_elem_18978", "heap_next", "idx", "instance", "klass", "CLOSURE_DTORS", "state", "type", "description", "length", "debug", "i", "builtInMatches", "className", "dropObject", "len", "mem", "getUint8ArrayMemory0", "getStringFromWasm0", "cachedDataViewMemory0", "decodeText", "cachedUint8ArrayMemory0", "f", "e", "dtor", "real", "arg", "malloc", "array", "realloc", "buf", "cachedTextEncoder", "offset", "code", "cachedTextDecoder", "MAX_SAFARI_DECODE_BYTES", "numBytesDecoded", "wasmModule", "__wbg_finalize_init", "module", "__wbg_load", "imports", "expectedResponseType", "module_or_path", "get_psp_type", "model", "metadata", "PRIVATE_PLUGIN_SYMBOL", "min", "max", "limit_default", "x", "low", "high", "clip_rgb_default", "rgb", "i", "limit_default", "classToType", "name", "type_default", "obj", "unpack_default", "args", "keyOrder", "type_default", "k", "last_default", "args", "l", "type_default", "PI", "min", "max", "rnd2", "a", "rnd3", "TWOPI", "PITHIRD", "DEG2RAD", "RAD2DEG", "reverse3", "arr", "input_default", "Color", "args", "me", "type_default", "mode", "last_default", "autodetect", "input_default", "a", "b", "chk", "rgb", "clip_rgb_default", "Color_default", "version", "chroma", "args", "Color_default", "version", "chroma_default", "w3cx11", "w3cx11_default", "RE_HEX", "RE_HEXA", "hex2rgb", "hex", "u", "g", "b", "a", "hex2rgb_default", "round", "rgb2hex", "args", "r", "g", "b", "a", "unpack_default", "mode", "last_default", "str", "hxa", "rgb2hex_default", "Color_default", "hex", "rgb2hex_default", "n", "w3cx11_default", "input_default", "name", "hex2rgb_default", "h", "rest", "type_default", "Color_default", "a", "mutate", "type_default", "Color_default", "labConstants", "lab_constants_default", "ILLUMINANTS", "setLabWhitePoint", "name", "ill", "getLabWhitePoint", "lab2rgb", "args", "unpack_default", "L", "a", "b", "x", "y", "z", "lab2xyz", "r", "g", "b_", "xyz2rgb", "kE", "kK", "kKE", "Xn", "Yn", "Zn", "lab_constants_default", "fy", "fx", "fz", "fx3", "fz3", "xr", "yr", "zr", "compand", "linear", "sign", "MtxAdaptMa", "MtxAdaptMaI", "MtxXYZ2RGB", "RefWhiteRGB", "As", "Bs", "Cs", "Ad", "Bd", "Cd", "X1", "Y1", "Z1", "X2", "Y2", "Z2", "lab2rgb_default", "rgb2lab", "args", "r", "g", "b", "rest", "unpack_default", "x", "y", "z", "rgb2xyz", "L", "a", "b_", "xyz2lab", "Xn", "Yn", "Zn", "kE", "kK", "lab_constants_default", "xr", "yr", "zr", "fx", "fy", "fz", "gammaAdjustSRGB", "companded", "sign", "MtxRGB2XYZ", "MtxAdaptMa", "MtxAdaptMaI", "As", "Bs", "Cs", "Ad", "Bd", "Cd", "X", "Y", "Z", "rgb2lab_default", "Color_default", "rgb2lab_default", "lab", "args", "chroma_default", "getLabWhitePoint", "setLabWhitePoint", "input_default", "lab2rgb_default", "unpack_default", "type_default", "Color_default", "amount", "me", "lab", "lab_constants_default", "Color_default", "mc", "mode", "channel", "src", "i", "pow", "EPS", "MAX_ITER", "Color_default", "lum", "mode", "type_default", "cur_lum", "max_iter", "test", "low", "high", "mid", "lm", "rgb", "rgb2luminance", "r", "g", "b", "luminance_x", "x", "interpolator_default", "mix_default", "col1", "col2", "f", "rest", "mode", "interpolator_default", "type_default", "Color_default", "Color_default", "col2", "f", "rest", "mix_default", "Color_default", "mutate", "rgb", "a", "sin", "cos", "lch2lab", "args", "l", "c", "h", "unpack_default", "DEG2RAD", "lch2lab_default", "lch2rgb", "args", "unpack_default", "l", "c", "h", "L", "a", "b_", "lch2lab_default", "r", "g", "b", "lab2rgb_default", "lch2rgb_default", "hcl2rgb", "args", "hcl", "reverse3", "unpack_default", "lch2rgb_default", "hcl2rgb_default", "sqrt", "atan2", "round", "lab2lch", "args", "l", "a", "b", "unpack_default", "c", "h", "RAD2DEG", "lab2lch_default", "rgb2lch", "args", "r", "g", "b", "rest", "unpack_default", "l", "a", "b_", "rgb2lab_default", "L", "c", "h", "lab2lch_default", "rgb2lch_default", "Color_default", "rgb2lch_default", "reverse3", "lch", "args", "hcl", "chroma_default", "input_default", "lch2rgb_default", "hcl2rgb_default", "m", "unpack_default", "type_default", "Color_default", "amount", "me", "lch", "lab_constants_default", "Color_default", "mc", "value", "mutate", "mode", "channel", "src", "i", "type_default", "out", "Color_default", "f", "rest", "mix_default", "rgb", "col1", "col2", "f", "xyz0", "xyz1", "Color_default", "interpolator_default", "sqrt", "pow", "lrgb", "col1", "col2", "f", "x1", "y1", "z1", "x2", "y2", "z2", "Color_default", "interpolator_default", "lab", "col1", "col2", "f", "xyz0", "xyz1", "Color_default", "interpolator_default", "hsx_default", "col1", "col2", "f", "m", "xyz0", "xyz1", "hue0", "hue1", "sat0", "sat1", "lbv0", "lbv1", "sat", "hue", "lbv", "dh", "Color_default", "lch", "col1", "col2", "f", "hsx_default", "interpolator_default", "num2rgb", "num", "type_default", "r", "g", "b", "num2rgb_default", "rgb2num", "args", "r", "g", "b", "unpack_default", "rgb2num_default", "Color_default", "rgb2num_default", "num", "args", "chroma_default", "input_default", "num2rgb_default", "type_default", "num", "col1", "col2", "f", "c1", "c2", "Color_default", "interpolator_default", "floor", "hcg2rgb", "args", "unpack_default", "h", "c", "_g", "r", "g", "b", "_c", "i", "f", "p", "q", "t", "v", "hcg2rgb_default", "rgb2hcg", "args", "r", "g", "b", "unpack_default", "minRgb", "min", "maxRgb", "max", "delta", "c", "_g", "h", "rgb2hcg_default", "Color_default", "rgb2hcg_default", "hcg", "args", "chroma_default", "input_default", "hcg2rgb_default", "unpack_default", "type_default", "hcg", "col1", "col2", "f", "hsx_default", "interpolator_default", "cos", "hsi2rgb", "args", "unpack_default", "h", "s", "i", "r", "g", "b", "TWOPI", "PITHIRD", "limit_default", "hsi2rgb_default", "min", "sqrt", "acos", "rgb2hsi", "args", "r", "g", "b", "unpack_default", "h", "min_", "i", "s", "TWOPI", "rgb2hsi_default", "Color_default", "rgb2hsi_default", "hsi", "args", "chroma_default", "input_default", "hsi2rgb_default", "unpack_default", "type_default", "hsi", "col1", "col2", "f", "hsx_default", "interpolator_default", "hsl2rgb", "args", "unpack_default", "h", "s", "l", "r", "g", "b", "t3", "c", "t2", "t1", "h_", "i", "hsl2rgb_default", "rgb2hsl", "args", "unpack_default", "r", "g", "b", "minRgb", "min", "maxRgb", "max", "l", "s", "h", "rgb2hsl_default", "Color_default", "rgb2hsl_default", "hsl", "args", "chroma_default", "input_default", "hsl2rgb_default", "unpack_default", "type_default", "hsl", "col1", "col2", "f", "hsx_default", "interpolator_default", "floor", "hsv2rgb", "args", "unpack_default", "h", "s", "v", "r", "g", "b", "i", "f", "p", "q", "t", "hsv2rgb_default", "min", "max", "rgb2hsl", "args", "unpack_default", "r", "g", "b", "min_", "max_", "delta", "h", "s", "v", "rgb2hsv_default", "Color_default", "rgb2hsv_default", "hsv", "args", "chroma_default", "input_default", "hsv2rgb_default", "unpack_default", "type_default", "hsv", "col1", "col2", "f", "hsx_default", "interpolator_default", "multiplyMatrices", "A", "B", "m", "x", "p", "B_cols", "_", "i", "product", "row", "col", "a", "c", "oklab2rgb", "args", "unpack_default", "L", "a", "b", "rest", "X", "Y", "Z", "OKLab_to_XYZ", "r", "g", "b_", "xyz2rgb", "OKLab", "LMStoXYZ", "OKLabtoLMS", "LMSnl", "multiplyMatrices", "c", "oklab2rgb_default", "rgb2oklab", "args", "r", "g", "b", "rest", "unpack_default", "xyz", "rgb2xyz", "XYZ_to_OKLab", "XYZ", "XYZtoLMS", "LMStoOKLab", "LMS", "multiplyMatrices", "c", "rgb2oklab_default", "Color_default", "rgb2oklab_default", "oklab", "args", "chroma_default", "input_default", "oklab2rgb_default", "unpack_default", "type_default", "oklab", "col1", "col2", "f", "xyz0", "xyz1", "Color_default", "interpolator_default", "oklch", "col1", "col2", "f", "hsx_default", "interpolator_default", "pow", "sqrt", "PI", "cos", "sin", "atan2", "average_default", "colors", "mode", "weights", "l", "k", "a", "b", "w", "i", "c", "Color_default", "_average_lrgb", "first", "xyz", "cnt", "dx", "dy", "A", "alpha", "ci", "xyz2", "col", "f", "rgb", "clip_rgb_default", "pow", "scale_default", "colors", "_mode", "_nacol", "chroma_default", "_spread", "_domain", "_pos", "_padding", "_classes", "_colors", "_out", "_min", "_max", "_correctLightness", "_colorCache", "_useCache", "_gamma", "setColors", "type_default", "c", "resetCache", "getClass", "value", "n", "i", "tMapLightness", "t", "tMapDomain", "getColor", "val", "bypassMap", "col", "limit_default", "k", "p", "f", "v", "classes", "d", "domain", "tOut", "tBreaks", "_m", "_o", "L0", "L1", "pol", "L_actual", "L_ideal", "L_diff", "t0", "t1", "max_iter", "numColors", "out", "result", "dm", "dd", "__range__", "samples", "end", "asc", "g", "left", "right", "inclusive", "range", "ascending", "binom_row", "n", "row", "i", "newrow", "j", "bezier", "colors", "I", "lab0", "lab1", "lab2", "c", "Color_default", "t", "lab", "lab3", "labs", "u", "sum", "el", "bezier_default", "f", "scale_default", "round", "Color_default", "rnd", "v", "i", "rgb", "args", "chroma_default", "input_default", "rgba", "unpack_default", "type_default", "blend", "bottom", "top", "mode", "blend_f", "f", "c0", "chroma_default", "c1", "each", "out", "normal", "a", "multiply", "b", "darken", "lighten", "screen", "overlay", "burn", "dodge", "blend_default", "pow", "sin", "cos", "cubehelix_default", "start", "rotations", "hue", "gamma", "lightness", "dh", "dl", "type_default", "f", "fract", "a", "TWOPI", "l", "amp", "cos_a", "sin_a", "r", "g", "b", "chroma_default", "clip_rgb_default", "s", "h", "digits", "floor", "random", "random_default", "code", "i", "Color_default", "log", "pow", "floor", "abs", "analyze", "data", "key", "type_default", "val", "mode", "num", "limits", "min", "max", "values", "a", "b", "i", "min_log", "max_log", "p", "pb", "pr", "cluster", "n", "assignments", "clusterSizes", "repeat", "nb_iters", "centroids", "j", "value", "mindist", "best", "dist", "newCentroids", "kClusters", "tmpKMeansBreaks", "v", "contrast_default", "a", "b", "Color_default", "l1", "l2", "W_offset", "P_in", "P_out", "R_scale", "B_threshold", "B_exp", "contrastAPCA_default", "text", "bg", "Color_default", "mix_default", "l_text", "lum", "l_bg", "Y_text", "Y_bg", "S_norm", "S_rev", "C", "r", "g", "b", "sqrt", "pow", "min", "max", "atan2", "abs", "cos", "sin", "exp", "PI", "delta_e_default", "a", "b", "Kl", "Kc", "Kh", "rad2deg", "rad", "deg2rad", "deg", "Color_default", "L1", "a1", "b1", "L2", "a2", "b2", "avgL", "C1", "C2", "avgC", "G", "a1p", "a2p", "C1p", "C2p", "avgCp", "arctan1", "arctan2", "h1p", "h2p", "avgHp", "deltaHp", "deltaL", "deltaCp", "sl", "sc", "sh", "deltaTheta", "Rt", "result", "distance_default", "a", "b", "mode", "Color_default", "l1", "l2", "sum_sq", "i", "d", "valid_default", "args", "Color_default", "scales_default", "scale_default", "chroma_default", "colorbrewer", "colorbrewerTypes", "typeMap", "key", "colorbrewerProxy", "target", "prop", "lower", "colorbrewer_default", "cmyk2rgb", "args", "unpack_default", "c", "m", "y", "k", "alpha", "cmyk2rgb_default", "max", "rgb2cmyk", "args", "r", "g", "b", "unpack_default", "k", "f", "c", "m", "y", "rgb2cmyk_default", "Color_default", "rgb2cmyk_default", "cmyk", "args", "chroma_default", "input_default", "cmyk2rgb_default", "unpack_default", "type_default", "hsl2css", "args", "hsla", "unpack_default", "mode", "last_default", "rnd2", "hsl2css_default", "lab2css", "args", "laba", "unpack_default", "mode", "last_default", "rnd2", "lab2css_default", "lch2css", "args", "lcha", "unpack_default", "mode", "last_default", "rnd2", "lch2css_default", "oklab2css", "args", "laba", "unpack_default", "rnd2", "rnd3", "oklab2css_default", "rgb2oklch", "args", "r", "g", "b", "rest", "unpack_default", "l", "a", "b_", "rgb2oklab_default", "L", "c", "h", "lab2lch_default", "rgb2oklch_default", "oklch2css", "args", "lcha", "unpack_default", "rnd2", "rnd3", "oklch2css_default", "round", "rgb2css", "args", "rgba", "unpack_default", "mode", "last_default", "hsl2css_default", "rgb2hsl_default", "prevWhitePoint", "getLabWhitePoint", "setLabWhitePoint", "cssColor", "lab2css_default", "rgb2lab_default", "lch2css_default", "rgb2lch_default", "oklab2css_default", "rgb2oklab_default", "oklch2css_default", "rgb2oklch_default", "rgb2css_default", "oklch2rgb", "args", "unpack_default", "l", "c", "h", "rest", "L", "a", "b_", "lch2lab_default", "r", "g", "b", "oklab2rgb_default", "oklch2rgb_default", "INT_OR_PCT", "FLOAT_OR_PCT", "PCT", "RE_S", "SEP", "COMMA", "ANLGE", "ALPHA", "RE_RGB", "RE_RGB_LEGACY", "RE_RGBA_LEGACY", "RE_HSL", "RE_HSL_LEGACY", "RE_HSLA_LEGACY", "RE_LAB", "RE_LCH", "RE_OKLAB", "RE_OKLCH", "round", "roundRGB", "rgb", "v", "i", "limit_default", "percentToAbsolute", "pct", "min", "max", "signed", "noneToValue", "noneValue", "css2rgb", "css", "m", "input_default", "alpha", "hsl", "hsl2rgb_default", "lab", "wp", "getLabWhitePoint", "setLabWhitePoint", "lab2rgb_default", "lch", "lch2rgb_default", "oklab", "oklab2rgb_default", "oklch", "oklch2rgb_default", "s", "css2rgb_default", "Color_default", "mode", "rgb2css_default", "css", "args", "chroma_default", "input_default", "css2rgb_default", "h", "rest", "type_default", "input_default", "args", "rgb", "unpack_default", "gl", "Color_default", "chroma_default", "Color_default", "mode", "rgb2hex_default", "hex", "args", "chroma_default", "input_default", "hex2rgb_default", "h", "rest", "type_default", "log", "temperature2rgb", "kelvin", "temp", "g", "b", "temperature2rgb_default", "round", "rgb2temperature", "args", "rgb", "unpack_default", "b", "minTemp", "maxTemp", "eps", "temp", "temperature2rgb_default", "rgb2temperature_default", "Color_default", "rgb2temperature_default", "temp", "args", "chroma_default", "input_default", "temperature2rgb_default", "Color_default", "rgb2oklch_default", "oklch", "args", "chroma_default", "input_default", "oklch2rgb_default", "unpack_default", "type_default", "chroma_default", "analyze", "average_default", "bezier_default", "blend_default", "colorbrewer_default", "Color_default", "w3cx11_default", "contrast_default", "contrastAPCA_default", "cubehelix_default", "delta_e_default", "distance_default", "input_default", "mix_default", "limits", "random_default", "scale_default", "scales_default", "valid_default", "chroma_js_default", "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", "div", "anchor", "pct", "bold", "italic", "formatter", "format_tree_header_row_path", "paths", "row_headers", "regularTable", "plugins", "PRIVATE_PLUGIN_SYMBOL", "path", "fullPath", "last", "newPath", "formatted", "format_cell", "format_flat_header_row_path", "part", "i", "format_tree_header", "new_path", "idx", "createDataListener", "viewer", "last_meta", "last_column_paths", "last_ids", "last_reverse_ids", "last_reverse_columns", "regularTable", "x0", "y0", "x1", "y1", "columns", "new_window", "num_columns", "x", "z", "new_col_paths", "changed_cols", "i", "a", "b", "column", "_", "index", "acc", "data", "metadata", "column_headers", "column_paths", "is_settings_open", "ipath", "path", "path_parts", "agg_depth", "PRIVATE_PLUGIN_SYMBOL", "format_cell", "is_dim_call", "is_row_path", "is_flat", "row_headers", "format_flat_header_row_path", "format_tree_header_row_path", "format_tree_header", "num_row_headers", "row_header_depth", "config", "blend", "a", "b", "chroma_js_default", "rgbaToRgb", "r", "g", "source", "f", "i", "c", "infer_foreground_from_background", "make_gradient", "chromahex", "r1", "g1", "b1", "r2", "g2", "b2", "make_color_record", "color", "chroma_neg", "_neg_grad", "rgb", "get_rule", "regular", "tag", "def", "color", "ElemFactoryImpl", "name", "elem", "createModel", "table", "view", "extend", "config", "old", "group_by_changed", "type_changed", "lvl", "split_by_changed", "columns_changed", "filter_changed", "i", "sort_changed", "group_rollup_mode_changed", "table_schema", "num_rows", "schema", "expression_schema", "_edit_port", "_plugin_background", "chroma_js_default", "_pos_fg_color", "make_color_record", "_neg_fg_color", "_pos_bg_color", "blend", "_neg_bg_color", "_color", "_schema", "_table_schema", "_column_paths", "_is_editable", "_column_types", "_edit_mode", "model", "column_path", "createDataListener", "EDIT_MODES", "toggle_edit_mode", "mode", "toggle_scroll_lock", "force", "restore_column_size_overrides", "old_sizes", "cache", "overrides", "group_by", "tree_header_offset", "key", "index", "save_column_size_overrides", "x", "numKey", "style_selected_column", "regularTable", "viewer", "selectedColumn", "group_header_trs", "len", "settings_open", "tr", "i", "offset", "id", "titles", "editBtns", "th", "title", "editBtn", "open", "r", "meta", "isOpen", "styleColumnHeaderRow", "headerRow", "is_menu_row", "header_depth", "td", "metadata", "column_name", "sort", "is_corner", "needs_border", "type", "get_psp_type", "is_numeric", "is_string", "is_date", "is_datetime", "ROW_SORT_ORDER", "ROW_COL_SORT_ORDER", "sortHandler", "regularTable", "viewer", "event", "target", "meta", "column_name", "sort_method", "append_sort", "override_sort", "abs", "sort", "found", "sort_term", "_column_name", "_sort_dir", "term", "create_sort", "sort_dir", "_abs", "order", "inc_sort_dir", "expandCollapseHandler", "regularTable", "event", "meta", "is_collapse", "x", "mousedown_listener", "regularTable", "viewer", "event", "target", "expandCollapseHandler", "column_name", "sortHandler", "click_listener", "write_cell", "table", "model", "active_cell", "meta", "type", "text", "id", "parsed", "msg", "clickListener", "_viewer", "event", "is_editable2", "is_bool", "get_psp_type", "is_null", "applyFocusStyle", "cells", "regularTable", "selectedPositionMap", "selected_position", "host", "td", "metadata", "focusSelectedCell", "tbody", "tr", "cell", "lock", "body", "lockPromise", "args", "resolve", "x", "result", "getPos", "_range", "range", "moveSelection", "table", "selected_position_map", "active_cell", "dx", "dy", "meta", "num_columns", "num_rows", "selected_position", "xmin", "xmax", "ymin", "ymax", "y", "focusSelectedCell", "isLastCell", "model", "target", "keydownListener", "_viewer", "event", "is_editable", "viewer", "allowed", "has_pivots", "selectable", "plugin", "editable", "keydownListener", "table", "selected_position_map", "event", "clickListener", "focusoutListener", "table", "viewer", "selected_position_map", "event", "is_editable", "target", "selectedPosition", "write_cell", "focusinListener", "_viewer", "meta", "new_state", "getCellConfig", "_view", "_config", "row_idx", "col_idx", "group_by", "split_by", "start_row", "end_row", "r", "group_by_values", "x", "row_filters", "pivot", "index", "pivot_value", "column_index", "column_paths", "result", "column_filters", "split_by_values", "value", "filter", "selectionListener", "regularTable", "viewer", "selected_rows_map", "event", "meta", "id", "selected", "key_match", "agg", "x", "i", "is_deselect", "row", "column_names", "config", "getCellConfig", "detail", "K", "deselect_all_listener", "regularTable", "_viewer", "selected_rows_map", "td", "dispatch_click_listener", "table", "viewer", "event", "meta", "x", "y", "row", "column_names", "config", "getCellConfig", "MOUSE_SELECTED_AREA_CLASS", "addAreaMouseSelection", "datagrid", "table", "className", "selected", "getMousedownListener", "getMouseoverListener", "getMouseupListener", "applyMouseAreaSelections", "event", "mouseEvent", "meta", "start", "potentialSelection", "selection", "set_psp_selection", "viewer", "x0", "x1", "y0", "y1", "viewport", "mode", "tds", "applyMouseAreaSelection", "td", "rendered", "applyColumnHeaderStyles", "headerRows", "regularTable", "viewer", "selectedColumn", "len", "settings_open", "row", "i", "offset", "id", "titlesRow", "editBtnsRow", "cells", "element", "title", "editBtn", "open", "colHeadersIndex", "colHeaders", "menuHeadersIndex", "menuHeaders", "applyGroupHeaderStyles", "headerRows", "regularTable", "header_depth", "m", "marked", "y", "row", "cells", "tops", "x", "td", "metadata", "needs_border", "xx", "cell", "tx", "ty", "style_cell_flash", "metadata", "td", "pos_s", "pos_e", "neg_s", "neg_e", "is_settings_open", "id", "metadata_path", "row_idx", "col_idx", "cell_style_numeric", "plugin", "td", "metadata", "is_settings_open", "is_positive", "is_negative", "pos_bg_color", "neg_bg_color", "bg_tuple", "hex", "r", "g", "b", "a", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "style_cell_flash", "fg_tuple", "gradhex", "cell_style_string", "plugin", "td", "metadata", "column_name", "colorRecord", "hex", "r", "g", "b", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "series_map", "seed", "color_seed", "h", "s", "l", "chroma_js_default", "color2", "r2", "g2", "b2", "hex2", "cell_style_datetime", "plugin", "td", "metadata", "colorRecord", "hex", "r", "g", "b", "source", "foreground", "infer_foreground_from_background", "rgbaToRgb", "cell_style_boolean", "_plugin", "td", "metadata", "hex", "cell_style_row_header", "regularTable", "td", "metadata", "is_not_empty", "is_leaf", "next", "is_collapse", "applyBodyCellStyles", "cells", "plugins", "isSettingsOpen", "isSelectable", "isEditable", "regularTable", "selectedRowsMap", "selectedPositionMap", "viewer", "hasSelected", "selected", "td", "metadata", "isHeader", "column_name", "type", "get_psp_type", "plugin", "is_numeric", "x", "cell_style_numeric", "cell_style_boolean", "cell_style_string", "cell_style_datetime", "cell_style_row_header", "tr", "id", "key_match", "agg", "i", "selectedArr", "col_name_str", "isEditableMode", "model", "viewer", "allowed", "has_pivots", "selectable", "plugin", "editable", "createConsolidatedStyleListener", "datagrid", "selectedRowsMap", "selectedPositionMap", "regularTable", "plugins", "PRIVATE_PLUGIN_SYMBOL", "isSettingsOpen", "isSelectable", "isEditable", "isEditableAllowed", "bodyCells", "groupHeaderRows", "tbody", "tr", "cell", "metadata", "isHeader", "thead", "rowData", "installConsolidatedStyleMethods", "modelPrototype", "applyBodyCellStyles", "applyGroupHeaderStyles", "applyColumnHeaderStyles", "applyFocusStyle", "styleColumnHeaderRow", "activate", "view", "viewer", "table", "createModel", "addAreaMouseSelection", "selected_rows_map", "selected_position_map", "installConsolidatedStyleMethods", "createConsolidatedStyleListener", "click_listener", "selectionListener", "deselect_all_listener", "dispatch_click_listener", "mousedown_listener", "clickListener", "focusinListener", "focusoutListener", "keydownListener", "event", "toggleEvent", "style_selected_column", "restore", "token", "columns", "overrides", "col", "value", "styles", "col_name", "controls", "make_color_record", "EDIT_MODES", "toggle_edit_mode", "toggle_scroll_lock", "datagrid", "restore_column_size_overrides", "PRIVATE_PLUGIN_SYMBOL", "save", "token", "column_size_overrides", "save_column_size_overrides", "col", "draw", "view", "old_sizes", "save_column_size_overrides", "drawPromise", "restore_column_size_overrides", "column_style_opts", "type", "_group", "perspective_viewer_datagrid_default", "HTMLPerspectiveViewerDatagridPluginElement", "_HTMLPerspectiveViewerDatagridPluginElement", "Elem", "perspective_viewer_datagrid_default", "parent", "view", "activate", "type", "_group", "group", "column_style_opts", "draw", "dimensions", "viewport", "json", "cols", "nrows", "out", "ridx", "col_name", "col", "pluginConfig", "PRIVATE_PLUGIN_SYMBOL", "columnName", "formatter", "format_raw", "save", "token", "columns_config", "restore", "perspective_viewer_datagrid_toolbar_default", "stylesheet", "perspective_viewer_datagrid_toolbar_default", "HTMLPerspectiveViewerDatagridToolbarElement", "viewer", "plugin", "toggle_scroll_lock", "toggle_edit_mode", "_register_element", "HTMLPerspectiveViewerDatagridToolbarElement", "HTMLPerspectiveViewerDatagridPluginElement"]
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/column_style_controls.ts", "../css/perspective-viewer-datagrid.css", "../../src/ts/custom_elements/datagrid.ts", "../css/perspective-viewer-datagrid-toolbar.css", "../../src/ts/custom_elements/toolbar.ts", "../../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 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"]
7
7
  }