diff --git a/.yarn/sdks/prettier/bin-prettier.js b/.yarn/sdks/prettier/bin-prettier.js new file mode 100755 index 00000000..73f04cac --- /dev/null +++ b/.yarn/sdks/prettier/bin-prettier.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = createRequire(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require prettier/bin-prettier.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real prettier/bin-prettier.js your application uses +module.exports = absRequire(`prettier/bin-prettier.js`); diff --git a/.yarn/sdks/prettier/index.js b/.yarn/sdks/prettier/index.js old mode 100755 new mode 100644 diff --git a/.yarn/sdks/prettier/package.json b/.yarn/sdks/prettier/package.json index f97fa554..0afcaf21 100644 --- a/.yarn/sdks/prettier/package.json +++ b/.yarn/sdks/prettier/package.json @@ -1,6 +1,7 @@ { "name": "prettier", - "version": "2.8.3-sdk", + "version": "2.8.8-sdk", "main": "./index.js", - "type": "commonjs" + "type": "commonjs", + "bin": "./bin-prettier.js" } diff --git a/.yarn/sdks/typescript/lib/typescript.js b/.yarn/sdks/typescript/lib/typescript.js index e14fa87b..b5f4db25 100644 --- a/.yarn/sdks/typescript/lib/typescript.js +++ b/.yarn/sdks/typescript/lib/typescript.js @@ -11,10 +11,10 @@ const absRequire = createRequire(absPnpApiPath); if (existsSync(absPnpApiPath)) { if (!process.versions.pnp) { - // Setup the environment to be able to require typescript/lib/typescript.js + // Setup the environment to be able to require typescript require(absPnpApiPath).setup(); } } -// Defer to the real typescript/lib/typescript.js your application uses -module.exports = absRequire(`typescript/lib/typescript.js`); +// Defer to the real typescript your application uses +module.exports = absRequire(`typescript`); diff --git a/.yarn/sdks/typescript/package.json b/.yarn/sdks/typescript/package.json index 0bfa4eb2..d32f3913 100644 --- a/.yarn/sdks/typescript/package.json +++ b/.yarn/sdks/typescript/package.json @@ -2,5 +2,9 @@ "name": "typescript", "version": "5.2.2-sdk", "main": "./lib/typescript.js", - "type": "commonjs" + "type": "commonjs", + "bin": { + "tsc": "./bin/tsc", + "tsserver": "./bin/tsserver" + } } diff --git a/deps/web-components b/deps/web-components index 55404d97..3db80aee 160000 --- a/deps/web-components +++ b/deps/web-components @@ -1 +1 @@ -Subproject commit 55404d973630c18f33d169c9b6e4c873e2ac70ee +Subproject commit 3db80aee7cf806011ef21fad4ae4d08ae5de956d diff --git a/packages/data-sheet-test/package.json b/packages/data-sheet-test/package.json index 2c541863..72bdcfbf 100644 --- a/packages/data-sheet-test/package.json +++ b/packages/data-sheet-test/package.json @@ -4,12 +4,12 @@ "main": "src/index.ts", "license": "ISC", "dependencies": { - "@blueprintjs/core": "4", - "@blueprintjs/icons": "^5.3.0", - "@blueprintjs/table": "^5.0.17", - "@macrostrat/data-sheet": "^1.0.0", + "@blueprintjs/core": "^4", + "@blueprintjs/table": "^4", + "@macrostrat/data-sheet": "workspace:^2.0.0-a1", "@macrostrat/hyper": "^2.2.1", "@macrostrat/ui-components": "workspace:^3.0.0", - "chroma-js": "^2.4.2" + "chroma-js": "^2.4.2", + "react": "^18.2.0" } } diff --git a/packages/data-sheet-test/src/index.ts b/packages/data-sheet-test/src/index.ts index 6e88b412..ae5a8958 100644 --- a/packages/data-sheet-test/src/index.ts +++ b/packages/data-sheet-test/src/index.ts @@ -1,83 +1,366 @@ import hyper from "@macrostrat/hyper"; -import { DataSheet, ColorEditor } from "@macrostrat/data-sheet"; -import { HotkeysProvider } from "@blueprintjs/core"; -import { Column, Table2 } from "@blueprintjs/table"; -import { useState } from "react"; +import { ColorPicker, EditorPopup } from "@macrostrat/data-sheet"; +import { ButtonGroup, Button, Intent } from "@blueprintjs/core"; +import { + Column, + Table2, + Cell, + FocusedCellCoordinates, + Region, +} from "@blueprintjs/table"; +import { useInDarkMode } from "@macrostrat/ui-components"; +import { useMemo, useState, useRef, useCallback, useEffect } from "react"; import chroma from "chroma-js"; +import update from "immutability-helper"; import styles from "./main.module.sass"; +import "@blueprintjs/table/lib/css/table.css"; const h = hyper.styled(styles); // More on component templates: https://storybook.js.org/docs/react/writing-stories/introduction#using-args -export default function DataSheetTestPage() { - return h("div.main", [h("h1", "Data sheet test"), h(DataSheetTest)]); -} +// TODO: add a "copy to selection" tool (the little square in the bottom right corner of a cell) +// This should copy the value of a cell (or a set of cells in the same row) downwards. + +export default function DataSheetTest() { + const darkMode = useInDarkMode(); + const columnSpec = buildColumnSpec(darkMode); + + // For now, we only consider a single cell "focused" when we have one cell selected. + // Multi-cell selections have a different set of "bulk" actions. + //const [focusedCell, setFocusedCell] = useState(null); + const [selection, setSelection] = useState([]); + const _topLeftCell = useMemo(() => topLeftCell(selection), [selection]); + const focusedCell = useMemo(() => singleFocusedCell(selection), [selection]); + const [fillValueBase, setFillValueBase] = + useState(null); + + useEffect(() => { + // Cancel value filling if we change the selection + if (focusedCell != null) { + setFillValueBase(null); + } + }, [focusedCell]); + + const ref = useRef(null); + + const data = useMemo(buildTestData, []); -function DataSheetTestOld() { - const [data, setData] = useState(buildTestData()); - return h(DataSheet, { - columns: columnSpec, - virtualized: true, - height: 500, - data: data, - valueRenderer: (d) => { - try { - return d.value.toFixed(2); - } catch (e) { - return `${d.value}`; + // A sparse array to hold updates + // TODO: create a "changeset" concept to facilitate undo/redo + const [updatedData, setUpdatedData] = useState([]); + const hasUpdates = updatedData.length > 0; + + const onCellEdited = useCallback( + (row: number, key: string, value: any) => { + let rowSpec = {}; + if (value != null) { + const rowOp = updatedData[row] != null ? "$merge" : "$set"; + rowSpec = { [rowOp]: { [key]: value } }; + } else { + rowSpec = { $unset: [key] }; } + const spec = { [row]: rowSpec }; + setUpdatedData(update(updatedData, spec)); }, - }); -} + [setUpdatedData, updatedData] + ); -function DataSheetTest() { - return h(HotkeysProvider, [ - h( - Table2, - { - nRows: 5, - }, - [h(Column), h(Column), h(Column)] - ), - ]); -} + const fillValues = useCallback( + (fillValueBase, selection) => { + // Fill values downwards + if (fillValueBase == null) return; + const { col, row } = fillValueBase; + const key = columnSpec[col].key; + const value = updatedData[row]?.[key] ?? data[row][key]; + const spec = {}; + for (const region of selection) { + const { cols, rows } = region; + for (const row of range(rows)) { + let op = updatedData[row] == null ? "$set" : "$merge"; + spec[row] = { [op]: { [key]: value } }; + } + } + setUpdatedData(update(updatedData, spec)); + }, + [updatedData] + ); -const columnSpec = [ - { name: "Strike", key: "strike" }, - { name: "Dip", key: "dip" }, - { name: "Rake", key: "rake" }, - { name: "Max.", key: "maxError", category: "Errors" }, - { name: "Min.", key: "minError", category: "Errors" }, - { - name: "Color", - key: "color", - required: false, - isValid: (d) => true, //getColor(d) != null, - transform: (d) => d, - dataEditor: ColorEditor, - valueViewer(d) { - let color = d.value; - try { - color.hex(); - } catch (e) { - color = null; + const clearSelection = useCallback(() => { + // Delete all selected cells + let spec = {}; + console.log(selection); + for (const region of selection) { + const { cols, rows } = region; + for (const row of range(rows)) { + let vals = {}; + for (const col of range(cols)) { + const key = columnSpec[col].key; + vals[key] = ""; + } + let op = updatedData[row] == null ? "$set" : "$merge"; + spec[row] = { [op]: vals }; } - return h( - "span.value-viewer", + } + setUpdatedData(update(updatedData, spec)); + }, [selection, updatedData, columnSpec]); + + return h("div.data-sheet-container", [ + h("div.data-sheet-toolbar", [ + h("div.spacer"), + h(ButtonGroup, [ + h( + Button, + { + intent: Intent.WARNING, + disabled: !hasUpdates, + onClick() { + setUpdatedData([]); + }, + }, + "Reset" + ), + h( + Button, + { + intent: Intent.SUCCESS, + icon: "floppy-disk", + disabled: !hasUpdates, + onClick() { + console.log("Here is where we would save data"); + }, + }, + "Save" + ), + ]), + ]), + h("div.data-sheet-holder", [ + h( + Table2, { - style: { - color: color?.css(), - backgroundColor: color?.luminance(0.8).css(), + ref, + numRows: data.length, + className: "data-sheet", + //enableFocusedCell: true, + //focusedCell, + selectedRegions: selection, + onSelection(val: Region[]) { + if (fillValueBase != null) { + let regions = val.map((region) => { + const { cols, rows } = region; + const [col] = cols; + return { cols: <[number, number]>[col, col], rows }; + }); + fillValues(fillValueBase, regions); + setSelection(regions); + } else { + setSelection(val); + } }, + cellRendererDependencies: [selection, updatedData], }, - color?.hex() - ); + columnSpec.map((col, colIndex) => { + return h(Column, { + name: col.name, + cellRenderer: (rowIndex) => { + const value = + updatedData[rowIndex]?.[col.key] ?? data[rowIndex][col.key]; + const valueRenderer = col.valueRenderer ?? ((d) => d); + const focused = + focusedCell?.col === colIndex && focusedCell?.row === rowIndex; + // Top left cell of a ranged selection + const topLeft = + _topLeftCell?.col === colIndex && + _topLeftCell?.row === rowIndex; + + const edited = updatedData[rowIndex]?.[col.key] != null; + const intent = edited ? "success" : undefined; + + const _Cell = col.cellComponent ?? BaseCell; + + if (!topLeft) { + // This should be the case for every cell except the focused one + return h( + _Cell, + { + intent, + value, + }, + valueRenderer(value) + ); + } + + if (!focused) { + // This should be the case for the focused cell + // Selection + return h(_Cell, { intent, value }, [ + h("input.hidden-input", { + autoFocus: true, + onKeyDown(e) { + console.log(e.key); + if (e.key == "Backspace" || e.key == "Delete") { + clearSelection(); + } + e.preventDefault(); + }, + }), + valueRenderer(value), + ]); + // Could probably put the hidden input elsewhere, + } + + // Single focused cell + + const onChange = (e) => { + const value = e.target.value; + onCellEdited(rowIndex, col.key, value); + }; + + let cellContents = null; + let cellClass = null; + + if (col.dataEditor != null) { + cellContents = h( + EditorPopup, + { + content: h(col.dataEditor, { + value, + onChange(value) { + onCellEdited(rowIndex, col.key, value); + }, + }), + className: cellClass, + }, + valueRenderer(value) + ); + } else { + cellClass = "input-cell"; + cellContents = h("input", { + value: valueRenderer(value), + autoFocus: true, + onChange, + }); + } + + // Hidden html input + return h( + _Cell, + { + intent, + className: cellClass, + truncated: false, + }, + [ + cellContents, + // TODO: we might want to drag multiple columns + // This should be on the last cell of a selection + h("div.corner-drag-handle", { + onMouseDown(e) { + setFillValueBase(focusedCell); + e.preventDefault(); + }, + }), + ] + ); + }, + }); + }) + ), + ]), + ]); +} + +function BaseCell({ children, value, ...rest }) { + return h( + Cell, + { + interactive: true, + ...rest, }, - }, -]; + children + ); +} + +function valueRenderer(d) { + try { + return d.toFixed(2); + } catch (e) { + return `${d}`; + } +} + +function range(arr: number[]) { + if (arr.length != 2) throw new Error("Range must have two elements"); + const [start, end] = arr; + return Array.from({ length: end - start + 1 }, (_, i) => i + start); +} -const cscale = chroma.scale("Spectral"); +function buildColumnSpec() { + return [ + { name: "Strike", key: "strike", valueRenderer }, + { name: "Dip", key: "dip", valueRenderer }, + { name: "Rake", key: "rake", valueRenderer }, + { name: "Max.", key: "maxError", category: "Errors", valueRenderer }, + { name: "Min.", key: "minError", category: "Errors", valueRenderer }, + { + name: "Color", + key: "color", + required: false, + isValid: (d) => true, //getColor(d) != null, + transform: (d) => d, + dataEditor: ColorPicker, + valueRenderer: (d) => { + let color = d; + try { + color = chroma(d); + } catch (e) { + color = null; + } + return color?.name() ?? ""; + }, + // Maybe this should be changed to CellProps? + cellComponent: ColorCell, + }, + ]; +} + +function ColorCell({ value, children, style, intent, ...rest }) { + const brighten = useInDarkMode() ? 0.5 : 0.1; + const color = value; + return h( + Cell, + { + ...rest, + style: { + ...style, + color: color?.luminance?.(brighten).css(), + backgroundColor: color?.alpha?.(0.2).css(), + }, + }, + children + ); +} + +function topLeftCell( + regions: Region[], + requireSolitaryCell: boolean = false +): FocusedCellCoordinates | null { + /** Top left cell of a ranged selection */ + if (regions == null) return null; + const [region] = regions; + if (region == null) return null; + const { cols, rows } = region; + if (cols == null || rows == null) return null; + if (requireSolitaryCell && (cols[0] !== cols[1] || rows[0] !== rows[1])) + return null; + return { col: cols[0], row: rows[0], focusSelectionIndex: 0 }; +} + +function singleFocusedCell(sel: Region[]): FocusedCellCoordinates | null { + /** Derive a single focused cell from a selected region, if possible */ + if (sel?.length !== 1) return null; + return topLeftCell(sel, true); +} function buildTestData() { const repeatedData = []; diff --git a/packages/data-sheet-test/src/main.module.sass b/packages/data-sheet-test/src/main.module.sass index a4568162..91250971 100644 --- a/packages/data-sheet-test/src/main.module.sass +++ b/packages/data-sheet-test/src/main.module.sass @@ -1,9 +1,55 @@ -body - height: 100vh - width: 100vw - padding: 0 - overflow-y: hidden - -.main - margin: 2em 8em - +@import "@blueprintjs/core/lib/scss/variables.scss" + +.data-sheet-container, .data-sheet-holder + flex: 1 + position: relative + min-height: 0 + +.data-sheet-container + display: flex + flex-direction: column + +.data-sheet + height: 100% + +:global(.bp4-dark) .data-sheet :global(.bp4-table-quadrant) + background-color: $dark-gray1 + +.input-cell + padding: 0 2px !important + input + width: 100% + height: 100% + padding: 0 8px + z-index: 0 + position: relative + border: none + margin: 0 + font-size: 1em + pointer-events: all + background: transparent + &:focus + outline: none + +.hidden-input + opacity: 0 + position: absolute + width: 0 + +.corner-drag-handle + position: absolute + bottom: 0 + right: 0 + width: 8px + height: 8px + background-color: $dark-gray1 + cursor: ns-resize + background-color: dodgerblue + +.data-sheet-toolbar + display: flex + flex-direction: row + margin-bottom: 4px + +.spacer + flex-grow: 1 \ No newline at end of file diff --git a/src/pages/dev/index.page.ts b/src/pages/dev/index.page.ts index 5dcbf11b..60a7a848 100644 --- a/src/pages/dev/index.page.ts +++ b/src/pages/dev/index.page.ts @@ -6,6 +6,7 @@ export function Page() { h("ul", [ h("li", h("a", { href: "/dev/globe" }, "Globe")), h("li", h("a", { href: "/dev/paleo" }, "Paleogeography")), + h("li", h("a", { href: "/dev/ui-tests" }, "UI tests")), ]), ]); } diff --git a/src/pages/dev/tests/data-sheet.page.ts b/src/pages/dev/tests/data-sheet.page.ts deleted file mode 100644 index 160ec60a..00000000 --- a/src/pages/dev/tests/data-sheet.page.ts +++ /dev/null @@ -1,8 +0,0 @@ -import h from "@macrostrat/hyper"; -import { ClientOnly } from "~/renderer/client-only"; - -export function Page() { - return h(ClientOnly, { - component: () => import("@macrostrat-web/data-sheet-test"), - }); -} diff --git a/src/pages/dev/ui-tests/data-sheet.page.ts b/src/pages/dev/ui-tests/data-sheet.page.ts new file mode 100644 index 00000000..eb7db396 --- /dev/null +++ b/src/pages/dev/ui-tests/data-sheet.page.ts @@ -0,0 +1,37 @@ +import hyper from "@macrostrat/hyper"; +import { Breadcrumbs, HotkeysProvider } from "@blueprintjs/core"; +import { ClientOnly } from "~/renderer/client-only"; +import style from "./main.module.sass"; + +const h = hyper.styled(style); + +function DataSheetTest() { + return h(ClientOnly, { + component: () => import("@macrostrat-web/data-sheet-test"), + }); +} + +export function Page() { + return h( + HotkeysProvider, + h("div.main", [ + h(Breadcrumbs, { + items: [ + { text: "Macrostrat", href: "/" }, + { text: "Development", href: "/dev" }, + { text: "UI tests", href: "/dev/ui-tests" }, + { text: "Data sheet" }, + ], + }), + h("h1", "Data sheet"), + h("p", [ + "This is a test of the a spreadsheet-like editor based on the ", + h("code", "@blueprintjs/core"), + " component. It will eventually be used as the basis for the ", + h("code", "@macrostrat/data-sheet"), + " library, which will underpin several important Macrostrat v2 user interfaces.", + ]), + h("div.data-sheet-container", h(DataSheetTest)), + ]) + ); +} diff --git a/src/pages/dev/tests/index.page.ts b/src/pages/dev/ui-tests/index.page.ts similarity index 60% rename from src/pages/dev/tests/index.page.ts rename to src/pages/dev/ui-tests/index.page.ts index 84992a82..d7be6d7c 100644 --- a/src/pages/dev/tests/index.page.ts +++ b/src/pages/dev/ui-tests/index.page.ts @@ -3,6 +3,8 @@ import h from "@macrostrat/hyper"; export function Page() { return h("div.dev-page", [ h("h1", "Macrostrat user interface tests"), - h("ul", [h("li", h("a", { href: "/dev/tests/data-sheet" }, "Data sheet"))]), + h("ul", [ + h("li", h("a", { href: "/dev/ui-tests/data-sheet" }, "Data sheet")), + ]), ]); } diff --git a/src/pages/dev/ui-tests/main.module.sass b/src/pages/dev/ui-tests/main.module.sass new file mode 100644 index 00000000..27feeefb --- /dev/null +++ b/src/pages/dev/ui-tests/main.module.sass @@ -0,0 +1,16 @@ +.main + padding: 2em 8em + display: flex + flex-direction: column + position: fixed + width: 100vw + height: 100vh + top: 0 + left: 0 + +.data-sheet-container + display: flex + flex-direction: column + flex: 1 + position: relative + min-height: 0 \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index cc9d2f16..5e2832b5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "baseUrl": ".", + "baseUrl": "./", "moduleResolution": "node", "target": "ES2020", "module": "ES2020", @@ -38,12 +38,10 @@ "@macrostrat/map-interface": [ "deps/web-components/packages/map-interface/src" ], - "@macrostrat/cesium-viewer": [ - "deps/cesium-viewer/src" - ], + "@macrostrat/cesium-viewer": ["deps/cesium-viewer/src"] } }, - "include": ["src", "packages/globe-dev/globe"], + "include": ["src", "packages/globe-dev/globe", "packages/*/src"], "types": ["vite/client"], "ts-node": { "transpileOnly": true, diff --git a/yarn.lock b/yarn.lock index 45a929f8..0f6745fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1716,16 +1716,7 @@ __metadata: languageName: node linkType: hard -"@blueprintjs/colors@npm:^5.0.5": - version: 5.0.5 - resolution: "@blueprintjs/colors@npm:5.0.5" - dependencies: - tslib: ~2.6.2 - checksum: 406dc1b45991bffb4301ac14bef214236661b0715c36adf499096b9c78b40f35740712c21d20afbed0fbe1913aaedb6a46c19f390141900e62cab5e52edd688e - languageName: node - linkType: hard - -"@blueprintjs/core@npm:4, @blueprintjs/core@npm:^4.14.1, @blueprintjs/core@npm:^4.17.8, @blueprintjs/core@npm:^4.18.0, @blueprintjs/core@npm:^4.20.2": +"@blueprintjs/core@npm:^4, @blueprintjs/core@npm:^4.14.1, @blueprintjs/core@npm:^4.17.8, @blueprintjs/core@npm:^4.18.0, @blueprintjs/core@npm:^4.20.2": version: 4.20.2 resolution: "@blueprintjs/core@npm:4.20.2" dependencies: @@ -1754,32 +1745,6 @@ __metadata: languageName: node linkType: hard -"@blueprintjs/core@npm:^5.6.0": - version: 5.6.0 - resolution: "@blueprintjs/core@npm:5.6.0" - dependencies: - "@blueprintjs/colors": ^5.0.5 - "@blueprintjs/icons": ^5.3.0 - "@popperjs/core": ^2.11.7 - classnames: ^2.3.1 - normalize.css: ^8.0.1 - react-popper: ^2.3.0 - react-transition-group: ^4.4.5 - tslib: ~2.6.2 - peerDependencies: - "@types/react": ^16.14.32 || 17 || 18 - react: ^16.8 || 17 || 18 - react-dom: ^16.8 || 17 || 18 - peerDependenciesMeta: - "@types/react": - optional: true - bin: - upgrade-blueprint-2.0.0-rename: scripts/upgrade-blueprint-2.0.0-rename.sh - upgrade-blueprint-3.0.0-rename: scripts/upgrade-blueprint-3.0.0-rename.sh - checksum: 430946049ce1052ea947928bcd24aacee66ef07127ab0f0ec11c306ed0621ce1268ea3dbf786e7da1b771835c7f7351c57a599418f30b47edfeb28e7caa41989 - languageName: node - linkType: hard - "@blueprintjs/datetime@npm:^4.1.2": version: 4.4.37 resolution: "@blueprintjs/datetime@npm:4.4.37" @@ -1810,24 +1775,6 @@ __metadata: languageName: node linkType: hard -"@blueprintjs/icons@npm:^5.3.0": - version: 5.3.0 - resolution: "@blueprintjs/icons@npm:5.3.0" - dependencies: - change-case: ^4.1.2 - classnames: ^2.3.1 - tslib: ~2.6.2 - peerDependencies: - "@types/react": ^16.14.32 || 17 || 18 - react: ^16.8 || 17 || 18 - react-dom: ^16.8 || 17 || 18 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 6eef6cd79f92791c07c9464b4c09cdba38eafdb680880f47a06f8e970bbd5218cc13a897d4371fae174613ada4ac2cea554f0ef2e8d644570be84c242b4140f0 - languageName: node - linkType: hard - "@blueprintjs/popover2@npm:^1.13.12, @blueprintjs/popover2@npm:^1.14.11": version: 1.14.11 resolution: "@blueprintjs/popover2@npm:1.14.11" @@ -1890,25 +1837,6 @@ __metadata: languageName: node linkType: hard -"@blueprintjs/table@npm:^5.0.17": - version: 5.0.17 - resolution: "@blueprintjs/table@npm:5.0.17" - dependencies: - "@blueprintjs/core": ^5.6.0 - classnames: ^2.3.1 - react-innertext: ^1.1.5 - tslib: ~2.6.2 - peerDependencies: - "@types/react": ^16.14.32 || 17 || 18 - react: ^16.8 || 17 || 18 - react-dom: ^16.8 || 17 || 18 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 70ba629cafd6cd429a6a6e4aae00b2615b4c68c2ecd59476986f75241870ea40eca10bd25b47d80f4170e59df624ab8424d2b76fceef769eafba733f87371eeb - languageName: node - linkType: hard - "@brillout/import@npm:0.2.3, @brillout/import@npm:^0.2.3": version: 0.2.3 resolution: "@brillout/import@npm:0.2.3" @@ -3357,13 +3285,13 @@ __metadata: version: 0.0.0-use.local resolution: "@macrostrat-web/data-sheet-test@workspace:packages/data-sheet-test" dependencies: - "@blueprintjs/core": 4 - "@blueprintjs/icons": ^5.3.0 - "@blueprintjs/table": ^5.0.17 - "@macrostrat/data-sheet": ^1.0.0 + "@blueprintjs/core": ^4 + "@blueprintjs/table": ^4 + "@macrostrat/data-sheet": "workspace:^2.0.0-a1" "@macrostrat/hyper": ^2.2.1 "@macrostrat/ui-components": "workspace:^3.0.0" chroma-js: ^2.4.2 + react: ^18.2.0 languageName: unknown linkType: soft @@ -3563,7 +3491,7 @@ __metadata: languageName: unknown linkType: soft -"@macrostrat/data-sheet@^1.0.0, @macrostrat/data-sheet@workspace:deps/web-components/packages/data-sheet": +"@macrostrat/data-sheet@workspace:^2.0.0-a1, @macrostrat/data-sheet@workspace:deps/web-components/packages/data-sheet": version: 0.0.0-use.local resolution: "@macrostrat/data-sheet@workspace:deps/web-components/packages/data-sheet" dependencies: @@ -28744,7 +28672,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:~2.6.2": +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad