@perspective-dev/viewer-datagrid 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/cdn/perspective-viewer-datagrid.js +4 -4
  2. package/dist/cdn/perspective-viewer-datagrid.js.map +4 -4
  3. package/dist/esm/event_handlers/click/edit_click.d.ts +1 -1
  4. package/dist/esm/model/create.d.ts +1 -1
  5. package/dist/esm/perspective-viewer-datagrid.js +3 -3
  6. package/dist/esm/perspective-viewer-datagrid.js.map +3 -3
  7. package/dist/esm/style_handlers/body.d.ts +1 -1
  8. package/dist/esm/style_handlers/column_header.d.ts +1 -1
  9. package/dist/esm/style_handlers/consolidated.d.ts +2 -5
  10. package/dist/esm/style_handlers/table_cell/boolean.d.ts +1 -5
  11. package/dist/esm/style_handlers/table_cell/cell_flash.d.ts +2 -2
  12. package/dist/esm/style_handlers/table_cell/datetime.d.ts +1 -5
  13. package/dist/esm/style_handlers/table_cell/row_header.d.ts +2 -2
  14. package/dist/esm/style_handlers/types.d.ts +2 -5
  15. package/dist/esm/types.d.ts +1 -1
  16. package/package.json +3 -3
  17. package/src/ts/color_utils.ts +0 -1
  18. package/src/ts/event_handlers/click/edit_click.ts +13 -10
  19. package/src/ts/event_handlers/dispatch_click.ts +2 -4
  20. package/src/ts/event_handlers/expand_collapse.ts +4 -3
  21. package/src/ts/event_handlers/focus.ts +1 -1
  22. package/src/ts/event_handlers/header_click.ts +1 -1
  23. package/src/ts/event_handlers/keydown/edit_keydown.ts +2 -2
  24. package/src/ts/event_handlers/row_select_click.ts +6 -4
  25. package/src/ts/event_handlers/select_region.ts +23 -11
  26. package/src/ts/event_handlers/sort.ts +1 -1
  27. package/src/ts/get_cell_config.ts +1 -0
  28. package/src/ts/model/create.ts +11 -18
  29. package/src/ts/style_handlers/body.ts +16 -21
  30. package/src/ts/style_handlers/column_header.ts +15 -4
  31. package/src/ts/style_handlers/consolidated.ts +8 -13
  32. package/src/ts/style_handlers/focus.ts +4 -10
  33. package/src/ts/style_handlers/group_header.ts +6 -3
  34. package/src/ts/style_handlers/table_cell/boolean.ts +2 -5
  35. package/src/ts/style_handlers/table_cell/cell_flash.ts +2 -2
  36. package/src/ts/style_handlers/table_cell/datetime.ts +2 -5
  37. package/src/ts/style_handlers/table_cell/row_header.ts +8 -7
  38. package/src/ts/style_handlers/types.ts +6 -6
  39. package/src/ts/types.ts +15 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/constants.ts", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/utils.ts", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/dist/css/container.css", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/dist/css/sub-cell-offsets.css", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/scroll_panel.ts", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/events.ts", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/view_model.ts", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/thead.ts", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/tbody.ts", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/table.ts", "../../../../node_modules/.pnpm/regular-table@0.7.3/node_modules/regular-table/src/ts/regular-table.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\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 = new WeakMap();\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", "// \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\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", ":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%;}div.rt-tree-container{display:flex;align-items:center;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(viewport: Viewport): void {\n const y_offset =\n (this._column_sizes.row_height || 20) * (viewport.start_row % 1) ||\n 0;\n\n const x_offset =\n (this._column_sizes.indices[\n (this.table_model._row_headers_length || 0) +\n Math.floor(viewport.start_col)\n ] || 0) *\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 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 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._view_cache.view(0, 0, 0, 0);\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 const is_non_horizontal =\n this._virtual_mode === \"none\" || this._virtual_mode === \"vertical\";\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 // this.table_model.clearWidthStyles();\n this.table_model.updateColumnWidthStyles(\n viewport,\n this._view_cache.row_headers_length,\n );\n\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 autosize_cells: CellTuple[] = [];\n let first_iteration = true;\n for await (let last_cells of 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 )) {\n if (last_cells !== undefined) {\n autosize_cells.push(...last_cells);\n }\n\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);\n first_iteration = false;\n }\n\n this._is_styling = true;\n const callbacks = this._style_callbacks;\n for (const callback of callbacks) {\n await callback({ detail: this as RegularTableElement });\n }\n\n this._is_styling = false;\n if (!this._invalidated && last_cells !== undefined) {\n break;\n }\n\n this._invalidated = false;\n }\n\n const old_height = this._column_sizes.row_height;\n this.table_model.autosize_cells(autosize_cells, 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 { METADATA_MAP } from \"./constants\";\nimport { RegularVirtualTableViewModel } from \"./scroll_panel\";\nimport { throttle_tag } from \"./utils\";\nimport { CellMetadata } from \"./types\";\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 });\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) {\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();\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) {\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();\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({ preserve_width: true, throttle: false });\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 { METADATA_MAP } from \"./constants\";\nimport { CellMetadata, ColumnSizes } from \"./types\";\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 ): CellMetadata {\n if (!td) {\n return { value: undefined };\n }\n let metadata = METADATA_MAP.get(td);\n if (!metadata) {\n metadata = { value: undefined };\n METADATA_MAP.set(td, metadata);\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 { ViewModel } from \"./view_model\";\nimport {\n HeaderDrawResult,\n ColumnSizes,\n CellMetadata,\n CellScalar,\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: [CellMetadata, HTMLTableCellElement, number][];\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 ): CellMetadata {\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 ): CellMetadata {\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: CellMetadata | 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 };\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.row_header_x = Array.isArray(size_key)\n ? size_key[0]\n : size_key;\n }\n }\n }\n\n this._clean_rows(this._offset_cache.length);\n output = output || { th: th!, metadata: metadata! };\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 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: CellMetadata } {\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: CellMetadata | 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 | { td: HTMLTableCellElement; metadata: CellMetadata }\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 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 const td = obj.td;\n const meta = obj.metadata;\n td.style.display = \"\";\n td.removeAttribute(\"rowspan\");\n td.removeAttribute(\"colspan\");\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;\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.x = x_floor;\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;\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(viewport.end_col, 0);\n viewport.start_col = missing_cidx;\n this._calculateViewportExtension(\n 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(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: 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 = 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 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\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 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,\n box.height,\n ),\n );\n\n if (metadata?.size_key !== undefined) {\n this._column_sizes.indices[metadata.size_key] = box.width;\n if (\n box.width &&\n this._column_sizes.override[metadata.size_key] === undefined\n ) {\n this._column_sizes.auto[metadata.size_key] = box.width;\n }\n }\n }\n }\n\n clearWidthStyles() {\n this._columnWidthStyleSheet?.replaceSync(\"\");\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 cssRules.push(\n `thead tr.rt-autosize th:nth-child(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-child(${columnIndex})`,\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-child(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-child(${columnIndex})`,\n `{min-width:${auto_width}px;max-width:none;}`,\n );\n }\n }\n\n for (\n let size_key = row_headers_size_key;\n size_key <\n row_headers_size_key +\n (Math.ceil(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-child(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-child(${columnIndex})`,\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-child(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-child(${columnIndex})`,\n `{min-width:${auto_width}px;max-width:none;}`,\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 *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 ): AsyncGenerator<CellTuple[] | undefined, void, unknown> {\n const { width: container_width, height: container_height } =\n container_size;\n\n // Fetch and prepare initial data\n const view_response = 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 yield undefined;\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 yield last_cells;\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 yield last_cells;\n\n // Recalculate after style listeners\n view_state.viewport_width = 0;\n for (const [td] of last_cells) {\n view_state.viewport_width += td.offsetWidth;\n }\n\n if (this._isViewportFilled(view_state, container_width)) {\n return;\n }\n }\n }\n\n this._cleanupAfterDraw(cont_body, _virtual_x);\n yield last_cells;\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 { METADATA_MAP } from \"./constants\";\nimport { RegularViewEventModel } from \"./events\";\nimport { RegularTableViewModel } from \"./table\";\nimport { DataListener, SetDataListenerOptions } from \"./types\";\nimport { get_draw_fps } from \"./utils\";\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 the viewport of this regular table.\n */\n private _reset_viewport(): void {\n this._start_row = undefined;\n this._end_row = undefined;\n this._start_col = undefined;\n this._end_col = undefined;\n }\n\n /**\n * Reset the scroll position of this regular table back to the origin.\n */\n private _reset_scroll(): void {\n this._column_sizes.indices = [];\n this.scrollTop = 0;\n this.scrollLeft = 0;\n this._reset_viewport();\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 * When called within the execution scope of a function registered to this\n * `<regular-table>` as a `StyleListener`, invalidate this draw's\n * dimensions and attempt to draw more columns. Useful if your\n * `StyleListener` changes a cells dimensions, otherwise `<regular-table>`\n * may not draw enough columns to fill the screen.\n */\n invalidate(): void {\n if (!this._is_styling) {\n throw new Error(\n \"Cannot call `invalidate()` outside of a `StyleListener`\",\n );\n }\n /** */\n this._invalidated = true;\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 | any): any {\n if (typeof element === \"undefined\") {\n return;\n } else if (element instanceof HTMLElement) {\n return METADATA_MAP.get(element);\n } else if (element.row_header_x >= 0) {\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 (element.column_header_y >= 0) {\n if (\n element.column_header_y < this._view_cache.column_headers_length\n ) {\n const td = this.table_model.body._fetch_cell(\n element.column_header_y,\n element.y,\n );\n return this.getMeta(td);\n }\n } else {\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(): {\n avg: number;\n real_fps: number;\n virtual_fps: number;\n num_frames: number;\n elapsed: number;\n } {\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", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type {\n View,\n Table,\n ViewConfig,\n ColumnType,\n SortDir,\n ViewWindow,\n} from \"@perspective-dev/client\";\nimport { RegularTableElement } from \"regular-table\";\nimport { CellMetadata, DataResponse } from \"regular-table/dist/esm/types\";\n\n// Re-export types from regular-table for use throughout the codebase\nexport type { RegularTableElement as RegularTable };\nexport type { CellMetadata as CellMeta };\n\n// Edit mode for the datagrid\nexport type EditMode =\n | \"READ_ONLY\"\n | \"EDIT\"\n | \"SELECT_COLUMN\"\n | \"SELECT_ROW\"\n | \"SELECT_REGION\";\n\n// Color record for styling - tuple returned by make_color_record\nexport type ColorRecord = [\n string, // hex color\n number, // red\n number, // green\n number, // blue\n string, // gradient\n string, // rgba solid\n string, // rgba transparent\n];\n\nexport type SortTerm = [string, SortDir];\n\n// Selection state for mouse-based region selection\nexport interface SelectionArea {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n}\n\nexport interface SelectionState {\n selected_areas: SelectionArea[];\n dirty: boolean;\n CURRENT_MOUSEDOWN_COORDINATES?: { x?: number; y?: number };\n old_selected_areas?: SelectionArea[];\n potential_selection?: SelectionArea;\n}\n\n// Position tracking for cell focus\nexport interface SelectedPosition {\n x: number;\n y: number;\n content?: string;\n}\n\n// Column configuration values from viewer\nexport interface ColumnConfig {\n color?: string;\n pos_fg_color?: string;\n neg_fg_color?: string;\n pos_bg_color?: string;\n neg_bg_color?: string;\n fg_gradient?: number;\n bg_gradient?: number;\n number_fg_mode?: string;\n number_bg_mode?: string;\n string_color_mode?: string;\n datetime_color_mode?: string;\n fixed?: number;\n aggregate_depth?: number;\n column_size_override?: number;\n format?: string;\n date_format?: DateFormatConfig;\n number_format?: NumberFormatConfig;\n}\n\n// Date format configuration for column styling\nexport interface DateFormatConfig {\n format?: \"custom\" | string;\n timeZone?: string;\n dateStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n timeStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n second?: \"numeric\" | \"2-digit\" | \"disabled\";\n minute?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour?: \"numeric\" | \"2-digit\" | \"disabled\";\n day?: \"numeric\" | \"2-digit\" | \"disabled\";\n weekday?: \"narrow\" | \"short\" | \"long\" | \"disabled\";\n month?: \"numeric\" | \"2-digit\" | \"narrow\" | \"short\" | \"long\" | \"disabled\";\n year?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour12?: boolean;\n fractionalSecondDigits?: 1 | 2 | 3;\n}\n\n// Number format configuration for column styling\nexport interface NumberFormatConfig {\n style?: \"decimal\" | \"currency\" | \"percent\" | \"unit\";\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n minimumIntegerDigits?: number;\n minimumSignificantDigits?: number;\n maximumSignificantDigits?: number;\n currency?: string;\n currencyDisplay?: \"code\" | \"symbol\" | \"narrowSymbol\" | \"name\";\n notation?: \"standard\" | \"scientific\" | \"engineering\" | \"compact\";\n compactDisplay?: \"short\" | \"long\";\n useGrouping?: boolean;\n}\n\nexport type ColumnsConfig = Record<string, ColumnConfig>;\n\n// Plugin save state\nexport interface DatagridPluginConfig {\n columns?: ColumnsConfig;\n editable?: boolean;\n scroll_lock?: boolean;\n edit_mode?: EditMode;\n column_size_override?: Record<string, number>;\n}\n\n// Element factory for reusing DOM elements\nexport interface ElemFactory {\n clear(): void;\n get(): HTMLElement;\n}\n\nexport type Schema = Record<string, ColumnType>;\n\n// Model object stored on regular-table\nexport interface DatagridModel {\n _edit_port: number;\n _view: View;\n _table: Table;\n _table_schema: Schema;\n _config: ViewConfig;\n _num_rows: number;\n _num_columns?: number;\n _schema: Schema;\n _ids: unknown[][];\n _plugin_background: number[];\n _color: ColorRecord;\n _pos_fg_color: ColorRecord;\n _neg_fg_color: ColorRecord;\n _pos_bg_color: ColorRecord;\n _neg_bg_color: ColorRecord;\n _column_paths: string[];\n _column_types: ColumnType[];\n _is_editable: boolean[];\n _edit_mode: EditMode;\n _selection_state: SelectionState;\n _row_header_types: ColumnType[];\n _series_color_map: Map<string, Map<string, number>>;\n _series_color_seed: Map<string, number>;\n _div_factory: ElemFactory;\n _last_window?: ViewWindow;\n _is_old_viewport?: boolean;\n _reverse_columns?: Map<string, number>;\n _reverse_ids?: Map<string, number>;\n last_column_paths?: string[];\n last_meta?: unknown[][];\n last_ids?: unknown[][];\n last_reverse_ids?: Map<string, number>;\n last_reverse_columns?: Map<string, number>;\n get_psp_type(metadata: CellMetadata): ColumnType;\n _column_settings_selected_column?: string;\n}\n\n// Symbol for private plugin data on regular-table\nexport const PRIVATE_PLUGIN_SYMBOL: unique symbol = Symbol(\n \"Perspective Column Config\",\n);\n\n// Data listener function type\nexport type DataListener = (\n regularTable: RegularTableElement,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse>;\n\n// Style listener function type\nexport type StyleListener = () => void;\n\n// Perspective viewer element interface (subset)\nexport interface PerspectiveViewerElement extends HTMLElement {\n getView(): Promise<View>;\n getTable(): Promise<Table>;\n getEditPort(): Promise<number>;\n restore(config: Partial<ViewConfig>): Promise<void>;\n toggleColumnSettings(columnName?: string): Promise<void>;\n hasAttribute(name: string): boolean;\n setSelection(viewport?: ViewWindow): void;\n dispatchEvent(event: Event): boolean;\n children: HTMLCollectionOf<HTMLElement>;\n}\n\n// Toolbar element interface\nexport interface DatagridToolbarElement extends HTMLElement {\n setEditButton(button: HTMLElement): void;\n setScrollLockButton(button: HTMLElement): void;\n}\n\n// Column override for persisting column sizes\nexport type ColumnOverrides = Record<string, number | undefined>;\n\n// Formatter cache types\nexport interface FormatterCacheEntry {\n format(value: unknown): string;\n}\n\nexport type FormatterCache = Map<string, FormatterCacheEntry>;\n\n// Cell config result from getCellConfig\nexport interface CellConfigResult {\n row: Record<string, unknown>;\n column_names: string[];\n config: Partial<ViewConfig>;\n}\n\n// Custom event detail types\nexport interface PerspectiveClickDetail {\n row: Record<string, unknown>;\n column_names: string[];\n config: Partial<ViewConfig>;\n}\n\nexport interface PerspectiveSelectDetail {\n selected: boolean;\n row: Record<string, unknown>;\n column_names?: string[];\n config: Partial<ViewConfig>;\n}\n\n// Mouse event with handled flag\nexport interface HandledMouseEvent extends MouseEvent {\n handled?: boolean;\n}\n\n// Sort order mappings\nexport type SortRotationOrder = Record<string, SortDir | undefined>;\n\n// Datagrid plugin element interface for toolbar\nexport interface DatagridPluginElement extends HTMLElement {\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n}\n\n// Map types for selected rows and positions\nexport type SelectedRowsMap = WeakMap<RegularTableElement, Set<number>>;\nexport type SelectedPositionMap = WeakMap<\n RegularTableElement,\n SelectedPosition\n>;\n", "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\n/**\n * Format a single cell of the `group_by` tree header.\n */\nexport function* format_tree_header(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<unknown[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n for (const path of paths) {\n const new_path: unknown[] = [\"\"];\n for (const idx in path) {\n new_path.push(\n format_cell.call(\n this,\n row_headers[idx],\n path[idx],\n plugins,\n true,\n ),\n );\n }\n\n yield path;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../types.js\";\nimport { format_cell } from \"./format_cell.js\";\nimport {\n format_tree_header,\n format_tree_header_row_path,\n} from \"./format_tree_header.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n RegularTable,\n Schema,\n} from \"../types.js\";\nimport type { CellScalar, DataResponse } from \"regular-table/dist/esm/types.js\";\nimport { ViewWindow } from \"@perspective-dev/client\";\n\ninterface ColumnData {\n __ROW_PATH__?: unknown[][];\n __ID__?: unknown[][];\n [key: string]: unknown[] | undefined;\n}\n\n/**\n * Creates a new DataListener, suitable for passing to `regular-table`'s\n * `.setDataListener()` method. This should be called as a method on the\n * plugin.\n *\n * @returns A data listener for the plugin.\n */\nexport function createDataListener(\n viewer: PerspectiveViewerElement,\n): (\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse> {\n let last_meta: unknown[][] | undefined;\n let last_column_paths: string[] | undefined;\n let last_ids: unknown[][] | undefined;\n let last_reverse_ids: Map<string, number> | undefined;\n let last_reverse_columns: Map<string, number> | undefined;\n\n return async function dataListener(\n this: DatagridModel,\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n ): Promise<DataResponse> {\n let columns: ColumnData = {};\n const new_window: ViewWindow = {\n start_row: y0,\n start_col: x0,\n end_row: y1,\n end_col: x1,\n id: true,\n };\n\n let num_columns: number | null = null;\n\n if (x1 - x0 > 0 && y1 - y0 > 0) {\n this._is_old_viewport =\n this._last_window?.start_row === y0 &&\n this._last_window?.end_row === y1 &&\n this._last_window?.start_col === x0 &&\n this._last_window?.end_col === x1;\n\n const [x, z] = await Promise.all([\n this._view.to_columns_string(new_window as any),\n this._view.num_columns(),\n ]);\n\n num_columns = z;\n columns = JSON.parse(x as string) as ColumnData;\n const y = Object.keys(columns);\n const new_col_paths = y.filter(\n (x) => x !== \"__ROW_PATH__\" && x !== \"__ID__\",\n );\n\n let changed_cols = false;\n for (let i = 0; i < new_col_paths.length; i++) {\n if (\n this._column_paths[new_window.start_col! + i] !==\n new_col_paths[i]\n ) {\n changed_cols = true;\n this._column_paths[new_window.start_col! + i] =\n new_col_paths[i];\n }\n }\n\n if (changed_cols) {\n const [a, b] = await Promise.all([\n this._view.schema(),\n this._view.expression_schema(),\n ]);\n\n this._schema = { ...(a as Schema), ...(b as Schema) };\n for (let i = 0; i < new_col_paths.length; i++) {\n const column_path_parts = new_col_paths[i].split(\"|\");\n const column =\n column_path_parts[this._config.split_by.length];\n\n this._is_editable[i + new_window.start_col!] =\n !!this._table_schema[column];\n\n this._column_types[i + new_window.start_col!] =\n this._schema[column];\n }\n }\n\n this._last_window = new_window;\n this._ids =\n columns.__ID__ ||\n Array(y1 - y0)\n .fill(null)\n .map((_, index) => [index + y0]);\n\n this._reverse_columns = this._column_paths\n .slice(x0, x1)\n .reduce((acc, x, i) => {\n acc.set(x, i);\n return acc;\n }, new Map<string, number>());\n\n this._reverse_ids = this._ids?.reduce((acc, x, i) => {\n acc.set(x?.join(\"|\"), i);\n return acc;\n }, new Map<string, number>());\n } else {\n this._div_factory.clear();\n num_columns = await this._view.num_columns();\n }\n\n const data: (string | HTMLElement)[][] = [];\n const metadata: unknown[][] = [];\n const column_headers: string[][] = [];\n const column_paths: string[] = [];\n\n const is_settings_open = viewer.hasAttribute(\"settings\");\n for (\n let ipath = x0;\n ipath < Math.min(x1, this._column_paths.length);\n ++ipath\n ) {\n const path = this._column_paths[ipath];\n const path_parts = path.split(\"|\");\n const column = columns[path] || new Array(y1 - y0).fill(null);\n const agg_depth = Math.min(\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL]?.[\n path_parts[this._config.split_by.length]\n ]?.aggregate_depth || 0,\n this._config.group_by.length,\n );\n\n data.push(\n column.map((x, i) => {\n if ((columns?.__ROW_PATH__?.[i]?.length ?? 0) < agg_depth) {\n return \"\";\n } else {\n return format_cell.call(\n this,\n path_parts[this._config.split_by.length],\n x,\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {},\n ) as string | HTMLElement;\n }\n }),\n );\n\n metadata.push(column as unknown[]);\n if (is_settings_open) {\n path_parts.push(\"\");\n }\n\n column_headers.push(path_parts);\n column_paths.push(path);\n }\n\n // Only update the last state if this is not a \"phantom\" call.\n if (x1 - x0 > 0 && y1 - y0 > 0) {\n this.last_column_paths = last_column_paths;\n this.last_meta = last_meta;\n this.last_ids = last_ids;\n this.last_reverse_ids = last_reverse_ids;\n this.last_reverse_columns = last_reverse_columns;\n\n last_column_paths = column_paths;\n last_meta = metadata;\n last_ids = this._ids;\n last_reverse_ids = this._reverse_ids;\n last_reverse_columns = this._reverse_columns;\n }\n\n const is_row_path = columns.__ROW_PATH__ !== undefined;\n const row_headers = Array.from(\n (is_row_path\n ? format_tree_header_row_path\n : format_tree_header\n ).call(\n this,\n columns.__ROW_PATH__,\n this._config.group_by,\n regularTable,\n ),\n ) as (string | HTMLElement)[][];\n\n const num_row_headers = row_headers[0]?.length;\n\n const result: DataResponse = {\n num_column_headers:\n this._config.split_by.length + (is_settings_open ? 2 : 1),\n num_row_headers,\n num_rows: this._num_rows,\n num_columns,\n row_headers: row_headers as CellScalar[][], // Add `HTMLElement`\n column_headers,\n data: data as CellScalar[][],\n metadata,\n column_header_merge_depth: Math.max(\n 0,\n this._config.split_by.length,\n ),\n };\n\n return result;\n };\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport type { ColorRecord } from \"./types.js\";\n\nexport function blend(a: string, b: number[]): string {\n return chroma.mix(a, `rgb(${b[0]},${b[1]},${b[2]})`, 0.5).hex();\n}\n\n// AFAICT `chroma-js` has no alpha-aware blending? So we need a function to get\n// the color of a heatmap cell over the background.\nexport function rgbaToRgb(\n [r, g, b, a]: [number, number, number, number],\n source: [number, number, number] = [255, 255, 255],\n): [number, number, number] {\n function f(i: number, c: number): number {\n return ((1 - a) * (source[i] / 255) + a * (c / 255)) * 255;\n }\n\n return [f(0, r), f(1, g), f(2, b)];\n}\n\n// Chroma does this but why bother?\nexport function infer_foreground_from_background([r, g, b]: [\n number,\n number,\n number,\n]): string {\n // TODO Implement dark/light themes.\n return Math.sqrt(r * r * 0.299 + g * g * 0.587 + b * b * 0.114) > 130\n ? \"#161616\"\n : \"#ffffff\";\n}\n\nfunction make_gradient(chromahex: chroma.Color): string {\n const [r, g, b] = chromahex.rgb();\n const [r1, g1, b1] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") - 15) % 360)\n .rgb();\n const [r2, g2, b2] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") + 15) % 360)\n .rgb();\n return `linear-gradient(to right top,rgb(${r1},${g1},${b1}),rgb(${r},${g},${b}) 50%,rgb(${r2},${g2},${b2}))`;\n}\n\nexport function make_color_record(color: string): ColorRecord {\n const chroma_neg = chroma(color);\n const _neg_grad = make_gradient(chroma_neg);\n const rgb = chroma_neg.rgb();\n\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 type {\n DatagridModel,\n DatagridPluginElement,\n RegularTable,\n Schema,\n CellMeta,\n ElemFactory,\n EditMode,\n PerspectiveViewerElement,\n} from \"../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\nfunction get_psp_type(this: DatagridModel, metadata: CellMeta): ColumnType {\n if (metadata.x !== undefined && metadata.x >= 0) {\n return this._column_types[metadata.x];\n } else {\n return this._row_header_types[metadata.row_header_x! - 1];\n }\n}\n\nexport async function createModel(\n this: DatagridPluginElement,\n regular: RegularTable,\n table: Table,\n view: View,\n extend: Partial<DatagridModel> = {},\n): Promise<DatagridModel> {\n const config = (await view.get_config()) as ViewConfig;\n if (this?.model?._config) {\n const old = this.model._config;\n let group_by_changed = old.group_by.length !== config.group_by.length;\n const type_changed =\n (old.group_by.length === 0 || config.group_by.length === 0) &&\n group_by_changed;\n\n if (!group_by_changed) {\n for (const lvl in old.group_by) {\n group_by_changed ||= config.group_by[lvl] !== old.group_by[lvl];\n }\n }\n\n let split_by_changed = old.split_by.length !== config.split_by.length;\n if (split_by_changed) {\n for (const lvl in old.split_by) {\n split_by_changed ||= config.split_by[lvl] !== old.split_by[lvl];\n }\n }\n\n let columns_changed = old.columns.length !== config.columns.length;\n if (columns_changed) {\n for (const lvl in old.columns) {\n columns_changed ||= config.columns[lvl] !== old.columns[lvl];\n }\n }\n\n let filter_changed = old.filter.length !== config.filter.length;\n if (filter_changed) {\n for (const lvl in old.filter) {\n for (const i in config.filter[lvl]) {\n filter_changed ||=\n config.filter[lvl][i as unknown as number] !==\n old.filter[lvl][i as unknown as number];\n }\n }\n }\n\n let sort_changed = old.sort.length !== config.sort.length;\n if (sort_changed) {\n for (const lvl in old.sort) {\n for (const i in config.sort[lvl]) {\n sort_changed ||=\n config.sort[lvl][i as unknown as number] !==\n old.sort[lvl][i as unknown as number];\n }\n }\n }\n\n this._reset_scroll_top = group_by_changed;\n this._reset_scroll_left = split_by_changed;\n this._reset_select =\n group_by_changed ||\n split_by_changed ||\n filter_changed ||\n sort_changed ||\n columns_changed;\n\n this._reset_column_size =\n split_by_changed ||\n group_by_changed ||\n columns_changed ||\n type_changed;\n }\n\n const [table_schema, num_rows, schema, expression_schema, _edit_port] =\n await Promise.all([\n table.schema(),\n view.num_rows(),\n view.schema(),\n view.expression_schema(),\n (this.parentElement as PerspectiveViewerElement).getEditPort(),\n ]);\n\n const _plugin_background = chroma(\n get_rule(regular, \"--plugin--background\", \"#FFFFFF\"),\n ).rgb();\n\n const _pos_fg_color = make_color_record(\n get_rule(regular, \"--rt-pos-cell--color\", \"#338DCD\"),\n );\n\n const _neg_fg_color = make_color_record(\n get_rule(regular, \"--rt-neg-cell--color\", \"#FF5942\"),\n );\n\n const _pos_bg_color = make_color_record(\n blend(_pos_fg_color[0], _plugin_background),\n );\n\n const _neg_bg_color = make_color_record(\n blend(_neg_fg_color[0], _plugin_background),\n );\n\n const _color = make_color_record(\n get_rule(regular, \"--active--color\", \"#ff0000\"),\n );\n\n const _schema: Schema = {\n ...(schema as Schema),\n ...(expression_schema as Schema),\n };\n const _table_schema: Schema = {\n ...(table_schema as Schema),\n ...(expression_schema as Schema),\n };\n\n const _column_paths: string[] = [];\n const _is_editable: boolean[] = [];\n const _column_types: ColumnType[] = [];\n\n const _edit_mode: EditMode = this._edit_mode || \"READ_ONLY\";\n this._edit_button!.dataset.editMode = _edit_mode;\n\n const model: DatagridModel = Object.assign(extend, {\n _edit_port,\n _view: view,\n _table: table,\n _table_schema,\n _config: config,\n _num_rows: num_rows,\n _schema,\n _ids: [],\n _plugin_background,\n _color,\n _pos_fg_color,\n _neg_fg_color,\n _pos_bg_color,\n _neg_bg_color,\n _column_paths,\n _column_types,\n _is_editable,\n _edit_mode,\n _selection_state: {\n selected_areas: [],\n dirty: false,\n },\n _row_header_types: config.group_by.map((column_path) => {\n return _table_schema[column_path];\n }),\n _series_color_map: new Map<string, string>(),\n _series_color_seed: new Map<string, number>(),\n get_psp_type,\n _div_factory: extend._div_factory || new ElemFactoryImpl(\"div\"),\n }) as DatagridModel;\n\n regular.setDataListener(\n createDataListener(this.parentElement as PerspectiveViewerElement).bind(\n model,\n regular,\n ) as any,\n {\n virtual_mode: (window\n .getComputedStyle(regular)\n .getPropertyValue(\"--datagrid-virtual-mode\")\n ?.trim() || \"both\") as\n | \"both\"\n | \"horizontal\"\n | \"vertical\"\n | \"none\",\n },\n );\n\n return model;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport 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 type { DatagridModel, PerspectiveViewerElement } from \"../types.js\";\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply selected column styling in response to column settings toggle events.\n * This is called directly (not as a style listener) when the user opens/closes\n * the column settings panel.\n */\nexport function style_selected_column(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selectedColumn: string | undefined,\n): void {\n const group_header_trs = Array.from(\n regularTable.children[0].children[0].children,\n ) as HTMLTableRowElement[];\n\n const len = group_header_trs.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n if (len <= 1) {\n group_header_trs[0]?.removeAttribute(\"id\");\n } else {\n group_header_trs.forEach((tr, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? tr.setAttribute(\"id\", id) : tr.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n if (settings_open && len >= 2) {\n const titles = Array.from(\n group_header_trs[len - 2].children,\n ) as HTMLElement[];\n const editBtns = Array.from(\n group_header_trs[len - 1].children,\n ) as HTMLElement[];\n if (titles && editBtns) {\n group_header_trs.slice(0, len - 2).forEach((tr) => {\n Array.from(tr.children).forEach((th) => {\n th.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titles.length; i++) {\n const title = titles[i];\n const editBtn = editBtns[i];\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n if (this._config.columns.length > 1) {\n for (const r of regularTable.querySelectorAll(\"td\")) {\n const meta = regularTable.getMeta(r);\n if (!meta?.column_header) continue;\n const isOpen =\n meta.column_header[\n meta.column_header.length - 2\n ] === selectedColumn;\n r.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n }\n }\n }\n}\n\n/**\n * Style a single column header row.\n */\nexport function styleColumnHeaderRow(\n this: DatagridModel,\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n): void {\n const header_depth = this._config.group_by.length;\n const selectedColumn = this._column_settings_selected_column;\n\n for (const { element: td, metadata } of headerRow.cells) {\n if (!metadata) continue;\n\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n const sort = this._config.sort.find((x) => x[0] === column_name);\n let needs_border = metadata.row_header_x === header_depth;\n const is_corner = typeof metadata.x === \"undefined\";\n needs_border =\n needs_border ||\n (metadata.x !== undefined &&\n (metadata.x + 1) % this._config.columns.length === 0);\n\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\"psp-header-group\", false);\n td.classList.toggle(\"psp-header-leaf\", true);\n td.classList.toggle(\"psp-is-top\", false);\n td.classList.toggle(\"psp-header-corner\", is_corner);\n td.classList.toggle(\n \"psp-header-sort-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc abs\",\n );\n\n const type = this.get_psp_type(metadata);\n const is_numeric = type === \"integer\" || type === \"float\";\n const is_string = type === \"string\";\n const is_date = type === \"date\";\n const is_datetime = type === \"datetime\";\n\n td.classList.toggle(\"psp-align-right\", is_numeric);\n td.classList.toggle(\"psp-align-left\", !is_numeric);\n td.classList.toggle(\n \"psp-menu-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length + 1,\n );\n td.classList.toggle(\n \"psp-sort-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length,\n );\n td.classList.toggle(\n \"psp-is-width-override\",\n regularTable.saveColumnSizes()[metadata.size_key!] !== undefined,\n );\n\n // Apply menu-open for selected column\n if (this._config.columns.length > 1 && selectedColumn) {\n const isOpen =\n metadata.column_header?.[metadata.column_header.length - 2] ===\n selectedColumn;\n td.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SortRotationOrder,\n SortTerm,\n} from \"../types.js\";\nimport { SortDir } from \"@perspective-dev/client\";\n\nconst ROW_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: undefined,\n \"desc abs\": \"asc abs\",\n \"asc abs\": undefined,\n};\n\nconst ROW_COL_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: \"col desc\",\n \"desc abs\": \"asc abs\",\n \"asc abs\": \"col desc abs\",\n \"col desc\": \"col asc\",\n \"col asc\": undefined,\n \"col desc abs\": \"col asc abs\",\n \"col asc abs\": undefined,\n};\n\nexport async function sortHandler(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n target: HTMLElement,\n): Promise<void> {\n const meta = regularTable.getMeta(target);\n if (!meta?.column_header) return;\n const column_name = meta.column_header[this._config.split_by.length];\n const sort_method =\n event.ctrlKey ||\n (event as MouseEvent & { metaKet?: boolean }).metaKet ||\n event.altKey\n ? append_sort\n : override_sort;\n\n const abs = event.shiftKey;\n const sort = sort_method.call(this, column_name, abs);\n await viewer.restore({ sort });\n}\n\nexport function append_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n const sort: SortTerm[] = [];\n let found = false;\n for (const sort_term of this._config.sort) {\n const [_column_name, _sort_dir] = sort_term;\n if (_column_name === column_name) {\n found = true;\n const term = create_sort.call(this, column_name, _sort_dir, abs);\n if (term) {\n sort.push(term);\n }\n } else {\n sort.push(sort_term);\n }\n }\n\n if (!found) {\n sort.push([column_name, abs ? \"desc abs\" : \"desc\"]);\n }\n\n return sort;\n}\n\nexport function override_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n for (const [_column_name, _sort_dir] of this._config.sort) {\n if (_column_name === column_name) {\n const sort = create_sort.call(this, column_name, _sort_dir, abs);\n return sort ? [sort] : [];\n }\n }\n return [[column_name, abs ? \"desc abs\" : \"desc\"]];\n}\n\nexport function create_sort(\n this: DatagridModel,\n column_name: string,\n sort_dir: SortDir | undefined,\n _abs: boolean,\n): SortTerm | undefined {\n const is_col_sortable = this._config.split_by.length > 0;\n const order = is_col_sortable ? ROW_COL_SORT_ORDER : ROW_SORT_ORDER;\n const inc_sort_dir: SortDir | undefined = sort_dir\n ? order[sort_dir]\n : \"desc\";\n if (inc_sort_dir) {\n return [column_name, inc_sort_dir];\n }\n return undefined;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { RegularTable, DatagridModel } from \"../types.js\";\n\nexport async function expandCollapseHandler(\n this: DatagridModel,\n regularTable: RegularTable,\n event: MouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as Element);\n if (!meta?.row_header) return;\n\n const is_collapse = (event.target as Element).classList.contains(\n \"psp-tree-label-collapse\",\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 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 type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\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);\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 Element);\n if (typeof meta?.x !== \"undefined\") {\n const is_editable2 = this._is_editable[meta.x];\n const is_bool = this.get_psp_type(meta) === \"boolean\";\n const is_null = (event.target as Element).classList.contains(\n \"psp-null\",\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\";\n\nimport {\n CollectedCell,\n LocalSelectedPositionMap,\n CellMetaExtended,\n} 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.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\n | CellMetaExtended\n | undefined;\n if (\n metadata &&\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) 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 !== undefined && 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) {\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 let column_filters: Filter[] = [];\n if (column_paths) {\n const split_by_values = column_paths.split(\"|\");\n result.column_names = [split_by_values[split_by.length]];\n column_filters = split_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = split_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined)\n .filter(([, , value]) => value !== \"__ROW_PATH__\");\n }\n\n const filter = _config.filter.concat(row_filters).concat(column_filters);\n result.config = { filter };\n return result;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport getCellConfig from \"../get_cell_config.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n HandledMouseEvent,\n PerspectiveSelectDetail,\n} from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTable, unknown[]>;\n\nexport async function selectionListener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n event: HandledMouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as Element);\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 event.stopImmediatePropagation();\n\n if (!meta) {\n return;\n }\n\n const id = this._ids?.[meta.y - meta.y0];\n if (meta && meta.y >= 0) {\n const selected = selected_rows_map.get(regularTable);\n const key_match =\n !!selected &&\n selected.reduce<boolean>((agg, x, i) => agg && x === id[i], true);\n\n const is_deselect =\n !!selected && id.length === selected.length && key_match;\n\n let detail: PerspectiveSelectDetail = {\n selected: !is_deselect,\n row: {},\n config: { filter: [] },\n };\n const { row, column_names, config } = await getCellConfig(\n this,\n meta.y,\n meta.x,\n );\n\n if (is_deselect) {\n selected_rows_map.delete(regularTable);\n detail = {\n ...detail,\n row,\n config: { filter: structuredClone(this._config.filter) },\n };\n } else {\n selected_rows_map.set(regularTable, id);\n detail = { ...detail, row, column_names, config };\n }\n\n await regularTable.draw({ preserve_width: true });\n event.handled = true;\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveSelectDetail>(\"perspective-select\", {\n bubbles: true,\n composed: true,\n detail,\n }),\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { PerspectiveViewerElement } from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTableElement, unknown[]>;\n\nexport async function deselect_all_listener(\n regularTable: RegularTableElement,\n _viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n): Promise<void> {\n selected_rows_map.delete(regularTable);\n for (const td of regularTable.querySelectorAll(\"td,th\")) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport getCellConfig from \"../get_cell_config.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n PerspectiveClickDetail,\n} from \"../types.js\";\n\nexport async function dispatch_click_listener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n const meta = table.getMeta(event.target as Element);\n if (!meta) return;\n const { x, y } = meta;\n\n const { row, column_names, config } = await getCellConfig(this, y, x);\n\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 Element);\n if (meta && meta.x !== undefined && meta.y !== undefined) {\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 Element);\n if (meta && meta.x !== undefined && meta.y !== undefined) {\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 Element);\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 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.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);\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 ) {\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);\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 ) {\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);\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 ) {\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 (header_depth > 0 && metadata.row_header_x === header_depth) ||\n (metadata.x ?? -1) >= 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 typeof metadata.x === \"undefined\",\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 { CellMetadata } 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: CellMetadata,\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\ninterface CellMetaWithFlags extends CellMetadata {\n _is_hidden_by_aggregate_depth?: boolean;\n}\n\nexport function cell_style_datetime(\n this: DatagridModel,\n plugin: ColumnConfig,\n td: HTMLElement,\n metadata: CellMetaWithFlags,\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 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\ninterface CellMetaWithFlags extends CellMetadata {\n _is_hidden_by_aggregate_depth?: boolean;\n}\n\nexport function cell_style_boolean(\n this: DatagridModel,\n _plugin: ColumnConfig | undefined,\n td: HTMLElement,\n metadata: CellMetaWithFlags,\n): void {\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 { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel } from \"../../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\ninterface NextMeta {\n row_header?: unknown[];\n}\n\nexport function cell_style_row_header(\n this: DatagridModel,\n regularTable: RegularTableElement,\n td: HTMLElement,\n metadata: CellMetadata,\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 unknown as Element) as NextMeta | undefined;\n const is_collapse =\n next &&\n next.row_header &&\n typeof next.row_header[(metadata.row_header_x ?? 0) + 1] !==\n \"undefined\";\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 type {\n DatagridModel,\n PerspectiveViewerElement,\n ColumnsConfig,\n DatagridPluginElement,\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 CellMetaExtended,\n} from \"./types.js\";\nimport { ColumnType } from \"@perspective-dev/client\";\n\nfunction get_psp_type(\n model: DatagridModel,\n metadata: CellMetaExtended,\n): ColumnType {\n if (metadata.x !== undefined && metadata.x >= 0) {\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/**\n * Apply styles to all body cells in a single pass.\n */\nexport function applyBodyCellStyles(\n this: DatagridModel,\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n): void {\n const hasSelected = selectedRowsMap.has(regularTable);\n const selected = selectedRowsMap.get(regularTable);\n\n for (const { element: td, metadata, isHeader } of cells) {\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n const type = get_psp_type(this, metadata);\n const plugin = column_name\n ? plugins[column_name.toString()]\n : undefined;\n const is_numeric = type === \"integer\" || type === \"float\";\n\n // Calculate aggregate depth visibility\n 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 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.row_header_x === undefined ||\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 td.dataset.x = String(metadata.x);\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.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.x !== undefined) {\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 { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport { ColumnType } from \"@perspective-dev/client\";\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\";\n\ninterface CellMetaExtended extends CellMetadata {\n _is_hidden_by_aggregate_depth?: boolean;\n}\n\ninterface CollectedCell {\n element: HTMLElement;\n metadata: CellMetaExtended;\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(cell) as\n | CellMetaExtended\n | 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(cell) as\n | CellMetadata\n | undefined;\n\n rowData.cells.push({\n element: cell as HTMLTableCellElement,\n metadata,\n });\n }\n groupHeaderRows.push(rowData);\n }\n }\n\n this._applyBodyCellStyles(\n bodyCells,\n plugins,\n isSettingsOpen,\n isSelectable,\n isEditable,\n regularTable,\n selectedRowsMap,\n selectedPositionMap,\n viewer,\n );\n\n this._applyGroupHeaderStyles(groupHeaderRows, regularTable);\n this._applyColumnHeaderStyles(groupHeaderRows, regularTable, viewer);\n this._applyFocusStyle(bodyCells, regularTable, selectedPositionMap);\n };\n}\n\ndeclare module \"../types.js\" {\n interface DatagridModel {\n _applyBodyCellStyles(\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyGroupHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n ): void;\n _applyColumnHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyFocusStyle(\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n ): void;\n _styleColumnHeaderRow(\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n ): void;\n }\n}\n\n/**\n * Install the styling methods on the DatagridModel prototype.\n * This should be called once during module initialization.\n */\nexport function installConsolidatedStyleMethods(modelPrototype: any): void {\n modelPrototype._applyBodyCellStyles = applyBodyCellStyles;\n modelPrototype._applyGroupHeaderStyles = applyGroupHeaderStyles;\n modelPrototype._applyColumnHeaderStyles = applyColumnHeaderStyles;\n modelPrototype._applyFocusStyle = applyFocusStyle;\n modelPrototype._styleColumnHeaderRow = styleColumnHeaderRow;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_selected_column } from \"../style_handlers/column_header.js\";\nimport {\n click_listener,\n mousedown_listener,\n} from \"../event_handlers/header_click.js\";\n\nimport { focusinListener, focusoutListener } from \"../event_handlers/focus.js\";\nimport { keydownListener, clickListener } from \"../event_handlers/click.js\";\n\nimport { selectionListener } from \"../event_handlers/row_select_click.js\";\nimport { deselect_all_listener } from \"../event_handlers/deselect_all.js\";\n\nimport { createModel } from \"../model/create.js\";\nimport { dispatch_click_listener } from \"../event_handlers/dispatch_click.js\";\n\nimport { addAreaMouseSelection } from \"../event_handlers/select_region.js\";\n\nimport {\n createConsolidatedStyleListener,\n installConsolidatedStyleMethods,\n} from \"../style_handlers/consolidated.js\";\n\nimport type { View } from \"@perspective-dev/client\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport type { RegularTableElement } from \"regular-table\";\n\ninterface ToggleColumnSettingsEvent extends CustomEvent {\n detail: {\n column_name: string | null;\n open: boolean;\n };\n}\n\n/**\n * Lazy initialize this plugin with various listeners.\n */\nexport async function activate(\n this: DatagridPluginElement,\n view: View,\n): Promise<void> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const table = await viewer.getTable();\n\n if (!this._initialized) {\n this.innerHTML = \"\";\n if (this.shadowRoot) {\n this.shadowRoot.appendChild(this.regular_table);\n } else {\n this.appendChild(this.regular_table);\n }\n\n this.model = await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n );\n\n if (!this.model) {\n return;\n }\n\n addAreaMouseSelection(this, this.regular_table, {\n className: \"psp-select-region\",\n });\n\n // Create shared state maps for selection and focus tracking\n const selected_rows_map = new WeakMap<\n RegularTableElement,\n Set<number>\n >();\n const selected_position_map = new WeakMap<\n RegularTableElement,\n SelectedPosition\n >();\n\n // Install consolidated style methods on model prototype\n installConsolidatedStyleMethods(this.model);\n\n // Single consolidated style listener replaces:\n // - table_cell_style_listener\n // - group_header_style_listener\n // - column_header_style_listener\n // - selectionStyleListener\n // - editable_style_listener\n // - focus_style_listener\n this.regular_table.addStyleListener(\n createConsolidatedStyleListener(\n this,\n selected_rows_map as any,\n selected_position_map as any,\n ).bind(this.model, this.regular_table, viewer),\n );\n\n // uh ..\n this.regular_table.addEventListener(\n \"click\",\n click_listener.bind(\n this.model,\n this.regular_table,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"mousedown\",\n selectionListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"psp-deselect-all\",\n deselect_all_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n // User event click\n this.regular_table.addEventListener(\n \"click\",\n dispatch_click_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // tree collapse, expand, edit button headers\n this.regular_table.addEventListener(\n \"mousedown\",\n mousedown_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // Editing event handlers (style handling is now in consolidated listener)\n // TODO relies on this.model._is_editable\n this.regular_table.addEventListener(\n \"click\",\n clickListener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusin\",\n focusinListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusout\",\n focusoutListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"keydown\",\n keydownListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n // viewer event listeners\n viewer.addEventListener(\n \"perspective-toggle-column-settings\",\n (event: Event) => {\n const toggleEvent = event as ToggleColumnSettingsEvent;\n if (this.isConnected) {\n style_selected_column.call(\n this.model!,\n this.regular_table,\n viewer,\n toggleEvent.detail.column_name ?? undefined,\n );\n if (!toggleEvent.detail.open) {\n this.model!._column_settings_selected_column =\n undefined;\n return;\n }\n\n this.model!._column_settings_selected_column =\n toggleEvent.detail.column_name ?? undefined;\n }\n },\n );\n\n this._initialized = true;\n } else {\n await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n this.model,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { restore_column_size_overrides } from \"../model/column_overrides.js\";\nimport {\n EDIT_MODES,\n toggle_edit_mode,\n toggle_scroll_lock,\n} from \"../model/toolbar.js\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { make_color_record } from \"../color_utils.js\";\nimport type {\n DatagridPluginElement,\n ColumnOverrides,\n EditMode,\n ColumnsConfig,\n ColorRecord,\n} from \"../types.js\";\n\ninterface RestoreToken {\n columns?: Record<string, { column_size_override?: number }>;\n edit_mode?: EditMode;\n scroll_lock?: boolean;\n}\n\n// interface ColumnConfigWithColors {\n// pos_fg_color?: string;\n// neg_fg_color?: string;\n// pos_bg_color?: string;\n// neg_bg_color?: string;\n// color?: string;\n// [key: string]: unknown;\n// }\n\ninterface StylesConfig {\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n color?: ColorRecord;\n [key: string]: unknown;\n}\n\nexport function restore(\n this: DatagridPluginElement,\n token: RestoreToken,\n columns: ColumnsConfig,\n): void {\n token = JSON.parse(JSON.stringify(token));\n columns = JSON.parse(JSON.stringify(columns));\n const overrides: ColumnOverrides = {};\n\n if (token.columns) {\n for (const [col, value] of Object.entries(token.columns)) {\n if (value.column_size_override !== undefined) {\n overrides[col] = value.column_size_override;\n delete value[\"column_size_override\"];\n }\n }\n }\n\n const styles: Record<string, StylesConfig> = {};\n if (columns) {\n for (const [col_name, controls] of Object.entries(columns)) {\n styles[col_name] = {\n ...controls,\n pos_fg_color: controls.pos_fg_color\n ? make_color_record(controls.pos_fg_color)\n : undefined,\n neg_fg_color: controls.neg_fg_color\n ? make_color_record(controls.neg_fg_color)\n : undefined,\n pos_bg_color: controls.pos_bg_color\n ? make_color_record(controls.pos_bg_color)\n : undefined,\n neg_bg_color: controls.neg_bg_color\n ? make_color_record(controls.neg_bg_color)\n : undefined,\n color: controls.color\n ? make_color_record(controls.color)\n : undefined,\n };\n }\n }\n\n if (\"edit_mode\" in token && token.edit_mode) {\n if (EDIT_MODES.indexOf(token.edit_mode) !== -1) {\n toggle_edit_mode.call(this, token.edit_mode);\n } else {\n console.error(\"Unknown edit mode \" + token.edit_mode);\n }\n }\n\n if (\"scroll_lock\" in token) {\n toggle_scroll_lock.call(this, token.scroll_lock);\n }\n\n const datagrid = this.regular_table;\n restore_column_size_overrides.call(this, overrides, true);\n (datagrid as any)[PRIVATE_PLUGIN_SYMBOL] = styles as ColumnsConfig;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { save_column_size_overrides } from \"../model/column_overrides.js\";\nimport type {\n DatagridPluginElement,\n DatagridPluginConfig,\n EditMode,\n} from \"../types.js\";\n\nexport function save(\n this: DatagridPluginElement,\n): DatagridPluginConfig | Record<string, never> {\n if (this.regular_table) {\n const token: DatagridPluginConfig = {\n columns: {},\n scroll_lock: !!this._is_scroll_lock,\n edit_mode: this._edit_mode,\n };\n\n const column_size_overrides = save_column_size_overrides.call(this);\n\n for (const col of Object.keys(column_size_overrides || {})) {\n if (!token.columns?.[col]) {\n token.columns = token.columns || {};\n token.columns[col] = {};\n }\n\n token.columns[col].column_size_override =\n column_size_overrides[col];\n }\n\n return JSON.parse(JSON.stringify(token));\n }\n return {};\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n restore_column_size_overrides,\n save_column_size_overrides,\n} from \"../model/column_overrides.js\";\nimport type { View } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface DatagridPluginWithActivate extends DatagridPluginElement {\n activate(view: View): Promise<void>;\n}\n\nexport async function draw(\n this: DatagridPluginWithActivate,\n view: View,\n): Promise<void> {\n if (this.parentElement) {\n await this.activate(view);\n }\n\n if (!this.isConnected || this.offsetParent == null || !this.model) {\n return;\n }\n\n const old_sizes = save_column_size_overrides.call(this);\n const drawPromise = this.regular_table.draw({\n invalid_columns: true,\n } as any);\n if (this._reset_scroll_top) {\n this.regular_table.scrollTop = 0;\n this._reset_scroll_top = false;\n }\n\n if (this._reset_scroll_left) {\n this.regular_table.scrollLeft = 0;\n this._reset_scroll_left = false;\n }\n if (this._reset_select) {\n this.regular_table.dispatchEvent(\n new CustomEvent(\"psp-deselect-all\", { bubbles: false }),\n );\n this._reset_select = false;\n }\n\n if (this._reset_column_size) {\n this.regular_table.resetAutoSize();\n this._reset_column_size = false;\n }\n\n restore_column_size_overrides.call(this, old_sizes);\n await drawPromise;\n\n this._toolbar?.classList.toggle(\n \"aggregated\",\n this.model._config.group_by.length > 0 ||\n this.model._config.split_by.length > 0,\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { ColumnType } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface NumberStyleOpts {\n datagrid_number_style: {\n fg_gradient: number;\n pos_fg_color: string;\n neg_fg_color: string;\n number_fg_mode: string;\n bg_gradient: number;\n pos_bg_color: string;\n neg_bg_color: string;\n number_bg_mode: string;\n };\n number_string_format: boolean;\n}\n\ninterface DatetimeStyleOpts {\n datagrid_datetime_style?: {\n color: string;\n bg_color: string;\n };\n datagrid_string_style?: {\n color: string;\n bg_color: string;\n };\n}\n\nexport type ColumnStyleOpts = NumberStyleOpts | DatetimeStyleOpts | null;\n\nexport default function column_style_opts(\n this: DatagridPluginElement,\n type: ColumnType,\n _group: string,\n): ColumnStyleOpts {\n if (type === \"integer\" || type === \"float\") {\n return {\n datagrid_number_style: {\n fg_gradient: 0,\n pos_fg_color: this.model!._pos_fg_color[0],\n neg_fg_color: this.model!._neg_fg_color[0],\n number_fg_mode: \"color\",\n bg_gradient: 0,\n pos_bg_color: this.model!._pos_bg_color[0],\n neg_bg_color: this.model!._neg_bg_color[0],\n number_bg_mode: \"disabled\",\n },\n number_string_format: true,\n };\n } else if (type === \"date\" || type === \"datetime\" || type === \"string\") {\n const control =\n type === \"date\" || type === \"datetime\"\n ? \"datagrid_datetime_style\"\n : `datagrid_string_style`;\n return {\n [control]: {\n color: this.model!._color[0],\n bg_color: this.model!._color[0],\n },\n } as DatetimeStyleOpts;\n } else {\n return null;\n }\n}\n", "regular-table{padding:0;margin:12px 0 0 12px;font-family:inherit;--rt-hover--border-color:var(--inactive--color,#c5c9d080);}regular-table div[tabindex]{outline:none;}regular-table>div{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden;}regular-table th{text-align:center;}regular-table thead tr:not(.rt-autosize) th{overflow:hidden;max-width:0px;}regular-table thead tr:last-child .rt-float,regular-table tbody .rt-float{text-align:right;}regular-table thead .rt-integer,regular-table tbody .rt-integer{text-align:right;}regular-table tbody th{text-align:left;}regular-table span.rt-tree-container{display:flex;align-items:center;height:100%;}regular-table thead .rt-string,regular-table tbody .rt-string,regular-table thead .rt-date,regular-table tbody .rt-date,regular-table thead .rt-datetime,regular-table tbody .rt-datetime{text-align:left;}regular-table thead tr:last-child th{border-bottom:1px solid#8b868045;}regular-table tbody tr:first-child td,regular-table tbody tr:first-child th{border-top:1px solid transparent!important;}regular-table th{position:relative;}regular-table tr th span.rt-tree-group{margin-left:5px;margin-right:15px;border-left:1px solid#eee;height:100%;}regular-table td,regular-table th{white-space:nowrap;font-size:12px;padding-right:5px;padding-left:5px;padding-top:0px;padding-bottom:0px;height:19px;}regular-table table *{box-sizing:border-box;}regular-table table{position:absolute;color:#666;outline:none;}regular-table span.rt-row-header-icon{color:#aaa;padding-right:4px;font-family:var(--button--font-family);}regular-table span.rt-column-header-icon{font-size:10px;padding-left:3px;display:inline-block;width:10px;font-family:var(--button--font-family);}regular-table span.rt-row-header-icon:hover{color:#1a7da1;text-shadow:0px 0px 3px#1a7da1;}regular-table .rt-selected td{background-color:#eee;}regular-table .rt-cell-clip{overflow:hidden;text-overflow:ellipsis;}regular-table td span.rt-group-name,regular-table th span.rt-group-name{margin-right:-5px;padding-right:5px;padding-left:8px;flex:1;height:100%;}regular-table th span.rt-group-name{text-align:left;}regular-table td th span.rt-group-leaf,regular-table th span.rt-group-leaf{margin-left:16px;height:100%;}regular-table .rt-column-resize{height:100%;width:10px;position:absolute;top:0;right:0;cursor:col-resize;}regular-table a{color:var(--rt-pos-cell--color);}regular-table a:visited{color:var(--active--color);}regular-table td.psp-null:after,regular-table th.psp-null:after{content:var(--null--content,\"-\");}.psp-header-border:not(.psp-is-top):not(.psp-header-leaf){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-group{box-shadow:0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-is-top{box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045);}.psp-is-top.psp-header-group:not(.psp-header-group-corner){box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-header-border.psp-header-group:not(.psp-is-top):not(.psp-header-group-corner){box-shadow:1px 0px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}perspective-viewer[settings] tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer[settings]) tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-leaf.psp-header-border{box-shadow:5px -4px 0px -4px var(--inactive--border-color,#8b868045);}tr:only-child th{box-shadow:none!important;}regular-table tbody tr:hover th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover:after{border-color:var(--rt-hover--border-color,#c5c9d080)!important;box-shadow:0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover th.psp-tree-leaf.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr.psp-menu-open:hover:after{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:last-child:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover+tr th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td:not(.psp-row-selected):not(.psp-row-subselected){border-top-color:transparent;}regular-table tbody tr th:first-child:not(:empty),regular-table tbody tr th:first-child:empty+th:not(:empty),regular-table tbody tr th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr td:first-child{border-left-width:1px;border-left-color:transparent;}regular-table tbody tr th:last-child,regular-table tbody tr td:last-child{border-right-width:0px;border-right-color:transparent;}regular-table tbody tr:hover{color:inherit;}regular-table tbody tr:hover th:first-child:not(:empty),regular-table tbody tr:hover th:first-child:empty+th:not(:empty),regular-table tbody tr:hover th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr:hover td:first-child{border-left-color:var(--rt-hover--border-color,#c5c9d080)!important;}regular-table tbody tr:hover th:last-child,regular-table tbody tr:hover td:last-child{border-right-color:var(--rt-hover--border-color,#c5c9d080)!important;}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody td,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead th:not(.rt-group-corner){transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody{transform:translate(0,var(--regular-table--transform-y,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child th,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child th,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) var(--regular-table--clip-y,0),var(--regular-table--clip-x,0) 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr:last-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr:last-child:after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:not(:first-child):after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:not(:first-child):after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:hover:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:hover:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner){clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}regular-table{outline:none;}regular-table::-webkit-scrollbar,regular-table::-webkit-scrollbar-corner{background-color:transparent;height:12px;width:12px;}regular-table::-webkit-scrollbar-thumb{background-clip:content-box;background:var(--icon--color);border:5.5px solid var(--plugin--background);max-height:50%;max-width:50%;min-width:10%;min-height:10%;}perspective-viewer .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}perspective-viewer .psp-menu-enabled:hover,perspective-viewer tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}perspective-viewer tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}perspective-viewer td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}perspective-viewer tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}perspective-viewer tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}:host .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}:host .psp-menu-enabled:hover,:host tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}:host tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}:host td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}:host tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}:host tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}perspective-viewer regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer) regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}.psp-sort-enabled:hover{cursor:pointer;}.psp-row-selected,:hover .psp-row-selected,:hover th.psp-tree-leaf.psp-row-selected,:hover th.psp-tree-label.psp-row-selected{color:white!important;background-color:var(--selected-row--background-color,#ea7319)!important;border-color:var(--selected-row--background-color,#ea7319)!important;}.psp-row-selected.psp-tree-label:not(:hover):before{color:white;}.psp-row-subselected,:hover .psp-row-subselected,:hover th.psp-tree-leaf.psp-row-subselected,:hover th.psp-tree-label.psp-row-subselected{background:rgba(234,115,25,0.2)!important;}.psp-error{color:red;}td:focus{outline:#666;outline-style:dotted;outline-width:1px;}perspective-viewer.dragging regular-table{pointer-events:none;}:host-context(perspective-viewer.dragging) regular-table{pointer-events:none;}.psp-header-border:last-child{border-right-width:0px;}.psp-header-sort-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-desc-icon--mask-image);mask-image:var(--sort-desc-icon--mask-image);}.psp-header-sort-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-asc-icon--mask-image);mask-image:var(--sort-asc-icon--mask-image);}.psp-header-sort-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-desc-icon--mask-image);mask-image:var(--sort-col-desc-icon--mask-image);}.psp-header-sort-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-asc-icon--mask-image);mask-image:var(--sort-col-asc-icon--mask-image);}.psp-header-sort-abs-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-desc-icon--mask-image);mask-image:var(--sort-abs-desc-icon--mask-image);}.psp-header-sort-abs-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-asc-icon--mask-image);mask-image:var(--sort-abs-asc-icon--mask-image);}.psp-header-sort-abs-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-desc-icon--mask-image);mask-image:var(--sort-abs-col-desc-icon--mask-image);}.psp-header-sort-abs-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-asc-icon--mask-image);mask-image:var(--sort-abs-col-asc-icon--mask-image);}tbody th:last-of-type{border-right:1px solid var(--inactive--border-color,#8b868045);overflow:hidden;text-overflow:ellipsis;}tbody th:empty{background-image:linear-gradient(to right,transparent 9px,var(--inactive--border-color,#eee) 10px,transparent 11px);background-repeat:no-repeat;min-width:20px;max-width:20px;pointer-events:none;}.psp-tree-label{max-width:0px;min-width:0px;}.psp-tree-label:before{color:var(--icon--color);font-family:var(--button--font-family,inherit);padding-right:11px;}.psp-tree-label-expand:before{content:var(--tree-label-expand--content,\"+\");}.psp-tree-label-collapse:before{content:var(--tree-label-collapse--content,\"-\");}.psp-tree-label-expand,.psp-tree-label-collapse{cursor:pointer;}.psp-tree-label:hover:before{color:var(--active--color);text-shadow:0px 0px 5px var(--active--color);}.psp-tree-leaf{padding-left:24px;}.psp-align-right{text-align:right;}.psp-align-left{text-align:left;}.psp-positive:not(:focus){color:var(--rt-pos-cell--color);}.psp-negative:not(:focus){color:var(--rt-neg-cell--color);}regular-table table tbody td{min-width:52px!important;}.psp-is-width-override .rt-column-resize,.rt-column-resize:hover{border:1px dashed#999;border-bottom-width:0px;border-left-width:0px;}.boolean-editable{cursor:pointer;}regular-table table{user-select:none;color:inherit;border-collapse:separate;}regular-table table th{font-weight:400;}regular-table table td,regular-table table th{border-color:var(--inactive--border-color,#8b868045);height:23px;}regular-table table .psp-header-group{text-overflow:ellipsis;}regular-table table th.psp-header-leaf{border-bottom-width:0px;}regular-table table th.psp-header-leaf span{height:23px;min-height:23px;}regular-table table td,regular-table table th.psp-tree-label,regular-table table th.psp-tree-label,regular-table table th.psp-tree-leaf,regular-table table tbody tr:first-child th{border-style:solid;border-width:0px;border-top-width:1px;}regular-table table tbody th:empty{background-position:0px -10px;}regular-table table td.psp-select-region,regular-table table th.psp-select-region{background-color:var(--icon--color)!important;color:var(--plugin--background)!important;border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected){border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}:host-context(perspective-viewer[settings]) td.psp-select-region.psp-menu-open{box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}regular-table #psp-column-edit-buttons th:not(.rt-group-corner) span:not(.rt-column-resize):before{content:var(--datagrid-column-edit-button--content,\"Edit\");}perspective-viewer:not([settings]) regular-table #psp-column-edit-buttons:after{content:none;}:host-context(perspective-viewer:not([settings])) regular-table #psp-column-edit-buttons:after{content:none;}regular-table table thead tr:last-child:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-bottom:1px solid var(--inactive--border-color);}regular-table table tbody tr:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-top:1px solid transparent;}regular-table table tbody tr:not(:first-child):after{border-top:1px solid var(--inactive--border-color);}regular-table table tbody tr:hover:not(:first-child):after{border-top:1px solid var(--rt-hover--border-color);}regular-table table tbody tr:hover+tr:after{border-top:1px solid var(--rt-hover--border-color);}@keyframes pulse_pos{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_pos2{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_neg{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}@keyframes pulse_neg2{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { activate } from \"../plugin/activate.js\";\nimport { restore } from \"../plugin/restore.js\";\nimport { save } from \"../plugin/save.js\";\nimport { draw } from \"../plugin/draw.js\";\nimport column_style_controls, {\n ColumnStyleOpts,\n} from \"../plugin/column_style_controls.js\";\nimport datagridStyles from \"../../../dist/css/perspective-viewer-datagrid.css\";\nimport { format_raw } from \"../data_listener/format_cell.js\";\n\nimport type { View, ViewWindow } from \"@perspective-dev/client\";\nimport type { IPerspectiveViewerPlugin } from \"@perspective-dev/viewer\";\nimport type {\n DatagridModel,\n DatagridToolbarElement,\n EditMode,\n PerspectiveViewerElement,\n DatagridPluginConfig,\n ColumnsConfig,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\ntype RenderTarget = \"shadow\" | \"light\";\n\n/**\n * The custom element class for this plugin. The interface methods for this\n */\nexport class HTMLPerspectiveViewerDatagridPluginElement\n extends HTMLElement\n implements IPerspectiveViewerPlugin\n{\n private static _global_stylesheet_installed: boolean = false;\n private static _sheet: CSSStyleSheet | undefined;\n\n // Determines whether this datagrid renders in the light DOM. This will\n // break style encapsulation and may cause inconsistent behavior.\n static renderTarget: RenderTarget =\n window.CSS?.supports &&\n window.CSS?.supports(\"selector(:host-context(foo))\")\n ? \"shadow\"\n : \"light\";\n\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n\n constructor() {\n super();\n this.regular_table = document.createElement(\n \"regular-table\",\n ) as RegularTableElement;\n this.regular_table.part = \"regular-table\";\n this._is_scroll_lock = false;\n this._edit_mode = \"READ_ONLY\";\n const Elem = HTMLPerspectiveViewerDatagridPluginElement;\n if (!Elem._sheet) {\n Elem._sheet = new CSSStyleSheet();\n Elem._sheet.replaceSync(datagridStyles);\n }\n\n if (Elem.renderTarget === \"shadow\") {\n const shadow = this.attachShadow({ mode: \"open\" });\n shadow.adoptedStyleSheets.push(Elem._sheet);\n } else if (\n Elem.renderTarget === \"light\" &&\n !Elem._global_stylesheet_installed\n ) {\n Elem._global_stylesheet_installed = true;\n document.adoptedStyleSheets.push(Elem._sheet);\n }\n }\n\n connectedCallback(): void {\n if (!this._toolbar) {\n this._toolbar = document.createElement(\n \"perspective-viewer-datagrid-toolbar\",\n ) as DatagridToolbarElement;\n }\n\n const parent = this.parentElement;\n if (parent) {\n parent.appendChild(this._toolbar);\n }\n }\n\n disconnectedCallback(): void {\n this._toolbar?.parentElement?.removeChild?.(this._toolbar);\n }\n\n async activate(view: View): Promise<void> {\n return await activate.call(this, view);\n }\n\n get name(): string {\n return \"Datagrid\";\n }\n\n get category(): string {\n return \"Basic\";\n }\n\n get select_mode(): string {\n return \"toggle\";\n }\n\n get min_config_columns(): number | undefined {\n return undefined;\n }\n\n get config_column_names(): string[] {\n return [\"Columns\"];\n }\n\n /**\n * Give the Datagrid a higher priority so it is loaded\n * over the default charts by default.\n */\n get priority(): number {\n return 1;\n }\n\n can_render_column_styles(type: string, _group: string): boolean {\n return type !== \"boolean\";\n }\n\n column_style_controls(type: string, group: string): ColumnStyleOpts {\n return column_style_controls.call(this, type as any, group);\n }\n\n async draw(view: View): Promise<void> {\n return await draw.call(this, view);\n }\n\n async update(view: View): Promise<void> {\n if (this.model === undefined) {\n await this.draw(view);\n } else if (this.model._config.split_by?.length > 0) {\n const dimensions = await view.dimensions();\n this.model._num_rows = dimensions.num_view_rows;\n await this.regular_table.draw();\n } else {\n this.model._num_rows = await view.num_rows();\n await this.regular_table.draw();\n }\n }\n\n async render(viewport?: ViewWindow): Promise<string> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const view = await viewer.getView();\n const json = await view.to_columns(viewport as any);\n const cols = await view.column_paths(viewport as any);\n\n const nrows =\n viewport?.end_row !== undefined &&\n viewport?.end_row !== null &&\n viewport?.start_row !== undefined &&\n viewport?.start_row !== null\n ? viewport.end_row - viewport.start_row\n : await view.num_rows();\n let out = \"\";\n for (let ridx = 0; ridx < nrows; ridx++) {\n for (const col_name of cols) {\n const col = (json as Record<string, unknown[]>)[col_name];\n const type = this.model!._schema[col_name];\n const pluginConfig = (this.regular_table as any)[\n PRIVATE_PLUGIN_SYMBOL\n ] as ColumnsConfig | undefined;\n const columnName = col_name.split(\"|\").at(-1)!;\n const formatter = format_raw(\n type,\n pluginConfig?.[columnName] || {},\n );\n\n if (formatter) {\n out += formatter.format(col[ridx]) + \"\\t\";\n } else {\n out += col[ridx] + \"\\t\";\n }\n }\n out += \"\\n\";\n }\n\n return out.trim();\n }\n\n async resize(): Promise<void> {\n if (!this.isConnected || this.offsetParent == null) {\n return;\n }\n\n if (this._initialized) {\n await this.regular_table.draw();\n }\n }\n\n async clear(): Promise<void> {\n this.regular_table.resetAutoSize();\n this.regular_table.clear();\n }\n\n async save(): Promise<any> {\n return save.call(this);\n }\n\n async restore(\n token: DatagridPluginConfig,\n columns_config?: ColumnsConfig,\n ): Promise<any> {\n return restore.call(this, token, columns_config ?? {});\n }\n\n async restyle(): Promise<void> {\n // Get view from model if available, otherwise no-op\n if (this.model?._view) {\n await this.draw(this.model._view);\n }\n }\n\n async delete(): Promise<void> {\n this.disconnectedCallback();\n this._toolbar = undefined;\n if ((this.regular_table as any).table_model) {\n this.regular_table.resetAutoSize();\n }\n\n this.regular_table.clear();\n }\n}\n", ":host{position:relative;display:block;height:100%;}:host #container{position:absolute;display:flex;flex-direction:column;justify-content:stretch;align-items:stretch;top:0;left:0;right:0;bottom:0;}:host #toolbar{display:flex;align-items:stretch;height:100%;}:host #toolbar .hover-target{margin:0;display:inline-flex;align-items:center;cursor:pointer;}:host #toolbar .hover-target:hover{box-shadow:-4px 0 0 var(--icon--color),4px 0 0 var(--icon--color);background-color:var(--icon--color);}:host #slot-container{flex:1;position:relative;}#scroll_lock.lock-scroll:before{-webkit-mask-image:var(--toolbar-scroll-lock-active--content);}#scroll_lock:before{-webkit-mask-image:var(--toolbar-scroll-lock--content);}#select_mode:before{content:\"highlight_alt\";}#edit_mode:before{-webkit-mask-image:\"\";}#edit_mode[data-edit-mode=\"READ_ONLY\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--edit--content);}:host(.aggregated) #toolbar #edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"SELECT_ROW\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-row--content);}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-column--content);}#edit_mode[data-edit-mode=\"SELECT_REGION\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-region--content);}#edit_mode[data-edit-mode=\"READ_ONLY\"] span:before{content:var(--edit-mode--read-only--content,\"Read Only\");}#edit_mode[data-edit-mode=\"EDIT\"] span:before{content:var(--edit-mode--edit--content,\"Editable\");}#edit_mode[data-edit-mode=\"SELECT_ROW\"] span:before{content:var(--edit-mode--select-row--content,\"Row Select\");}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"] span:before{content:var(--edit-mode--select-column--content,\"Column Select\");}#edit_mode[data-edit-mode=\"SELECT_REGION\"] span:before{content:var(--edit-mode--select-region--content,\"Region Select\");}#scroll_lock span:before{content:var(--scroll-lock-toggle--content,\"Free Scroll\");}#scroll_lock.lock-scroll span:before{content:var(--scroll-lock-alt-toggle--content,\"Align Scroll\");}.button:before{width:21px;height:21px;content:\"\";-webkit-mask-size:cover;mask-size:cover;background-color:var(--icon--color);}.button.editable:before,.button.lock-scroll:before{color:inherit;}.button{display:inline-flex;justify-content:center;align-items:center;user-select:none;padding:0 5px;border:1px solid transparent;border-radius:3px;border:1px solid transparent;box-sizing:border-box;display:inline-flex;font-size:var(--label--font-size,0.75em);height:22px;user-select:none;white-space:nowrap;width:37px;}.button>span{display:none;margin:0;padding:0;}.hover-target:focus-within .button,.hover-target:hover .button{position:relative;background-color:var(--icon--color);color:var(--plugin--background);opacity:1;display:flex;align-items:center;cursor:pointer;}.hover-target:focus-within .button:before,.hover-target:hover .button:before{background-color:var(--plugin--background);}.hover-target:focus-within .button>span,.hover-target:hover .button>span{display:block;position:absolute;top:calc(100% + 3px);left:50%;translate:-50%;margin:0;padding:5px;height:auto;white-space:pre-wrap;line-height:1;font-size:9px;background-color:var(--icon--color);width:35px;text-align:center;border-radius:0 0 3px 3px;}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport TOOLBAR_STYLE from \"../../../dist/css/perspective-viewer-datagrid-toolbar.css\";\nimport { toggle_edit_mode, toggle_scroll_lock } from \"../model/toolbar.js\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nconst stylesheet = new CSSStyleSheet();\nstylesheet.replaceSync(TOOLBAR_STYLE);\n\n/**\n * The custom element for this plugin's toolbar, a component which displays in\n * the host `<perspective-viewer>`'s status bar when this plugin is active.\n * In the case of Datagrid, this comprises \"Editable\" and \"Scroll Lock\" toggle\n * buttons.\n */\nexport class HTMLPerspectiveViewerDatagridToolbarElement extends HTMLElement {\n private _initialized: boolean = false;\n\n connectedCallback(): void {\n if (this._initialized) {\n return;\n }\n\n this._initialized = true;\n this.setAttribute(\"slot\", \"statusbar-extra\");\n this.attachShadow({ mode: \"open\" });\n this.shadowRoot!.adoptedStyleSheets.push(stylesheet);\n this.shadowRoot!.innerHTML = `\n <div id=\"toolbar\">\n <span class=\"hover-target\">\n <span id=\"scroll_lock\" class=\"button\">\n <span></span>\n </span>\n </span>\n <span class=\"hover-target\">\n <span id=\"edit_mode\" class=\"button\" data-edit-mode=\"READ_ONLY\">\n <span></span>\n </span>\n </span>\n </div>\n `;\n\n const viewer = this.parentElement as PerspectiveViewerElement;\n const plugin = this.previousElementSibling as DatagridPluginElement;\n\n plugin._scroll_lock = this.shadowRoot!.querySelector(\n \"#scroll_lock\",\n ) as HTMLElement;\n plugin._scroll_lock.addEventListener(\"click\", () =>\n toggle_scroll_lock.call(plugin),\n );\n\n plugin._edit_button = this.shadowRoot!.querySelector(\n \"#edit_mode\",\n ) as HTMLElement;\n plugin._edit_button.addEventListener(\"click\", () => {\n toggle_edit_mode.call(plugin);\n plugin.regular_table.draw();\n viewer.dispatchEvent(new Event(\"perspective-config-update\"));\n });\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\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": ["METADATA_MAP", "DEBUG", "isFirefox", "BROWSER_MAX_HEIGHT", "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", "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", "y_offset", "x_offset", "_row_headers_length", "_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__", "invalid_viewport", "preserve_width", "num_rows", "num_row_headers", "num_column_headers", "is_non_vertical", "is_non_horizontal", "safe_num_rows", "safe_num_columns", "invalid_schema_or_column", "autosize_cells", "first_iteration", "last_cells", "callbacks", "callback", "old_height", "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", "metadata", "row", "td", "_virtual_x", "_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", "ElemFactory", "_name", "_elements", "_index", "name", "elem", "ViewModel", "_container", "_span_factory", "column_sizes", "container", "table", "_get_row", "_set_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", "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", "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_col", "_cleanupAfterDraw", "RegularTableViewModel", "_columnWidthStyleSheet", "_lastColumnWidthCss", "thead", "tbody", "override_row_height", "measurements", "cell", "box", "cssRules", "row_headers_size_key", "columnIndex", "_applyColumnWidthStyles", "css", "shadowRoot", "container_size", "view_cache", "maxLen", "rh", "row_header_result", "num_visible_columns", "fetch_result", "drawn_body", "col_width", "_isViewportFilled", "VIRTUAL_MODES", "RegularTableElement", "_initialized", "_reset_viewport", "_reset_scroll", "sizes", "styleListener", "isSubscribed", "index", "start_len", "y", "viewport_row_height", "scroll_left", "dataListener", "virtual_mode", "preserve_state", "virtual_mode_changed", "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", "r", "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", "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_", "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", "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", "chroma_default", "clip_rgb_default", "s", "h", "digits", "floor", "random", "random_default", "code", "i", "Color_default", "log", "pow", "floor", "abs", "analyze", "data", "key", "r", "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", "T", "deltaHp", "deltaL", "deltaCp", "sl", "sc", "sh", "deltaTheta", "Rt", "result", "distance_default", "a", "b", "mode", "Color_default", "l1", "l2", "sum_sq", "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", "r", "g", "b", "temperature2rgb_default", "round", "rgb2temperature", "args", "rgb", "unpack_default", "r", "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_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_row_path", "row_headers", "format_tree_header_row_path", "format_tree_header", "num_row_headers", "blend", "a", "b", "chroma_js_default", "rgbaToRgb", "r", "g", "source", "f", "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", "get_psp_type", "metadata", "createModel", "table", "view", "extend", "config", "old", "group_by_changed", "type_changed", "lvl", "split_by_changed", "columns_changed", "filter_changed", "i", "sort_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", "x", "needs_border", "is_corner", "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", "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", "detail", "row", "column_names", "config", "getCellConfig", "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", "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", "get_psp_type", "model", "metadata", "applyBodyCellStyles", "cells", "plugins", "isSettingsOpen", "isSelectable", "isEditable", "regularTable", "selectedRowsMap", "selectedPositionMap", "viewer", "hasSelected", "selected", "td", "isHeader", "column_name", "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.1/node_modules/regular-table/src/ts/utils.ts", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/src/ts/constants.ts", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/dist/css/container.css", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/dist/css/sub-cell-offsets.css", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/src/ts/scroll_panel.ts", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/src/ts/view_model.ts", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/src/ts/events.ts", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/src/ts/thead.ts", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/src/ts/tbody.ts", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/src/ts/table.ts", "../../../../node_modules/.pnpm/regular-table@0.8.1/node_modules/regular-table/src/ts/regular-table.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 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,\n box.height,\n ),\n );\n\n if (metadata?.size_key !== undefined) {\n this._column_sizes.indices[metadata.size_key] = box.width;\n if (\n box.width &&\n this._column_sizes.override[metadata.size_key] === undefined\n ) {\n this._column_sizes.auto[metadata.size_key] = box.width;\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 cssRules.push(\n `thead tr.rt-autosize th:nth-child(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-child(${columnIndex})`,\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-child(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-child(${columnIndex})`,\n `{min-width:${auto_width}px;max-width:none;}`,\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-child(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-child(${columnIndex})`,\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-child(${columnIndex}),`,\n `tbody td.rt-cell-clip:nth-child(${columnIndex})`,\n `{min-width:${auto_width}px;max-width:none;}`,\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 {\n View,\n Table,\n ViewConfig,\n ColumnType,\n SortDir,\n ViewWindow,\n} from \"@perspective-dev/client\";\nimport { RegularTableElement } from \"regular-table\";\nimport { CellMetadata, DataResponse } from \"regular-table/dist/esm/types\";\n\n// Re-export types from regular-table for use throughout the codebase\nexport type { RegularTableElement as RegularTable };\n\nexport function get_psp_type(\n model: DatagridModel,\n metadata: CellMetadata,\n): ColumnType {\n if (\n metadata.type === \"body\" ||\n metadata.type === \"column_header\" ||\n metadata.type === \"corner\"\n ) {\n return model._column_types[metadata.x];\n } else {\n return model._row_header_types[(metadata.row_header_x ?? 0) - 1];\n }\n}\n\n// Edit mode for the datagrid\nexport type EditMode =\n | \"READ_ONLY\"\n | \"EDIT\"\n | \"SELECT_COLUMN\"\n | \"SELECT_ROW\"\n | \"SELECT_REGION\";\n\n// Color record for styling - tuple returned by make_color_record\nexport type ColorRecord = [\n string, // hex color\n number, // red\n number, // green\n number, // blue\n string, // gradient\n string, // rgba solid\n string, // rgba transparent\n];\n\nexport type SortTerm = [string, SortDir];\n\n// Selection state for mouse-based region selection\nexport interface SelectionArea {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n}\n\nexport interface SelectionState {\n selected_areas: SelectionArea[];\n dirty: boolean;\n CURRENT_MOUSEDOWN_COORDINATES?: { x?: number; y?: number };\n old_selected_areas?: SelectionArea[];\n potential_selection?: SelectionArea;\n}\n\n// Position tracking for cell focus\nexport interface SelectedPosition {\n x: number;\n y: number;\n content?: string;\n}\n\n// Column configuration values from viewer\nexport interface ColumnConfig {\n color?: string;\n pos_fg_color?: string;\n neg_fg_color?: string;\n pos_bg_color?: string;\n neg_bg_color?: string;\n fg_gradient?: number;\n bg_gradient?: number;\n number_fg_mode?: string;\n number_bg_mode?: string;\n string_color_mode?: string;\n datetime_color_mode?: string;\n fixed?: number;\n aggregate_depth?: number;\n column_size_override?: number;\n format?: string;\n date_format?: DateFormatConfig;\n number_format?: NumberFormatConfig;\n}\n\n// Date format configuration for column styling\nexport interface DateFormatConfig {\n format?: \"custom\" | string;\n timeZone?: string;\n dateStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n timeStyle?: \"short\" | \"medium\" | \"long\" | \"full\" | \"disabled\";\n second?: \"numeric\" | \"2-digit\" | \"disabled\";\n minute?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour?: \"numeric\" | \"2-digit\" | \"disabled\";\n day?: \"numeric\" | \"2-digit\" | \"disabled\";\n weekday?: \"narrow\" | \"short\" | \"long\" | \"disabled\";\n month?: \"numeric\" | \"2-digit\" | \"narrow\" | \"short\" | \"long\" | \"disabled\";\n year?: \"numeric\" | \"2-digit\" | \"disabled\";\n hour12?: boolean;\n fractionalSecondDigits?: 1 | 2 | 3;\n}\n\n// Number format configuration for column styling\nexport interface NumberFormatConfig {\n style?: \"decimal\" | \"currency\" | \"percent\" | \"unit\";\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n minimumIntegerDigits?: number;\n minimumSignificantDigits?: number;\n maximumSignificantDigits?: number;\n currency?: string;\n currencyDisplay?: \"code\" | \"symbol\" | \"narrowSymbol\" | \"name\";\n notation?: \"standard\" | \"scientific\" | \"engineering\" | \"compact\";\n compactDisplay?: \"short\" | \"long\";\n useGrouping?: boolean;\n}\n\nexport type ColumnsConfig = Record<string, ColumnConfig>;\n\n// Plugin save state\nexport interface DatagridPluginConfig {\n columns?: ColumnsConfig;\n editable?: boolean;\n scroll_lock?: boolean;\n edit_mode?: EditMode;\n column_size_override?: Record<string, number>;\n}\n\n// Element factory for reusing DOM elements\nexport interface ElemFactory {\n clear(): void;\n get(): HTMLElement;\n}\n\nexport type Schema = Record<string, ColumnType>;\n\n// Model object stored on regular-table\nexport interface DatagridModel {\n _edit_port: number;\n _view: View;\n _table: Table;\n _table_schema: Schema;\n _config: ViewConfig;\n _num_rows: number;\n _num_columns?: number;\n _schema: Schema;\n _ids: unknown[][];\n _plugin_background: number[];\n _color: ColorRecord;\n _pos_fg_color: ColorRecord;\n _neg_fg_color: ColorRecord;\n _pos_bg_color: ColorRecord;\n _neg_bg_color: ColorRecord;\n _column_paths: string[];\n _column_types: ColumnType[];\n _is_editable: boolean[];\n _edit_mode: EditMode;\n _selection_state: SelectionState;\n _row_header_types: ColumnType[];\n _series_color_map: Map<string, Map<string, number>>;\n _series_color_seed: Map<string, number>;\n _div_factory: ElemFactory;\n _last_window?: ViewWindow;\n _is_old_viewport?: boolean;\n _reverse_columns?: Map<string, number>;\n _reverse_ids?: Map<string, number>;\n last_column_paths?: string[];\n last_meta?: unknown[][];\n last_ids?: unknown[][];\n last_reverse_ids?: Map<string, number>;\n last_reverse_columns?: Map<string, number>;\n get_psp_type(metadata: CellMetadata): ColumnType;\n _column_settings_selected_column?: string;\n}\n\n// Symbol for private plugin data on regular-table\nexport const PRIVATE_PLUGIN_SYMBOL: unique symbol = Symbol(\n \"Perspective Column Config\",\n);\n\n// Data listener function type\nexport type DataListener = (\n regularTable: RegularTableElement,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse>;\n\n// Style listener function type\nexport type StyleListener = () => void;\n\n// Perspective viewer element interface (subset)\nexport interface PerspectiveViewerElement extends HTMLElement {\n getView(): Promise<View>;\n getTable(): Promise<Table>;\n getEditPort(): Promise<number>;\n restore(config: Partial<ViewConfig>): Promise<void>;\n toggleColumnSettings(columnName?: string): Promise<void>;\n hasAttribute(name: string): boolean;\n setSelection(viewport?: ViewWindow): void;\n dispatchEvent(event: Event): boolean;\n children: HTMLCollectionOf<HTMLElement>;\n}\n\n// Toolbar element interface\nexport interface DatagridToolbarElement extends HTMLElement {\n setEditButton(button: HTMLElement): void;\n setScrollLockButton(button: HTMLElement): void;\n}\n\n// Column override for persisting column sizes\nexport type ColumnOverrides = Record<string, number | undefined>;\n\n// Formatter cache types\nexport interface FormatterCacheEntry {\n format(value: unknown): string;\n}\n\nexport type FormatterCache = Map<string, FormatterCacheEntry>;\n\n// Cell config result from getCellConfig\nexport interface CellConfigResult {\n row: Record<string, unknown>;\n column_names: string[];\n config: Partial<ViewConfig>;\n}\n\n// Custom event detail types\nexport interface PerspectiveClickDetail {\n row: Record<string, unknown>;\n column_names: string[];\n config: Partial<ViewConfig>;\n}\n\nexport interface PerspectiveSelectDetail {\n selected: boolean;\n row: Record<string, unknown>;\n column_names?: string[];\n config: Partial<ViewConfig>;\n}\n\n// Mouse event with handled flag\nexport interface HandledMouseEvent extends MouseEvent {\n handled?: boolean;\n}\n\n// Sort order mappings\nexport type SortRotationOrder = Record<string, SortDir | undefined>;\n\n// Datagrid plugin element interface for toolbar\nexport interface DatagridPluginElement extends HTMLElement {\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n}\n\n// Map types for selected rows and positions\nexport type SelectedRowsMap = WeakMap<RegularTableElement, Set<number>>;\nexport type SelectedPositionMap = WeakMap<\n RegularTableElement,\n SelectedPosition\n>;\n", "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\n/**\n * Format a single cell of the `group_by` tree header.\n */\nexport function* format_tree_header(\n this: DatagridModel,\n paths: unknown[][] = [],\n row_headers: string[],\n regularTable: RegularTable,\n): Generator<unknown[]> {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n for (const path of paths) {\n const new_path: unknown[] = [\"\"];\n for (const idx in path) {\n new_path.push(\n format_cell.call(\n this,\n row_headers[idx],\n path[idx],\n plugins,\n true,\n ),\n );\n }\n\n yield path;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../types.js\";\nimport { format_cell } from \"./format_cell.js\";\nimport {\n format_tree_header,\n format_tree_header_row_path,\n} from \"./format_tree_header.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n RegularTable,\n Schema,\n} from \"../types.js\";\nimport type { CellScalar, DataResponse } from \"regular-table/dist/esm/types.js\";\nimport { ViewWindow } from \"@perspective-dev/client\";\n\ninterface ColumnData {\n __ROW_PATH__?: unknown[][];\n __ID__?: unknown[][];\n [key: string]: unknown[] | undefined;\n}\n\n/**\n * Creates a new DataListener, suitable for passing to `regular-table`'s\n * `.setDataListener()` method. This should be called as a method on the\n * plugin.\n *\n * @returns A data listener for the plugin.\n */\nexport function createDataListener(\n viewer: PerspectiveViewerElement,\n): (\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n) => Promise<DataResponse> {\n let last_meta: unknown[][] | undefined;\n let last_column_paths: string[] | undefined;\n let last_ids: unknown[][] | undefined;\n let last_reverse_ids: Map<string, number> | undefined;\n let last_reverse_columns: Map<string, number> | undefined;\n\n return async function dataListener(\n this: DatagridModel,\n regularTable: RegularTable,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n ): Promise<DataResponse> {\n let columns: ColumnData = {};\n const new_window: ViewWindow = {\n start_row: y0,\n start_col: x0,\n end_row: y1,\n end_col: x1,\n id: true,\n };\n\n let num_columns: number | null = null;\n\n if (x1 - x0 > 0 && y1 - y0 > 0) {\n this._is_old_viewport =\n this._last_window?.start_row === y0 &&\n this._last_window?.end_row === y1 &&\n this._last_window?.start_col === x0 &&\n this._last_window?.end_col === x1;\n\n const [x, z] = await Promise.all([\n this._view.to_columns_string(new_window as any),\n this._view.num_columns(),\n ]);\n\n num_columns = z;\n columns = JSON.parse(x as string) as ColumnData;\n const y = Object.keys(columns);\n const new_col_paths = y.filter(\n (x) => x !== \"__ROW_PATH__\" && x !== \"__ID__\",\n );\n\n let changed_cols = false;\n for (let i = 0; i < new_col_paths.length; i++) {\n if (\n this._column_paths[new_window.start_col! + i] !==\n new_col_paths[i]\n ) {\n changed_cols = true;\n this._column_paths[new_window.start_col! + i] =\n new_col_paths[i];\n }\n }\n\n if (changed_cols) {\n const [a, b] = await Promise.all([\n this._view.schema(),\n this._view.expression_schema(),\n ]);\n\n this._schema = { ...(a as Schema), ...(b as Schema) };\n for (let i = 0; i < new_col_paths.length; i++) {\n const column_path_parts = new_col_paths[i].split(\"|\");\n const column =\n column_path_parts[this._config.split_by.length];\n\n this._is_editable[i + new_window.start_col!] =\n !!this._table_schema[column];\n\n this._column_types[i + new_window.start_col!] =\n this._schema[column];\n }\n }\n\n this._last_window = new_window;\n this._ids =\n columns.__ID__ ||\n Array(y1 - y0)\n .fill(null)\n .map((_, index) => [index + y0]);\n\n this._reverse_columns = this._column_paths\n .slice(x0, x1)\n .reduce((acc, x, i) => {\n acc.set(x, i);\n return acc;\n }, new Map<string, number>());\n\n this._reverse_ids = this._ids?.reduce((acc, x, i) => {\n acc.set(x?.join(\"|\"), i);\n return acc;\n }, new Map<string, number>());\n } else {\n this._div_factory.clear();\n num_columns = await this._view.num_columns();\n }\n\n const data: (string | HTMLElement)[][] = [];\n const metadata: unknown[][] = [];\n const column_headers: string[][] = [];\n const column_paths: string[] = [];\n\n const is_settings_open = viewer.hasAttribute(\"settings\");\n for (\n let ipath = x0;\n ipath < Math.min(x1, this._column_paths.length);\n ++ipath\n ) {\n const path = this._column_paths[ipath];\n const path_parts = path.split(\"|\");\n const column = columns[path] || new Array(y1 - y0).fill(null);\n const agg_depth = Math.min(\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL]?.[\n path_parts[this._config.split_by.length]\n ]?.aggregate_depth || 0,\n this._config.group_by.length,\n );\n\n data.push(\n column.map((x, i) => {\n if ((columns?.__ROW_PATH__?.[i]?.length ?? 0) < agg_depth) {\n return \"\";\n } else {\n return format_cell.call(\n this,\n path_parts[this._config.split_by.length],\n x,\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {},\n ) as string | HTMLElement;\n }\n }),\n );\n\n metadata.push(column as unknown[]);\n if (is_settings_open) {\n path_parts.push(\"\");\n }\n\n column_headers.push(path_parts);\n column_paths.push(path);\n }\n\n // Only update the last state if this is not a \"phantom\" call.\n if (x1 - x0 > 0 && y1 - y0 > 0) {\n this.last_column_paths = last_column_paths;\n this.last_meta = last_meta;\n this.last_ids = last_ids;\n this.last_reverse_ids = last_reverse_ids;\n this.last_reverse_columns = last_reverse_columns;\n\n last_column_paths = column_paths;\n last_meta = metadata;\n last_ids = this._ids;\n last_reverse_ids = this._reverse_ids;\n last_reverse_columns = this._reverse_columns;\n }\n\n const is_row_path = columns.__ROW_PATH__ !== undefined;\n const row_headers = Array.from(\n (is_row_path\n ? format_tree_header_row_path\n : format_tree_header\n ).call(\n this,\n columns.__ROW_PATH__,\n this._config.group_by,\n regularTable,\n ),\n ) as (string | HTMLElement)[][];\n\n const num_row_headers = row_headers[0]?.length;\n\n const result: DataResponse = {\n num_column_headers:\n this._config.split_by.length + (is_settings_open ? 2 : 1),\n num_row_headers,\n num_rows: this._num_rows,\n num_columns,\n row_headers: row_headers as CellScalar[][], // Add `HTMLElement`\n column_headers,\n data: data as CellScalar[][],\n metadata,\n column_header_merge_depth: Math.max(\n 0,\n this._config.split_by.length,\n ),\n };\n\n return result;\n };\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport type { ColorRecord } from \"./types.js\";\n\nexport function blend(a: string, b: number[]): string {\n return chroma.mix(a, `rgb(${b[0]},${b[1]},${b[2]})`, 0.5).hex();\n}\n\n// AFAICT `chroma-js` has no alpha-aware blending? So we need a function to get\n// the color of a heatmap cell over the background.\nexport function rgbaToRgb(\n [r, g, b, a]: [number, number, number, number],\n source: [number, number, number] = [255, 255, 255],\n): [number, number, number] {\n function f(i: number, c: number): number {\n return ((1 - a) * (source[i] / 255) + a * (c / 255)) * 255;\n }\n\n return [f(0, r), f(1, g), f(2, b)];\n}\n\n// Chroma does this but why bother?\nexport function infer_foreground_from_background([r, g, b]: [\n number,\n number,\n number,\n]): string {\n // TODO Implement dark/light themes.\n return Math.sqrt(r * r * 0.299 + g * g * 0.587 + b * b * 0.114) > 130\n ? \"#161616\"\n : \"#ffffff\";\n}\n\nfunction make_gradient(chromahex: chroma.Color): string {\n const [r, g, b] = chromahex.rgb();\n const [r1, g1, b1] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") - 15) % 360)\n .rgb();\n const [r2, g2, b2] = chromahex\n .set(\"hsl.h\", (chromahex.get(\"hsl.h\") + 15) % 360)\n .rgb();\n return `linear-gradient(to right top,rgb(${r1},${g1},${b1}),rgb(${r},${g},${b}) 50%,rgb(${r2},${g2},${b2}))`;\n}\n\nexport function make_color_record(color: string): ColorRecord {\n const chroma_neg = chroma(color);\n const _neg_grad = make_gradient(chroma_neg);\n const rgb = chroma_neg.rgb();\n return [\n color,\n rgb[0],\n rgb[1],\n rgb[2],\n _neg_grad,\n `rgba(${rgb[0]},${rgb[1]},${rgb[2]},1)`,\n `rgba(${rgb[0]},${rgb[1]},${rgb[2]},0)`,\n ];\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport { createDataListener } from \"../data_listener/index.js\";\nimport { blend, make_color_record } from \"../color_utils.js\";\nimport type {\n ColumnType,\n Table,\n View,\n ViewConfig,\n} from \"@perspective-dev/client\";\nimport {\n type DatagridModel,\n type DatagridPluginElement,\n type RegularTable,\n type Schema,\n type ElemFactory,\n type EditMode,\n type PerspectiveViewerElement,\n get_psp_type,\n} from \"../types.js\";\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\n\nfunction get_rule(regular: HTMLElement, tag: string, def: string): string {\n const color = window.getComputedStyle(regular).getPropertyValue(tag).trim();\n if (color.length > 0) {\n return color;\n } else {\n return def;\n }\n}\n\nclass ElemFactoryImpl implements ElemFactory {\n private _name: string;\n private _elements: HTMLElement[];\n private _index: number;\n\n constructor(name: string) {\n this._name = name;\n this._elements = [];\n this._index = 0;\n }\n\n clear(): void {\n this._index = 0;\n }\n\n get(): HTMLElement {\n if (!this._elements[this._index]) {\n this._elements[this._index] = document.createElement(this._name);\n }\n const elem = this._elements[this._index];\n this._index += 1;\n return elem;\n }\n}\n\nexport async function createModel(\n this: DatagridPluginElement,\n regular: RegularTable,\n table: Table,\n view: View,\n extend: Partial<DatagridModel> = {},\n): Promise<DatagridModel> {\n const config = (await view.get_config()) as ViewConfig;\n if (this?.model?._config) {\n const old = this.model._config;\n let group_by_changed = old.group_by.length !== config.group_by.length;\n const type_changed =\n (old.group_by.length === 0 || config.group_by.length === 0) &&\n group_by_changed;\n\n if (!group_by_changed) {\n for (const lvl in old.group_by) {\n group_by_changed ||= config.group_by[lvl] !== old.group_by[lvl];\n }\n }\n\n let split_by_changed = old.split_by.length !== config.split_by.length;\n if (split_by_changed) {\n for (const lvl in old.split_by) {\n split_by_changed ||= config.split_by[lvl] !== old.split_by[lvl];\n }\n }\n\n let columns_changed = old.columns.length !== config.columns.length;\n if (columns_changed) {\n for (const lvl in old.columns) {\n columns_changed ||= config.columns[lvl] !== old.columns[lvl];\n }\n }\n\n let filter_changed = old.filter.length !== config.filter.length;\n if (filter_changed) {\n for (const lvl in old.filter) {\n for (const i in config.filter[lvl]) {\n filter_changed ||=\n config.filter[lvl][i as unknown as number] !==\n old.filter[lvl][i as unknown as number];\n }\n }\n }\n\n let sort_changed = old.sort.length !== config.sort.length;\n if (sort_changed) {\n for (const lvl in old.sort) {\n for (const i in config.sort[lvl]) {\n sort_changed ||=\n config.sort[lvl][i as unknown as number] !==\n old.sort[lvl][i as unknown as number];\n }\n }\n }\n\n this._reset_scroll_top = group_by_changed;\n this._reset_scroll_left = split_by_changed;\n this._reset_select =\n group_by_changed ||\n split_by_changed ||\n filter_changed ||\n sort_changed ||\n columns_changed;\n\n this._reset_column_size =\n split_by_changed ||\n group_by_changed ||\n columns_changed ||\n type_changed;\n }\n\n const [table_schema, num_rows, schema, expression_schema, _edit_port] =\n await Promise.all([\n table.schema(),\n view.num_rows(),\n view.schema(),\n view.expression_schema(),\n (this.parentElement as PerspectiveViewerElement).getEditPort(),\n ]);\n\n const _plugin_background = chroma(\n get_rule(regular, \"--plugin--background\", \"#FFFFFF\"),\n ).rgb();\n\n const _pos_fg_color = make_color_record(\n get_rule(regular, \"--rt-pos-cell--color\", \"#338DCD\"),\n );\n\n const _neg_fg_color = make_color_record(\n get_rule(regular, \"--rt-neg-cell--color\", \"#FF5942\"),\n );\n\n const _pos_bg_color = make_color_record(\n blend(_pos_fg_color[0], _plugin_background),\n );\n\n const _neg_bg_color = make_color_record(\n blend(_neg_fg_color[0], _plugin_background),\n );\n\n const _color = make_color_record(\n get_rule(regular, \"--active--color\", \"#ff0000\"),\n );\n\n const _schema: Schema = {\n ...(schema as Schema),\n ...(expression_schema as Schema),\n };\n const _table_schema: Schema = {\n ...(table_schema as Schema),\n ...(expression_schema as Schema),\n };\n\n const _column_paths: string[] = [];\n const _is_editable: boolean[] = [];\n const _column_types: ColumnType[] = [];\n\n const _edit_mode: EditMode = this._edit_mode || \"READ_ONLY\";\n this._edit_button!.dataset.editMode = _edit_mode;\n\n const model: DatagridModel = Object.assign(extend, {\n _edit_port,\n _view: view,\n _table: table,\n _table_schema,\n _config: config,\n _num_rows: num_rows,\n _schema,\n _ids: [],\n _plugin_background,\n _color,\n _pos_fg_color,\n _neg_fg_color,\n _pos_bg_color,\n _neg_bg_color,\n _column_paths,\n _column_types,\n _is_editable,\n _edit_mode,\n _selection_state: {\n selected_areas: [],\n dirty: false,\n },\n _row_header_types: config.group_by.map((column_path) => {\n return _table_schema[column_path];\n }),\n _series_color_map: new Map<string, string>(),\n _series_color_seed: new Map<string, number>(),\n // get_psp_type,\n _div_factory: extend._div_factory || new ElemFactoryImpl(\"div\"),\n }) as DatagridModel;\n\n regular.setDataListener(\n createDataListener(this.parentElement as PerspectiveViewerElement).bind(\n model,\n regular,\n ) as any,\n {\n virtual_mode: (window\n .getComputedStyle(regular)\n .getPropertyValue(\"--datagrid-virtual-mode\")\n ?.trim() || \"both\") as\n | \"both\"\n | \"horizontal\"\n | \"vertical\"\n | \"none\",\n },\n );\n\n return model;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { DatagridPluginElement, EditMode } from \"../types.js\";\n\nexport const EDIT_MODES: readonly EditMode[] = [\n \"READ_ONLY\",\n \"EDIT\",\n \"SELECT_ROW\",\n \"SELECT_COLUMN\",\n \"SELECT_REGION\",\n] as const;\n\nexport function toggle_edit_mode(\n this: DatagridPluginElement,\n mode?: EditMode,\n): void {\n if (typeof mode === \"undefined\") {\n mode =\n EDIT_MODES[\n (EDIT_MODES.indexOf(this._edit_mode) + 1) % EDIT_MODES.length\n ];\n }\n\n (this.parentElement as any)?.setSelection?.();\n this._edit_mode = mode;\n if (this.model) {\n this.model._edit_mode = mode;\n this.model._selection_state = {\n selected_areas: [],\n dirty: true,\n };\n }\n\n if (this._edit_button !== undefined) {\n this._edit_button.dataset.editMode = mode;\n }\n\n this.dataset.editMode = mode;\n}\n\nexport function toggle_scroll_lock(\n this: DatagridPluginElement,\n force?: boolean,\n): void {\n if (typeof force === \"undefined\") {\n force = !this._is_scroll_lock;\n }\n\n this._is_scroll_lock = force;\n this.classList.toggle(\"sub-cell-scroll-disabled\", force);\n if (this._scroll_lock !== undefined) {\n this._scroll_lock.classList.toggle(\"lock-scroll\", force);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type {\n ColumnOverrides,\n DatagridPluginElement,\n RegularTable,\n} from \"../types.js\";\n\ninterface RegularTableWithOverrides {\n restoreColumnSizes(overrides: Record<number, number | undefined>): void;\n saveColumnSizes(): Record<number, number | undefined>;\n}\n\ninterface DatagridPluginWithCache extends DatagridPluginElement {\n _cached_column_sizes?: ColumnOverrides;\n}\n\n/**\n * Restore a saved column width override token.\n *\n * @param old_sizes An object previously returned by a call to\n * `save_column_size_overrides()`\n * @param cache A flag indicating whether this value should\n * be cached so a future `resetAutoSize()` call does not clear it.\n */\nexport function restore_column_size_overrides(\n this: DatagridPluginWithCache,\n old_sizes: ColumnOverrides,\n cache = false,\n): void {\n if (!this._initialized) {\n return;\n }\n\n if (cache) {\n this._cached_column_sizes = old_sizes;\n }\n\n const overrides: Record<number, number | undefined> = {};\n const { group_by } = this.model!._config;\n const tree_header_offset = group_by?.length > 0 ? group_by.length + 1 : 0;\n\n for (const key of Object.keys(old_sizes)) {\n if (key === \"__ROW_PATH__\") {\n overrides[tree_header_offset - 1] = old_sizes[key] as\n | number\n | undefined;\n } else {\n const index = this.model!._column_paths.indexOf(key);\n overrides[index + tree_header_offset] = old_sizes[key] as\n | number\n | undefined;\n }\n }\n\n (this.regular_table as RegularTableWithOverrides).restoreColumnSizes(\n overrides,\n );\n}\n\n/**\n * Extract the current user-overriden column widths from\n * `regular-table`. This function depends on the internal\n * implementation of `regular-table` and may break!\n *\n * @returns An Object-as-dictionary keyed by column_path string, and\n * valued by the column's user-overridden pixel width.\n */\nexport function save_column_size_overrides(\n this: DatagridPluginWithCache,\n): ColumnOverrides {\n if (!this._initialized) {\n return {};\n }\n\n if (this._cached_column_sizes) {\n const x = this._cached_column_sizes;\n this._cached_column_sizes = undefined;\n return x;\n }\n\n const overrides = (\n this.regular_table as RegularTableWithOverrides\n ).saveColumnSizes();\n const { group_by } = this.model!._config;\n const tree_header_offset = group_by?.length > 0 ? group_by.length + 1 : 0;\n\n const old_sizes: ColumnOverrides = {};\n for (const key of Object.keys(overrides)) {\n const numKey = Number(key);\n if (overrides[numKey] !== undefined) {\n const index = numKey - tree_header_offset;\n if (index > -1) {\n old_sizes[this.model!._column_paths[index]] = overrides[numKey];\n } else if (index === -1) {\n old_sizes[\"__ROW_PATH__\"] = overrides[numKey];\n }\n }\n }\n\n return old_sizes;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport {\n get_psp_type,\n type DatagridModel,\n type PerspectiveViewerElement,\n} from \"../types.js\";\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply selected column styling in response to column settings toggle events.\n * This is called directly (not as a style listener) when the user opens/closes\n * the column settings panel.\n */\nexport function style_selected_column(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selectedColumn: string | undefined,\n): void {\n const group_header_trs = Array.from(\n regularTable.children[0].children[0].children,\n ) as HTMLTableRowElement[];\n\n const len = group_header_trs.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n if (len <= 1) {\n group_header_trs[0]?.removeAttribute(\"id\");\n } else {\n group_header_trs.forEach((tr, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? tr.setAttribute(\"id\", id) : tr.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n if (settings_open && len >= 2) {\n const titles = Array.from(\n group_header_trs[len - 2].children,\n ) as HTMLElement[];\n const editBtns = Array.from(\n group_header_trs[len - 1].children,\n ) as HTMLElement[];\n if (titles && editBtns) {\n group_header_trs.slice(0, len - 2).forEach((tr) => {\n Array.from(tr.children).forEach((th) => {\n th.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titles.length; i++) {\n const title = titles[i];\n const editBtn = editBtns[i];\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n if (this._config.columns.length > 1) {\n for (const r of regularTable.querySelectorAll(\"td\")) {\n const meta = regularTable.getMeta(r);\n if (!meta?.column_header) continue;\n const isOpen =\n meta.column_header[\n meta.column_header.length - 2\n ] === selectedColumn;\n r.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n }\n }\n }\n}\n\n/**\n * Style a single column header row.\n */\nexport function styleColumnHeaderRow(\n this: DatagridModel,\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n): void {\n const header_depth = this._config.group_by.length;\n const selectedColumn = this._column_settings_selected_column;\n\n for (const { element: td, metadata } of headerRow.cells) {\n if (\n !metadata ||\n metadata.type === \"body\" ||\n metadata.type === \"row_header\"\n )\n continue;\n\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n const sort = this._config.sort.find((x) => x[0] === column_name);\n let needs_border =\n metadata.type === \"corner\" &&\n metadata.row_header_x === header_depth;\n const is_corner = typeof metadata.x === \"undefined\";\n needs_border =\n needs_border ||\n (metadata.x !== undefined &&\n (metadata.x + 1) % this._config.columns.length === 0);\n\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\"psp-header-group\", false);\n td.classList.toggle(\"psp-header-leaf\", true);\n td.classList.toggle(\"psp-is-top\", false);\n td.classList.toggle(\"psp-header-corner\", is_corner);\n td.classList.toggle(\n \"psp-header-sort-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc\",\n );\n td.classList.toggle(\n \"psp-header-sort-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-asc\",\n !is_menu_row && !!sort && sort[1] === \"asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-desc\",\n !is_menu_row && !!sort && sort[1] === \"desc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-asc\",\n !is_menu_row && !!sort && sort[1] === \"col asc abs\",\n );\n td.classList.toggle(\n \"psp-header-sort-abs-col-desc\",\n !is_menu_row && !!sort && sort[1] === \"col desc abs\",\n );\n\n const type = get_psp_type(this, metadata);\n const is_numeric = type === \"integer\" || type === \"float\";\n const is_string = type === \"string\";\n const is_date = type === \"date\";\n const is_datetime = type === \"datetime\";\n\n td.classList.toggle(\"psp-align-right\", is_numeric);\n td.classList.toggle(\"psp-align-left\", !is_numeric);\n td.classList.toggle(\n \"psp-menu-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length + 1,\n );\n td.classList.toggle(\n \"psp-sort-enabled\",\n (is_string || is_numeric || is_date || is_datetime) &&\n !is_corner &&\n metadata.column_header_y === this._config.split_by.length,\n );\n td.classList.toggle(\n \"psp-is-width-override\",\n regularTable.saveColumnSizes()[metadata.size_key!] !== undefined,\n );\n\n // Apply menu-open for selected column\n if (this._config.columns.length > 1 && selectedColumn) {\n const isOpen =\n metadata.column_header?.[metadata.column_header.length - 2] ===\n selectedColumn;\n td.classList.toggle(\"psp-menu-open\", isOpen);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SortRotationOrder,\n SortTerm,\n} from \"../types.js\";\nimport { SortDir } from \"@perspective-dev/client\";\n\nconst ROW_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: undefined,\n \"desc abs\": \"asc abs\",\n \"asc abs\": undefined,\n};\n\nconst ROW_COL_SORT_ORDER: SortRotationOrder = {\n desc: \"asc\",\n asc: \"col desc\",\n \"desc abs\": \"asc abs\",\n \"asc abs\": \"col desc abs\",\n \"col desc\": \"col asc\",\n \"col asc\": undefined,\n \"col desc abs\": \"col asc abs\",\n \"col asc abs\": undefined,\n};\n\nexport async function sortHandler(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n target: HTMLElement,\n): Promise<void> {\n const meta = regularTable.getMeta(target);\n if (!meta?.column_header) return;\n const column_name = meta.column_header[this._config.split_by.length];\n const sort_method =\n event.ctrlKey ||\n (event as MouseEvent & { metaKet?: boolean }).metaKet ||\n event.altKey\n ? append_sort\n : override_sort;\n\n const abs = event.shiftKey;\n const sort = sort_method.call(this, `${column_name}`, abs);\n await viewer.restore({ sort });\n}\n\nexport function append_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n const sort: SortTerm[] = [];\n let found = false;\n for (const sort_term of this._config.sort) {\n const [_column_name, _sort_dir] = sort_term;\n if (_column_name === column_name) {\n found = true;\n const term = create_sort.call(this, column_name, _sort_dir, abs);\n if (term) {\n sort.push(term);\n }\n } else {\n sort.push(sort_term);\n }\n }\n\n if (!found) {\n sort.push([column_name, abs ? \"desc abs\" : \"desc\"]);\n }\n\n return sort;\n}\n\nexport function override_sort(\n this: DatagridModel,\n column_name: string,\n abs: boolean,\n): SortTerm[] {\n for (const [_column_name, _sort_dir] of this._config.sort) {\n if (_column_name === column_name) {\n const sort = create_sort.call(this, column_name, _sort_dir, abs);\n return sort ? [sort] : [];\n }\n }\n return [[column_name, abs ? \"desc abs\" : \"desc\"]];\n}\n\nexport function create_sort(\n this: DatagridModel,\n column_name: string,\n sort_dir: SortDir | undefined,\n _abs: boolean,\n): SortTerm | undefined {\n const is_col_sortable = this._config.split_by.length > 0;\n const order = is_col_sortable ? ROW_COL_SORT_ORDER : ROW_SORT_ORDER;\n const inc_sort_dir: SortDir | undefined = sort_dir\n ? order[sort_dir]\n : \"desc\";\n if (inc_sort_dir) {\n return [column_name, inc_sort_dir];\n }\n return undefined;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { RegularTable, DatagridModel } from \"../types.js\";\n\nexport async function expandCollapseHandler(\n this: DatagridModel,\n regularTable: RegularTable,\n event: MouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as HTMLElement);\n if (!meta || meta.type !== \"row_header\") return;\n const is_collapse = (event.target as Element).classList.contains(\n \"psp-tree-label-collapse\",\n );\n\n if (event.shiftKey && is_collapse) {\n this._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 2,\n );\n } else if (event.shiftKey) {\n this._view.set_depth(\n (meta.row_header as unknown[]).filter((x) => x !== undefined)\n .length - 1,\n );\n } else if (is_collapse) {\n this._view.collapse(meta.y);\n } else {\n this._view.expand(meta.y);\n }\n\n this._num_rows = await this._view.num_rows();\n this._num_columns = await this._view.num_columns();\n regularTable.draw();\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { sortHandler } from \"./sort.js\";\nimport { expandCollapseHandler } from \"./expand_collapse.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nexport async function mousedown_listener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n if (event.which !== 1) {\n return;\n }\n\n let target = event.target as HTMLElement | null;\n if (target?.tagName === \"A\") {\n return;\n }\n\n while (target && target.tagName !== \"TD\" && target.tagName !== \"TH\") {\n target = target.parentElement;\n if (!target || !regularTable.contains(target)) {\n return;\n }\n }\n\n if (!target) return;\n\n if (target.classList.contains(\"psp-tree-label\")) {\n expandCollapseHandler.call(this, regularTable, event);\n return;\n }\n\n if (target.classList.contains(\"psp-menu-enabled\")) {\n const meta = regularTable.getMeta(target);\n const column_name = meta?.column_header?.[this._config.split_by.length];\n await viewer.toggleColumnSettings(`${column_name}`);\n } else if (target.classList.contains(\"psp-sort-enabled\")) {\n sortHandler.call(this, regularTable, viewer, event, target);\n }\n}\n\nexport function click_listener(\n regularTable: RegularTable,\n event: MouseEvent,\n): void {\n if (event.which !== 1) {\n return;\n }\n\n let target = event.target as HTMLElement | null;\n while (target && target.tagName !== \"TD\" && target.tagName !== \"TH\") {\n target = target.parentElement;\n if (!target || !regularTable.contains(target)) {\n return;\n }\n }\n\n if (!target) return;\n\n if (target.classList.contains(\"psp-tree-label\") && event.offsetX < 26) {\n event.stopImmediatePropagation();\n } else if (\n target.classList.contains(\"psp-header-leaf\") &&\n !target.classList.contains(\"psp-header-corner\")\n ) {\n event.stopImmediatePropagation();\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport {\n type RegularTable,\n type DatagridModel,\n type PerspectiveViewerElement,\n get_psp_type,\n} from \"../../types.js\";\n\nexport function write_cell(\n table: RegularTable,\n model: DatagridModel,\n active_cell: HTMLElement,\n): boolean {\n const meta = table.getMeta(active_cell) as CellMetadataBody;\n if (!meta) {\n return false;\n }\n const type = model._schema[model._column_paths[meta.x!]];\n let text: string | number | boolean | null = active_cell.textContent || \"\";\n const id = model._ids[meta.y! - meta.y0][0];\n if (type === \"float\" || type === \"integer\") {\n const parsed = parseFloat(text.replace(/,/g, \"\"));\n if (isNaN(parsed)) {\n return false;\n }\n text = parsed;\n } else if (type === \"date\" || type === \"datetime\") {\n const parsed = Date.parse(text);\n if (isNaN(parsed)) {\n return false;\n }\n text = parsed;\n } else if (type === \"boolean\") {\n text = text === \"true\" ? false : text === \"false\" ? true : null;\n }\n\n const msg = {\n __INDEX__: id,\n [model._column_paths[meta.x]]: text,\n };\n\n model._table.update([msg], { port_id: model._edit_port, format: null });\n return true;\n}\n\nexport function clickListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): void {\n const meta = table.getMeta(event.target as HTMLElement);\n if (meta?.type === \"body\" || meta?.type === \"column_header\") {\n const is_editable2 = this._is_editable[meta.x];\n const is_bool = get_psp_type(this, meta) === \"boolean\";\n const is_null = (event.target as Element).classList.contains(\n \"psp-null\",\n );\n\n if (is_editable2 && is_bool && !is_null) {\n write_cell(table, this, event.target as HTMLElement);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel, SelectedPosition } from \"../types.js\";\nimport { CollectedCell, LocalSelectedPositionMap } from \"./types.js\";\n\n/**\n * Apply focus style to the selected cell.\n * Optimized to use collected cells instead of querySelectorAll.\n */\nexport function applyFocusStyle(\n this: DatagridModel,\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n): void {\n const selected_position = selectedPositionMap.get(regularTable);\n const host = regularTable.getRootNode() as Document;\n\n if (selected_position) {\n for (const { element: td, metadata } of cells) {\n if (\n metadata.type === \"body\" &&\n metadata.x === selected_position.x &&\n metadata.y === selected_position.y\n ) {\n if (host.activeElement !== td) {\n td.focus({ preventScroll: true });\n }\n return;\n }\n }\n\n // If we didn't find the cell to focus, blur current\n if (\n document.activeElement !== document.body &&\n regularTable.contains(host.activeElement)\n ) {\n (host.activeElement as HTMLElement).blur();\n }\n }\n}\n\n/**\n * Standalone function to focus the selected cell.\n * This collects cells from the table and tries to focus the selected position.\n * Returns true if focus was successful, false otherwise.\n *\n * Used by edit_keydown.ts for keyboard navigation.\n */\nexport function focusSelectedCell(\n regularTable: RegularTableElement,\n selectedPositionMap: Map<RegularTableElement, SelectedPosition>,\n): boolean {\n const selected_position = selectedPositionMap.get(regularTable);\n if (!selected_position) {\n return false;\n }\n\n const host = regularTable.getRootNode() as Document;\n const tbody = regularTable.children[0]?.children[1];\n\n if (tbody) {\n for (const tr of tbody.children) {\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(cell as HTMLElement);\n if (\n metadata?.type === \"body\" &&\n metadata.x === selected_position.x &&\n metadata.y === selected_position.y\n ) {\n if (host.activeElement !== cell) {\n (cell as HTMLElement).focus({ preventScroll: true });\n }\n return true;\n }\n }\n }\n }\n\n // If we didn't find the cell to focus, blur current\n if (\n document.activeElement !== document.body &&\n regularTable.contains(host.activeElement)\n ) {\n (host.activeElement as HTMLElement).blur();\n }\n\n return false;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { focusSelectedCell } from \"../../style_handlers/focus.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../../types.js\";\n\ntype SelectedPositionMap = Map<RegularTable, SelectedPosition>;\n\ntype AsyncFunction<T extends unknown[], R> = (\n this: DatagridModel,\n ...args: T\n) => Promise<R>;\n\nfunction lock<T extends unknown[], R>(\n body: AsyncFunction<T, R>,\n): AsyncFunction<T, R | undefined> {\n let lockPromise: Promise<void> | undefined;\n return async function (\n this: DatagridModel,\n ...args: T\n ): Promise<R | undefined> {\n if (lockPromise) {\n await lockPromise;\n return;\n }\n\n let resolve: () => void;\n lockPromise = new Promise((x) => (resolve = x));\n const result = await body.apply(this, args);\n lockPromise = undefined;\n resolve!();\n return result;\n };\n}\n\ninterface ContentEditableElement extends HTMLElement {\n isContentEditable: boolean;\n selectionStart?: number;\n}\n\nfunction getPos(this: ContentEditableElement): number {\n if (this.isContentEditable) {\n const _range = (this.getRootNode() as Document)\n .getSelection()\n ?.getRangeAt(0);\n if (!_range) return 0;\n const range = _range.cloneRange();\n range.selectNodeContents(this);\n range.setEnd(_range.endContainer, _range.endOffset);\n return range.toString().length;\n } else {\n return this.selectionStart || 0;\n }\n}\n\nconst moveSelection = lock(async function (\n this: DatagridModel,\n table: RegularTable,\n selected_position_map: SelectedPositionMap,\n active_cell: HTMLElement,\n dx: number,\n dy: number,\n): Promise<void> {\n const meta = table.getMeta(active_cell);\n if (!meta || meta.type !== \"body\") return;\n const num_columns = this._column_paths.length;\n const num_rows = this._num_rows;\n const selected_position = selected_position_map.get(table);\n if (!selected_position) {\n return;\n }\n\n if (meta.x + dx < num_columns && 0 <= meta.x + dx) {\n selected_position.x = meta.x + dx;\n }\n\n if (meta.y + dy < num_rows && 0 <= meta.y + dy) {\n selected_position.y = meta.y + dy;\n }\n\n const xmin = Math.max(meta.x0 - 10, 0);\n const xmax = Math.min(meta.x0 + 10, num_columns);\n const ymin = Math.max(meta.y0 - 5, 0);\n const ymax = Math.min(meta.y0 + 10, num_rows);\n let x = meta.x0 + dx,\n y = meta.y0 + dy;\n while (\n !focusSelectedCell(table, selected_position_map) &&\n x >= xmin &&\n x < xmax &&\n y >= ymin &&\n y < ymax\n ) {\n await table.scrollToCell(x, y);\n selected_position_map.set(table, selected_position);\n x += dx;\n y += dy;\n }\n});\n\nfunction isLastCell(\n model: DatagridModel,\n table: RegularTable,\n target: HTMLElement,\n): boolean {\n const meta = table.getMeta(target);\n return meta?.type === \"body\" && meta.y === model._num_rows - 1;\n}\n\nexport function keydownListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: KeyboardEvent,\n): void {\n const target = (table.getRootNode() as Document)\n .activeElement as HTMLElement;\n (event.target as HTMLElement).classList.remove(\"psp-error\");\n switch (event.key) {\n case \"Enter\":\n event.preventDefault();\n if (isLastCell(this, table, target)) {\n target.blur();\n selected_position_map.delete(table);\n } else if (event.shiftKey) {\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n } else {\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n }\n break;\n case \"ArrowLeft\":\n if (getPos.call(target as ContentEditableElement) === 0) {\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n -1,\n 0,\n );\n }\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n -1,\n );\n break;\n case \"ArrowRight\":\n if (\n getPos.call(target as ContentEditableElement) ===\n (target.textContent?.length || 0)\n ) {\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 1,\n 0,\n );\n }\n break;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection.call(\n this,\n table,\n selected_position_map,\n target,\n 0,\n 1,\n );\n break;\n default:\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport * as edit_click from \"./click/edit_click.js\";\nimport * as edit_keydown from \"./keydown/edit_keydown.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\nimport { HTMLPerspectiveViewerDatagridPluginElement } from \"../custom_elements/datagrid.js\";\n\ntype SelectedPositionMap = Map<RegularTableElement, SelectedPosition>;\n\nexport function is_editable(\n this: DatagridModel,\n viewer: PerspectiveViewerElement,\n allowed: boolean = false,\n): boolean {\n const has_pivots =\n this._config.group_by.length === 0 &&\n this._config.split_by.length === 0;\n const selectable = viewer.hasAttribute(\"selectable\");\n const plugin = viewer.children[0] as\n | HTMLPerspectiveViewerDatagridPluginElement\n | undefined;\n const editable = allowed || !!(plugin?._edit_mode === \"EDIT\");\n return has_pivots && !selectable && editable;\n}\n\nexport function keydownListener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: KeyboardEvent,\n): void {\n if (this._edit_mode === \"EDIT\") {\n if (!is_editable.call(this, viewer)) {\n return;\n }\n\n edit_keydown.keydownListener.call(\n this,\n table,\n viewer,\n selected_position_map,\n event,\n );\n } else {\n console.debug(\n `Mode ${this._edit_mode} for \"keydown\" event not yet implemented`,\n );\n }\n}\n\nexport function clickListener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): void {\n if (this._edit_mode === \"EDIT\") {\n if (!is_editable.call(this, viewer)) {\n return;\n }\n\n edit_click.clickListener.call(this, table, viewer, event);\n } else if (this._edit_mode === \"READ_ONLY\") {\n // No-op for read-only mode\n } else if (this._edit_mode === \"SELECT_COLUMN\") {\n // Not yet implemented\n } else if (this._edit_mode === \"SELECT_ROW\") {\n // Not yet implemented\n } else if (this._edit_mode === \"SELECT_REGION\") {\n // Not yet implemented\n } else {\n console.debug(\n `Mode ${this._edit_mode} for \"click\" event not yet implemented`,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { is_editable } from \"./click.js\";\nimport { write_cell } from \"./click/edit_click.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\n\ntype SelectedPositionMap = Map<RegularTable, SelectedPosition>;\n\nexport function focusoutListener(\n this: DatagridModel,\n table: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: FocusEvent,\n): void {\n if (is_editable.call(this, viewer) && selected_position_map.has(table)) {\n const target = event.target as HTMLElement;\n target.classList.remove(\"psp-error\");\n const selectedPosition = selected_position_map.get(table)!;\n selected_position_map.delete(table);\n if (selectedPosition.content !== target.textContent) {\n if (!write_cell(table, this, target)) {\n target.textContent = selectedPosition.content || \"\";\n target.classList.add(\"psp-error\");\n target.focus();\n }\n }\n }\n}\n\nexport function focusinListener(\n this: DatagridModel,\n table: RegularTable,\n _viewer: PerspectiveViewerElement,\n selected_position_map: SelectedPositionMap,\n event: FocusEvent,\n): void {\n const target = event.target as HTMLElement;\n const meta = table.getMeta(target);\n if (meta?.type === \"body\") {\n const new_state: SelectedPosition = {\n x: meta.x,\n y: meta.y,\n content: target.textContent || undefined,\n };\n selected_position_map.set(table, new_state);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport type { View, ViewConfig, Filter, Scalar } from \"@perspective-dev/client\";\nimport type { CellConfigResult } from \"./types.js\";\n\ninterface ModelWithViewAndConfig {\n _view: View;\n _config: ViewConfig;\n}\n\ninterface RowData {\n __ROW_PATH__?: unknown[];\n [key: string]: unknown;\n}\n\nexport default async function getCellConfig(\n { _view, _config }: ModelWithViewAndConfig,\n row_idx: number,\n col_idx: number,\n): Promise<CellConfigResult> {\n const group_by = _config.group_by;\n const split_by = _config.split_by;\n const start_row = row_idx >= 0 ? row_idx : 0;\n const end_row = start_row + 1;\n const r = (await _view.to_json({ start_row, end_row })) as RowData[];\n const row_paths = r.map((x) => x.__ROW_PATH__);\n const group_by_values = (row_paths[0] || []) as Scalar[];\n const row_filters = group_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = group_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined);\n\n const column_index = group_by.length > 0 ? col_idx + 1 : col_idx;\n const column_paths = Object.keys(r[0])[column_index];\n const result: CellConfigResult = {\n row: r[0] as Record<string, unknown>,\n column_names: [],\n config: { filter: [] },\n };\n\n let column_filters: Filter[] = [];\n if (column_paths) {\n const split_by_values = column_paths.split(\"|\");\n result.column_names = [split_by_values[split_by.length]];\n column_filters = split_by\n .map((pivot, index): Filter | undefined => {\n const pivot_value = split_by_values[index];\n return pivot_value ? [pivot, \"==\", pivot_value] : undefined;\n })\n .filter((x): x is Filter => x !== undefined)\n .filter(([, , value]) => value !== \"__ROW_PATH__\");\n }\n\n const filter = _config.filter.concat(row_filters).concat(column_filters);\n result.config = { filter };\n return result;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport getCellConfig from \"../get_cell_config.js\";\nimport type {\n RegularTable,\n DatagridModel,\n PerspectiveViewerElement,\n HandledMouseEvent,\n PerspectiveSelectDetail,\n} from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTable, unknown[]>;\n\nexport async function selectionListener(\n this: DatagridModel,\n regularTable: RegularTable,\n viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n event: HandledMouseEvent,\n): Promise<void> {\n const meta = regularTable.getMeta(event.target as HTMLElement);\n if (!viewer.hasAttribute(\"selectable\")) return;\n if (event.handled) return;\n if (event.shiftKey) return;\n if (event.button !== 0) {\n return;\n }\n\n event.stopImmediatePropagation();\n\n if (!meta) {\n return;\n }\n\n if ((meta.type === \"body\" || meta.type === \"row_header\") && meta.y >= 0) {\n const id = this._ids?.[meta.y - meta.y0];\n const selected = selected_rows_map.get(regularTable);\n const key_match =\n !!selected &&\n selected.reduce<boolean>((agg, x, i) => agg && x === id[i], true);\n\n const is_deselect =\n !!selected && id.length === selected.length && key_match;\n\n let detail: PerspectiveSelectDetail = {\n selected: !is_deselect,\n row: {},\n config: { filter: [] },\n };\n\n const { row, column_names, config } = await getCellConfig(\n this,\n meta.y,\n meta.type === \"body\" ? meta.x : 0,\n );\n\n if (is_deselect) {\n selected_rows_map.delete(regularTable);\n detail = {\n ...detail,\n row,\n config: { filter: structuredClone(this._config.filter) },\n };\n } else {\n selected_rows_map.set(regularTable, id);\n detail = { ...detail, row, column_names, config };\n }\n\n await regularTable.draw({ preserve_width: true });\n event.handled = true;\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveSelectDetail>(\"perspective-select\", {\n bubbles: true,\n composed: true,\n detail,\n }),\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { PerspectiveViewerElement } from \"../types.js\";\n\ntype SelectedRowsMap = Map<RegularTableElement, unknown[]>;\n\nexport async function deselect_all_listener(\n regularTable: RegularTableElement,\n _viewer: PerspectiveViewerElement,\n selected_rows_map: SelectedRowsMap,\n): Promise<void> {\n selected_rows_map.delete(regularTable);\n for (const td of regularTable.querySelectorAll(\"td,th\")) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport getCellConfig from \"../get_cell_config.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n PerspectiveClickDetail,\n} from \"../types.js\";\n\nexport async function dispatch_click_listener(\n this: DatagridModel,\n table: RegularTableElement,\n viewer: PerspectiveViewerElement,\n event: MouseEvent,\n): Promise<void> {\n const meta = table.getMeta(event.target as HTMLElement);\n if (!meta || meta.type !== \"body\") return;\n const { x, y } = meta;\n const { row, column_names, config } = await getCellConfig(this, y, x);\n viewer.dispatchEvent(\n new CustomEvent<PerspectiveClickDetail>(\"perspective-click\", {\n bubbles: true,\n composed: true,\n detail: {\n row,\n column_names,\n config,\n },\n }),\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectionArea,\n} from \"../types.js\";\nimport { ViewWindow } from \"@perspective-dev/client\";\n\nconst MOUSE_SELECTED_AREA_CLASS = \"mouse-selected-area\";\n\ninterface AddAreaMouseSelectionOptions {\n className?: string;\n selected?: SelectionArea[];\n}\n\nexport const addAreaMouseSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n {\n className = MOUSE_SELECTED_AREA_CLASS,\n selected = [],\n }: AddAreaMouseSelectionOptions = {},\n): RegularTableElement => {\n datagrid.model!._selection_state = {\n selected_areas: selected,\n dirty: true,\n };\n\n table.addEventListener(\n \"mousedown\",\n getMousedownListener(datagrid, table, className),\n );\n\n table.addEventListener(\n \"mouseover\",\n getMouseoverListener(datagrid, table, className),\n );\n\n table.addEventListener(\n \"mouseup\",\n getMouseupListener(datagrid, table, className),\n );\n\n table.addStyleListener(() =>\n applyMouseAreaSelections(datagrid, table, className),\n );\n\n return table;\n};\n\nconst getMousedownListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n mouseEvent.button === 0 &&\n (datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\")\n ) {\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES = {};\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {\n x: meta.x,\n y: meta.y,\n };\n\n datagrid.model!._selection_state.old_selected_areas =\n datagrid.model!._selection_state.selected_areas;\n datagrid.model!._selection_state.selected_areas = [];\n\n const start: SelectionArea = {\n x0: meta.x,\n x1: meta.x,\n y0: meta.y,\n y1: meta.y,\n };\n datagrid.model!._selection_state.potential_selection = start;\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n datagrid.model!._selection_state.selected_areas.concat([\n start,\n ]),\n );\n\n return;\n }\n }\n\n datagrid.model!._selection_state.selected_areas = [];\n };\n\nconst getMouseoverListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n if (\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES &&\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES\n .x !== undefined\n ) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n const potentialSelection: SelectionArea = {\n x0: Math.min(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n x1: Math.max(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n y0: Math.min(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n y1: Math.max(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n };\n\n datagrid.model!._selection_state.potential_selection =\n potentialSelection;\n\n applyMouseAreaSelections(\n datagrid,\n table,\n className,\n datagrid.model!._selection_state.selected_areas.concat([\n potentialSelection,\n ]),\n );\n }\n }\n }\n };\n\nconst getMouseupListener =\n (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n ) =>\n (event: Event): void => {\n const mouseEvent = event as MouseEvent;\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n const meta = table.getMeta(mouseEvent.target as HTMLElement);\n if (!meta) return;\n\n if (\n (datagrid.model!._selection_state.old_selected_areas?.length ??\n 0) > 0\n ) {\n const selected =\n datagrid.model!._selection_state.old_selected_areas![0];\n if (\n selected.x0 === selected.x1 &&\n selected.y0 === selected.y1 &&\n meta?.type === \"body\" &&\n selected.x0 === meta.x &&\n selected.y0 === meta.y\n ) {\n datagrid.model!._selection_state.selected_areas = [];\n datagrid.model!._selection_state.old_selected_areas = [];\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES =\n {};\n datagrid.model!._selection_state.potential_selection =\n undefined;\n applyMouseAreaSelections(datagrid, table, className, []);\n return;\n }\n }\n\n datagrid.model!._selection_state.old_selected_areas = [];\n\n if (\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES &&\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES\n .x !== undefined &&\n meta?.type === \"body\" &&\n meta.x !== undefined &&\n meta.y !== undefined\n ) {\n const selection: SelectionArea = {\n x0: Math.min(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n x1: Math.max(\n meta.x,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.x!,\n ),\n y0: Math.min(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n y1: Math.max(\n meta.y,\n datagrid.model!._selection_state\n .CURRENT_MOUSEDOWN_COORDINATES.y!,\n ),\n };\n datagrid.model!._selection_state.selected_areas.push(selection);\n applyMouseAreaSelections(datagrid, table, className);\n }\n\n datagrid.model!._selection_state.CURRENT_MOUSEDOWN_COORDINATES = {};\n datagrid.model!._selection_state.potential_selection = undefined;\n }\n };\n\nfunction set_psp_selection(\n viewer: PerspectiveViewerElement,\n datagrid: DatagridPluginElement,\n { x0, x1, y0, y1 }: SelectionArea,\n): void {\n const viewport: ViewWindow = {};\n const mode = datagrid.model!._edit_mode;\n if (\n x0 !== undefined &&\n [\"SELECT_COLUMN\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.start_col = x0;\n }\n\n if (\n x1 !== undefined &&\n [\"SELECT_COLUMN\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.end_col = x1 + 1;\n }\n\n if (\n y0 !== undefined &&\n [\"SELECT_ROW\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.start_row = y0;\n }\n\n if (\n y1 !== undefined &&\n [\"SELECT_ROW\", \"SELECT_REGION\"].indexOf(mode) > -1\n ) {\n viewport.end_row = y1 + 1;\n }\n\n viewer.setSelection(viewport);\n}\n\nexport const applyMouseAreaSelections = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n className: string,\n selected?: SelectionArea[],\n): void => {\n if (\n datagrid.model!._edit_mode === \"SELECT_REGION\" ||\n datagrid.model!._edit_mode === \"SELECT_ROW\" ||\n datagrid.model!._edit_mode === \"SELECT_COLUMN\"\n ) {\n selected = datagrid.model!._selection_state.selected_areas.slice(0);\n if (datagrid.model!._selection_state.potential_selection) {\n selected.push(datagrid.model!._selection_state.potential_selection);\n }\n\n const tds = table.querySelectorAll(\"tbody td\");\n\n if (selected.length > 0) {\n set_psp_selection(\n datagrid.parentElement as any,\n datagrid,\n selected[0],\n );\n applyMouseAreaSelection(datagrid, table, selected, className);\n } else {\n (datagrid.parentElement as any).setSelection();\n for (const td of tds) {\n td.classList.remove(className);\n }\n }\n } else if (datagrid.model!._selection_state.dirty) {\n datagrid.model!._selection_state.dirty = false;\n const tds = table.querySelectorAll(\"tbody td\");\n for (const td of tds) {\n td.classList.remove(className);\n }\n }\n};\n\nconst applyMouseAreaSelection = (\n datagrid: DatagridPluginElement,\n table: RegularTableElement,\n selected: SelectionArea[],\n className: string,\n): void => {\n if (datagrid.model!._edit_mode === \"SELECT_REGION\" && selected.length > 0) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta || meta.type !== \"body\") continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined\n ) {\n if (\n x0 <= meta.x &&\n meta.x <= x1 &&\n y0 <= meta.y &&\n meta.y <= y1\n ) {\n rendered = true;\n datagrid.model!._selection_state.dirty = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n } else if (\n datagrid.model!._edit_mode === \"SELECT_ROW\" &&\n selected.length > 0\n ) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta) continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined &&\n meta?.type === \"body\"\n ) {\n if (y0 <= meta.y && meta.y <= y1) {\n datagrid.model!._selection_state.dirty = true;\n rendered = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n } else if (\n datagrid.model!._edit_mode === \"SELECT_COLUMN\" &&\n selected.length > 0\n ) {\n const tds = table.querySelectorAll(\"tbody td\");\n\n for (const td of tds) {\n const meta = table.getMeta(td as HTMLElement);\n if (!meta) continue;\n let rendered = false;\n for (const { x0, x1, y0, y1 } of selected) {\n if (\n x0 !== undefined &&\n y0 !== undefined &&\n x1 !== undefined &&\n y1 !== undefined &&\n meta?.type === \"body\"\n ) {\n if (x0 <= meta.x && meta.x <= x1) {\n datagrid.model!._selection_state.dirty = true;\n rendered = true;\n td.classList.add(className);\n }\n }\n }\n\n if (!rendered) {\n td.classList.remove(className);\n }\n }\n }\n};\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\n\nimport type { DatagridModel, PerspectiveViewerElement } from \"../types.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to column header rows.\n */\nexport function applyColumnHeaderStyles(\n this: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n): void {\n if (headerRows.length === 0) return;\n\n // Style selected column for settings panel\n const selectedColumn = this._column_settings_selected_column;\n const len = headerRows.length;\n const settings_open = viewer.hasAttribute(\"settings\");\n\n // Set row IDs\n if (len <= 1) {\n headerRows[0]?.row.removeAttribute(\"id\");\n } else {\n headerRows.forEach(({ row }, i) => {\n const offset = settings_open ? 1 : 0;\n const id =\n i === len - (offset + 1)\n ? \"psp-column-titles\"\n : i === len - offset\n ? \"psp-column-edit-buttons\"\n : null;\n id ? row.setAttribute(\"id\", id) : row.removeAttribute(\"id\");\n });\n }\n\n viewer.classList.toggle(\"psp-menu-open\", !!selectedColumn);\n\n // Style column titles and edit buttons when settings open\n if (settings_open && len >= 2) {\n const titlesRow = headerRows[len - 2];\n const editBtnsRow = headerRows[len - 1];\n\n if (titlesRow && editBtnsRow) {\n // Clear menu-open from other rows\n headerRows.slice(0, len - 2).forEach(({ cells }) => {\n cells.forEach(({ element }) => {\n element.classList.toggle(\"psp-menu-open\", false);\n });\n });\n\n for (let i = 0; i < titlesRow.cells.length; i++) {\n const title = titlesRow.cells[i]?.element;\n const editBtn = editBtnsRow.cells[i]?.element;\n if (!title || !editBtn) continue;\n\n const open = title.textContent === selectedColumn;\n title.classList.toggle(\"psp-menu-open\", open);\n editBtn.classList.toggle(\"psp-menu-open\", open);\n }\n }\n }\n\n // Style the actual column header rows\n const colHeadersIndex = this._config.split_by.length;\n if (colHeadersIndex < headerRows.length) {\n const colHeaders = headerRows[colHeadersIndex];\n if (colHeaders) {\n this._styleColumnHeaderRow(colHeaders, regularTable, false);\n }\n }\n\n const menuHeadersIndex = this._config.split_by.length + 1;\n if (menuHeadersIndex < headerRows.length) {\n const menuHeaders = headerRows[menuHeadersIndex];\n if (menuHeaders) {\n this._styleColumnHeaderRow(menuHeaders, regularTable, true);\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport type { DatagridModel } from \"../types.js\";\n\nimport { CollectedHeaderRow } from \"./types.js\";\n\n/**\n * Apply styles to group header rows.\n */\nexport function applyGroupHeaderStyles(\n this: DatagridModel,\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n): void {\n const header_depth = this._config.group_by.length;\n const m: boolean[][] = [];\n let marked = new Set<number>();\n\n for (let y = 0; y < headerRows.length; y++) {\n const { row, cells } = headerRows[y];\n const tops = new Set<number>();\n\n for (let x = 0; x < cells.length; x++) {\n const { element: td, metadata } = cells[x];\n if (!metadata) continue;\n\n td.style.backgroundColor = \"\";\n\n const needs_border =\n (metadata.type === \"corner\" &&\n header_depth > 0 &&\n metadata.row_header_x === header_depth) ||\n (metadata.type === \"column_header\" && metadata.x >= 0);\n\n td.classList.toggle(\"psp-align-right\", false);\n td.classList.toggle(\"psp-align-left\", false);\n td.classList.toggle(\"psp-header-group\", true);\n td.classList.toggle(\"psp-header-leaf\", false);\n td.classList.toggle(\"psp-header-border\", needs_border);\n td.classList.toggle(\n \"psp-header-group-corner\",\n metadata.type === \"corner\",\n );\n\n td.classList.toggle(\"psp-color-mode-bar\", false);\n td.classList.toggle(\"psp-header-sort-asc\", false);\n td.classList.toggle(\"psp-header-sort-desc\", false);\n td.classList.toggle(\"psp-header-sort-col-asc\", false);\n td.classList.toggle(\"psp-header-sort-col-desc\", false);\n td.classList.toggle(\"psp-sort-enabled\", false);\n\n // Calculate spanning for psp-is-top\n let xx = x;\n for (; m[y] && m[y][xx]; ++xx);\n tops.add(xx);\n\n const cell = td;\n for (let tx = xx; tx < xx + cell.colSpan; ++tx) {\n for (let ty = y; ty < y + cell.rowSpan; ++ty) {\n if (!m[ty]) m[ty] = [];\n m[ty][tx] = true;\n }\n }\n\n cell.classList.toggle(\"psp-is-top\", y === 0 || !marked.has(xx));\n }\n\n marked = tops;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadataBody } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel, ColorRecord } from \"../../types.js\";\n\nexport function style_cell_flash(\n this: DatagridModel,\n metadata: CellMetadataBody,\n td: HTMLElement,\n [, , , , , pos_s, pos_e]: ColorRecord,\n [, , , , , neg_s, neg_e]: ColorRecord,\n is_settings_open: boolean,\n): void {\n const id = this._ids?.[metadata.dy ?? 0]?.join(\"|\");\n const metadata_path = (\n is_settings_open\n ? (metadata.column_header ?? []).slice(0, -1)\n : (metadata.column_header ?? [])\n ).join(\"|\");\n\n if (\n this.last_reverse_columns?.has(metadata_path) &&\n this.last_reverse_ids?.has(id)\n ) {\n const row_idx = this.last_reverse_ids?.get(id);\n const col_idx = this.last_reverse_columns.get(metadata_path);\n if (!this._is_old_viewport) {\n td.style.animation = \"\";\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (this.last_meta![col_idx]![row_idx] as number) >\n ((metadata.user ?? 0) as number)\n ) {\n td.style.setProperty(\"--pulse--background-color-start\", neg_s);\n td.style.setProperty(\"--pulse--background-color-end\", neg_e);\n if (td.style.animationName === \"pulse_neg\") {\n td.style.animation = \"pulse_neg2 0.5s linear\";\n } else {\n td.style.animation = \"pulse_neg 0.5s linear\";\n }\n } else if (\n col_idx !== undefined &&\n row_idx !== undefined &&\n (this.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==\n undefined &&\n (this.last_meta![col_idx]![row_idx] as number) <\n ((metadata.user ?? 0) as number)\n ) {\n td.style.setProperty(\"--pulse--background-color-start\", pos_s);\n td.style.setProperty(\"--pulse--background-color-end\", pos_e);\n if (td.style.animationName === \"pulse_pos\") {\n td.style.animation = \"pulse_pos2 0.5s linear\";\n } else {\n td.style.animation = \"pulse_pos 0.5s linear\";\n }\n } else if (row_idx !== metadata.dy) {\n td.style.animation = \"\";\n }\n } else {\n td.style.animation = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_cell_flash } from \"./cell_flash.js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\ninterface CellMetaWithExtras {\n _is_hidden_by_aggregate_depth?: boolean;\n user?: number;\n dy: number;\n column_header?: string[];\n}\n\ninterface PluginWithColors\n extends Omit<\n ColumnConfig,\n \"pos_fg_color\" | \"neg_fg_color\" | \"pos_bg_color\" | \"neg_bg_color\"\n > {\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n}\n\nexport function cell_style_numeric(\n this: DatagridModel,\n plugin: PluginWithColors | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n is_settings_open: boolean,\n): void {\n const is_positive = (metadata.user ?? 0) > 0;\n const is_negative = (metadata.user ?? 0) < 0;\n\n let pos_bg_color: ColorRecord;\n if (plugin?.pos_bg_color !== undefined) {\n pos_bg_color = plugin.pos_bg_color;\n } else {\n pos_bg_color = this._pos_bg_color;\n }\n\n let neg_bg_color: ColorRecord;\n if (plugin?.neg_bg_color !== undefined) {\n neg_bg_color = plugin.neg_bg_color;\n } else {\n neg_bg_color = this._neg_bg_color;\n }\n\n const bg_tuple: ColorRecord = is_positive\n ? pos_bg_color\n : is_negative\n ? neg_bg_color\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n\n {\n const [hex, r, g, b] = bg_tuple;\n\n td.style.position = \"\";\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n } else if (plugin?.number_bg_mode === \"color\") {\n td.style.animation = \"\";\n td.style.backgroundColor = hex;\n } else if (plugin?.number_bg_mode === \"gradient\") {\n const a = Math.max(\n 0,\n Math.min(\n 1,\n Math.abs((metadata.user ?? 0) / (plugin.bg_gradient ?? 1)),\n ),\n );\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, a], source),\n );\n\n td.style.animation = \"\";\n td.style.color = foreground;\n td.style.backgroundColor = `rgba(${r},${g},${b},${a})`;\n } else if (plugin?.number_bg_mode === \"pulse\") {\n style_cell_flash.call(\n this,\n metadata as any,\n td,\n pos_bg_color,\n neg_bg_color,\n is_settings_open,\n );\n td.style.backgroundColor = \"\";\n } else if (\n plugin?.number_bg_mode === \"disabled\" ||\n !plugin?.number_bg_mode\n ) {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n } else {\n td.style.animation = \"\";\n td.style.backgroundColor = \"\";\n }\n }\n\n const fg_tuple: ColorRecord = (() => {\n if (plugin?.pos_fg_color !== undefined) {\n return is_positive\n ? plugin.pos_fg_color\n : is_negative\n ? plugin.neg_fg_color!\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n } else {\n return is_positive\n ? this._pos_fg_color\n : is_negative\n ? this._neg_fg_color\n : [\n \"\",\n this._plugin_background[0],\n this._plugin_background[1],\n this._plugin_background[2],\n \"\",\n \"\",\n \"\",\n ];\n }\n })();\n\n const [hex, , , , gradhex] = fg_tuple;\n\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (plugin?.number_fg_mode === \"disabled\") {\n if (plugin?.number_bg_mode === \"color\") {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([bg_tuple[1], bg_tuple[2], bg_tuple[3], 1], source),\n );\n td.style.color = foreground;\n } else if (plugin?.number_bg_mode === \"gradient\") {\n // Color already set above\n } else {\n td.style.color = \"\";\n }\n } else if (plugin?.number_fg_mode === \"bar\") {\n td.style.color = \"\";\n td.style.position = \"relative\";\n if (\n gradhex !== \"\" &&\n td.children.length > 0 &&\n td.children[0].nodeType === Node.ELEMENT_NODE\n ) {\n (td.children[0] as HTMLElement).style.background = gradhex;\n }\n } else if (plugin?.number_fg_mode === \"color\" || !plugin?.number_fg_mode) {\n td.style.color = hex;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport chroma from \"chroma-js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\ninterface CellMetaWithExtras {\n _is_hidden_by_aggregate_depth?: boolean;\n user?: string | null;\n column_header?: string[];\n}\n\ninterface PluginWithColor extends Omit<ColumnConfig, \"color\"> {\n color?: ColorRecord;\n}\n\nexport function cell_style_string(\n this: DatagridModel,\n plugin: PluginWithColor | undefined,\n td: HTMLElement,\n metadata: CellMetaWithExtras,\n): void {\n const column_name = metadata.column_header?.[this._config.split_by.length];\n const colorRecord: ColorRecord = (() => {\n if (plugin?.color !== undefined) {\n return plugin.color;\n } else {\n return this._color;\n }\n })();\n\n const [hex, r, g, b] = colorRecord;\n\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (\n plugin?.string_color_mode === \"foreground\" &&\n metadata.user !== null\n ) {\n td.style.color = hex;\n td.style.backgroundColor = \"\";\n if (plugin?.format === \"link\" && td.children[0]) {\n (td.children[0] as HTMLElement).style.color = hex;\n }\n } else if (\n plugin?.string_color_mode === \"background\" &&\n metadata.user !== null\n ) {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex;\n } else if (\n plugin?.string_color_mode === \"series\" &&\n metadata.user !== null &&\n column_name\n ) {\n if (!this._series_color_map.has(column_name)) {\n this._series_color_map.set(column_name, new Map());\n this._series_color_seed.set(column_name, 0);\n }\n\n const series_map = this._series_color_map.get(column_name)!;\n if (metadata.user && !series_map.has(metadata.user)) {\n const seed = this._series_color_seed.get(column_name) ?? 0;\n series_map.set(metadata.user, seed);\n this._series_color_seed.set(column_name, seed + 1);\n }\n\n const color_seed = series_map.get(metadata.user!) ?? 0;\n let [h, s, l] = chroma(hex).hsl();\n h = h + ((color_seed * 150) % 360);\n const color2 = chroma(h, s, l, \"hsl\");\n const [r2, g2, b2] = color2.rgb();\n const hex2 = color2.hex();\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r2, g2, b2, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex2;\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport {\n rgbaToRgb,\n infer_foreground_from_background,\n} from \"../../color_utils.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\nexport function cell_style_datetime(\n this: DatagridModel,\n plugin: ColumnConfig,\n td: HTMLElement,\n metadata: CellMetadata,\n): void {\n const colorRecord: ColorRecord = //(() => {\n // if (plugin?.color !== undefined) {\n // return plugin.color;\n // } else {\n // return\n this._color;\n // }\n // })();\n\n const [hex, r, g, b] = colorRecord;\n\n // @ts-ignore\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else if (\n plugin?.datetime_color_mode === \"foreground\" &&\n metadata.user !== null\n ) {\n td.style.color = hex;\n td.style.backgroundColor = \"\";\n } else if (\n plugin?.datetime_color_mode === \"background\" &&\n metadata.user !== null\n ) {\n const source = this._plugin_background as [number, number, number];\n const foreground = infer_foreground_from_background(\n rgbaToRgb([r, g, b, 1], source),\n );\n td.style.color = foreground;\n td.style.backgroundColor = hex;\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel, ColumnConfig, ColorRecord } from \"../../types.js\";\n\nexport function cell_style_boolean(\n this: DatagridModel,\n _plugin: ColumnConfig | undefined,\n td: HTMLElement,\n metadata: CellMetadata,\n): void {\n // @ts-ignore\n if (metadata._is_hidden_by_aggregate_depth) {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n } else {\n const [hex]: ColorRecord | [string, number, number, number, string] =\n metadata.user === true\n ? this._pos_fg_color\n : metadata.user === false\n ? this._neg_fg_color\n : [\"\", 0, 0, 0, \"\"];\n td.style.backgroundColor = \"\";\n td.style.color = hex;\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n CellMetadata,\n CellMetadataRowHeader,\n} from \"regular-table/dist/esm/types.js\";\nimport type { DatagridModel } from \"../../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\nexport function cell_style_row_header(\n this: DatagridModel,\n regularTable: RegularTableElement,\n td: HTMLElement,\n metadata: CellMetadataRowHeader,\n): void {\n const is_not_empty =\n metadata.value !== undefined &&\n metadata.value !== null &&\n metadata.value?.toString()?.trim().length > 0;\n const is_leaf =\n (metadata.row_header_x ?? 0) >= this._config.group_by.length;\n const next = regularTable.getMeta({\n dx: 0,\n dy: (metadata.y ?? 0) - (metadata.y0 ?? 0) + 1,\n } as CellMetadata);\n\n const is_collapse =\n next &&\n next.row_header &&\n typeof next.row_header[(metadata.row_header_x ?? 0) + 1] !==\n \"undefined\";\n\n td.classList.toggle(\"psp-tree-label\", is_not_empty && !is_leaf);\n td.classList.toggle(\n \"psp-tree-label-expand\",\n is_not_empty && !is_leaf && !is_collapse,\n );\n\n td.classList.toggle(\n \"psp-tree-label-collapse\",\n is_not_empty && !is_leaf && is_collapse,\n );\n td.classList.toggle(\"psp-tree-leaf\", is_not_empty && is_leaf);\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\n\nimport {\n type DatagridModel,\n type PerspectiveViewerElement,\n type ColumnsConfig,\n type DatagridPluginElement,\n get_psp_type,\n} from \"../types.js\";\n\nimport { cell_style_numeric } from \"./table_cell/numeric.js\";\nimport { cell_style_string } from \"./table_cell/string.js\";\nimport { cell_style_datetime } from \"./table_cell/datetime.js\";\nimport { cell_style_boolean } from \"./table_cell/boolean.js\";\nimport { cell_style_row_header } from \"./table_cell/row_header.js\";\nimport {\n CollectedCell,\n LocalSelectedPositionMap,\n LocalSelectedRowsMap,\n} from \"./types.js\";\n\n/**\n * Apply styles to all body cells in a single pass.\n */\nexport function applyBodyCellStyles(\n this: DatagridModel,\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n): void {\n const hasSelected = selectedRowsMap.has(regularTable);\n const selected = selectedRowsMap.get(regularTable);\n\n for (const { element: td, metadata, isHeader } of cells) {\n const column_name =\n metadata.column_header?.[this._config.split_by.length];\n const type = get_psp_type(this, metadata);\n const plugin = column_name\n ? plugins[column_name.toString()]\n : undefined;\n const is_numeric = type === \"integer\" || type === \"float\";\n\n // Calculate aggregate depth visibility\n // @ts-ignore\n metadata._is_hidden_by_aggregate_depth = ((x?: number) =>\n x === 0 || x === undefined\n ? false\n : x - 1 <\n Math.min(\n this._config.group_by.length,\n plugin?.aggregate_depth || 0,\n ))(\n (metadata.row_header as unknown[] | undefined)?.filter(\n (x) => x !== undefined,\n )?.length,\n );\n\n // Apply type-specific cell styling\n if (is_numeric) {\n cell_style_numeric.call(\n this,\n plugin as any,\n td,\n metadata as any,\n isSettingsOpen,\n );\n } else if (type === \"boolean\") {\n cell_style_boolean.call(this, plugin, td, metadata as any);\n } else if (type === \"string\") {\n cell_style_string.call(this, plugin as any, td, metadata as any);\n } else if (type === \"date\" || type === \"datetime\") {\n cell_style_datetime.call(this, plugin as any, td, metadata as any);\n } else {\n td.style.backgroundColor = \"\";\n td.style.color = \"\";\n }\n\n // Apply common cell classes\n td.classList.toggle(\n \"psp-bool-type\",\n type === \"boolean\" && metadata.user !== null,\n );\n\n td.classList.toggle(\"psp-null\", metadata.value === null);\n td.classList.toggle(\"psp-align-right\", !isHeader && is_numeric);\n td.classList.toggle(\"psp-align-left\", isHeader || !is_numeric);\n if (this._column_settings_selected_column) {\n td.classList.toggle(\n \"psp-menu-open\",\n column_name === this._column_settings_selected_column,\n );\n } else {\n td.classList.toggle(\"psp-menu-open\", false);\n }\n\n td.classList.toggle(\n \"psp-color-mode-bar\",\n plugin?.number_fg_mode === \"bar\" && is_numeric,\n );\n\n // Apply row header styling\n if (isHeader) {\n cell_style_row_header.call(this, regularTable, td, metadata as any);\n }\n\n // Set data attributes\n const tr = td.parentElement as HTMLElement;\n if (tr) {\n tr.dataset.y = String(metadata.y);\n }\n\n if (\n metadata.type !== \"row_header\" ||\n metadata.row_header_x ===\n (metadata.row_header as unknown[]).length - 1 ||\n (metadata.row_header as unknown[])[metadata.row_header_x + 1] ===\n undefined\n ) {\n td.dataset.y = String(metadata.y);\n if (metadata.type !== \"row_header\") {\n td.dataset.x = String(metadata.x);\n } else {\n delete td.dataset.x;\n }\n } else {\n delete td.dataset.y;\n delete td.dataset.x;\n }\n\n // Apply selection styling (if selectable)\n if (isSelectable) {\n if (!hasSelected) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n } else {\n const id = this._ids[(metadata.y ?? 0) - (metadata.y0 ?? 0)];\n const key_match = (selected as unknown[]).reduce<boolean>(\n (agg, x, i) => agg && x === id[i],\n true,\n );\n\n const selectedArr = selected as unknown[];\n if (isHeader) {\n if (\n metadata.type === \"row_header\" &&\n metadata.row_header_x !== undefined &&\n !!id[metadata.row_header_x]\n ) {\n td.classList.toggle(\"psp-row-selected\", false);\n td.classList.toggle(\"psp-row-subselected\", false);\n } else {\n td.classList.toggle(\n \"psp-row-selected\",\n id.length === selectedArr.length && key_match,\n );\n td.classList.toggle(\n \"psp-row-subselected\",\n id.length !== selectedArr.length && key_match,\n );\n }\n } else {\n td.classList.toggle(\n \"psp-row-selected\",\n id.length === selectedArr.length && key_match,\n );\n td.classList.toggle(\n \"psp-row-subselected\",\n id.length !== selectedArr.length && key_match,\n );\n }\n }\n }\n\n // Apply editable styling (if editable)\n if (!isHeader && metadata.type === \"body\") {\n if (isEditable && this._is_editable[metadata.x]) {\n const col_name =\n metadata.column_header?.[this._config.split_by.length];\n const col_name_str = col_name?.toString();\n if (\n col_name_str &&\n type === \"string\" &&\n plugins[col_name_str]?.format === \"link\"\n ) {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\"boolean-editable\", false);\n } else if (type === \"boolean\") {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\n \"boolean-editable\",\n (metadata as { user?: unknown }).user !== null,\n );\n } else {\n if (isEditable !== td.hasAttribute(\"contenteditable\")) {\n td.toggleAttribute(\"contenteditable\", isEditable);\n }\n td.classList.toggle(\"boolean-editable\", false);\n }\n } else {\n td.toggleAttribute(\"contenteditable\", false);\n td.classList.toggle(\"boolean-editable\", false);\n }\n }\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { RegularTableElement } from \"regular-table\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport type {\n DatagridModel,\n PerspectiveViewerElement,\n ColumnsConfig,\n DatagridPluginElement,\n SelectedPosition,\n} from \"../types.js\";\n\nimport { applyFocusStyle } from \"./focus.js\";\nimport { styleColumnHeaderRow } from \"./column_header.js\";\nimport { applyColumnHeaderStyles } from \"./editable.js\";\nimport { applyGroupHeaderStyles } from \"./group_header.js\";\nimport { applyBodyCellStyles } from \"./body.js\";\nimport { CellMetadata } from \"regular-table/dist/esm/types.js\";\n\ninterface CollectedCell {\n element: HTMLElement;\n metadata: CellMetadata;\n isHeader: boolean;\n}\n\ninterface CollectedHeaderRow {\n row: HTMLTableRowElement;\n cells: Array<{\n element: HTMLTableCellElement;\n metadata: CellMetadata | undefined;\n }>;\n}\n\n/**\n * Context object passed through consolidated styling\n */\nexport interface StyleContext {\n model: DatagridModel;\n regularTable: RegularTableElement;\n viewer: PerspectiveViewerElement;\n datagrid: DatagridPluginElement;\n plugins: ColumnsConfig;\n isSettingsOpen: boolean;\n isSelectable: boolean;\n isEditable: boolean;\n selectedRowsMap: Map<RegularTableElement, unknown[]>;\n selectedPositionMap: Map<RegularTableElement, SelectedPosition>;\n}\n\n// Local types for selection maps - match the actual runtime usage\n// (activate.ts uses `as any` casts when passing these)\ntype LocalSelectedRowsMap = WeakMap<RegularTableElement, unknown[]>;\ntype LocalSelectedPositionMap = WeakMap<RegularTableElement, SelectedPosition>;\n\nfunction isEditableMode(\n model: DatagridModel,\n viewer: PerspectiveViewerElement,\n allowed: boolean = false,\n): boolean {\n const has_pivots =\n model._config.group_by.length === 0 &&\n model._config.split_by.length === 0;\n const selectable = viewer.hasAttribute(\"selectable\");\n const plugin = viewer.children[0] as\n | (DatagridPluginElement & { dataset: DOMStringMap })\n | undefined;\n const editable = allowed || plugin?.dataset?.editMode === \"EDIT\";\n return has_pivots && !selectable && editable;\n}\n\n/**\n * Consolidated style listener that handles all cell styling in a single pass.\n * This eliminates redundant DOM traversals and reduces layout thrashing by:\n * 1. Collecting all cell metadata in a read phase\n * 2. Applying all styles in a write phase\n */\nexport function createConsolidatedStyleListener(\n datagrid: DatagridPluginElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n): (\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n) => void {\n return function consolidatedStyleListener(\n this: DatagridModel,\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void {\n const plugins: ColumnsConfig =\n (regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};\n const isSettingsOpen = viewer.hasAttribute(\"settings\");\n const isSelectable = viewer.hasAttribute(\"selectable\");\n const isEditable = isEditableMode(this, viewer);\n const isEditableAllowed = isEditableMode(this, viewer, true);\n\n // Toggle edit mode class on datagrid\n datagrid.classList.toggle(\"edit-mode-allowed\", isEditableAllowed);\n const bodyCells: CollectedCell[] = [];\n const groupHeaderRows: CollectedHeaderRow[] = [];\n const tbody = regularTable.children[0]?.children[1];\n if (tbody) {\n for (const tr of tbody.children) {\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(\n cell as HTMLElement,\n ) as CellMetadata | undefined;\n\n if (metadata) {\n const isHeader = cell.tagName === \"TH\";\n bodyCells.push({\n element: cell as HTMLElement,\n metadata,\n isHeader,\n });\n }\n }\n }\n }\n\n // Collect header rows (thead)\n const thead = regularTable.children[0]?.children[0];\n if (thead) {\n for (const tr of thead.children) {\n const rowData: CollectedHeaderRow = {\n row: tr as HTMLTableRowElement,\n cells: [],\n };\n\n for (const cell of tr.children) {\n const metadata = regularTable.getMeta(\n cell as HTMLElement,\n ) as CellMetadata | undefined;\n\n rowData.cells.push({\n element: cell as HTMLTableCellElement,\n metadata,\n });\n }\n groupHeaderRows.push(rowData);\n }\n }\n\n this._applyBodyCellStyles(\n bodyCells,\n plugins,\n isSettingsOpen,\n isSelectable,\n isEditable,\n regularTable,\n selectedRowsMap,\n selectedPositionMap,\n viewer,\n );\n\n this._applyGroupHeaderStyles(groupHeaderRows, regularTable);\n this._applyColumnHeaderStyles(groupHeaderRows, regularTable, viewer);\n this._applyFocusStyle(bodyCells, regularTable, selectedPositionMap);\n };\n}\n\ndeclare module \"../types.js\" {\n interface DatagridModel {\n _applyBodyCellStyles(\n cells: CollectedCell[],\n plugins: ColumnsConfig,\n isSettingsOpen: boolean,\n isSelectable: boolean,\n isEditable: boolean,\n regularTable: RegularTableElement,\n selectedRowsMap: LocalSelectedRowsMap,\n selectedPositionMap: LocalSelectedPositionMap,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyGroupHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n ): void;\n _applyColumnHeaderStyles(\n headerRows: CollectedHeaderRow[],\n regularTable: RegularTableElement,\n viewer: PerspectiveViewerElement,\n ): void;\n _applyFocusStyle(\n cells: CollectedCell[],\n regularTable: RegularTableElement,\n selectedPositionMap: LocalSelectedPositionMap,\n ): void;\n _styleColumnHeaderRow(\n headerRow: CollectedHeaderRow,\n regularTable: RegularTableElement,\n is_menu_row: boolean,\n ): void;\n }\n}\n\n/**\n * Install the styling methods on the DatagridModel prototype.\n * This should be called once during module initialization.\n */\nexport function installConsolidatedStyleMethods(modelPrototype: any): void {\n modelPrototype._applyBodyCellStyles = applyBodyCellStyles;\n modelPrototype._applyGroupHeaderStyles = applyGroupHeaderStyles;\n modelPrototype._applyColumnHeaderStyles = applyColumnHeaderStyles;\n modelPrototype._applyFocusStyle = applyFocusStyle;\n modelPrototype._styleColumnHeaderRow = styleColumnHeaderRow;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { style_selected_column } from \"../style_handlers/column_header.js\";\nimport {\n click_listener,\n mousedown_listener,\n} from \"../event_handlers/header_click.js\";\n\nimport { focusinListener, focusoutListener } from \"../event_handlers/focus.js\";\nimport { keydownListener, clickListener } from \"../event_handlers/click.js\";\n\nimport { selectionListener } from \"../event_handlers/row_select_click.js\";\nimport { deselect_all_listener } from \"../event_handlers/deselect_all.js\";\n\nimport { createModel } from \"../model/create.js\";\nimport { dispatch_click_listener } from \"../event_handlers/dispatch_click.js\";\n\nimport { addAreaMouseSelection } from \"../event_handlers/select_region.js\";\n\nimport {\n createConsolidatedStyleListener,\n installConsolidatedStyleMethods,\n} from \"../style_handlers/consolidated.js\";\n\nimport type { View } from \"@perspective-dev/client\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n SelectedPosition,\n} from \"../types.js\";\nimport type { RegularTableElement } from \"regular-table\";\n\ninterface ToggleColumnSettingsEvent extends CustomEvent {\n detail: {\n column_name: string | null;\n open: boolean;\n };\n}\n\n/**\n * Lazy initialize this plugin with various listeners.\n */\nexport async function activate(\n this: DatagridPluginElement,\n view: View,\n): Promise<void> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const table = await viewer.getTable();\n\n if (!this._initialized) {\n this.innerHTML = \"\";\n if (this.shadowRoot) {\n this.shadowRoot.appendChild(this.regular_table);\n } else {\n this.appendChild(this.regular_table);\n }\n\n this.model = await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n );\n\n if (!this.model) {\n return;\n }\n\n addAreaMouseSelection(this, this.regular_table, {\n className: \"psp-select-region\",\n });\n\n // Create shared state maps for selection and focus tracking\n const selected_rows_map = new WeakMap<\n RegularTableElement,\n Set<number>\n >();\n const selected_position_map = new WeakMap<\n RegularTableElement,\n SelectedPosition\n >();\n\n // Install consolidated style methods on model prototype\n installConsolidatedStyleMethods(this.model);\n\n // Single consolidated style listener replaces:\n // - table_cell_style_listener\n // - group_header_style_listener\n // - column_header_style_listener\n // - selectionStyleListener\n // - editable_style_listener\n // - focus_style_listener\n this.regular_table.addStyleListener(\n createConsolidatedStyleListener(\n this,\n selected_rows_map as any,\n selected_position_map as any,\n ).bind(this.model, this.regular_table, viewer),\n );\n\n // uh ..\n this.regular_table.addEventListener(\n \"click\",\n click_listener.bind(\n this.model,\n this.regular_table,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"mousedown\",\n selectionListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"psp-deselect-all\",\n deselect_all_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_rows_map as any,\n ) as unknown as EventListener,\n );\n\n // User event click\n this.regular_table.addEventListener(\n \"click\",\n dispatch_click_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // tree collapse, expand, edit button headers\n this.regular_table.addEventListener(\n \"mousedown\",\n mousedown_listener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as unknown as EventListener,\n );\n\n // Editing event handlers (style handling is now in consolidated listener)\n // TODO relies on this.model._is_editable\n this.regular_table.addEventListener(\n \"click\",\n clickListener.bind(\n this.model,\n this.regular_table,\n viewer,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusin\",\n focusinListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"focusout\",\n focusoutListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n this.regular_table.addEventListener(\n \"keydown\",\n keydownListener.bind(\n this.model,\n this.regular_table,\n viewer,\n selected_position_map as any,\n ) as EventListener,\n );\n\n // viewer event listeners\n viewer.addEventListener(\n \"perspective-toggle-column-settings\",\n (event: Event) => {\n const toggleEvent = event as ToggleColumnSettingsEvent;\n if (this.isConnected) {\n style_selected_column.call(\n this.model!,\n this.regular_table,\n viewer,\n toggleEvent.detail.column_name ?? undefined,\n );\n if (!toggleEvent.detail.open) {\n this.model!._column_settings_selected_column =\n undefined;\n return;\n }\n\n this.model!._column_settings_selected_column =\n toggleEvent.detail.column_name ?? undefined;\n }\n },\n );\n\n this._initialized = true;\n } else {\n await createModel.call(\n this,\n this.regular_table,\n table,\n view,\n this.model,\n );\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { restore_column_size_overrides } from \"../model/column_overrides.js\";\nimport {\n EDIT_MODES,\n toggle_edit_mode,\n toggle_scroll_lock,\n} from \"../model/toolbar.js\";\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { make_color_record } from \"../color_utils.js\";\nimport type {\n DatagridPluginElement,\n ColumnOverrides,\n EditMode,\n ColumnsConfig,\n ColorRecord,\n} from \"../types.js\";\n\ninterface RestoreToken {\n columns?: Record<string, { column_size_override?: number }>;\n edit_mode?: EditMode;\n scroll_lock?: boolean;\n}\n\n// interface ColumnConfigWithColors {\n// pos_fg_color?: string;\n// neg_fg_color?: string;\n// pos_bg_color?: string;\n// neg_bg_color?: string;\n// color?: string;\n// [key: string]: unknown;\n// }\n\ninterface StylesConfig {\n pos_fg_color?: ColorRecord;\n neg_fg_color?: ColorRecord;\n pos_bg_color?: ColorRecord;\n neg_bg_color?: ColorRecord;\n color?: ColorRecord;\n [key: string]: unknown;\n}\n\nexport function restore(\n this: DatagridPluginElement,\n token: RestoreToken,\n columns: ColumnsConfig,\n): void {\n token = JSON.parse(JSON.stringify(token));\n columns = JSON.parse(JSON.stringify(columns));\n const overrides: ColumnOverrides = {};\n\n if (token.columns) {\n for (const [col, value] of Object.entries(token.columns)) {\n if (value.column_size_override !== undefined) {\n overrides[col] = value.column_size_override;\n delete value[\"column_size_override\"];\n }\n }\n }\n\n const styles: Record<string, StylesConfig> = {};\n if (columns) {\n for (const [col_name, controls] of Object.entries(columns)) {\n styles[col_name] = {\n ...controls,\n pos_fg_color: controls.pos_fg_color\n ? make_color_record(controls.pos_fg_color)\n : undefined,\n neg_fg_color: controls.neg_fg_color\n ? make_color_record(controls.neg_fg_color)\n : undefined,\n pos_bg_color: controls.pos_bg_color\n ? make_color_record(controls.pos_bg_color)\n : undefined,\n neg_bg_color: controls.neg_bg_color\n ? make_color_record(controls.neg_bg_color)\n : undefined,\n color: controls.color\n ? make_color_record(controls.color)\n : undefined,\n };\n }\n }\n\n if (\"edit_mode\" in token && token.edit_mode) {\n if (EDIT_MODES.indexOf(token.edit_mode) !== -1) {\n toggle_edit_mode.call(this, token.edit_mode);\n } else {\n console.error(\"Unknown edit mode \" + token.edit_mode);\n }\n }\n\n if (\"scroll_lock\" in token) {\n toggle_scroll_lock.call(this, token.scroll_lock);\n }\n\n const datagrid = this.regular_table;\n restore_column_size_overrides.call(this, overrides, true);\n (datagrid as any)[PRIVATE_PLUGIN_SYMBOL] = styles as ColumnsConfig;\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { save_column_size_overrides } from \"../model/column_overrides.js\";\nimport type {\n DatagridPluginElement,\n DatagridPluginConfig,\n EditMode,\n} from \"../types.js\";\n\nexport function save(\n this: DatagridPluginElement,\n): DatagridPluginConfig | Record<string, never> {\n if (this.regular_table) {\n const token: DatagridPluginConfig = {\n columns: {},\n scroll_lock: !!this._is_scroll_lock,\n edit_mode: this._edit_mode,\n };\n\n const column_size_overrides = save_column_size_overrides.call(this);\n\n for (const col of Object.keys(column_size_overrides || {})) {\n if (!token.columns?.[col]) {\n token.columns = token.columns || {};\n token.columns[col] = {};\n }\n\n token.columns[col].column_size_override =\n column_size_overrides[col];\n }\n\n return JSON.parse(JSON.stringify(token));\n }\n return {};\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport {\n restore_column_size_overrides,\n save_column_size_overrides,\n} from \"../model/column_overrides.js\";\nimport type { View } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface DatagridPluginWithActivate extends DatagridPluginElement {\n activate(view: View): Promise<void>;\n}\n\nexport async function draw(\n this: DatagridPluginWithActivate,\n view: View,\n): Promise<void> {\n if (this.parentElement) {\n await this.activate(view);\n }\n\n if (!this.isConnected || this.offsetParent == null || !this.model) {\n return;\n }\n\n const old_sizes = save_column_size_overrides.call(this);\n const drawPromise = this.regular_table.draw({\n invalid_columns: true,\n } as any);\n if (this._reset_scroll_top) {\n this.regular_table.scrollTop = 0;\n this._reset_scroll_top = false;\n }\n\n if (this._reset_scroll_left) {\n this.regular_table.scrollLeft = 0;\n this._reset_scroll_left = false;\n }\n if (this._reset_select) {\n this.regular_table.dispatchEvent(\n new CustomEvent(\"psp-deselect-all\", { bubbles: false }),\n );\n this._reset_select = false;\n }\n\n if (this._reset_column_size) {\n this.regular_table.resetAutoSize();\n this._reset_column_size = false;\n }\n\n restore_column_size_overrides.call(this, old_sizes);\n await drawPromise;\n\n this._toolbar?.classList.toggle(\n \"aggregated\",\n this.model._config.group_by.length > 0 ||\n this.model._config.split_by.length > 0,\n );\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { ColumnType } from \"@perspective-dev/client\";\nimport type { DatagridPluginElement } from \"../types.js\";\n\ninterface NumberStyleOpts {\n datagrid_number_style: {\n fg_gradient: number;\n pos_fg_color: string;\n neg_fg_color: string;\n number_fg_mode: string;\n bg_gradient: number;\n pos_bg_color: string;\n neg_bg_color: string;\n number_bg_mode: string;\n };\n number_string_format: boolean;\n}\n\ninterface DatetimeStyleOpts {\n datagrid_datetime_style?: {\n color: string;\n bg_color: string;\n };\n datagrid_string_style?: {\n color: string;\n bg_color: string;\n };\n}\n\nexport type ColumnStyleOpts = NumberStyleOpts | DatetimeStyleOpts | null;\n\nexport default function column_style_opts(\n this: DatagridPluginElement,\n type: ColumnType,\n _group: string,\n): ColumnStyleOpts {\n if (type === \"integer\" || type === \"float\") {\n return {\n datagrid_number_style: {\n fg_gradient: 0,\n pos_fg_color: this.model!._pos_fg_color[0],\n neg_fg_color: this.model!._neg_fg_color[0],\n number_fg_mode: \"color\",\n bg_gradient: 0,\n pos_bg_color: this.model!._pos_bg_color[0],\n neg_bg_color: this.model!._neg_bg_color[0],\n number_bg_mode: \"disabled\",\n },\n number_string_format: true,\n };\n } else if (type === \"date\" || type === \"datetime\" || type === \"string\") {\n const control =\n type === \"date\" || type === \"datetime\"\n ? \"datagrid_datetime_style\"\n : `datagrid_string_style`;\n return {\n [control]: {\n color: this.model!._color[0],\n bg_color: this.model!._color[0],\n },\n } as DatetimeStyleOpts;\n } else {\n return null;\n }\n}\n", "regular-table{padding:0;margin:12px 0 0 12px;font-family:inherit;--rt-hover--border-color:var(--inactive--color,#c5c9d080);}regular-table div[tabindex]{outline:none;}regular-table>div{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden;}regular-table th{text-align:center;}regular-table thead tr:not(.rt-autosize) th{overflow:hidden;max-width:0px;}regular-table thead tr:last-child .rt-float,regular-table tbody .rt-float{text-align:right;}regular-table thead .rt-integer,regular-table tbody .rt-integer{text-align:right;}regular-table tbody th{text-align:left;}regular-table span.rt-tree-container{display:flex;align-items:center;height:100%;}regular-table thead .rt-string,regular-table tbody .rt-string,regular-table thead .rt-date,regular-table tbody .rt-date,regular-table thead .rt-datetime,regular-table tbody .rt-datetime{text-align:left;}regular-table thead tr:last-child th{border-bottom:1px solid#8b868045;}regular-table tbody tr:first-child td,regular-table tbody tr:first-child th{border-top:1px solid transparent!important;}regular-table th{position:relative;}regular-table tr th span.rt-tree-group{margin-left:5px;margin-right:15px;border-left:1px solid#eee;height:100%;}regular-table td,regular-table th{white-space:nowrap;font-size:12px;padding-right:5px;padding-left:5px;padding-top:0px;padding-bottom:0px;height:19px;}regular-table table *{box-sizing:border-box;}regular-table table{position:absolute;color:#666;outline:none;}regular-table span.rt-row-header-icon{color:#aaa;padding-right:4px;font-family:var(--button--font-family);}regular-table span.rt-column-header-icon{font-size:10px;padding-left:3px;display:inline-block;width:10px;font-family:var(--button--font-family);}regular-table span.rt-row-header-icon:hover{color:#1a7da1;text-shadow:0px 0px 3px#1a7da1;}regular-table .rt-selected td{background-color:#eee;}regular-table .rt-cell-clip{overflow:hidden;text-overflow:ellipsis;}regular-table td span.rt-group-name,regular-table th span.rt-group-name{margin-right:-5px;padding-right:5px;padding-left:8px;flex:1;height:100%;}regular-table th span.rt-group-name{text-align:left;}regular-table td th span.rt-group-leaf,regular-table th span.rt-group-leaf{margin-left:16px;height:100%;}regular-table .rt-column-resize{height:100%;width:10px;position:absolute;top:0;right:0;cursor:col-resize;}regular-table a{color:var(--rt-pos-cell--color);}regular-table a:visited{color:var(--active--color);}regular-table td.psp-null:after,regular-table th.psp-null:after{content:var(--null--content,\"-\");}.psp-header-border:not(.psp-is-top):not(.psp-header-leaf){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-group{box-shadow:0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-is-top{box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045);}.psp-is-top.psp-header-group:not(.psp-header-group-corner){box-shadow:5px 4px 0px -4px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}.psp-header-border.psp-header-group:not(.psp-is-top):not(.psp-header-group-corner){box-shadow:1px 0px var(--inactive--border-color,#8b868045),0px 10px 0 -9px var(--inactive--border-color,#8b868045);}perspective-viewer[settings] tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer[settings]) tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled){box-shadow:1px 0px var(--inactive--border-color,#8b868045);}.psp-header-leaf.psp-header-border{box-shadow:5px -4px 0px -4px var(--inactive--border-color,#8b868045);}tr:only-child th{box-shadow:none!important;}regular-table tbody tr:hover th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover:after{border-color:var(--rt-hover--border-color,#c5c9d080)!important;box-shadow:0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover th.psp-tree-leaf.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover th.psp-tree-label.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr.psp-menu-open:hover:after{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:last-child:hover td.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color),0px 1px 0px var(--rt-hover--border-color,#c5c9d080);}regular-table tbody tr:hover+tr th.psp-tree-leaf:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td:not(.psp-row-selected):not(.psp-row-subselected){border-top-color:transparent;}regular-table tbody tr th:first-child:not(:empty),regular-table tbody tr th:first-child:empty+th:not(:empty),regular-table tbody tr th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr td:first-child{border-left-width:1px;border-left-color:transparent;}regular-table tbody tr th:last-child,regular-table tbody tr td:last-child{border-right-width:0px;border-right-color:transparent;}regular-table tbody tr:hover{color:inherit;}regular-table tbody tr:hover th:first-child:not(:empty),regular-table tbody tr:hover th:first-child:empty+th:not(:empty),regular-table tbody tr:hover th:first-child:empty~th:empty+th:not(:empty),regular-table tbody tr:hover td:first-child{border-left-color:var(--rt-hover--border-color,#c5c9d080)!important;}regular-table tbody tr:hover th:last-child,regular-table tbody tr:hover td:last-child{border-right-color:var(--rt-hover--border-color,#c5c9d080)!important;}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody td,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead th:not(.rt-group-corner){transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody{transform:translate(0,var(--regular-table--transform-y,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child th,perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child th,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:first-child td:first-of-type,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:first-child td:first-of-type{clip-path:polygon(var(--regular-table--clip-x,0) var(--regular-table--clip-y,0),var(--regular-table--clip-x,0) 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr:last-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr:last-child:after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:not(:first-child):after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:not(:first-child):after{transform:translate(var(--regular-table--transform-x,0px));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table tbody tr:hover:first-child:after,:host(:not(.sub-cell-scroll-disabled)) regular-table table tbody tr:hover:first-child:after{clip-path:polygon(0 var(--regular-table--clip-y,0),0 200%,200% 200%,200% var(--regular-table--clip-y,0));}perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner),:host(:not(.sub-cell-scroll-disabled)) regular-table table thead tr th.rt-group-corner+th:not(.rt-group-corner){clip-path:polygon(var(--regular-table--clip-x,0) 0,var(--regular-table--clip-x,0) 200%,200% 200%,200% 0);}regular-table{outline:none;}regular-table::-webkit-scrollbar,regular-table::-webkit-scrollbar-corner{background-color:transparent;height:12px;width:12px;}regular-table::-webkit-scrollbar-thumb{background-clip:content-box;background:var(--icon--color);border:5.5px solid var(--plugin--background);max-height:50%;max-width:50%;min-width:10%;min-height:10%;}perspective-viewer .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}perspective-viewer .psp-menu-enabled:hover,perspective-viewer tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}perspective-viewer tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}perspective-viewer td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}perspective-viewer tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}perspective-viewer tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}:host .psp-menu-enabled{padding:0 6px;font-size:8px;border-radius:3px 3px 0 0;}:host .psp-menu-enabled:hover,:host tr:not(.rt-autosize) th.psp-menu-open{color:var(--plugin--background);background-color:var(--icon--color);border-bottom-color:var(--icon--color);cursor:pointer;}:host tr:not(.rt-autosize) th.psp-menu-open:before{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;height:8px;width:10px;-webkit-mask-image:var(--column-settings-icon--mask-image);mask-image:var(--column-settings-icon--mask-image);margin-right:4px;background-color:var(--plugin--background);}:host td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color);}:host tr:first-child td.psp-menu-open{border-top-color:var(--icon--color)!important;}:host tr:last-child td.psp-menu-open{box-shadow:inset -2px 0px 0px var(--icon--color),inset 2px 0px 0px var(--icon--color),inset 0px -2px 0px var(--icon--color);}perspective-viewer regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}:host-context(perspective-viewer) regular-table table thead tr:last-child th{border-bottom-width:1px;border-bottom-color:var(--inactive--border-color,#8b868045);}.psp-sort-enabled:hover{cursor:pointer;}.psp-row-selected,:hover .psp-row-selected,:hover th.psp-tree-leaf.psp-row-selected,:hover th.psp-tree-label.psp-row-selected{color:white!important;background-color:var(--selected-row--background-color,#ea7319)!important;border-color:var(--selected-row--background-color,#ea7319)!important;}.psp-row-selected.psp-tree-label:not(:hover):before{color:white;}.psp-row-subselected,:hover .psp-row-subselected,:hover th.psp-tree-leaf.psp-row-subselected,:hover th.psp-tree-label.psp-row-subselected{background:rgba(234,115,25,0.2)!important;}.psp-error{color:red;}td:focus{outline:#666;outline-style:dotted;outline-width:1px;}perspective-viewer.dragging regular-table{pointer-events:none;}:host-context(perspective-viewer.dragging) regular-table{pointer-events:none;}.psp-header-border:last-child{border-right-width:0px;}.psp-header-sort-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-desc-icon--mask-image);mask-image:var(--sort-desc-icon--mask-image);}.psp-header-sort-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-asc-icon--mask-image);mask-image:var(--sort-asc-icon--mask-image);}.psp-header-sort-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-desc-icon--mask-image);mask-image:var(--sort-col-desc-icon--mask-image);}.psp-header-sort-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-col-asc-icon--mask-image);mask-image:var(--sort-col-asc-icon--mask-image);}.psp-header-sort-abs-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-desc-icon--mask-image);mask-image:var(--sort-abs-desc-icon--mask-image);}.psp-header-sort-abs-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-asc-icon--mask-image);mask-image:var(--sort-abs-asc-icon--mask-image);}.psp-header-sort-abs-col-desc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-desc-icon--mask-image);mask-image:var(--sort-abs-col-desc-icon--mask-image);}.psp-header-sort-abs-col-asc:after{background-repeat:no-repeat;background-color:var(--icon--color);content:\"\";display:inline-block;-webkit-mask-size:cover;mask-size:cover;width:14px;height:11px;margin-left:4px;-webkit-mask-image:var(--sort-abs-col-asc-icon--mask-image);mask-image:var(--sort-abs-col-asc-icon--mask-image);}tbody th:last-of-type{border-right:1px solid var(--inactive--border-color,#8b868045);overflow:hidden;text-overflow:ellipsis;}tbody th:empty{background-image:linear-gradient(to right,transparent 9px,var(--inactive--border-color,#eee) 10px,transparent 11px);background-repeat:no-repeat;min-width:20px;max-width:20px;pointer-events:none;}.psp-tree-label{max-width:0px;min-width:0px;}.psp-tree-label:before{color:var(--icon--color);font-family:var(--button--font-family,inherit);padding-right:11px;}.psp-tree-label-expand:before{content:var(--tree-label-expand--content,\"+\");}.psp-tree-label-collapse:before{content:var(--tree-label-collapse--content,\"-\");}.psp-tree-label-expand,.psp-tree-label-collapse{cursor:pointer;}.psp-tree-label:hover:before{color:var(--active--color);text-shadow:0px 0px 5px var(--active--color);}.psp-tree-leaf{padding-left:24px;}.psp-align-right{text-align:right;}.psp-align-left{text-align:left;}.psp-positive:not(:focus){color:var(--rt-pos-cell--color);}.psp-negative:not(:focus){color:var(--rt-neg-cell--color);}regular-table table tbody td{min-width:52px!important;}.psp-is-width-override .rt-column-resize,.rt-column-resize:hover{border:1px dashed#999;border-bottom-width:0px;border-left-width:0px;}.boolean-editable{cursor:pointer;}regular-table table{user-select:none;color:inherit;border-collapse:separate;}regular-table table th{font-weight:400;}regular-table table td,regular-table table th{border-color:var(--inactive--border-color,#8b868045);height:23px;}regular-table table .psp-header-group{text-overflow:ellipsis;}regular-table table th.psp-header-leaf{border-bottom-width:0px;}regular-table table th.psp-header-leaf span{height:23px;min-height:23px;}regular-table table td,regular-table table th.psp-tree-label,regular-table table th.psp-tree-label,regular-table table th.psp-tree-leaf,regular-table table tbody tr:first-child th{border-style:solid;border-width:0px;border-top-width:1px;}regular-table table tbody th:empty{background-position:0px -10px;}regular-table table td.psp-select-region,regular-table table th.psp-select-region{background-color:var(--icon--color)!important;color:var(--plugin--background)!important;border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected),regular-table tbody tr:hover+tr td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected){border-color:var(--plugin--background)!important;}regular-table tbody tr:hover td.psp-select-region.psp-menu-open:not(.psp-row-selected):not(.psp-row-subselected){box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}:host-context(perspective-viewer[settings]) td.psp-select-region.psp-menu-open{box-shadow:inset -2px 0px 0px var(--plugin--background),inset 2px 0px 0px var(--plugin--background);}regular-table #psp-column-edit-buttons th:not(.rt-group-corner) span:not(.rt-column-resize):before{content:var(--datagrid-column-edit-button--content,\"Edit\");}perspective-viewer:not([settings]) regular-table #psp-column-edit-buttons:after{content:none;}:host-context(perspective-viewer:not([settings])) regular-table #psp-column-edit-buttons:after{content:none;}regular-table table thead tr:last-child:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-bottom:1px solid var(--inactive--border-color);}regular-table table tbody tr:after{width:10000px;box-sizing:border-box;display:block;height:23px;content:\" \";border-top:1px solid transparent;}regular-table table tbody tr:not(:first-child):after{border-top:1px solid var(--inactive--border-color);}regular-table table tbody tr:hover:not(:first-child):after{border-top:1px solid var(--rt-hover--border-color);}regular-table table tbody tr:hover+tr:after{border-top:1px solid var(--rt-hover--border-color);}@keyframes pulse_pos{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_pos2{0%{background-color:var(--pulse--background-color-start,rgba(0,128,255,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(0,128,255,0));}}@keyframes pulse_neg{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}@keyframes pulse_neg2{0%{background-color:var(--pulse--background-color-start,rgba(255,25,0,0.5));}100%{background-color:var(--pulse--background-color-end,rgba(255,25,0,0));}}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport { PRIVATE_PLUGIN_SYMBOL } from \"../model/index.js\";\nimport { activate } from \"../plugin/activate.js\";\nimport { restore } from \"../plugin/restore.js\";\nimport { save } from \"../plugin/save.js\";\nimport { draw } from \"../plugin/draw.js\";\nimport column_style_controls, {\n ColumnStyleOpts,\n} from \"../plugin/column_style_controls.js\";\nimport datagridStyles from \"../../../dist/css/perspective-viewer-datagrid.css\";\nimport { format_raw } from \"../data_listener/format_cell.js\";\n\nimport type { View, ViewWindow } from \"@perspective-dev/client\";\nimport type { IPerspectiveViewerPlugin } from \"@perspective-dev/viewer\";\nimport type {\n DatagridModel,\n DatagridToolbarElement,\n EditMode,\n PerspectiveViewerElement,\n DatagridPluginConfig,\n ColumnsConfig,\n} from \"../types.js\";\nimport { RegularTableElement } from \"regular-table\";\n\ntype RenderTarget = \"shadow\" | \"light\";\n\n/**\n * The custom element class for this plugin. The interface methods for this\n */\nexport class HTMLPerspectiveViewerDatagridPluginElement\n extends HTMLElement\n implements IPerspectiveViewerPlugin\n{\n private static _global_stylesheet_installed: boolean = false;\n private static _sheet: CSSStyleSheet | undefined;\n\n // Determines whether this datagrid renders in the light DOM. This will\n // break style encapsulation and may cause inconsistent behavior.\n static renderTarget: RenderTarget =\n window.CSS?.supports &&\n window.CSS?.supports(\"selector(:host-context(foo))\")\n ? \"shadow\"\n : \"light\";\n\n regular_table: RegularTableElement;\n model?: DatagridModel;\n _toolbar?: DatagridToolbarElement;\n _edit_button?: HTMLElement;\n _scroll_lock?: HTMLElement;\n _is_scroll_lock: boolean;\n _edit_mode: EditMode;\n _initialized?: boolean;\n _reset_scroll_top?: boolean;\n _reset_scroll_left?: boolean;\n _reset_select?: boolean;\n _reset_column_size?: boolean;\n\n constructor() {\n super();\n this.regular_table = document.createElement(\n \"regular-table\",\n ) as RegularTableElement;\n this.regular_table.part = \"regular-table\";\n this._is_scroll_lock = false;\n this._edit_mode = \"READ_ONLY\";\n const Elem = HTMLPerspectiveViewerDatagridPluginElement;\n if (!Elem._sheet) {\n Elem._sheet = new CSSStyleSheet();\n Elem._sheet.replaceSync(datagridStyles);\n }\n\n if (Elem.renderTarget === \"shadow\") {\n const shadow = this.attachShadow({ mode: \"open\" });\n shadow.adoptedStyleSheets.push(Elem._sheet);\n } else if (\n Elem.renderTarget === \"light\" &&\n !Elem._global_stylesheet_installed\n ) {\n Elem._global_stylesheet_installed = true;\n document.adoptedStyleSheets.push(Elem._sheet);\n }\n }\n\n connectedCallback(): void {\n if (!this._toolbar) {\n this._toolbar = document.createElement(\n \"perspective-viewer-datagrid-toolbar\",\n ) as DatagridToolbarElement;\n }\n\n const parent = this.parentElement;\n if (parent) {\n parent.appendChild(this._toolbar);\n }\n }\n\n disconnectedCallback(): void {\n this._toolbar?.parentElement?.removeChild?.(this._toolbar);\n }\n\n async activate(view: View): Promise<void> {\n return await activate.call(this, view);\n }\n\n get name(): string {\n return \"Datagrid\";\n }\n\n get category(): string {\n return \"Basic\";\n }\n\n get select_mode(): string {\n return \"toggle\";\n }\n\n get min_config_columns(): number | undefined {\n return undefined;\n }\n\n get config_column_names(): string[] {\n return [\"Columns\"];\n }\n\n /**\n * Give the Datagrid a higher priority so it is loaded\n * over the default charts by default.\n */\n get priority(): number {\n return 1;\n }\n\n can_render_column_styles(type: string, _group: string): boolean {\n return type !== \"boolean\";\n }\n\n column_style_controls(type: string, group: string): ColumnStyleOpts {\n return column_style_controls.call(this, type as any, group);\n }\n\n async draw(view: View): Promise<void> {\n return await draw.call(this, view);\n }\n\n async update(view: View): Promise<void> {\n if (this.model === undefined) {\n await this.draw(view);\n } else if (this.model._config.split_by?.length > 0) {\n const dimensions = await view.dimensions();\n this.model._num_rows = dimensions.num_view_rows;\n await this.regular_table.draw();\n } else {\n this.model._num_rows = await view.num_rows();\n await this.regular_table.draw();\n }\n }\n\n async render(viewport?: ViewWindow): Promise<string> {\n const viewer = this.parentElement as PerspectiveViewerElement;\n const view = await viewer.getView();\n const json = await view.to_columns(viewport as any);\n const cols = await view.column_paths(viewport as any);\n\n const nrows =\n viewport?.end_row !== undefined &&\n viewport?.end_row !== null &&\n viewport?.start_row !== undefined &&\n viewport?.start_row !== null\n ? viewport.end_row - viewport.start_row\n : await view.num_rows();\n let out = \"\";\n for (let ridx = 0; ridx < nrows; ridx++) {\n for (const col_name of cols) {\n const col = (json as Record<string, unknown[]>)[col_name];\n const type = this.model!._schema[col_name];\n const pluginConfig = (this.regular_table as any)[\n PRIVATE_PLUGIN_SYMBOL\n ] as ColumnsConfig | undefined;\n const columnName = col_name.split(\"|\").at(-1)!;\n const formatter = format_raw(\n type,\n pluginConfig?.[columnName] || {},\n );\n\n if (formatter) {\n out += formatter.format(col[ridx]) + \"\\t\";\n } else {\n out += col[ridx] + \"\\t\";\n }\n }\n out += \"\\n\";\n }\n\n return out.trim();\n }\n\n async resize(): Promise<void> {\n if (!this.isConnected || this.offsetParent == null) {\n return;\n }\n\n if (this._initialized) {\n await this.regular_table.draw();\n }\n }\n\n async clear(): Promise<void> {\n this.regular_table.resetAutoSize();\n this.regular_table.clear();\n }\n\n async save(): Promise<any> {\n return save.call(this);\n }\n\n async restore(\n token: DatagridPluginConfig,\n columns_config?: ColumnsConfig,\n ): Promise<any> {\n return restore.call(this, token, columns_config ?? {});\n }\n\n async restyle(): Promise<void> {\n // Get view from model if available, otherwise no-op\n if (this.model?._view) {\n await this.draw(this.model._view);\n }\n }\n\n async delete(): Promise<void> {\n this.disconnectedCallback();\n this._toolbar = undefined;\n if ((this.regular_table as any).table_model) {\n this.regular_table.resetAutoSize();\n }\n\n this.regular_table.clear();\n }\n}\n", ":host{position:relative;display:block;height:100%;}:host #container{position:absolute;display:flex;flex-direction:column;justify-content:stretch;align-items:stretch;top:0;left:0;right:0;bottom:0;}:host #toolbar{display:flex;align-items:stretch;height:100%;}:host #toolbar .hover-target{margin:0;display:inline-flex;align-items:center;cursor:pointer;}:host #toolbar .hover-target:hover{box-shadow:-4px 0 0 var(--icon--color),4px 0 0 var(--icon--color);background-color:var(--icon--color);}:host #slot-container{flex:1;position:relative;}#scroll_lock.lock-scroll:before{-webkit-mask-image:var(--toolbar-scroll-lock-active--content);}#scroll_lock:before{-webkit-mask-image:var(--toolbar-scroll-lock--content);}#select_mode:before{content:\"highlight_alt\";}#edit_mode:before{-webkit-mask-image:\"\";}#edit_mode[data-edit-mode=\"READ_ONLY\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--edit--content);}:host(.aggregated) #toolbar #edit_mode[data-edit-mode=\"EDIT\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--read-only--content);}#edit_mode[data-edit-mode=\"SELECT_ROW\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-row--content);}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-column--content);}#edit_mode[data-edit-mode=\"SELECT_REGION\"]:before{-webkit-mask-image:var(--toolbar-edit-mode--select-region--content);}#edit_mode[data-edit-mode=\"READ_ONLY\"] span:before{content:var(--edit-mode--read-only--content,\"Read Only\");}#edit_mode[data-edit-mode=\"EDIT\"] span:before{content:var(--edit-mode--edit--content,\"Editable\");}#edit_mode[data-edit-mode=\"SELECT_ROW\"] span:before{content:var(--edit-mode--select-row--content,\"Row Select\");}#edit_mode[data-edit-mode=\"SELECT_COLUMN\"] span:before{content:var(--edit-mode--select-column--content,\"Column Select\");}#edit_mode[data-edit-mode=\"SELECT_REGION\"] span:before{content:var(--edit-mode--select-region--content,\"Region Select\");}#scroll_lock span:before{content:var(--scroll-lock-toggle--content,\"Free Scroll\");}#scroll_lock.lock-scroll span:before{content:var(--scroll-lock-alt-toggle--content,\"Align Scroll\");}.button:before{width:21px;height:21px;content:\"\";-webkit-mask-size:cover;mask-size:cover;background-color:var(--icon--color);}.button.editable:before,.button.lock-scroll:before{color:inherit;}.button{display:inline-flex;justify-content:center;align-items:center;user-select:none;padding:0 5px;border:1px solid transparent;border-radius:3px;border:1px solid transparent;box-sizing:border-box;display:inline-flex;font-size:var(--label--font-size,0.75em);height:22px;user-select:none;white-space:nowrap;width:37px;}.button>span{display:none;margin:0;padding:0;}.hover-target:focus-within .button,.hover-target:hover .button{position:relative;background-color:var(--icon--color);color:var(--plugin--background);opacity:1;display:flex;align-items:center;cursor:pointer;}.hover-target:focus-within .button:before,.hover-target:hover .button:before{background-color:var(--plugin--background);}.hover-target:focus-within .button>span,.hover-target:hover .button>span{display:block;position:absolute;top:calc(100% + 3px);left:50%;translate:-50%;margin:0;padding:5px;height:auto;white-space:pre-wrap;line-height:1;font-size:9px;background-color:var(--icon--color);width:35px;text-align:center;border-radius:0 0 3px 3px;}", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n\nimport TOOLBAR_STYLE from \"../../../dist/css/perspective-viewer-datagrid-toolbar.css\";\nimport { toggle_edit_mode, toggle_scroll_lock } from \"../model/toolbar.js\";\nimport type {\n DatagridPluginElement,\n PerspectiveViewerElement,\n} from \"../types.js\";\n\nconst stylesheet = new CSSStyleSheet();\nstylesheet.replaceSync(TOOLBAR_STYLE);\n\n/**\n * The custom element for this plugin's toolbar, a component which displays in\n * the host `<perspective-viewer>`'s status bar when this plugin is active.\n * In the case of Datagrid, this comprises \"Editable\" and \"Scroll Lock\" toggle\n * buttons.\n */\nexport class HTMLPerspectiveViewerDatagridToolbarElement extends HTMLElement {\n private _initialized: boolean = false;\n\n connectedCallback(): void {\n if (this._initialized) {\n return;\n }\n\n this._initialized = true;\n this.setAttribute(\"slot\", \"statusbar-extra\");\n this.attachShadow({ mode: \"open\" });\n this.shadowRoot!.adoptedStyleSheets.push(stylesheet);\n this.shadowRoot!.innerHTML = `\n <div id=\"toolbar\">\n <span class=\"hover-target\">\n <span id=\"scroll_lock\" class=\"button\">\n <span></span>\n </span>\n </span>\n <span class=\"hover-target\">\n <span id=\"edit_mode\" class=\"button\" data-edit-mode=\"READ_ONLY\">\n <span></span>\n </span>\n </span>\n </div>\n `;\n\n const viewer = this.parentElement as PerspectiveViewerElement;\n const plugin = this.previousElementSibling as DatagridPluginElement;\n\n plugin._scroll_lock = this.shadowRoot!.querySelector(\n \"#scroll_lock\",\n ) as HTMLElement;\n plugin._scroll_lock.addEventListener(\"click\", () =>\n toggle_scroll_lock.call(plugin),\n );\n\n plugin._edit_button = this.shadowRoot!.querySelector(\n \"#edit_mode\",\n ) as HTMLElement;\n plugin._edit_button.addEventListener(\"click\", () => {\n toggle_edit_mode.call(plugin);\n plugin.regular_table.draw();\n viewer.dispatchEvent(new Event(\"perspective-config-update\"));\n });\n }\n}\n", "// \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n// \u2503 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588 \u2588 \u2588 \u2588 \u2588\u2584 \u2580\u2588\u2588\u2588 \u2588 \u2503\n// \u2503 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2584\u2584\u2584\u2584\u2584 \u2584\u2584\u2584\u2584\u2584\u2588 \u2580\u2580\u2580\u2580\u2580\u2588\u2580\u2580\u2580\u2580\u2580 \u2588 \u2580\u2580\u2580\u2580\u2580\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2584 \u2580\u2588 \u2588 \u2580\u2580\u2580\u2580\u2580 \u2503\n// \u2503 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2580\u2580\u2580\u2580 \u2588\u2580\u2588\u2588\u2580\u2580 \u2584\u2584\u2584\u2584\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2584\u2584\u2584\u2584\u2584\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2584\u2584\u2584\u2584\u2584 \u2503\n// \u2503 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2580\u2588\u2584 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u258C\u2590\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588 \u2503\n// \u2523\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u252B\n// \u2503 Copyright (c) 2017, the Perspective Authors. \u2503\n// \u2503 \u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C\u254C \u2503\n// \u2503 This file is part of the Perspective library, distributed under the terms \u2503\n// \u2503 of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). \u2503\n// \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\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", "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", "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", "r", "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", "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_", "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", "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", "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", "r", "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", "T", "deltaHp", "deltaL", "deltaCp", "sl", "sc", "sh", "deltaTheta", "Rt", "result", "distance_default", "a", "b", "mode", "Color_default", "l1", "l2", "sum_sq", "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", "r", "g", "b", "temperature2rgb_default", "round", "rgb2temperature", "args", "rgb", "unpack_default", "r", "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_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_row_path", "row_headers", "format_tree_header_row_path", "format_tree_header", "num_row_headers", "blend", "a", "b", "chroma_js_default", "rgbaToRgb", "r", "g", "source", "f", "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", "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", "x", "needs_border", "is_corner", "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", "detail", "row", "column_names", "config", "getCellConfig", "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"]
7
7
  }