@genspectrum/dashboard-components 0.6.15 → 0.6.17

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 (28) hide show
  1. package/custom-elements.json +3 -3
  2. package/dist/dashboard-components.js +115 -117
  3. package/dist/dashboard-components.js.map +1 -1
  4. package/dist/genspectrum-components.d.ts +141 -25
  5. package/dist/style.css +107 -112
  6. package/package.json +3 -3
  7. package/src/preact/components/error-display.stories.tsx +2 -2
  8. package/src/preact/components/proportion-selector-dropdown.stories.tsx +13 -4
  9. package/src/preact/components/proportion-selector-dropdown.tsx +7 -4
  10. package/src/preact/mutationsOverTime/mutations-over-time.tsx +1 -0
  11. package/src/web-components/app.ts +10 -0
  12. package/src/web-components/input/gs-date-range-selector.tsx +10 -0
  13. package/src/web-components/input/gs-lineage-filter.stories.ts +1 -1
  14. package/src/web-components/input/gs-lineage-filter.tsx +10 -0
  15. package/src/web-components/input/gs-location-filter.stories.ts +2 -2
  16. package/src/web-components/input/gs-location-filter.tsx +10 -0
  17. package/src/web-components/input/gs-mutation-filter.tsx +10 -0
  18. package/src/web-components/input/gs-text-input.stories.ts +1 -1
  19. package/src/web-components/input/gs-text-input.tsx +10 -0
  20. package/src/web-components/visualization/gs-aggregate.tsx +10 -0
  21. package/src/web-components/visualization/gs-mutation-comparison.tsx +10 -0
  22. package/src/web-components/visualization/gs-mutations-over-time.tsx +10 -0
  23. package/src/web-components/visualization/gs-mutations.tsx +10 -0
  24. package/src/web-components/visualization/gs-number-sequences-over-time.tsx +10 -0
  25. package/src/web-components/visualization/gs-prevalence-over-time.tsx +10 -0
  26. package/src/web-components/visualization/gs-relative-growth-advantage.tsx +10 -0
  27. package/standalone-bundle/dashboard-components.js +3133 -3122
  28. package/standalone-bundle/dashboard-components.js.map +1 -1
@@ -511,7 +511,7 @@
511
511
  "type": {
512
512
  "text": "StoryObj<Required<LineageFilterProps>>"
513
513
  },
514
- "default": "{ ...Default, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-lineage-filter'); const inputField = () => canvas.getByPlaceholderText('Enter lineage'); const listenerMock = fn(); await step('Setup event listener mock', async () => { canvasElement.addEventListener('gs-lineage-filter-changed', listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Enters an invalid lineage value', async () => { await userEvent.type(inputField(), 'notInList'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>9/}'); await expect(listenerMock.mock.calls.at(-1)[0].detail).toStrictEqual({ pangoLineage: undefined, }); }); await step('Enter a valid lineage value', async () => { await userEvent.type(inputField(), 'B.1.1.7'); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { pangoLineage: 'B.1.1.7', }, }), ); }); await step('Enter a valid lineage value', async () => { await userEvent.type(inputField(), '{backspace>9/}'); await userEvent.type(inputField(), 'B.1.1.7*'); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { pangoLineage: 'B.1.1.7*', }, }), ); }); }, args: { ...Default.args, initialValue: '', }, }"
514
+ "default": "{ ...Default, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-lineage-filter'); const inputField = () => canvas.getByPlaceholderText('Enter lineage'); const listenerMock = fn(); await step('Setup event listener mock', async () => { canvasElement.addEventListener('gs-lineage-filter-changed', listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Enters an invalid lineage value', async () => { await userEvent.type(inputField(), 'notInList'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>9/}'); await expect(listenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({ pangoLineage: undefined, }); }); await step('Enter a valid lineage value', async () => { await userEvent.type(inputField(), 'B.1.1.7'); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { pangoLineage: 'B.1.1.7', }, }), ); }); await step('Enter a valid lineage value', async () => { await userEvent.type(inputField(), '{backspace>9/}'); await userEvent.type(inputField(), 'B.1.1.7*'); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { pangoLineage: 'B.1.1.7*', }, }), ); }); }, args: { ...Default.args, initialValue: '', }, }"
515
515
  }
516
516
  ],
517
517
  "exports": [
@@ -707,7 +707,7 @@
707
707
  "type": {
708
708
  "text": "StoryObj<LocationFilterProps>"
709
709
  },
710
- "default": "{ ...Template, parameters: { fetchMock: { mocks: [ { matcher: aggregatedEndpointMatcher, response: { status: 200, body: data, }, }, ], }, }, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-location-filter'); const inputField = () => canvas.getByRole('combobox'); const listenerMock = fn(); await step('Setup event listener mock', async () => { canvasElement.addEventListener('gs-location-changed', listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Input invalid location', async () => { await userEvent.type(inputField(), 'Not / A / Location'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>18/}'); await expect(listenerMock.mock.calls.at(-1)[0].detail).toStrictEqual({ region: undefined, country: undefined, division: undefined, location: undefined, }); }); await step('Select Asia', async () => { await userEvent.type(inputField(), 'Asia'); await expect(listenerMock.mock.calls.at(-1)[0].detail).toStrictEqual({ region: 'Asia', country: undefined, division: undefined, location: undefined, }); }); await step('Select Asia / Bangladesh / Rajshahi / Chapainawabgonj', async () => { await userEvent.type(inputField(), ' / Bangladesh / Rajshahi / Chapainawabgonj'); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { region: 'Asia', country: 'Bangladesh', division: 'Rajshahi', location: 'Chapainawabgonj', }, }), ); }); }, }"
710
+ "default": "{ ...Template, parameters: { fetchMock: { mocks: [ { matcher: aggregatedEndpointMatcher, response: { status: 200, body: data, }, }, ], }, }, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-location-filter'); const inputField = () => canvas.getByRole('combobox'); const listenerMock = fn(); await step('Setup event listener mock', async () => { canvasElement.addEventListener('gs-location-changed', listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Input invalid location', async () => { await userEvent.type(inputField(), 'Not / A / Location'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>18/}'); await expect(listenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({ region: undefined, country: undefined, division: undefined, location: undefined, }); }); await step('Select Asia', async () => { await userEvent.type(inputField(), 'Asia'); await expect(listenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({ region: 'Asia', country: undefined, division: undefined, location: undefined, }); }); await step('Select Asia / Bangladesh / Rajshahi / Chapainawabgonj', async () => { await userEvent.type(inputField(), ' / Bangladesh / Rajshahi / Chapainawabgonj'); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { region: 'Asia', country: 'Bangladesh', division: 'Rajshahi', location: 'Chapainawabgonj', }, }), ); }); }, }"
711
711
  }
712
712
  ],
713
713
  "exports": [
@@ -1084,7 +1084,7 @@
1084
1084
  "type": {
1085
1085
  "text": "StoryObj<Required<TextInputProps>>"
1086
1086
  },
1087
- "default": "{ ...Default, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-text-input'); const inputField = () => canvas.getByPlaceholderText('Enter host name'); const listenerMock = fn(); await step('Setup event listener mock', async () => { canvasElement.addEventListener('gs-text-input-changed', listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Enters an invalid host name', async () => { await userEvent.type(inputField(), 'notInList'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>9/}'); await expect(listenerMock.mock.calls.at(-1)[0].detail).toStrictEqual({ host: undefined, }); }); await step('Enter a valid host name', async () => { await userEvent.type(inputField(), 'Homo'); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { host: 'Homo', }, }), ); }); }, args: { ...Default.args, initialValue: '', }, }"
1087
+ "default": "{ ...Default, play: async ({ canvasElement, step }) => { const canvas = await withinShadowRoot(canvasElement, 'gs-text-input'); const inputField = () => canvas.getByPlaceholderText('Enter host name'); const listenerMock = fn(); await step('Setup event listener mock', async () => { canvasElement.addEventListener('gs-text-input-changed', listenerMock); }); await step('wait until data is loaded', async () => { await waitFor(() => { return expect(inputField()).toBeEnabled(); }); }); await step('Enters an invalid host name', async () => { await userEvent.type(inputField(), 'notInList'); await expect(listenerMock).not.toHaveBeenCalled(); }); await step('Empty input', async () => { await userEvent.type(inputField(), '{backspace>9/}'); await expect(listenerMock.mock.calls.at(-1)![0].detail).toStrictEqual({ host: undefined, }); }); await step('Enter a valid host name', async () => { await userEvent.type(inputField(), 'Homo'); await expect(listenerMock).toHaveBeenCalledWith( expect.objectContaining({ detail: { host: 'Homo', }, }), ); }); }, args: { ...Default.args, initialValue: '', }, }"
1088
1088
  }
1089
1089
  ],
1090
1090
  "exports": [
@@ -1802,10 +1802,12 @@ const ProportionSelector = ({
1802
1802
  const ProportionSelectorDropdown = ({
1803
1803
  proportionInterval,
1804
1804
  setMinProportion,
1805
- setMaxProportion
1805
+ setMaxProportion,
1806
+ labelPrefix = "Proportion"
1806
1807
  }) => {
1807
- const label = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;
1808
- return /* @__PURE__ */ u$1("div", { className: "w-44", children: /* @__PURE__ */ u$1(Dropdown, { buttonTitle: `Proportion ${label}`, placement: "bottom-start", children: /* @__PURE__ */ u$1(
1808
+ const percentLabel = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;
1809
+ const width = "w-[calc(1.5 * var(--tw-space-x-reverse) + 1.5 * var(--tw-space-x))]";
1810
+ return /* @__PURE__ */ u$1("div", { className: width, children: /* @__PURE__ */ u$1(Dropdown, { buttonTitle: `${labelPrefix} ${percentLabel}`, placement: "bottom-start", children: /* @__PURE__ */ u$1(
1809
1811
  ProportionSelector,
1810
1812
  {
1811
1813
  proportionInterval,
@@ -2057,8 +2059,114 @@ const Toolbar$5 = ({
2057
2059
  };
2058
2060
  const gridJsStyle = '.gridjs-head button, .gridjs-footer button {\n cursor: pointer;\n background-color: transparent;\n background-image: none;\n padding: 0;\n margin: 0;\n border: none;\n outline: none;\n}\n\n.gridjs-temp {\n position: relative;\n}\n\n.gridjs-head {\n width: 100%;\n margin-bottom: 5px;\n padding: 5px 1px;\n}\n.gridjs-head::after {\n content: "";\n display: block;\n clear: both;\n}\n.gridjs-head:empty {\n padding: 0;\n border: none;\n}\n\n.gridjs-container {\n overflow: hidden;\n display: inline-block;\n padding: 2px;\n color: #000;\n position: relative;\n z-index: 0;\n}\n\n.gridjs-footer {\n display: block;\n position: relative;\n width: 100%;\n z-index: 5;\n padding: 12px 24px;\n border-top: 1px solid #e5e7eb;\n background-color: #fff;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.26);\n border-radius: 0 0 8px 8px;\n border-bottom-width: 1px;\n border-color: #e5e7eb;\n}\n.gridjs-footer:empty {\n padding: 0;\n border: none;\n}\n\ninput.gridjs-input {\n outline: none;\n background-color: #fff;\n border: 1px solid #d2d6dc;\n border-radius: 5px;\n padding: 10px 13px;\n font-size: 14px;\n line-height: 1.45;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\ninput.gridjs-input:focus {\n box-shadow: 0 0 0 3px rgba(149, 189, 243, 0.5);\n border-color: #9bc2f7;\n}\n\n.gridjs-pagination {\n color: #3d4044;\n}\n.gridjs-pagination::after {\n content: "";\n display: block;\n clear: both;\n}\n.gridjs-pagination .gridjs-summary {\n float: left;\n margin-top: 5px;\n}\n.gridjs-pagination .gridjs-pages {\n float: right;\n}\n.gridjs-pagination .gridjs-pages button {\n padding: 5px 14px;\n border: 1px solid #d2d6dc;\n background-color: #fff;\n border-right: none;\n outline: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.gridjs-pagination .gridjs-pages button:focus {\n box-shadow: 0 0 0 2px rgba(149, 189, 243, 0.5);\n position: relative;\n margin-right: -1px;\n border-right: 1px solid #d2d6dc;\n}\n.gridjs-pagination .gridjs-pages button:hover {\n background-color: #f7f7f7;\n color: rgb(60, 66, 87);\n outline: none;\n}\n.gridjs-pagination .gridjs-pages button:disabled,\n.gridjs-pagination .gridjs-pages button[disabled],\n.gridjs-pagination .gridjs-pages button:hover:disabled {\n cursor: default;\n background-color: #fff;\n color: #6b7280;\n}\n.gridjs-pagination .gridjs-pages button.gridjs-spread {\n cursor: default;\n box-shadow: none;\n background-color: #fff;\n}\n.gridjs-pagination .gridjs-pages button.gridjs-currentPage {\n background-color: #f7f7f7;\n font-weight: bold;\n}\n.gridjs-pagination .gridjs-pages button:last-child {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n border-right: 1px solid #d2d6dc;\n}\n.gridjs-pagination .gridjs-pages button:first-child {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.gridjs-pagination .gridjs-pages button:last-child:focus {\n margin-right: 0;\n}\n\nbutton.gridjs-sort {\n float: right;\n height: 24px;\n width: 13px;\n background-color: transparent;\n background-repeat: no-repeat;\n background-position-x: center;\n cursor: pointer;\n padding: 0;\n margin: 0;\n border: none;\n outline: none;\n background-size: contain;\n}\nbutton.gridjs-sort-neutral {\n opacity: 0.3;\n background-image: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSI0MDEuOTk4cHgiIGhlaWdodD0iNDAxLjk5OHB4IiB2aWV3Qm94PSIwIDAgNDAxLjk5OCA0MDEuOTk4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MDEuOTk4IDQwMS45OTg7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik03My4wOTIsMTY0LjQ1MmgyNTUuODEzYzQuOTQ5LDAsOS4yMzMtMS44MDcsMTIuODQ4LTUuNDI0YzMuNjEzLTMuNjE2LDUuNDI3LTcuODk4LDUuNDI3LTEyLjg0NwoJCQljMC00Ljk0OS0xLjgxMy05LjIyOS01LjQyNy0xMi44NUwyMTMuODQ2LDUuNDI0QzIxMC4yMzIsMS44MTIsMjA1Ljk1MSwwLDIwMC45OTksMHMtOS4yMzMsMS44MTItMTIuODUsNS40MjRMNjAuMjQyLDEzMy4zMzEKCQkJYy0zLjYxNywzLjYxNy01LjQyNCw3LjkwMS01LjQyNCwxMi44NWMwLDQuOTQ4LDEuODA3LDkuMjMxLDUuNDI0LDEyLjg0N0M2My44NjMsMTYyLjY0NSw2OC4xNDQsMTY0LjQ1Miw3My4wOTIsMTY0LjQ1MnoiLz4KCQk8cGF0aCBkPSJNMzI4LjkwNSwyMzcuNTQ5SDczLjA5MmMtNC45NTIsMC05LjIzMywxLjgwOC0xMi44NSw1LjQyMWMtMy42MTcsMy42MTctNS40MjQsNy44OTgtNS40MjQsMTIuODQ3CgkJCWMwLDQuOTQ5LDEuODA3LDkuMjMzLDUuNDI0LDEyLjg0OEwxODguMTQ5LDM5Ni41N2MzLjYyMSwzLjYxNyw3LjkwMiw1LjQyOCwxMi44NSw1LjQyOHM5LjIzMy0xLjgxMSwxMi44NDctNS40MjhsMTI3LjkwNy0xMjcuOTA2CgkJCWMzLjYxMy0zLjYxNCw1LjQyNy03Ljg5OCw1LjQyNy0xMi44NDhjMC00Ljk0OC0xLjgxMy05LjIyOS01LjQyNy0xMi44NDdDMzM4LjEzOSwyMzkuMzUzLDMzMy44NTQsMjM3LjU0OSwzMjguOTA1LDIzNy41NDl6Ii8+Cgk8L2c+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+");\n background-position-y: center;\n}\nbutton.gridjs-sort-asc {\n background-image: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyOTIuMzYycHgiIGhlaWdodD0iMjkyLjM2MXB4IiB2aWV3Qm94PSIwIDAgMjkyLjM2MiAyOTIuMzYxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyOTIuMzYyIDI5Mi4zNjE7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIGQ9Ik0yODYuOTM1LDE5Ny4yODdMMTU5LjAyOCw2OS4zODFjLTMuNjEzLTMuNjE3LTcuODk1LTUuNDI0LTEyLjg0Ny01LjQyNHMtOS4yMzMsMS44MDctMTIuODUsNS40MjRMNS40MjQsMTk3LjI4NwoJCUMxLjgwNywyMDAuOTA0LDAsMjA1LjE4NiwwLDIxMC4xMzRzMS44MDcsOS4yMzMsNS40MjQsMTIuODQ3YzMuNjIxLDMuNjE3LDcuOTAyLDUuNDI1LDEyLjg1LDUuNDI1aDI1NS44MTMKCQljNC45NDksMCw5LjIzMy0xLjgwOCwxMi44NDgtNS40MjVjMy42MTMtMy42MTMsNS40MjctNy44OTgsNS40MjctMTIuODQ3UzI5MC41NDgsMjAwLjkwNCwyODYuOTM1LDE5Ny4yODd6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+");\n background-position-y: 35%;\n background-size: 10px;\n}\nbutton.gridjs-sort-desc {\n background-image: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyOTIuMzYycHgiIGhlaWdodD0iMjkyLjM2MnB4IiB2aWV3Qm94PSIwIDAgMjkyLjM2MiAyOTIuMzYyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyOTIuMzYyIDI5Mi4zNjI7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIGQ9Ik0yODYuOTM1LDY5LjM3N2MtMy42MTQtMy42MTctNy44OTgtNS40MjQtMTIuODQ4LTUuNDI0SDE4LjI3NGMtNC45NTIsMC05LjIzMywxLjgwNy0xMi44NSw1LjQyNAoJCUMxLjgwNyw3Mi45OTgsMCw3Ny4yNzksMCw4Mi4yMjhjMCw0Ljk0OCwxLjgwNyw5LjIyOSw1LjQyNCwxMi44NDdsMTI3LjkwNywxMjcuOTA3YzMuNjIxLDMuNjE3LDcuOTAyLDUuNDI4LDEyLjg1LDUuNDI4CgkJczkuMjMzLTEuODExLDEyLjg0Ny01LjQyOEwyODYuOTM1LDk1LjA3NGMzLjYxMy0zLjYxNyw1LjQyNy03Ljg5OCw1LjQyNy0xMi44NDdDMjkyLjM2Miw3Ny4yNzksMjkwLjU0OCw3Mi45OTgsMjg2LjkzNSw2OS4zNzd6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+");\n background-position-y: 65%;\n background-size: 10px;\n}\nbutton.gridjs-sort:focus {\n outline: none;\n}\n\ntable.gridjs-table {\n width: 100%;\n max-width: 100%;\n border-collapse: collapse;\n text-align: left;\n display: table;\n margin: 0;\n padding: 0;\n overflow: auto;\n table-layout: fixed;\n}\n\n.gridjs-tbody {\n background-color: #fff;\n}\n\ntd.gridjs-td {\n border: 1px solid #e5e7eb;\n padding: 12px 24px;\n background-color: #fff;\n box-sizing: content-box;\n}\ntd.gridjs-td:first-child {\n border-left: none;\n}\ntd.gridjs-td:last-child {\n border-right: none;\n}\ntd.gridjs-message {\n text-align: center;\n}\n\nth.gridjs-th {\n position: relative;\n color: #6b7280;\n background-color: #f9fafb;\n border: 1px solid #e5e7eb;\n border-top: none;\n padding: 14px 24px;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n box-sizing: border-box;\n white-space: nowrap;\n outline: none;\n vertical-align: middle;\n}\nth.gridjs-th .gridjs-th-content {\n text-overflow: ellipsis;\n overflow: hidden;\n width: 100%;\n float: left;\n}\nth.gridjs-th-sort {\n cursor: pointer;\n}\nth.gridjs-th-sort .gridjs-th-content {\n width: calc(100% - 15px);\n}\nth.gridjs-th-sort:hover {\n background-color: #e5e7eb;\n}\nth.gridjs-th-sort:focus {\n background-color: #e5e7eb;\n}\nth.gridjs-th-fixed {\n position: sticky;\n box-shadow: 0 1px 0 0 #e5e7eb;\n}\n@supports (-moz-appearance: none) {\n th.gridjs-th-fixed {\n box-shadow: 0 0 0 1px #e5e7eb;\n }\n}\nth.gridjs-th:first-child {\n border-left: none;\n}\nth.gridjs-th:last-child {\n border-right: none;\n}\n\n.gridjs-tr {\n border: none;\n}\n.gridjs-tr-selected td {\n background-color: #ebf5ff;\n}\n.gridjs-tr:last-child td {\n border-bottom: 0;\n}\n\n.gridjs *,\n.gridjs :after,\n.gridjs :before {\n box-sizing: border-box;\n}\n\n.gridjs-wrapper {\n position: relative;\n z-index: 1;\n overflow: auto;\n width: 100%;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.26);\n border-radius: 8px 8px 0 0;\n display: block;\n border-top-width: 1px;\n border-color: #e5e7eb;\n}\n.gridjs-wrapper:nth-last-of-type(2) {\n border-radius: 8px;\n border-bottom-width: 1px;\n}\n\n.gridjs-search {\n float: left;\n}\n.gridjs-search-input {\n width: 250px;\n}\n\n.gridjs-loading-bar {\n z-index: 10;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-color: #fff;\n opacity: 0.5;\n}\n.gridjs-loading-bar::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n transform: translateX(-100%);\n background-image: linear-gradient(90deg, rgba(204, 204, 204, 0) 0, rgba(204, 204, 204, 0.2) 20%, rgba(204, 204, 204, 0.5) 60%, rgba(204, 204, 204, 0));\n animation: shimmer 2s infinite;\n content: "";\n}\n@keyframes shimmer {\n 100% {\n transform: translateX(100%);\n }\n}\n\n.gridjs-td .gridjs-checkbox {\n display: block;\n margin: auto;\n cursor: pointer;\n}\n\n.gridjs-resizable {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: 5px;\n}\n.gridjs-resizable:hover {\n cursor: ew-resize;\n background-color: #9bc2f7;\n}\n/*# sourceMappingURL=mermaid.css?inline.map */';
2059
2061
  const minMaxPercentSliderCss = 'input[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n pointer-events: all;\n width: 24px;\n height: 24px;\n background-color: #fff;\n border-radius: 50%;\n box-shadow: 0 0 0 1px #C6C6C6;\n cursor: pointer;\n}\n\ninput[type=range]::-moz-range-thumb {\n -webkit-appearance: none;\n pointer-events: all;\n width: 24px;\n height: 24px;\n background-color: #fff;\n border-radius: 50%;\n box-shadow: 0 0 0 1px #C6C6C6;\n cursor: pointer;\n}\n\ninput[type=range]::-webkit-slider-thumb:hover {\n background: #f7f7f7;\n}\n\ninput[type=range]::-webkit-slider-thumb:active {\n box-shadow: inset 0 0 3px #387bbe, 0 0 9px #387bbe;\n -webkit-box-shadow: inset 0 0 3px #387bbe, 0 0 9px #387bbe;\n}\n\ninput[type="range"] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n height: 2px;\n width: 100%;\n position: absolute;\n background-color: #C6C6C6;\n pointer-events: none;\n}';
2060
- const tailwindStyle = `/*
2061
- ! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com
2062
+ const tailwindStyle = `*, ::before, ::after {
2063
+ --tw-border-spacing-x: 0;
2064
+ --tw-border-spacing-y: 0;
2065
+ --tw-translate-x: 0;
2066
+ --tw-translate-y: 0;
2067
+ --tw-rotate: 0;
2068
+ --tw-skew-x: 0;
2069
+ --tw-skew-y: 0;
2070
+ --tw-scale-x: 1;
2071
+ --tw-scale-y: 1;
2072
+ --tw-pan-x: ;
2073
+ --tw-pan-y: ;
2074
+ --tw-pinch-zoom: ;
2075
+ --tw-scroll-snap-strictness: proximity;
2076
+ --tw-gradient-from-position: ;
2077
+ --tw-gradient-via-position: ;
2078
+ --tw-gradient-to-position: ;
2079
+ --tw-ordinal: ;
2080
+ --tw-slashed-zero: ;
2081
+ --tw-numeric-figure: ;
2082
+ --tw-numeric-spacing: ;
2083
+ --tw-numeric-fraction: ;
2084
+ --tw-ring-inset: ;
2085
+ --tw-ring-offset-width: 0px;
2086
+ --tw-ring-offset-color: #fff;
2087
+ --tw-ring-color: rgb(59 130 246 / 0.5);
2088
+ --tw-ring-offset-shadow: 0 0 #0000;
2089
+ --tw-ring-shadow: 0 0 #0000;
2090
+ --tw-shadow: 0 0 #0000;
2091
+ --tw-shadow-colored: 0 0 #0000;
2092
+ --tw-blur: ;
2093
+ --tw-brightness: ;
2094
+ --tw-contrast: ;
2095
+ --tw-grayscale: ;
2096
+ --tw-hue-rotate: ;
2097
+ --tw-invert: ;
2098
+ --tw-saturate: ;
2099
+ --tw-sepia: ;
2100
+ --tw-drop-shadow: ;
2101
+ --tw-backdrop-blur: ;
2102
+ --tw-backdrop-brightness: ;
2103
+ --tw-backdrop-contrast: ;
2104
+ --tw-backdrop-grayscale: ;
2105
+ --tw-backdrop-hue-rotate: ;
2106
+ --tw-backdrop-invert: ;
2107
+ --tw-backdrop-opacity: ;
2108
+ --tw-backdrop-saturate: ;
2109
+ --tw-backdrop-sepia: ;
2110
+ --tw-contain-size: ;
2111
+ --tw-contain-layout: ;
2112
+ --tw-contain-paint: ;
2113
+ --tw-contain-style: ;
2114
+ }
2115
+
2116
+ ::backdrop {
2117
+ --tw-border-spacing-x: 0;
2118
+ --tw-border-spacing-y: 0;
2119
+ --tw-translate-x: 0;
2120
+ --tw-translate-y: 0;
2121
+ --tw-rotate: 0;
2122
+ --tw-skew-x: 0;
2123
+ --tw-skew-y: 0;
2124
+ --tw-scale-x: 1;
2125
+ --tw-scale-y: 1;
2126
+ --tw-pan-x: ;
2127
+ --tw-pan-y: ;
2128
+ --tw-pinch-zoom: ;
2129
+ --tw-scroll-snap-strictness: proximity;
2130
+ --tw-gradient-from-position: ;
2131
+ --tw-gradient-via-position: ;
2132
+ --tw-gradient-to-position: ;
2133
+ --tw-ordinal: ;
2134
+ --tw-slashed-zero: ;
2135
+ --tw-numeric-figure: ;
2136
+ --tw-numeric-spacing: ;
2137
+ --tw-numeric-fraction: ;
2138
+ --tw-ring-inset: ;
2139
+ --tw-ring-offset-width: 0px;
2140
+ --tw-ring-offset-color: #fff;
2141
+ --tw-ring-color: rgb(59 130 246 / 0.5);
2142
+ --tw-ring-offset-shadow: 0 0 #0000;
2143
+ --tw-ring-shadow: 0 0 #0000;
2144
+ --tw-shadow: 0 0 #0000;
2145
+ --tw-shadow-colored: 0 0 #0000;
2146
+ --tw-blur: ;
2147
+ --tw-brightness: ;
2148
+ --tw-contrast: ;
2149
+ --tw-grayscale: ;
2150
+ --tw-hue-rotate: ;
2151
+ --tw-invert: ;
2152
+ --tw-saturate: ;
2153
+ --tw-sepia: ;
2154
+ --tw-drop-shadow: ;
2155
+ --tw-backdrop-blur: ;
2156
+ --tw-backdrop-brightness: ;
2157
+ --tw-backdrop-contrast: ;
2158
+ --tw-backdrop-grayscale: ;
2159
+ --tw-backdrop-hue-rotate: ;
2160
+ --tw-backdrop-invert: ;
2161
+ --tw-backdrop-opacity: ;
2162
+ --tw-backdrop-saturate: ;
2163
+ --tw-backdrop-sepia: ;
2164
+ --tw-contain-size: ;
2165
+ --tw-contain-layout: ;
2166
+ --tw-contain-paint: ;
2167
+ --tw-contain-style: ;
2168
+ }/*
2169
+ ! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com
2062
2170
  *//*
2063
2171
  1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2064
2172
  2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
@@ -2557,114 +2665,6 @@ html {
2557
2665
  --b3: 92.4169% 0.00108 197.137559;
2558
2666
  --bc: 27.8078% 0.029596 256.847952;
2559
2667
  }
2560
-
2561
- *, ::before, ::after {
2562
- --tw-border-spacing-x: 0;
2563
- --tw-border-spacing-y: 0;
2564
- --tw-translate-x: 0;
2565
- --tw-translate-y: 0;
2566
- --tw-rotate: 0;
2567
- --tw-skew-x: 0;
2568
- --tw-skew-y: 0;
2569
- --tw-scale-x: 1;
2570
- --tw-scale-y: 1;
2571
- --tw-pan-x: ;
2572
- --tw-pan-y: ;
2573
- --tw-pinch-zoom: ;
2574
- --tw-scroll-snap-strictness: proximity;
2575
- --tw-gradient-from-position: ;
2576
- --tw-gradient-via-position: ;
2577
- --tw-gradient-to-position: ;
2578
- --tw-ordinal: ;
2579
- --tw-slashed-zero: ;
2580
- --tw-numeric-figure: ;
2581
- --tw-numeric-spacing: ;
2582
- --tw-numeric-fraction: ;
2583
- --tw-ring-inset: ;
2584
- --tw-ring-offset-width: 0px;
2585
- --tw-ring-offset-color: #fff;
2586
- --tw-ring-color: rgb(59 130 246 / 0.5);
2587
- --tw-ring-offset-shadow: 0 0 #0000;
2588
- --tw-ring-shadow: 0 0 #0000;
2589
- --tw-shadow: 0 0 #0000;
2590
- --tw-shadow-colored: 0 0 #0000;
2591
- --tw-blur: ;
2592
- --tw-brightness: ;
2593
- --tw-contrast: ;
2594
- --tw-grayscale: ;
2595
- --tw-hue-rotate: ;
2596
- --tw-invert: ;
2597
- --tw-saturate: ;
2598
- --tw-sepia: ;
2599
- --tw-drop-shadow: ;
2600
- --tw-backdrop-blur: ;
2601
- --tw-backdrop-brightness: ;
2602
- --tw-backdrop-contrast: ;
2603
- --tw-backdrop-grayscale: ;
2604
- --tw-backdrop-hue-rotate: ;
2605
- --tw-backdrop-invert: ;
2606
- --tw-backdrop-opacity: ;
2607
- --tw-backdrop-saturate: ;
2608
- --tw-backdrop-sepia: ;
2609
- --tw-contain-size: ;
2610
- --tw-contain-layout: ;
2611
- --tw-contain-paint: ;
2612
- --tw-contain-style: ;
2613
- }
2614
-
2615
- ::backdrop {
2616
- --tw-border-spacing-x: 0;
2617
- --tw-border-spacing-y: 0;
2618
- --tw-translate-x: 0;
2619
- --tw-translate-y: 0;
2620
- --tw-rotate: 0;
2621
- --tw-skew-x: 0;
2622
- --tw-skew-y: 0;
2623
- --tw-scale-x: 1;
2624
- --tw-scale-y: 1;
2625
- --tw-pan-x: ;
2626
- --tw-pan-y: ;
2627
- --tw-pinch-zoom: ;
2628
- --tw-scroll-snap-strictness: proximity;
2629
- --tw-gradient-from-position: ;
2630
- --tw-gradient-via-position: ;
2631
- --tw-gradient-to-position: ;
2632
- --tw-ordinal: ;
2633
- --tw-slashed-zero: ;
2634
- --tw-numeric-figure: ;
2635
- --tw-numeric-spacing: ;
2636
- --tw-numeric-fraction: ;
2637
- --tw-ring-inset: ;
2638
- --tw-ring-offset-width: 0px;
2639
- --tw-ring-offset-color: #fff;
2640
- --tw-ring-color: rgb(59 130 246 / 0.5);
2641
- --tw-ring-offset-shadow: 0 0 #0000;
2642
- --tw-ring-shadow: 0 0 #0000;
2643
- --tw-shadow: 0 0 #0000;
2644
- --tw-shadow-colored: 0 0 #0000;
2645
- --tw-blur: ;
2646
- --tw-brightness: ;
2647
- --tw-contrast: ;
2648
- --tw-grayscale: ;
2649
- --tw-hue-rotate: ;
2650
- --tw-invert: ;
2651
- --tw-saturate: ;
2652
- --tw-sepia: ;
2653
- --tw-drop-shadow: ;
2654
- --tw-backdrop-blur: ;
2655
- --tw-backdrop-brightness: ;
2656
- --tw-backdrop-contrast: ;
2657
- --tw-backdrop-grayscale: ;
2658
- --tw-backdrop-hue-rotate: ;
2659
- --tw-backdrop-invert: ;
2660
- --tw-backdrop-opacity: ;
2661
- --tw-backdrop-saturate: ;
2662
- --tw-backdrop-sepia: ;
2663
- --tw-contain-size: ;
2664
- --tw-contain-layout: ;
2665
- --tw-contain-paint: ;
2666
- --tw-contain-style: ;
2667
- }
2668
2668
  .container {
2669
2669
  width: 100%;
2670
2670
  }
@@ -4718,9 +4718,6 @@ input.tab:checked + .tab-content,
4718
4718
  .w-32 {
4719
4719
  width: 8rem;
4720
4720
  }
4721
- .w-44 {
4722
- width: 11rem;
4723
- }
4724
4721
  .w-64 {
4725
4722
  width: 16rem;
4726
4723
  }
@@ -9030,7 +9027,8 @@ const Toolbar = ({
9030
9027
  {
9031
9028
  proportionInterval,
9032
9029
  setMinProportion: (min) => setProportionInterval((prev) => ({ ...prev, min })),
9033
- setMaxProportion: (max) => setProportionInterval((prev) => ({ ...prev, max }))
9030
+ setMaxProportion: (max) => setProportionInterval((prev) => ({ ...prev, max })),
9031
+ labelPrefix: "Mean proportion"
9034
9032
  }
9035
9033
  ),
9036
9034
  /* @__PURE__ */ u$1(