imerss-bioinfo 1.14.0 → 1.16.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 (125) hide show
  1. package/build.js +113 -60
  2. package/docs/css/data-table.css +25 -8
  3. package/docs/css/imerss-bbea-i6.css +1195 -0
  4. package/docs/css/imerss-bbea.css +818 -140
  5. package/docs/css/imerss-core.css +2 -0
  6. package/docs/css/imerss-i6.css +140 -0
  7. package/docs/css/imerss-viz-all.css +2 -0
  8. package/docs/css/imerss-viz-lib.css +2 -0
  9. package/docs/js/imerss-viz-all.js +2 -2
  10. package/docs/js/imerss-viz-all.js.map +1 -1
  11. package/docs/js/imerss-viz-lib.js +1 -1
  12. package/docs/js/imerss-viz-lib.js.map +1 -1
  13. package/docs/js/imerss-viz-new-core.js +1 -1
  14. package/docs/js/imerss-viz-new-core.js.map +1 -1
  15. package/indexBeasBCBA.html +27 -245
  16. package/indexBeasOBA.html +26 -236
  17. package/indexBeasWaBA.html +28 -238
  18. package/indexBlitz.html +22 -180
  19. package/indexDiatoms.html +23 -182
  20. package/package.json +23 -18
  21. package/src/assignBNames.js +0 -1
  22. package/src/buildSource/indexBeasBCBA.html +32 -195
  23. package/src/buildSource/indexBeasOBA.html +30 -185
  24. package/src/buildSource/indexBeasWaBA.html +30 -185
  25. package/src/buildSource/indexBlitz.html +26 -133
  26. package/src/buildSource/indexDiatoms.html +27 -113
  27. package/src/client/css/data-table.css +25 -8
  28. package/src/client/css/imerss-bbea-i6.css +1195 -0
  29. package/src/client/css/imerss-bbea.css +818 -140
  30. package/src/client/css/imerss-core.css +2 -0
  31. package/src/client/css/imerss-i6.css +140 -0
  32. package/src/client/js/autocomplete.js +23 -1
  33. package/src/client/js/colour.js +3 -5
  34. package/src/client/js/i6/bbea/barChart.js +84 -0
  35. package/src/client/js/i6/bbea/imerss-bbea.js +246 -0
  36. package/src/client/js/i6/bbea/mfShell.js +177 -0
  37. package/src/client/js/i6/blitz.js +57 -0
  38. package/src/client/js/i6/checklist.js +671 -0
  39. package/src/client/js/i6/filters.js +322 -0
  40. package/src/client/js/i6/hashManager.js +156 -0
  41. package/src/client/js/i6/imerss-core.js +575 -0
  42. package/src/client/js/i6/imerss-plants.js +27 -0
  43. package/src/client/js/i6/libreMap.js +1329 -0
  44. package/src/client/js/i6/polygonDraw.js +164 -0
  45. package/src/client/js/i6/tooltip.js +292 -0
  46. package/src/client/js/leafletMapWithBareRegions.js +1 -1
  47. package/src/client/js/new/imerss-new.js +23 -4
  48. package/src/client/js/new/newChecklist.js +133 -0
  49. package/src/client/sfc/bbea/hortis-bbeaChecklist.vue +31 -0
  50. package/src/client/sfc/bbea/hortis-bbeaLibreMap.vue +37 -0
  51. package/src/client/sfc/bbea/hortis-bbeaViewTabs.vue +86 -0
  52. package/src/client/sfc/bbea/hortis-beaVizLoader.vue +421 -0
  53. package/src/client/sfc/bbea/hortis-beeAbundance.vue +191 -0
  54. package/src/client/sfc/bbea/hortis-bipartite.vue +100 -0
  55. package/src/client/sfc/bbea/hortis-checklist-search.vue +34 -0
  56. package/src/client/sfc/bbea/hortis-collectorReportLinker.vue +51 -0
  57. package/src/client/sfc/bbea/hortis-drawInteractions.vue +258 -0
  58. package/src/client/sfc/bbea/hortis-seedMix.vue +353 -0
  59. package/src/client/sfc/components/hortis-autocomplete.vue +46 -0
  60. package/src/client/sfc/components/hortis-dataTable.vue +295 -0
  61. package/src/client/sfc/components/hortis-dualRangeInput.vue +244 -0
  62. package/src/client/sfc/components/hortis-pageTabs-tab.vue +17 -0
  63. package/src/client/sfc/components/hortis-pageTabs.vue +43 -0
  64. package/src/client/sfc/components/hortis-resizeBar.vue +95 -0
  65. package/src/client/sfc/core/hortis-blitzRecords.vue +80 -0
  66. package/src/client/sfc/core/hortis-blitzVizLoader.vue +40 -0
  67. package/src/client/sfc/core/hortis-icons.vue +24 -0
  68. package/src/client/sfc/core/hortis-recordReporter.vue +26 -0
  69. package/src/client/sfc/core/hortis-standardChecklist.vue +53 -0
  70. package/src/client/sfc/core/hortis-standardVizLoader.vue +140 -0
  71. package/src/client/sfc/core/hortis-taxonListView.vue +207 -0
  72. package/src/client/sfc/core/hortis-vizLibreMap.vue +30 -0
  73. package/src/client/sfc/filters/hortis-collectorFilter.vue +84 -0
  74. package/src/client/sfc/filters/hortis-elevationFilter.vue +111 -0
  75. package/src/client/sfc/filters/hortis-filterControls.vue +25 -0
  76. package/src/client/sfc/filters/hortis-filterFacet.vue +111 -0
  77. package/src/client/sfc/filters/hortis-groupedRegionFilter.vue +195 -0
  78. package/src/client/sfc/filters/hortis-phenologyFilter-row.vue +22 -0
  79. package/src/client/sfc/filters/hortis-phenologyFilter.vue +243 -0
  80. package/src/client/sfc/filters/hortis-regionFilter-row.vue +22 -0
  81. package/src/client/sfc/filters/hortis-regionFilter.vue +72 -0
  82. package/src/client/sfc/filters/hortis-sexFilter.vue +58 -0
  83. package/src/client/sfc/filters/hortis-standardFilterControls.vue +25 -0
  84. package/src/client/sfc/filters/hortis-taxonSearchFilter.vue +93 -0
  85. package/src/client/sfc/filters/hortis-valueFilter-row.vue +23 -0
  86. package/src/client/sfc/filters/hortis-valueFilter.vue +44 -0
  87. package/src/copyMelitOut.js +120 -64
  88. package/src/dataProcessing/coordinatePatch.js +1 -1
  89. package/src/geom/geoJSON.js +3 -1
  90. package/src/infusion6.js +69 -0
  91. package/test/i6/bbeaHydrationRoundTrip.js +110 -0
  92. package/test/i6/html/BbeaCoreTests.html +28 -0
  93. package/test/i6/html/BbeaMapTests.html +27 -0
  94. package/test/i6/html/BbeaViewsTests.html +28 -0
  95. package/test/i6/html/HashManagerTests.html +29 -0
  96. package/test/i6/js/BbeaCoreTests.js +406 -0
  97. package/test/i6/js/BbeaMapTests.js +290 -0
  98. package/test/i6/js/BbeaTestData.js +46 -0
  99. package/test/i6/js/BbeaTestSupport.js +40 -0
  100. package/test/i6/js/BbeaViewsTests.js +201 -0
  101. package/test/i6/js/HashManagerTests.js +159 -0
  102. package/test/i6/standardHydrationRoundTrip.js +154 -0
  103. package/test/i6/storyHydrationRoundTrip.js +105 -0
  104. package/test/i6/storyNavigation.js +89 -0
  105. package/docs/css/imerss-viz-new.css +0 -474
  106. package/docs/js/imerss-bbea.js +0 -1307
  107. package/docs/js/imerss-blitz.js +0 -266
  108. package/docs/js/imerss-plants.js +0 -84
  109. package/docs/js/imerss-viz-new.js +0 -19
  110. package/docs/js/imerss-viz-new.js.map +0 -1
  111. package/docs/js/imerss-viz.js +0 -161
  112. package/docs/js/vizjs.js +0 -1
  113. package/indexBeas.html +0 -141
  114. package/src/client/js/new/bipartitePP.js +0 -179
  115. package/src/client/js/new/data-table.js +0 -483
  116. package/src/client/js/new/dual-range-input.js +0 -195
  117. package/src/client/js/new/filters.js +0 -582
  118. package/src/client/js/new/imerss-bbea.js +0 -1307
  119. package/src/client/js/new/imerss-blitz.js +0 -266
  120. package/src/client/js/new/imerss-plants.js +0 -84
  121. package/src/client/js/new/imerss-viz.js +0 -161
  122. package/src/client/js/new/polygon-draw.js +0 -85
  123. package/src/client/js/new/resize-bar.js +0 -289
  124. package/src/copyBeasOut.js +0 -70
  125. /package/{docs/js → src/client/js/i6/bbea}/bipartitePP.js +0 -0
package/build.js CHANGED
@@ -2,14 +2,18 @@
2
2
  "use strict";
3
3
 
4
4
  const glob = require("glob"),
5
- fs = require("fs-extra");
5
+ fs = require("fs-extra"),
6
+ childProcess = require("child_process");
6
7
 
7
- const fluid = require("infusion");
8
+ const fluid = require("infusion"),
9
+ infusion6 = require("./src/infusion6.js");
8
10
  const terser = require("terser");
9
11
  const path = require("path");
10
12
 
11
- // const fluid6 = require("./infusion-6.js");
12
- // console.log(fluid6);
13
+ // Builds into docs, for GitHub Pages, the older visualisations driven by .lz4 files, as imerss-viz-all.js, the bundles
14
+ // of the "new" framework from which Xetthecum's story map is built, as imerss-viz-lib.js and imerss-viz-new-core.js,
15
+ // and the pages of the newer visualisations ported to Infusion 6 together with the modules they depend upon - see
16
+ // buildI6 below
13
17
 
14
18
  const buildIndex = {
15
19
  libSource: [
@@ -77,27 +81,6 @@ const buildIndex = {
77
81
  "src/client/js/new/imerss-new.js",
78
82
  "src/client/js/new/newChecklist.js"
79
83
  ],
80
- // Full source for environments with strong focus on biodiversity info
81
- newSource: [
82
- "node_modules/@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.js",
83
- "src/client/css/mapbox-gl-draw.css", // has our own overrides
84
- "src/client/css/data-table.css",
85
- "src/client/css/resize-bar.css",
86
- "node_modules/papaparse/papaparse.min.js",
87
- "node_modules/pako/dist/pako_inflate.min.js",
88
- "node_modules/pretty-checkbox/dist/pretty-checkbox.min.css",
89
- "node_modules/@stanko/dual-range-input/dist/index.css",
90
- "src/lib/jquery-ui-widgets-tabs.js",
91
- "src/lib/point-in-polygon.js",
92
- "src/geom/geoJSON.js",
93
- "src/client/js/new/filters.js",
94
- "src/client/js/new/polygon-draw.js",
95
- "src/client/js/new/dual-range-input.js",
96
- "src/client/js/new/data-table.js",
97
- "src/client/js/new/resize-bar.js",
98
- "src/client/js/autocomplete.js",
99
- "src/client/js/tabs.js"
100
- ],
101
84
  codeHeader: "",
102
85
  codeFooter: "", // "\njQuery.noConflict()",
103
86
  copy: [{
@@ -118,24 +101,6 @@ const buildIndex = {
118
101
  }, {
119
102
  src: "src/client/fonts",
120
103
  dest: "docs/fonts"
121
- }, {
122
- src: "src/client/js/new/bipartitePP.js",
123
- dest: "docs/js/bipartitePP.js"
124
- }, {
125
- src: "src/client/js/new/imerss-bbea.js",
126
- dest: "docs/js/imerss-bbea.js"
127
- }, {
128
- src: "src/client/js/new/imerss-viz.js",
129
- dest: "docs/js/imerss-viz.js"
130
- }, {
131
- src: "src/client/js/new/imerss-blitz.js",
132
- dest: "docs/js/imerss-blitz.js"
133
- }, {
134
- src: "src/client/js/new/imerss-plants.js",
135
- dest: "docs/js/imerss-plants.js"
136
- }, {
137
- src: "src/lib/vizjs.js",
138
- dest: "docs/js/vizjs.js"
139
104
  }, {
140
105
  src: "src/buildSource/*.html",
141
106
  dest: "docs/"
@@ -179,14 +144,14 @@ const buildIndex = {
179
144
  src: "data/b-team/plant-pollinators-OBA-2025-regionIndirection.csv",
180
145
  dest: "docs/data/b-team/plant-pollinators-OBA-2025-regionIndirection.csv"
181
146
  }, {
182
- src: "data/b-team/plant-pollinators-WaBA-2025-labels.viz",
183
- dest: "docs/data/b-team/plant-pollinators-WaBA-2025-labels.viz"
147
+ src: "data/b-team/plant-pollinators-WaBA-2026-labels.viz",
148
+ dest: "docs/data/b-team/plant-pollinators-WaBA-2026-labels.viz"
184
149
  }, {
185
- src: "data/b-team/plant-pollinators-WaBA-2025-assigned-taxa.viz",
186
- dest: "docs/data/b-team/plant-pollinators-WaBA-2025-assigned-taxa.viz"
150
+ src: "data/b-team/plant-pollinators-WaBA-2026-assigned-taxa.viz",
151
+ dest: "docs/data/b-team/plant-pollinators-WaBA-2026-assigned-taxa.viz"
187
152
  }, {
188
- src: "data/b-team/plant-pollinators-WaBA-2025-regionIndirection.csv",
189
- dest: "docs/data/b-team/plant-pollinators-WaBA-2025-regionIndirection.csv"
153
+ src: "data/b-team/plant-pollinators-WaBA-2026-regionIndirection.csv",
154
+ dest: "docs/data/b-team/plant-pollinators-WaBA-2026-regionIndirection.csv"
190
155
  }, {
191
156
  src: "data/b-team/plant-pollinators-BCBA-labels.viz",
192
157
  dest: "docs/data/b-team/plant-pollinators-BCBA-labels.viz"
@@ -214,8 +179,35 @@ const buildIndex = {
214
179
  }, {
215
180
  src: "data/dataPaper-II/regionIndirection.csv",
216
181
  dest: "docs/data/dataPaper-II/regionIndirection.csv"
182
+ }, {
183
+ src: "data/b-team/placeholder/*",
184
+ dest: "docs/data/b-team/placeholder"
185
+ }, {
186
+ src: "data/Galiano 2023 BioBlitz/placeholder/*",
187
+ dest: "docs/data/Galiano 2023 BioBlitz/placeholder"
188
+ }, {
189
+ src: "data/dataPaper-II/placeholder/*",
190
+ dest: "docs/data/dataPaper-II/placeholder"
217
191
  }
218
- ]
192
+ ],
193
+ // The pages of the visualisations ported to Infusion 6, copied into docs from src/buildSource with the rest of its
194
+ // pages, each with the test verifying it - see buildI6
195
+ i6Pages: [{
196
+ page: "indexBeasBCBA.html",
197
+ verify: ["test/i6/bbeaHydrationRoundTrip.js", "docs", "indexBeasBCBA.html"]
198
+ }, {
199
+ page: "indexBeasOBA.html",
200
+ verify: ["test/i6/bbeaHydrationRoundTrip.js", "docs", "indexBeasOBA.html"]
201
+ }, {
202
+ page: "indexBeasWaBA.html",
203
+ verify: ["test/i6/bbeaHydrationRoundTrip.js", "docs", "indexBeasWaBA.html"]
204
+ }, {
205
+ page: "indexBlitz.html",
206
+ verify: ["test/i6/standardHydrationRoundTrip.js", "docs", "Blitz=indexBlitz.html"]
207
+ }, {
208
+ page: "indexDiatoms.html",
209
+ verify: ["test/i6/standardHydrationRoundTrip.js", "docs", "Diatoms=indexDiatoms.html"]
210
+ }]
219
211
  };
220
212
 
221
213
  // These two taken from reknit.js
@@ -282,6 +274,12 @@ const minify = async function (hash, filename) {
282
274
  });
283
275
  };
284
276
 
277
+ /**
278
+ * Build the bundles of the "new" framework from which Xetthecum's story map is built - see the config.json5 of
279
+ * https://github.com/IMERSS/xetthecum-storymap-story, which copies them from docs
280
+ * @param {Object} buildIndex - The build index
281
+ * @return {Promise} A promise which resolves once the bundles are written
282
+ */
285
283
  const buildStory = async function (buildIndex) {
286
284
 
287
285
  // imerss-viz-lib.js contains just upstream libraries we depend on, to support reasonably easy deploy of "new" framework
@@ -293,16 +291,11 @@ const buildStory = async function (buildIndex) {
293
291
  console.log("newCoreFiles ", buildIndex.newCoreSource);
294
292
  const newCoreJs = await minify(newCoreJsHash, "imerss-viz-new-core.js");
295
293
 
296
- const newJsHash = filesToContentHash(buildIndex.newSource, ".js");
297
- console.log("newFiles ", buildIndex.newSource);
298
- const newJs = await minify(newJsHash, "imerss-viz-new.js");
299
294
 
300
295
  fs.writeFileSync("docs/js/imerss-viz-lib.js", minifiedLib.code, "utf8");
301
296
  fs.writeFileSync("docs/js/imerss-viz-lib.js.map", minifiedLib.map);
302
297
  fs.writeFileSync("docs/js/imerss-viz-new-core.js", newCoreJs.code, "utf8");
303
298
  fs.writeFileSync("docs/js/imerss-viz-new-core.js.map", newCoreJs.map);
304
- fs.writeFileSync("docs/js/imerss-viz-new.js", newJs.code, "utf8");
305
- fs.writeFileSync("docs/js/imerss-viz-new.js.map", newJs.map);
306
299
 
307
300
  const cssLibHash = filesToContentHash(buildIndex.libSource, ".css");
308
301
  const cssLibConcat = String.prototype.concat.apply("", Object.values(cssLibHash));
@@ -310,12 +303,9 @@ const buildStory = async function (buildIndex) {
310
303
  const cssNewCoreHash = filesToContentHash(buildIndex.newCoreSource, ".css");
311
304
  const cssNewCoreConcat = String.prototype.concat.apply("", Object.values(cssNewCoreHash));
312
305
 
313
- const cssNewHash = filesToContentHash(buildIndex.newSource, ".css");
314
- const cssNewConcat = String.prototype.concat.apply("", Object.values(cssNewHash));
315
306
 
316
307
  fs.writeFileSync("docs/css/imerss-viz-lib.css", cssLibConcat);
317
308
  fs.writeFileSync("docs/css/imerss-viz-new-core.css", cssNewCoreConcat);
318
- fs.writeFileSync("docs/css/imerss-viz-new.css", cssNewConcat);
319
309
 
320
310
  };
321
311
 
@@ -347,10 +337,73 @@ const buildFromFiles = async function (buildIndex) {
347
337
  fluid.log("Copied " + (buildIndex.copy.length + 2) + " files to " + fs.realpathSync("docs"));
348
338
  };
349
339
 
340
+ /**
341
+ * Run a node script from this checkout in a child process, failing the build if it fails
342
+ * @param {String[]} args - The script and its arguments
343
+ */
344
+ const runNode = function (args) {
345
+ console.log("Running node " + args.join(" "));
346
+ const result = childProcess.spawnSync(process.execPath, args, {stdio: ["ignore", "pipe", "inherit"], encoding: "utf8",
347
+ maxBuffer: 256 * 1024 * 1024});
348
+ const reported = (result.stdout || "").split("\n").filter(line => !line.startsWith("fluid.loadInContext"));
349
+ console.log(reported.slice(-12).join("\n"));
350
+ if (result.status !== 0) {
351
+ throw new Error("node " + args.join(" ") + " failed with status " + result.status);
352
+ }
353
+ };
354
+
355
+ /**
356
+ * Build into docs the pages of the visualisations ported to Infusion 6, already copied there from src/buildSource,
357
+ * where each is written as it is served from docs. Infusion 6's copyOut.js copies into docs/vendor the files of the
358
+ * modules each page depends upon, from this checkout and from Infusion 6 - installed by npm, or as named by moduleOverrides.json5 - and writes docs/fluid-modules.json
359
+ * locating them. Each page is then verified by its test, which checks that it renders identically in the browser
360
+ * whether booted from its minimal form or from its hydrated form, and that its hydration is reversed exactly by
361
+ * dehydrate.js. Finally each page is hydrated in place, with Infusion in its built form, so that it shows its
362
+ * rendering from placeholder data before it boots - the page as written in src/buildSource is recovered from it by
363
+ * dehydrate.js.
364
+ * @param {Object} buildIndex - The build index
365
+ * @param {Boolean} verify - `false` if the pages are not to be verified
366
+ */
367
+ const buildI6 = function (buildIndex, verify) {
368
+ // Infusion 6 as installed by npm, or the checkout named for it by moduleOverrides.json5
369
+ const infusion6Dir = infusion6.dir();
370
+ const pages = buildIndex.i6Pages.map(record => path.join("docs", record.page));
371
+ // The stylesheets of the Oregon State University site hosting the atlases refer to its theme's fonts and images,
372
+ // which are served only there, and to forms of its fonts which are not held here
373
+ const sources = ["--source", "infusion-6=" + infusion6Dir, "--source", "imerss-bioinfo=.",
374
+ "--ignore-missing", "sites/all/", "--ignore-missing", "fonts/OSU/"];
375
+ // Copied once in the form booted by FluidBoot.js, which the minimal pages verified are written in, and once in
376
+ // the built form in which they are hydrated
377
+ runNode([path.join(infusion6Dir, "src/framework/server/copyOut.js"), ...pages, ...sources, "--framework", "boot"]);
378
+ runNode([path.join(infusion6Dir, "src/framework/server/copyOut.js"), ...pages, ...sources, "--framework", "built"]);
379
+ if (verify) {
380
+ buildIndex.i6Pages.forEach(record => runNode(record.verify));
381
+ }
382
+ pages.forEach(page => runNode([path.join(infusion6Dir, "src/framework/server/hydrate.js"), page, "-o", page, "--framework", "built"]));
383
+ };
384
+
350
385
  fluid.setLogging(true);
351
386
 
352
- const buildFn = process.argv[2] === "story" ? buildStory : buildFromFiles;
387
+ // Usage: node build.js [story|i6] [--no-verify]
388
+ // story Build only the bundles from which Xetthecum's story map is built
389
+ // i6 Build only the pages ported to Infusion 6, into an existing docs
390
+ // --no-verify Do not verify the pages ported to Infusion 6
391
+ const mode = process.argv[2];
392
+ const verify = !process.argv.includes("--no-verify");
393
+
394
+ const build = async function (buildIndex) {
395
+ if (mode === "story") {
396
+ await buildStory(buildIndex);
397
+ } else if (mode === "i6") {
398
+ copyDep("src/buildSource/*.html", "docs/");
399
+ buildI6(buildIndex, verify);
400
+ } else {
401
+ await buildFromFiles(buildIndex);
402
+ buildI6(buildIndex, verify);
403
+ }
404
+ };
353
405
 
354
- buildFn(buildIndex).then(null, function (error) {
406
+ build(buildIndex).then(null, function (error) {
355
407
  console.log(error);
408
+ process.exitCode = 1;
356
409
  });
@@ -30,6 +30,10 @@
30
30
  align-items: center;
31
31
  }
32
32
 
33
+ .hortis-dataTable-selectable-row {
34
+ cursor: pointer;
35
+ }
36
+
33
37
  .hortis-dataTable-selected-row {
34
38
  background-color: #a5d6ff;
35
39
  }
@@ -52,10 +56,11 @@
52
56
  }
53
57
 
54
58
  .hortis-dataTable-scroll {
55
- flex: 1;
59
+ /* Zero basis so that the height of all the rows does not inflate any parent whose height depends on its content */
60
+ flex: 1 1 0px;
56
61
  min-height: 0;
57
62
  overflow-x: scroll;
58
- overflow-y: hidden;
63
+ overflow-y: auto;
59
64
  }
60
65
 
61
66
  .hortis-dataTable-scroll table {
@@ -91,6 +96,8 @@
91
96
  }
92
97
 
93
98
  .hortis-dataTable-scroll tbody tr {
99
+ /* All rows must share a height for hortis.dataTable.viewExtent - a few would otherwise come out half a pixel short */
100
+ height: 26.5px;
94
101
  transition: background 0.15s ease;
95
102
  }
96
103
 
@@ -98,6 +105,12 @@
98
105
  border-bottom: none;
99
106
  }
100
107
 
108
+ /* Stands in for the rows which are not currently rendered */
109
+ .hortis-dataTable-scroll tbody tr.hortis-dataTable-spacer td {
110
+ padding: 0;
111
+ border: none;
112
+ }
113
+
101
114
  :root {
102
115
  --datatable-scrollbar-width: 12px;
103
116
  }
@@ -108,6 +121,16 @@
108
121
  background-color: #eee
109
122
  }
110
123
 
124
+ /* Confine the vertical scrollbar to the table body - the sticky header is really inside the scrolling area */
125
+ .hortis-dataTable-scroll::-webkit-scrollbar:vertical {
126
+ background-color: transparent;
127
+ }
128
+
129
+ .hortis-dataTable-scroll::-webkit-scrollbar-track:vertical {
130
+ margin-top: var(--data-table-head-height, 0);
131
+ background-color: #eee;
132
+ }
133
+
111
134
  .hortis-dataTable-wrap ::-webkit-scrollbar-thumb {
112
135
  border-radius: 6px;
113
136
  background-color: #C1C1C1;
@@ -168,9 +191,3 @@ td.hortis-dataTable-num, th.hortis-dataTable-num {
168
191
  opacity: 0.3;
169
192
  cursor: default;
170
193
  }
171
-
172
- .hortis-dataTable-pagination button.hortis-dataTable-active {
173
- border-color: var(--data-table-accent);
174
- color: var(--data-table-accent);
175
- background: var(--data-table-accent-dim);
176
- }