diff --git a/deps/web-components b/deps/web-components index 818fac81c..3fff67600 160000 --- a/deps/web-components +++ b/deps/web-components @@ -1 +1 @@ -Subproject commit 818fac81cf8a7ca318701198ea380b64babad7ca +Subproject commit 3fff67600244631d0fda5cb2829c7dffd0c1728d diff --git a/package.json b/package.json index 7d03cc9a2..9dc968638 100644 --- a/package.json +++ b/package.json @@ -106,6 +106,7 @@ "@visx/axis": "^2.14.0", "@visx/scale": "^2.2.2", "@vitejs/plugin-react": "^4.0.4", + "allotment": "^1.20.2", "axios": "^0.25.0", "chroma-js": "^3.0.0", "classnames": "^2.2.6", diff --git a/pages/+config.ts b/pages/+config.ts index 2afe7c17c..4f569d3e8 100644 --- a/pages/+config.ts +++ b/pages/+config.ts @@ -19,6 +19,7 @@ export default { "environment", "urlPathname", "scripts", + "pageStyle", ], clientRouting: true, supportsDarkMode: true, @@ -29,6 +30,12 @@ export default { server: true, }, }, + pageStyle: { + env: { + client: true, + server: true, + }, + }, scripts: { env: { client: false, diff --git a/pages/dev/map/sources/+Page.client.ts b/pages/dev/map/sources/+Page.client.ts index 70b6a22a7..c42c5d20c 100644 --- a/pages/dev/map/sources/+Page.client.ts +++ b/pages/dev/map/sources/+Page.client.ts @@ -1,6 +1,6 @@ import h from "@macrostrat/hyper"; // Import other components -import { burwellTileDomain, mapboxAccessToken } from "@macrostrat-web/settings"; +import { mapboxAccessToken } from "@macrostrat-web/settings"; // Import other components import { Spacer, useDarkMode } from "@macrostrat/ui-components"; import mapboxgl from "mapbox-gl"; @@ -13,12 +13,11 @@ import { buildInspectorStyle, LocationPanel, MapView, - FeaturePanel, FeatureSelectionHandler, } from "@macrostrat/map-interface"; import { NonIdealState } from "@blueprintjs/core"; -import { LinkItem } from "pages/dev/map/layers/lib"; import { Link } from "~/components"; +import { boundingGeometryMapStyle } from "~/map-styles"; export function Page() { const dark = useDarkMode(); @@ -33,39 +32,7 @@ export function Page() { const [actualStyle, setActualStyle] = useState(null); useEffect(() => { - const color = isEnabled ? 255 : 20; - - const overlayStyle: mapboxgl.Style = { - version: 8, - sources: { - rgeom: { - type: "vector", - tiles: [burwellTileDomain + "/maps/bounds/{z}/{x}/{y}"], - maxzoom: 9, - }, - }, - layers: [ - { - id: "rgeom", - type: "fill", - source: "rgeom", - "source-layer": "bounds", - paint: { - "fill-color": `rgba(${color}, ${color}, ${color}, 0.1)`, - }, - }, - { - id: "rgeom-line", - type: "line", - source: "rgeom", - "source-layer": "bounds", - paint: { - "line-color": `rgba(${color}, ${color}, ${color}, 0.5)`, - "line-width": 1, - }, - }, - ], - }; + const overlayStyle = boundingGeometryMapStyle(isEnabled); buildInspectorStyle(baseStyle, overlayStyle, { mapboxToken: mapboxAccessToken, diff --git a/pages/dev/me/+Page.client.ts b/pages/dev/me/+Page.client.ts index 0f44ef7d2..10818b210 100644 --- a/pages/dev/me/+Page.client.ts +++ b/pages/dev/me/+Page.client.ts @@ -1,7 +1,34 @@ import h from "@macrostrat/hyper"; import { DocumentationPage } from "~/layouts"; -import { AuthStatus } from "@macrostrat/auth-components"; +import { AuthStatus, useAuth } from "@macrostrat/auth-components"; +import { usePostgresQuery } from "#/integrations/xdd/extractions/lib/data-service"; export function Page() { - return h(DocumentationPage, { title: "Login" }, [h(AuthStatus)]); + return h(DocumentationPage, { title: "Login" }, [ + h(UserIdentity), + h(UserIdentityPostgrest), + h(AuthStatus), + ]); +} + +function UserIdentity() { + const { user } = useAuth(); + + return h("div", [ + h("h3", "User Identity"), + h("pre", JSON.stringify(user, null, 2)), + ]); +} + +function UserIdentityPostgrest() { + const res = usePostgresQuery("rpc/auth_status"); + + if (res == null) { + return h("div", "No Postgrest auth status"); + } + + return h("div", [ + h("h3", "User identity (PostgREST)"), + h("pre", JSON.stringify(res?.token, null, 2)), + ]); } diff --git a/pages/integrations/xdd/feedback/+Page.client.ts b/pages/integrations/xdd/feedback/+Page.client.ts index 92d1ea722..9a2d32699 100644 --- a/pages/integrations/xdd/feedback/+Page.client.ts +++ b/pages/integrations/xdd/feedback/+Page.client.ts @@ -1,13 +1,15 @@ import { FullscreenPage } from "~/layouts"; import h from "./main.module.sass"; import { PageBreadcrumbs } from "~/components"; -import { PostgRESTTableView } from "~/components/legend-table"; +import { PostgRESTTableView } from "@macrostrat/data-sheet2"; +import { postgrestPrefix } from "@macrostrat-web/settings"; export function Page() { return h(FullscreenPage, { className: "main" }, [ h(PageBreadcrumbs), h("h1", "Source text"), h(PostgRESTTableView, { + endpoint: postgrestPrefix, table: "kg_source_text", columns: "id,map_legend_id,paper_id,last_update,created,n_runs,n_entities,n_matches,n_strat_names", diff --git a/pages/integrations/xdd/runs/+Page.ts b/pages/integrations/xdd/runs/+Page.ts index 508c37f6f..e1317d779 100644 --- a/pages/integrations/xdd/runs/+Page.ts +++ b/pages/integrations/xdd/runs/+Page.ts @@ -2,7 +2,8 @@ import { FullscreenPage } from "~/layouts"; import hyper from "@macrostrat/hyper"; import styles from "./main.module.sass"; import { PageBreadcrumbs } from "~/components"; -import { PostgRESTTableView } from "~/components/legend-table"; +import { PostgRESTTableView } from "@macrostrat/data-sheet2"; +import { postgrestPrefix } from "@macrostrat-web/settings"; const h = hyper.styled(styles); @@ -11,6 +12,7 @@ export function Page() { h(PageBreadcrumbs), h("h1", "Model runs"), h(PostgRESTTableView, { + endpoint: postgrestPrefix, table: "kg_model_run", columns: "id,timestamp,model_id,version_id,source_text_id,map_legend_id,supersedes,superseded_by", diff --git a/pages/integrations/xdd/types/+Page.client.ts b/pages/integrations/xdd/types/+Page.client.ts index 756c364dd..e23901b4e 100644 --- a/pages/integrations/xdd/types/+Page.client.ts +++ b/pages/integrations/xdd/types/+Page.client.ts @@ -1,15 +1,14 @@ import { FullscreenPage } from "~/layouts"; import h from "@macrostrat/hyper"; import { PageBreadcrumbs } from "~/components"; -import { PostgRESTTableView } from "~/components/legend-table"; - import { + PostgRESTTableView, ColorCell, - //EditableTextArea, - //ColorPicker, + EditableTextArea, } from "@macrostrat/data-sheet2"; import { asChromaColor } from "@macrostrat/color-utils"; import { AuthStatus } from "@macrostrat/auth-components"; +import { postgrestPrefix } from "@macrostrat-web/settings"; const colorField = { name: "Color", @@ -30,6 +29,7 @@ export function Page() { h(PageBreadcrumbs), h("div.header", [h("h1", "Entity types"), h("div.spacer"), h(AuthStatus)]), h(PostgRESTTableView, { + endpoint: postgrestPrefix, table: "kg_entity_type", editable: true, columnOptions: { diff --git a/pages/layout.module.sass b/pages/layout.module.sass index 317d35050..c17982efc 100644 --- a/pages/layout.module.sass +++ b/pages/layout.module.sass @@ -13,3 +13,8 @@ right: 0 margin: 1em z-index: 5000 + +.fullscreen-page + height: 100vh + overflow: hidden + position: relative diff --git a/pages/map/+config.ts b/pages/map/+config.ts index 1e6dc4e78..0beaa3284 100644 --- a/pages/map/+config.ts +++ b/pages/map/+config.ts @@ -13,4 +13,5 @@ export default { }, }, title: "Map", + pageStyle: "fullscreen", }; diff --git a/pages/maps/+Page.ts b/pages/maps/+Page.ts index d3d9ce398..0395e0b27 100644 --- a/pages/maps/+Page.ts +++ b/pages/maps/+Page.ts @@ -1,5 +1,5 @@ import h from "./main.module.scss"; -import { AnchorButton, ButtonGroup } from "@blueprintjs/core"; +import { AnchorButton } from "@blueprintjs/core"; import { ContentPage } from "~/layouts"; import { PageHeader, DevLinkButton, AssistantLinks } from "~/components"; import { usePageProps } from "~/renderer/usePageProps"; @@ -20,9 +20,7 @@ export function Page() { h(PageHeader, { title: "Maps" }), h( "ul.maps-list", - sources.map((d) => - h.if(d.is_mapped)(SourceItem, { source: d, key: d.source_id }) - ) + sources.map((d) => h(SourceItem, { source: d, key: d.source_id })) ), ]); } diff --git a/pages/maps/+config.ts b/pages/maps/+config.ts new file mode 100644 index 000000000..df20ea1f0 --- /dev/null +++ b/pages/maps/+config.ts @@ -0,0 +1,3 @@ +export default { + pageStyle: "content", +}; diff --git a/pages/maps/+onBeforeRender.ts b/pages/maps/+onBeforeRender.ts index c4413ce7e..0cda1bdaf 100644 --- a/pages/maps/+onBeforeRender.ts +++ b/pages/maps/+onBeforeRender.ts @@ -6,6 +6,7 @@ export async function onBeforeRender(pageContext) { const res = await postgrest .from("sources_metadata") .select("*") + .eq("is_finalized", true) .order("source_id", { ascending: true }); const pageProps = { sources: res.data }; diff --git a/pages/maps/@id/+config.ts b/pages/maps/@id/+config.ts index ac56ce592..868c69872 100644 --- a/pages/maps/@id/+config.ts +++ b/pages/maps/@id/+config.ts @@ -7,4 +7,5 @@ export default { }, }, }, + pageStyle: "fullscreen", }; diff --git a/pages/maps/@id/legend/+Page.ts b/pages/maps/@id/legend/+Page.ts index 6e050e2d3..adaf11e46 100644 --- a/pages/maps/@id/legend/+Page.ts +++ b/pages/maps/@id/legend/+Page.ts @@ -1,16 +1,15 @@ -import { HotkeysProvider, Spinner, Tag } from "@blueprintjs/core"; -import DataSheet from "@macrostrat/data-sheet2"; +import { HotkeysProvider, Spinner } from "@blueprintjs/core"; +import { DataSheet, ColorCell } from "@macrostrat/data-sheet2"; import { FullscreenPage } from "~/layouts"; import hyper from "@macrostrat/hyper"; import styles from "./main.module.sass"; -import { ColorCell } from "@macrostrat/data-sheet2"; import { PageBreadcrumbs } from "~/components"; import { LongTextViewer, IntervalCell, lithologyRenderer, ExpandedLithologies, -} from "~/components/legend-table"; +} from "~/components/data-table"; import { useLegendData } from "../utils"; import { useData } from "vike-react/useData"; diff --git a/pages/maps/ingestion/+Page.ts b/pages/maps/ingestion/+Page.ts index 0f1f1a7a6..168ef3daf 100644 --- a/pages/maps/ingestion/+Page.ts +++ b/pages/maps/ingestion/+Page.ts @@ -54,7 +54,6 @@ export function Page() { return h(ContentPage, [ h(PageBreadcrumbs), - //h(IngestNavbar, { user }), h("div.ingestion-title-bar", [ h("h1", ["Map ingestion queue"]), h("div.spacer"), diff --git a/pages/maps/ingestion/+config.ts b/pages/maps/ingestion/+config.ts index 45da14cea..6e70bbf1a 100644 --- a/pages/maps/ingestion/+config.ts +++ b/pages/maps/ingestion/+config.ts @@ -3,4 +3,5 @@ export default { // Applies to all pages ssr: false, + pageStyle: "content", }; diff --git a/pages/maps/ingestion/@id/+Page.ts b/pages/maps/ingestion/@id/+Page.ts index 213637f50..a66fefc4d 100644 --- a/pages/maps/ingestion/@id/+Page.ts +++ b/pages/maps/ingestion/@id/+Page.ts @@ -1,10 +1,13 @@ import hyper from "@macrostrat/hyper"; import styles from "./main.module.sass"; import { AnchorButton, ButtonGroup } from "@blueprintjs/core"; -import { FullscreenPage } from "~/layouts"; import { Header } from "./components"; import { MapInterface } from "./components"; import { usePageProps } from "~/renderer/usePageProps"; +import { useState } from "react"; +import { Allotment } from "allotment"; +import { MapSelectedFeatures } from "./details-panel"; +import "allotment/dist/style.css"; const h = hyper.styled(styles); @@ -30,12 +33,38 @@ export function Page() { const basename = `/maps/ingestion/${source_id}`; - return h(FullscreenPage, { className: "page" }, [ + const [mapSelectedFeatures, selectFeatures] = useState([]); + const [inspectPosition, setInspectPosition] = useState(null); + + const showSelectedFeatures = + mapSelectedFeatures != null && mapSelectedFeatures.length > 0; + + return h("div.page", [ h(Header, headerProps), h("div.ingestion-main-panel", [ h("div.context-panel", [h(EditMenu, { parentRoute: basename })]), - h("div.main-content", [ - h(MapInterface, { id: source_id, map: mapBounds, slug: source.slug }), + h(Allotment, { className: "main-panel", defaultSizes: [800, 300] }, [ + h("div.map-container", [ + h(MapInterface, { + map: mapBounds, + slug: source.slug, + onClickFeatures: selectFeatures, + selectedFeatures: mapSelectedFeatures, + inspectPosition, + setInspectPosition, + }), + ]), + h(Allotment.Pane, { visible: showSelectedFeatures }, [ + h(MapSelectedFeatures, { + features: mapSelectedFeatures, + onClose() { + selectFeatures([]); + setInspectPosition(null); + }, + selectFeatures, + className: "details-panel", + }), + ]), ]), ]), ]); diff --git a/pages/maps/ingestion/@id/+config.ts b/pages/maps/ingestion/@id/+config.ts index ac56ce592..868c69872 100644 --- a/pages/maps/ingestion/@id/+config.ts +++ b/pages/maps/ingestion/@id/+config.ts @@ -7,4 +7,5 @@ export default { }, }, }, + pageStyle: "fullscreen", }; diff --git a/pages/maps/ingestion/@id/@editMode/+Page.ts b/pages/maps/ingestion/@id/@editMode/+Page.ts index 24e2b0640..efdc023ec 100644 --- a/pages/maps/ingestion/@id/@editMode/+Page.ts +++ b/pages/maps/ingestion/@id/@editMode/+Page.ts @@ -1,13 +1,16 @@ import { Button, HotkeysProvider } from "@blueprintjs/core"; import { ingestPrefix } from "@macrostrat-web/settings"; import hyper from "@macrostrat/hyper"; -import { useStoredState } from "@macrostrat/ui-components"; -import { FullscreenPage } from "~/layouts"; -import { Header, WidthAdjustablePanel } from "../components"; +import { ErrorBoundary, useStoredState } from "@macrostrat/ui-components"; +import { BasePage } from "~/layouts"; +import { Header, MapInterface } from "../components"; import styles from "./main.module.sass"; -import { MapInterface } from "../components"; import { LinesTable, PointsTable, PolygonsTable } from "../tables"; import { usePageProps } from "~/renderer/usePageProps"; +import { Allotment } from "allotment"; +import { useState } from "react"; +import "allotment/dist/style.css"; +import { MapSelectedFeatures } from "#/maps/ingestion/@id/details-panel"; const h = hyper.styled(styles); @@ -35,7 +38,7 @@ export function Page() { let url = sourcePrefix + `/${editMode}`; const ingestProcessId = ingestProcess.id; - const tableComponent = routeMap[editMode]; + let tableComponent = routeMap[editMode]; const [showMap, setShowMap] = useStoredState( "edit:showMap", @@ -44,19 +47,19 @@ export function Page() { (v) => typeof v === "boolean" ); + const [mapSelectedFeatures, selectFeatures] = useState([]); + const [inspectPosition, setInspectPosition] = useState(null); + + const showSelectedFeatures = + mapSelectedFeatures != null && mapSelectedFeatures.length > 0; + return h( - FullscreenPage, + BasePage, + { fitViewport: true }, h(HotkeysProvider, [ h("div.edit-page", [ - h( - WidthAdjustablePanel, - { - expand: !showMap, - className: "edit-page-content", - storageID: "edit-panel-width", - }, - // TODO: make this basename dynamic - [ + h(Allotment, [ + h("div.main-panel", [ h( Header, { @@ -66,33 +69,39 @@ export function Page() { }, [h(ShowMapButton, { showMap, setShowMap })] ), - h(TableContainer, {}, [ - h(tableComponent, { - url, - ingestProcessId, - }), + h("div.table-container", [ + h(ErrorBoundary, [ + h(tableComponent, { + url, + ingestProcessId, + }), + ]), ]), - ] - ), - h.if(showMap)(MapInterface, { - id: source_id, - map: mapBounds, - slug, - featureTypes: [editMode], - }), + ]), + h.if(showMap)("div.map-panel", [ + h(MapInterface, { + map: mapBounds, + slug, + featureTypes: [editMode], + onClickFeatures: selectFeatures, + inspectPosition, + setInspectPosition, + }), + ]), + h.if(showSelectedFeatures)(MapSelectedFeatures, { + features: mapSelectedFeatures, + selectFeatures, + onClose() { + setInspectPosition(null); + selectFeatures([]); + }, + }), + ]), ]), ]) ); } -const TableContainer = ({ children }) => { - return h( - "div.table-container", - { style: { display: "flex", flexDirection: "column", height: "100%" } }, - children - ); -}; - function ShowMapButton({ showMap, setShowMap }) { return h(Button, { minimal: true, diff --git a/pages/maps/ingestion/@id/@editMode/main.module.sass b/pages/maps/ingestion/@id/@editMode/main.module.sass index 3fe703453..a4c259738 100644 --- a/pages/maps/ingestion/@id/@editMode/main.module.sass +++ b/pages/maps/ingestion/@id/@editMode/main.module.sass @@ -1,10 +1,19 @@ .edit-page display: flex flex-direction: row - width: calc(100% - 2em) - height: calc(100% - 2em) - overflow: hidden + height: 100% + position: relative + --navbar-padding: 5px +.main-panel + height: 100% + display: flex + flex-direction: column + padding: 1em 2em + +.table-container + flex: 1 + min-height: 0 .spacer flex-grow: 1 @@ -16,7 +25,7 @@ .map-panel-container flex: 1 min-width: 0 - + div.interface height: 100% background-color: #efefef @@ -24,9 +33,15 @@ div.interface margin-right: auto - - - div.edit-table-wrapper overflow: scroll width: 100% + +.map-panel + display: flex + height: 100% + flex-direction: column + +.single-map + flex: 1 + min-height: 40% diff --git a/pages/maps/ingestion/@id/columns.ts b/pages/maps/ingestion/@id/columns.ts deleted file mode 100644 index 243abd155..000000000 --- a/pages/maps/ingestion/@id/columns.ts +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Generators for the table columns in the ingestion table - */ - -import hyper from "@macrostrat/hyper"; - -import { ColumnProps, Column } from "@blueprintjs/table"; -import { DataParameters } from "#/maps/ingestion/@id/table"; -import IntervalSelection from "#/maps/ingestion/@id/components/cells/interval-selection"; -import { getTableUpdate } from "#/maps/ingestion/@id/components/table-util"; -import CheckboxCell from "#/maps/ingestion/@id/components/cells/checkbox-cell"; -import { toBoolean } from "#/maps/ingestion/@id/components/cells/util"; -import styles from "#/maps/ingestion/@id/edit-table.module.sass"; - -const h = hyper.styled(styles); - -type ColumnConfig = { - [key: string]: ColumnProps; -}; - -interface ColumnConfigGenerator { - url: string; - defaultColumnConfig: ColumnConfig; - tableColumns: string[]; - dataParameters: DataParameters[]; - setTableUpdates: (tableUpdates: any[]) => void; - transformedData: any[]; - data: any[]; - intervals: any[]; - ref: any; -} - -const polygonColumnGenerator = ({ - url, - defaultColumnConfig, - tableColumns, - dataParameters, - setTableUpdates, - transformedData, - data, - intervals, - ref, -}: ColumnConfigGenerator): ColumnProps[] => { - return { - ...defaultColumnConfig, - t_interval: h(Column, { - ...defaultColumnConfig["t_interval"].props, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(IntervalSelection, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch (e) {} - }, - intervals: intervals, - onConfirm: (value) => { - const tableUpdate = getTableUpdate( - url, - value, - "t_interval", - rowIndex, - transformedData, - dataParameters - ); - - let newTableUpdates = [tableUpdate]; - - if ( - transformedData[rowIndex]["b_interval"] == undefined || - transformedData[rowIndex]["b_interval"] == "" - ) { - let oppositeIntervalTableUpdate = getTableUpdate( - url, - value, - "b_interval", - rowIndex, - transformedData, - dataParameters - ); - - newTableUpdates.push(oppositeIntervalTableUpdate); - } - - setTableUpdates(newTableUpdates); - }, - intent: - data[rowIndex]["t_interval"] != - transformedData[rowIndex]["t_interval"] - ? "success" - : undefined, - value: - transformedData.length == 0 - ? "" - : transformedData[rowIndex]["t_interval"], - }), - }), - b_interval: h(Column, { - ...defaultColumnConfig["b_interval"].props, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(IntervalSelection, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch (e) {} - }, - intervals: intervals, - onConfirm: (value) => { - const tableUpdate = getTableUpdate( - url, - value, - "b_interval", - rowIndex, - transformedData, - dataParameters - ); - - let newTableUpdates = [tableUpdate]; - - if ( - transformedData[rowIndex]["t_interval"] == undefined || - transformedData[rowIndex]["t_interval"] == "" - ) { - let oppositeIntervalTableUpdate = getTableUpdate( - url, - value, - "t_interval", - rowIndex, - transformedData, - dataParameters - ); - - newTableUpdates.push(oppositeIntervalTableUpdate); - } - - setTableUpdates(newTableUpdates); - }, - intent: - data[rowIndex]["b_interval"] != - transformedData[rowIndex]["b_interval"] - ? "success" - : undefined, - value: - transformedData.length == 0 - ? "" - : transformedData[rowIndex]["b_interval"], - }), - }), - omit: h(Column, { - ...defaultColumnConfig["omit"].props, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(CheckboxCell, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch (e) {} - }, - onConfirm: (value) => { - const tableUpdate = getTableUpdate( - url, - value, - "omit", - rowIndex, - transformedData, - dataParameters - ); - - setTableUpdates(tableUpdate); - }, - value: toBoolean(transformedData[rowIndex]["omit"]), - }), - }), - }; -}; diff --git a/pages/maps/ingestion/@id/components/cells/checkbox-cell.ts b/pages/maps/ingestion/@id/components/cells/checkbox-cell.ts index 8ddd5c77a..5a8b2f9d9 100644 --- a/pages/maps/ingestion/@id/components/cells/checkbox-cell.ts +++ b/pages/maps/ingestion/@id/components/cells/checkbox-cell.ts @@ -2,11 +2,7 @@ import React, { forwardRef, memo, useEffect, useMemo } from "react"; import { Button } from "@blueprintjs/core"; import { Cell, EditableCell2Props } from "@blueprintjs/table"; - -import hyper from "@macrostrat/hyper"; -import styles from "./main.module.sass"; - -const h = hyper.styled(styles); +import h from "../../hyper"; interface CheckboxCell extends Omit { value: boolean | undefined; @@ -67,3 +63,4 @@ let CheckboxCell = forwardRef((props: CheckboxCell, ref) => { CheckboxCell = memo(CheckboxCell); export default CheckboxCell; +export { CheckboxCell }; diff --git a/pages/maps/ingestion/@id/components/cells/editable.ts b/pages/maps/ingestion/@id/components/cells/editable.ts index 02df1561c..f1078bd89 100644 --- a/pages/maps/ingestion/@id/components/cells/editable.ts +++ b/pages/maps/ingestion/@id/components/cells/editable.ts @@ -2,10 +2,8 @@ import React, { forwardRef, memo, useEffect } from "react"; import { Cell, EditableCell2Props } from "@blueprintjs/table"; -import hyper from "@macrostrat/hyper"; -import styles from "./main.module.sass"; - -const h = hyper.styled(styles); +import h from "../../hyper"; +import classNames from "classnames"; interface EditableCellProps extends EditableCell2Props { columnName: string; @@ -18,8 +16,7 @@ interface EditableCellProps extends EditableCell2Props { } const _EditableCell = forwardRef((props: EditableCellProps, ref) => { - - const { style, ...rest } = props; + const { style, disabled, ...rest } = props; // Keep an optimistic value so that the ui is responsive in case of slow onConfirm const [optimisticValue, setOptimisticValue] = React.useState(props.value); @@ -35,11 +32,11 @@ const _EditableCell = forwardRef((props: EditableCellProps, ref) => { "input", { ref, - disabled: props?.editableTextProps?.disabled, - className: "editable-cell", + disabled: disabled ?? props?.editableTextProps?.disabled, + className: classNames("editable-cell", { disabled }), style: { width: (props.value?.length ?? 2) + "ch", - color: "inherit" // Necessary so changed cells have the correct color text + color: "inherit", // Necessary so changed cells have the correct color text }, value: optimisticValue || "", onChange: (e) => { @@ -64,7 +61,7 @@ const _EditableCell = forwardRef((props: EditableCellProps, ref) => { }, onBlur: (e) => { props.onConfirm(e.target.value); - } + }, }, [] ), diff --git a/pages/maps/ingestion/@id/components/cells/editor-popover.ts b/pages/maps/ingestion/@id/components/cells/editor-popover.ts deleted file mode 100644 index d5b8bae2f..000000000 --- a/pages/maps/ingestion/@id/components/cells/editor-popover.ts +++ /dev/null @@ -1,9 +0,0 @@ -// @ts-ignore -import hyper from "@macrostrat/hyper"; - -import "@blueprintjs/select/lib/css/blueprint-select.css"; -import styles from "../../edit-table.module.sass"; - -const h = hyper.styled(styles); - -export const EditorPopover = () => {}; diff --git a/pages/maps/ingestion/@id/components/cells/index.d.ts b/pages/maps/ingestion/@id/components/cells/index.d.ts deleted file mode 100644 index 25d6792c3..000000000 --- a/pages/maps/ingestion/@id/components/cells/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface CellProps extends React.HTMLProps { - value: string; - onChange: (value: string) => void; -} diff --git a/pages/maps/ingestion/@id/components/cells/index.ts b/pages/maps/ingestion/@id/components/cells/index.ts index cdbfba394..a09799a56 100644 --- a/pages/maps/ingestion/@id/components/cells/index.ts +++ b/pages/maps/ingestion/@id/components/cells/index.ts @@ -1 +1,10 @@ export * from "./editable"; +export * from "./checkbox-cell"; +export * from "./interval-selection"; +export * from "./long-text"; +export * from "./util"; + +export interface CellProps extends React.HTMLProps { + value: string; + onChange: (value: string) => void; +} diff --git a/pages/maps/ingestion/@id/components/cells/interval-selection.ts b/pages/maps/ingestion/@id/components/cells/interval-selection.ts index 15e399cc3..b377b5a33 100644 --- a/pages/maps/ingestion/@id/components/cells/interval-selection.ts +++ b/pages/maps/ingestion/@id/components/cells/interval-selection.ts @@ -4,14 +4,7 @@ import { Cell, EditableCell2Props } from "@blueprintjs/table"; import React, { useMemo, memo } from "react"; import { useInDarkMode } from "@macrostrat/ui-components"; import { getColorPair } from "@macrostrat/color-utils"; - -// @ts-ignore -import hyper from "@macrostrat/hyper"; - -import "~/styles/blueprint-select"; -import styles from "../../edit-table.module.sass"; - -const h = hyper.styled(styles); +import h from "../../hyper"; interface Timescale { timescale_id: number; @@ -153,13 +146,13 @@ let IntervalSelection = ({ roleStructure: "listoption", }), }, - h(IntervalButton, { interval, intent, setActive }) + h(IntervalView, { interval, intent, setActive }) ), ] ); }; -function IntervalButton({ interval, intent, setActive }) { +export function IntervalView({ interval, intent, setActive }) { const inDarkMode = useInDarkMode(); const colors = getColorPair(interval?.color, inDarkMode); return h( @@ -192,3 +185,4 @@ function IntervalButton({ interval, intent, setActive }) { IntervalSelection = memo(IntervalSelection); export default IntervalSelection; +export { IntervalSelection }; diff --git a/pages/maps/ingestion/@id/components/cells/long-text.ts b/pages/maps/ingestion/@id/components/cells/long-text.ts index 6517d3621..9d57d755a 100644 --- a/pages/maps/ingestion/@id/components/cells/long-text.ts +++ b/pages/maps/ingestion/@id/components/cells/long-text.ts @@ -2,13 +2,7 @@ import { Button, Popover } from "@blueprintjs/core"; import { Cell, EditableCell2Props } from "@blueprintjs/table"; import React, { forwardRef, useEffect } from "react"; -// @ts-ignore -import hyper from "@macrostrat/hyper"; - -//import "@blueprintjs/core/lib/css/blueprint.css"; -import styles from "../../edit-table.module.sass"; - -const h = hyper.styled(styles); +import h from "../../hyper"; const LongTextCell = forwardRef((props: EditableCell2Props, forwardRef) => { const { value, onConfirm } = props; @@ -102,4 +96,4 @@ const LongTextCell = forwardRef((props: EditableCell2Props, forwardRef) => { ); }); -export default LongTextCell; +export { LongTextCell }; diff --git a/pages/maps/ingestion/@id/components/cells/main.module.sass b/pages/maps/ingestion/@id/components/cells/main.module.sass deleted file mode 100644 index a26d00767..000000000 --- a/pages/maps/ingestion/@id/components/cells/main.module.sass +++ /dev/null @@ -1,84 +0,0 @@ -@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(.bp5-dark) :global(.bp5-table-cell) - 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 - - -.editable-cell - height: 18px - padding: 1.7px 8px - font-size: 12px - min-height: 0px - min-width: 99% - box-shadow: none - border: 0 - z-index: 0 - position: relative - max-width: 99% - -.short - &:focus - z-index: 99 - max-width: 999% - border: #2d72d2 solid 2px - margin: -1px - height: 22px - -.long - width: 100% - overflow: hidden - &:focus - z-index: 99 - border: #2d72d2 solid 2px - margin: -1px \ No newline at end of file diff --git a/pages/maps/ingestion/@id/components/header.ts b/pages/maps/ingestion/@id/components/header.ts index 53c7f156c..77a36b0eb 100644 --- a/pages/maps/ingestion/@id/components/header.ts +++ b/pages/maps/ingestion/@id/components/header.ts @@ -31,7 +31,7 @@ export function Header({ setIngestProcess(await response.json()); }, []); - return h("div", [ + return h("div.header", [ h(PageBreadcrumbs), h("div.edit-page-header", [ h("h2", "Map ingestion"), diff --git a/pages/maps/ingestion/@id/components/index.ts b/pages/maps/ingestion/@id/components/index.ts index 92f17e286..3c011982a 100644 --- a/pages/maps/ingestion/@id/components/index.ts +++ b/pages/maps/ingestion/@id/components/index.ts @@ -1,4 +1,3 @@ -export * from "./panels"; export * from "./progress-popover"; export * from "./cells"; export * from "./table-menu"; diff --git a/pages/maps/ingestion/@id/components/main.module.sass b/pages/maps/ingestion/@id/components/main.module.sass index 5bc429993..8d26b1f30 100644 --- a/pages/maps/ingestion/@id/components/main.module.sass +++ b/pages/maps/ingestion/@id/components/main.module.sass @@ -1,37 +1,12 @@ -.width-adjustable-panel - transition: max-width 0.1s ease-in-out - height: 100% - width: 100% - display: flex - flex-direction: row - position: relative - -.width-adjustable-panel-content - display: flex - flex-direction: column - overflow: scroll - height: 100% - flex-grow: 1 - padding: 1em - width: 100% - -.width-adjuster - cursor: col-resize - width: 6px - height: 100% - // Not sure why this defaults to shrinking - flex-shrink: 0 - background-color: #efefef - &:hover - background-color: #ddd - .edit-page-header display: flex flex-direction: row gap: 1em align-items: baseline + h2 min-width: 20% + h3 font-weight: 500 @@ -44,4 +19,8 @@ align-items: center justify-content: center height: 100vh - flex: 1 \ No newline at end of file + flex: 1 + +.single-map + flex-grow: 1 + min-height: 20% diff --git a/pages/maps/ingestion/@id/components/map-interface.ts b/pages/maps/ingestion/@id/components/map-interface.ts index edf6ebc9a..64f332a20 100644 --- a/pages/maps/ingestion/@id/components/map-interface.ts +++ b/pages/maps/ingestion/@id/components/map-interface.ts @@ -1,12 +1,13 @@ -import { Radio, RadioGroup } from "@blueprintjs/core"; +import { Radio, RadioGroup, Spinner } from "@blueprintjs/core"; import { SETTINGS, tileserverDomain } from "@macrostrat-web/settings"; import hyper from "@macrostrat/hyper"; import { + FeatureSelectionHandler, MapAreaContainer, + MapMarker, MapView, PanelCard, } from "@macrostrat/map-interface"; -import { useMapRef } from "@macrostrat/mapbox-react"; import { NonIdealState, Switch } from "@blueprintjs/core"; import { buildMacrostratStyle } from "@macrostrat/mapbox-styles"; import { getMapboxStyle, mergeStyles } from "@macrostrat/mapbox-utils"; @@ -21,7 +22,8 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { MapNavbar } from "~/components/map-navbar"; import "~/styles/global.styl"; import styles from "./main.module.sass"; -import chroma from "chroma-js"; +import { asChromaColor, toRGBAString } from "@macrostrat/color-utils"; +import { boundingGeometryMapStyle } from "~/map-styles"; const h = hyper.styled(styles); @@ -49,36 +51,6 @@ const emptyStyle: any = { layers: [], }; -function buildOverlayStyle({ - style, - mapSlug, - layers = ["points", "lines", "polygons"], - layerOpacity, -}: StyleOpts): any { - let baseStyle = style ?? emptyStyle; - let macrostratStyle = {}; - if (layerOpacity.vector != null) { - macrostratStyle = buildMacrostratStyle({ - tileserverDomain: SETTINGS.burwellTileDomain, - fillOpacity: layerOpacity.vector - 0.1, - strokeOpacity: layerOpacity.vector + 0.2, - lineOpacity: layerOpacity.vector + 0.4, - }); - } - - let tableStyles = layers.map((layer) => { - const table = tableName(mapSlug, layer); - return buildStyle({ - inDarkMode: false, - sourceID: table, - featureTypes: [layer], - tileURL: tileserverDomain + `/${table}/tilejson.json`, - }); - }); - - return mergeStyles(baseStyle, macrostratStyle, ...tableStyles); -} - function tableName(slug, layer) { return `sources.${slug}_${layer}`; } @@ -108,10 +80,13 @@ function basemapStyle(basemap, inDarkMode) { } export function MapInterface({ - id, map, slug, - featureTypes = ["points", "lines", "polygons"], + featureTypes = ["points", "lines", "polygons", "rgeom"], + onClickFeatures, + selectedFeatures, + inspectPosition, + setInspectPosition, }) { const [isOpen, setOpen] = useState(false); @@ -125,10 +100,19 @@ export function MapInterface({ } const dark = useDarkMode()?.isEnabled ?? false; - const table = `sources.${slug}_polygons`; const hasRaster = rasterURL(map.properties.source_id) != null; + const [showOmittedRows, setShowOmittedRows] = useStoredState( + "ingestion:mapShowOmittedRows", + false + ); + + const [showColors, setShowColors] = useStoredState( + "ingestion:mapShowColors", + false + ); + const bounds: LngLatBoundsLike | "invalid" = useMemo(() => { return ensureBoxInGeographicRange(boundingBox(map.geometry)); }, [map.geometry]); @@ -137,7 +121,7 @@ export function MapInterface({ const [layer, setLayer] = useStoredState( "ingestion:baseLayer", - Basemap.None, + Basemap.Basic, (v) => { return Object.values(Basemap).includes(v); } @@ -174,11 +158,22 @@ export function MapInterface({ style, mapSlug: slug, layers: _featureTypes, - //focusedMap: map.properties.source_id, + focusedMap: map.properties.source_id, layerOpacity, + showOmittedRows, + showColors, + selectedFeatures, }) ); - }, [map.properties.source_id, style, layerOpacity, _featureTypes]); + }, [ + map.properties.source_id, + style, + layerOpacity, + _featureTypes, + showOmittedRows, + showColors, + selectedFeatures, + ]); if (bounds == null || bounds == "invalid") { let title = "No map data"; @@ -200,6 +195,21 @@ export function MapInterface({ const contextPanel = h(PanelCard, [ h(FeatureTypeSwitches, { featureTypes: _featureTypes, setFeatureTypes }), h("div.vector-controls", [ + h("h3", "Display options"), + h(Switch, { + label: "Show omitted rows", + checked: showOmittedRows, + onChange(e) { + setShowOmittedRows(e.target.checked); + }, + }), + h(Switch, { + label: "Show colors", + checked: showColors, + onChange(e) { + setShowColors(e.target.checked); + }, + }), h("h3", "Macrostrat"), h(OpacitySlider, { opacity: layerOpacity.vector, @@ -220,6 +230,10 @@ export function MapInterface({ h(BaseLayerSelector, { layer, setLayer }), ]); + if (mapStyle == null) { + return h(Spinner); + } + return h( MapAreaContainer, { @@ -232,52 +246,28 @@ export function MapInterface({ }, [ h(MapView, { - style: mapStyle, ///"mapbox://styles/mapbox/satellite-v9", + style: mapStyle, mapboxToken: SETTINGS.mapboxAccessToken, bounds, mapPosition: null, fitBoundsOptions: { padding: 50 }, }), - h(MapFeatureSelector, { featureTypes: _featureTypes, slug }), + h(FeatureSelectionHandler, { + selectedLocation: inspectPosition, + setFeatures: onClickFeatures, + }), + h(MapMarker, { + position: inspectPosition, + setPosition: setInspectPosition, + }), ] ); } -function MapFeatureSelector({ featureTypes, slug }) { - const queryLayers = useMemo( - () => featureTypes.map((t) => tableName(slug, t) + "_" + t), - [featureTypes, slug] - ); - - const mapRef = useMapRef(); - - const listener = useCallback( - (e) => { - const features = mapRef.current?.queryRenderedFeatures(e.point, { - layers: queryLayers, - }); - console.log(features); - }, - [mapRef.current, queryLayers] - ); - - useEffect(() => { - console.log("Setting up listener"); - const map = mapRef.current; - if (map == null) return; - map.on("click", listener); - return () => { - map.off("click", listener); - }; - }, [listener]); - - return null; -} - function FeatureTypeSwitches({ featureTypes, setFeatureTypes }) { return h("div.feature-type-switches", [ h("h3", "Map layers"), - ["points", "lines", "polygons"].map((t) => { + ["points", "lines", "polygons", "rgeom"].map((t) => { return h(Switch, { label: t.charAt(0).toUpperCase() + t.slice(1), checked: featureTypes.includes(t), @@ -329,45 +319,209 @@ function OpacitySlider(props) { ]); } -export function buildStyle({ +const _defaultColor = "rgb(74, 242, 161)"; + +function buildOverlayStyle({ + style, + mapSlug, + layers = ["points", "lines", "polygons", "rgeom"], + layerOpacity, + showOmittedRows, + showColors, + selectedFeatures, +}: StyleOpts): any { + let baseStyle = style ?? emptyStyle; + let macrostratStyle = {}; + if (layerOpacity.vector != null) { + macrostratStyle = buildMacrostratStyle({ + tileserverDomain: SETTINGS.burwellTileDomain, + fillOpacity: layerOpacity.vector - 0.1, + strokeOpacity: layerOpacity.vector + 0.2, + lineOpacity: layerOpacity.vector + 0.4, + }); + } + + const notOmitted = ["!=", "omit", true]; + + let mainColor = "#000000"; + let omitColor = "#ffffff"; + + // This filtering strategy doesn't quite work because lines, points, and polygons + // have overlapping source layers sometimes + + let tableStyle = buildBasicStyle({ + inDarkMode: false, + sourceID: mapSlug, + featureTypes: layers, + color: showColors ? mainColor : _defaultColor, + tileURL: tileserverDomain + `/ingestion/${mapSlug}/tilejson.json`, + filter: buildFilters(notOmitted), + }); + + let selectedStyle = null; + if (selectedFeatures != null && selectedFeatures.length > 0) { + selectedStyle = buildBasicStyle({ + inDarkMode: false, + sourceID: mapSlug, + featureTypes: layers, + color: "red", + tileURL: tileserverDomain + `/ingestion/${mapSlug}/tilejson.json`, + //filter: buildFilters(isSelected), + suffix: "selected", + adjustForDarkMode: false, + fillOpacity: 0.3, + }); + for (let layer of selectedStyle.layers) { + const type = layer["source-layer"]; + const isSelected = buildSelectionFilters(selectedFeatures, type); + layer.filter = buildFilters(layer.filter, isSelected); + } + } + + if (showColors) { + for (let layer of tableStyle.layers) { + if (layer["source-layer"] == "polygons") { + layer.filter = buildFilters(layer.filter, ["!has", "color"]); + } + } + + if (layers.includes("polygons")) { + tableStyle.layers = [ + { + ...baseElements( + mapSlug, + "polygons", + "color", + buildFilters(["has", "color"], notOmitted) + ), + type: "fill", + paint: { + "fill-color": ["get", "color"], + "fill-opacity": 0.5, + }, + }, + ...tableStyle.layers, + ]; + } + } + + let omittedTableStyle = null; + if (showOmittedRows) { + omittedTableStyle = buildBasicStyle({ + inDarkMode: false, + sourceID: mapSlug, + featureTypes: layers, + tileURL: tileserverDomain + `/ingestion/${mapSlug}/tilejson.json`, + suffix: "omitted", + filter: buildFilters(["==", "omit", true]), + color: omitColor, + }); + } + + let rgeomStyle = null; + if (layers.includes("rgeom")) { + rgeomStyle = boundingGeometryMapStyle(false, mapSlug); + } + + return mergeStyles( + baseStyle, + macrostratStyle, + rgeomStyle, + tableStyle, + omittedTableStyle, + selectedStyle + ); +} + +function buildSelectionFilters(selectedFeatures, type = "polygons") { + if (selectedFeatures == null || selectedFeatures.length == 0) { + return null; + } + + const keys = selectedFeatures + .filter((f) => f.layer["source-layer"] == type) + .map(getProp("_pkid")); + return ["in", "_pkid", ...keys]; +} + +function getProp(key) { + return (f) => f._vectorTileFeature.properties[key]; +} + +function buildFilters(...filters) { + const _filters = filters.filter((f) => f != null); + if (_filters.length == 0) return null; + if (_filters.length == 1) return _filters[0]; + return ["all", ..._filters]; +} + +function anyFilters(...filters) { + const _filters = filters.filter((f) => f != null); + if (_filters.length == 0) return null; + if (_filters.length == 1) return _filters[0]; + return ["any", ..._filters]; +} + +function baseElements(sourceID, featureType, suffix = "", filter = null) { + let id = sourceID + "_" + featureType; + if (suffix != null && suffix != "") { + id += "_" + suffix; + } + let lyr = { + id, + source: sourceID, + "source-layer": featureType, + }; + + if (filter != null) { + lyr.filter = filter; + } + return lyr; +} + +export function buildBasicStyle({ color = "rgb(74, 242, 161)", inDarkMode, sourceLayers, sourceID = "tileLayer", featureTypes = ["points", "lines", "polygons"], tileURL, + filter = null, + suffix = null, + adjustForDarkMode = true, + fillOpacity = 0.1, }): mapboxgl.Style { const xRayColor = (opacity = 1, darken = 0) => { - if (!inDarkMode) { - return chroma(color) - .darken(2 - darken) - .alpha(opacity) - .css(); + const c0 = asChromaColor(color).alpha(opacity); + let c1 = c0; + if (adjustForDarkMode) { + if (!inDarkMode) { + c1 = c0.darken(2 - darken); + } + c1 = c0.darken(darken); } - return chroma(color).alpha(opacity).darken(darken).css(); + return toRGBAString(c1); }; let layers = []; - if (featureTypes.includes("polygons")) { + const fillOutlineOpacity = Math.max(fillOpacity + 0.4, 1); + + if (featureTypes.includes("points")) { layers.push({ - id: sourceID + "_polygons", - type: "fill", - source: sourceID, - "source-layer": sourceLayers?.polygons ?? "default", + ...baseElements(sourceID, "points", suffix, filter), + type: "circle", paint: { - "fill-color": xRayColor(0.1), - "fill-outline-color": xRayColor(0.5), + "circle-color": xRayColor(1, 1), + "circle-radius": 5, }, }); } if (featureTypes.includes("lines")) { layers.push({ - id: sourceID + "_lines", + ...baseElements(sourceID, "lines", suffix, filter), type: "line", - source: sourceID, - "source-layer": sourceLayers?.lines ?? "default", paint: { "line-color": xRayColor(1, -1), "line-width": 1.5, @@ -375,15 +529,13 @@ export function buildStyle({ }); } - if (featureTypes.includes("points")) { + if (featureTypes.includes("polygons")) { layers.push({ - id: sourceID + "_points", - type: "circle", - source: sourceID, - "source-layer": sourceLayers?.points ?? "default", + ...baseElements(sourceID, "polygons", suffix, filter), + type: "fill", paint: { - "circle-color": xRayColor(1, 1), - "circle-radius": 5, + "fill-color": xRayColor(fillOpacity), + "fill-outline-color": xRayColor(fillOutlineOpacity), }, }); } diff --git a/pages/maps/ingestion/@id/components/panels.ts b/pages/maps/ingestion/@id/components/panels.ts deleted file mode 100644 index 9f5068304..000000000 --- a/pages/maps/ingestion/@id/components/panels.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { ReactNode, useEffect } from "react"; -import { useRef } from "react"; -import { useStoredState } from "@macrostrat/ui-components"; -import hyper from "@macrostrat/hyper"; -import styles from "./main.module.sass"; -export const h = hyper.styled(styles); - -export enum AdjustSide { - LEFT = "left", - RIGHT = "right", -} - -export function WidthAdjustablePanel({ - children, - adjustSide = AdjustSide.RIGHT, - expand, - className, - storageID = null, -}: { - children: ReactNode; - adjustSide?: AdjustSide; - expand?: boolean; - className?: string; - storageID?: string; -}) { - const [maxWidth, setMaxWidth] = useStoredState( - storageID, - 0, - (v) => typeof v === "number" - ); - - useEffect(() => { - if (typeof window === "undefined") return; - setMaxWidth(window.innerWidth / 2); - }, []); - - if (expand) { - return h("div.width-adjustable-panel", { className }, [ - h("div.width-adjustable-panel-content", {}, children), - ]); - } - return h( - "div.width-adjustable-panel", - { style: { maxWidth: maxWidth + "px" }, className }, - [ - h.if(adjustSide == AdjustSide.LEFT)(WidthAdjuster, { - onAdjust: (dx) => { - const newMaxWidth = maxWidth - dx; - setMaxWidth(newMaxWidth); - }, - }), - h("div.width-adjustable-panel-content", {}, children), - h.if(adjustSide == AdjustSide.RIGHT)(WidthAdjuster, { - onAdjust: (dx) => { - const newMaxWidth = maxWidth + dx; - setMaxWidth(newMaxWidth); - }, - }), - ] - ); -} - -function WidthAdjuster({ onAdjust }: { onAdjust: (dx: number) => void }) { - const startPosition = useRef(0); - return h( - "div.width-adjuster", - { - onDragStart: (e) => { - startPosition.current = e.clientX; - }, - onDragEnd: (e) => { - const dx = e.clientX - startPosition.current; - onAdjust(dx); - }, - draggable: true, - }, - [] - ); -} diff --git a/pages/maps/ingestion/@id/components/table-header.ts b/pages/maps/ingestion/@id/components/table-header.ts index 21803e1bd..5170f0eea 100644 --- a/pages/maps/ingestion/@id/components/table-header.ts +++ b/pages/maps/ingestion/@id/components/table-header.ts @@ -39,6 +39,7 @@ export const TableHeader = ({ downloadSourceFiles, clearDataParameters, markAsHarmonized, + children, }: TableHeaderProps) => { const activeFilters = Object.values(dataParameters.filter).filter((f) => f.is_valid() @@ -49,84 +50,87 @@ export const TableHeader = ({ hiddenColumns.length != 0 || tableUpdates.length != 0; - return h("div.input-form", {}, [ - h(ButtonGroup, [ - h(Popover, { - interactionKind: "click", - minimal: true, - placement: "bottom-start", - content: h(Menu, {}, [ - h(MenuItem, { - icon: "refresh", - text: "Clear Changes", - onClick: clearTableUpdates, + return h("div.table-header", [ + h("div.input-form", {}, [ + h(ButtonGroup, [ + h(Popover, { + interactionKind: "click", + minimal: true, + placement: "bottom-start", + content: h(Menu, {}, [ + h(MenuItem, { + icon: "refresh", + text: "Clear Changes", + onClick: clearTableUpdates, + disabled: tableUpdates.length == 0, + }), + h(MenuItem, { + icon: "filter", + text: "Clear Filters/Group", + onClick: clearDataParameters, + disabled: + dataParameters.group == undefined && activeFilters.length == 0, + }), + h(MenuItem, { + disabled: hiddenColumns.length == 0, + icon: "eye-open", + text: "Show Hidden Columns", + onClick: showAllColumns, + }), + h(MenuItem, { + icon: "cross", + text: "Show Omitted Rows", + onClick: toggleShowOmittedRows, + }), + h(MenuItem, { + icon: "download", + text: "Download Source Files", + onClick: downloadSourceFiles, + }), + h(MenuItem, { + icon: "issue-new", + text: "Report Issue/Request Feature", + href: "https://github.com/UW-Macrostrat/web/issues/new?assignees=&labels=ingestion&projects=&template=ingestion.md&title=", + target: "_blank", + }), + ]), + renderTarget: ({ ...targetProps }) => + h(Button, { + ...targetProps, + icon: "menu", + intent: isMenuActive ? "success" : undefined, + }), + }), + h( + Button, + { + type: "submit", + onClick: submitTableUpdates, disabled: tableUpdates.length == 0, - }), - h(MenuItem, { - icon: "filter", - text: "Clear Filters/Group", - onClick: clearDataParameters, - disabled: - dataParameters.group == undefined && activeFilters.length == 0, - }), - h(MenuItem, { - disabled: hiddenColumns.length == 0, - icon: "eye-open", - text: "Show Hidden Columns", - onClick: showAllColumns, - }), - h(MenuItem, { - icon: "cross", - text: "Show Omitted Rows", - onClick: toggleShowOmittedRows, - }), - h(MenuItem, { - icon: "download", - text: "Download Source Files", - onClick: downloadSourceFiles, - }), - h(MenuItem, { - icon: "issue-new", - text: "Report Issue/Request Feature", - href: "https://github.com/UW-Macrostrat/web/issues/new?assignees=&labels=ingestion&projects=&template=ingestion.md&title=", - target: "_blank", - }), - ]), - renderTarget: ({ ...targetProps }) => - h(Button, { - ...targetProps, - icon: "menu", - intent: isMenuActive ? "success" : undefined, - }), - }), - h( - Button, - { - type: "submit", - onClick: submitTableUpdates, - disabled: tableUpdates.length == 0, - intent: "success", - }, - ["Submit Changes"] - ), - h( - Button, - { - type: "submit", - onClick: markAsHarmonized, - intent: "success", - title: "Mark the legend as harmonized and generate the map", - }, - ["Generate Map"] - ), - h.if(totalNumberOfRows != undefined)( - Button, - { - disabled: true, - }, - [`${totalNumberOfRows} Rows`] - ), + intent: "success", + }, + ["Submit Changes"] + ), + h( + Button, + { + type: "submit", + onClick: markAsHarmonized, + intent: "success", + title: "Mark the legend as harmonized and generate the map", + }, + ["Generate Map"] + ), + h.if(totalNumberOfRows != undefined)( + Button, + { + disabled: true, + }, + [`${totalNumberOfRows} Rows`] + ), + ]), ]), + children, ]); }; diff --git a/pages/maps/ingestion/@id/components/table-menu.ts b/pages/maps/ingestion/@id/components/table-menu.ts index 014c8656b..3e6e522d4 100644 --- a/pages/maps/ingestion/@id/components/table-menu.ts +++ b/pages/maps/ingestion/@id/components/table-menu.ts @@ -3,15 +3,12 @@ import React from "react"; import { useDebouncedCallback } from "use-debounce"; // @ts-ignore -import hyper from "@macrostrat/hyper"; import { OperatorQueryParameter, ColumnOperatorOption } from "../table"; import "~/styles/blueprint-select"; -import styles from "../edit-table.module.sass"; -import { Filter } from "./table-util"; - -const h = hyper.styled(styles); +import { Filter } from "../utils/filter"; +import h from "../hyper"; const validExpressions: ColumnOperatorOption[] = [ { key: "na", value: "", verbose: "None" }, @@ -21,8 +18,16 @@ const validExpressions: ColumnOperatorOption[] = [ { key: "gt", value: ">", verbose: "Is greater than" }, { key: "ge", value: ">=", verbose: "Is greater than or equal to" }, { key: "ne", value: "<>", verbose: "Is not equal to" }, - { key: "is_distinct_from", value: "IS DISTINCT FROM", verbose: "Is distinct from" }, - { key: "is_not_distinct_from", value: "IS NOT DISTINCT FROM", verbose: "Is not distinct from" }, + { + key: "is_distinct_from", + value: "IS DISTINCT FROM", + verbose: "Is distinct from", + }, + { + key: "is_not_distinct_from", + value: "IS NOT DISTINCT FROM", + verbose: "Is not distinct from", + }, { key: "like", value: "LIKE", verbose: "Like" }, { key: "is", value: "IS", verbose: "Is", placeholder: "true | false | null" }, { key: "in", value: "IN", verbose: "In", placeholder: "1,2,3" }, @@ -41,13 +46,15 @@ interface TableMenuProps { export const TableMenu = ({ columnName, onFilterChange, - filter, + filter: _filter, onGroupChange, group, onHide, }: TableMenuProps) => { const [inputPlaceholder, setInputPlaceholder] = React.useState(""); + const filter = _filter ?? new Filter(columnName, "eq", null); + // Create a debounced version of the text state const [inputValue, setInputValue] = React.useState(filter.value); const onInputChange = (e: React.ChangeEvent) => { diff --git a/pages/maps/ingestion/@id/details-panel.module.sass b/pages/maps/ingestion/@id/details-panel.module.sass new file mode 100644 index 000000000..2e40a1324 --- /dev/null +++ b/pages/maps/ingestion/@id/details-panel.module.sass @@ -0,0 +1,20 @@ +.map-selected-features + max-height: 100% + display: flex + flex-direction: column + +.toolbar + display: flex + flex-direction: row + justify-content: space-between + align-items: center + position: sticky + padding: 0 1em + top: 0 + background-color: var(--panel-secondary-background-color) + border-bottom: 1px solid var(--panel-rule-color) + +.feature-list + flex-grow: 1 + overflow-y: scroll + padding: 1em 0 diff --git a/pages/maps/ingestion/@id/details-panel.ts b/pages/maps/ingestion/@id/details-panel.ts new file mode 100644 index 000000000..6d7563ffb --- /dev/null +++ b/pages/maps/ingestion/@id/details-panel.ts @@ -0,0 +1,41 @@ +import { JSONView } from "@macrostrat/ui-components"; +import { Button } from "@blueprintjs/core"; +import styles from "./details-panel.module.sass"; +import hyper from "@macrostrat/hyper"; + +const h = hyper.styled(styles); + +export function MapSelectedFeatures({ + features, + onClose, + selectFeatures, + className, +}) { + if (features == null || features.length === 0) { + return null; + } + return h("div.map-selected-features", { className }, [ + h("div.toolbar", [ + h("h3", "Selected features"), + h(Button, { + icon: "cross", + minimal: true, + onClick: onClose, + }), + ]), + h("div.feature-list", [ + features.map((f) => { + return h(Feature, { feature: f }); + }), + ]), + ]); +} + +function Feature({ feature }) { + return h("div.feature", [ + h(JSONView, { + data: feature._vectorTileFeature.properties, + showRoot: false, + }), + ]); +} diff --git a/pages/maps/ingestion/@id/edit-table.module.sass b/pages/maps/ingestion/@id/edit-table.module.sass deleted file mode 100644 index 2665ec0aa..000000000 --- a/pages/maps/ingestion/@id/edit-table.module.sass +++ /dev/null @@ -1,37 +0,0 @@ -.table-container - height: 100% - display: flex - flex-direction: column - -td - text-wrap: nowrap - background-color: #ffffff78 - -tr:nth-child(odd) td - background-color: #ffffff - -div.input-form - display: flex - flex-direction: row - -.update-input-group - flex-grow: 1 - -div.filter-header - padding-bottom: .4rem - font-size: 1rem - -div.filter-select - padding-bottom: .2rem - -div.filter-container - box-shadow: #00000038 1px 1px 8px - padding: 10px - border-radius: 10px - -div.warning - background-color: rgb(255 216 152 / 73%) - color: black - border: #ffe26c solid 1px - font-size: 1rem - padding-bottom: 0.2rem diff --git a/pages/maps/ingestion/@id/hyper.ts b/pages/maps/ingestion/@id/hyper.ts new file mode 100644 index 000000000..1f6afd533 --- /dev/null +++ b/pages/maps/ingestion/@id/hyper.ts @@ -0,0 +1,13 @@ +import hyper from "@macrostrat/hyper"; + +// Duplicative style imports +import "~/styles/blueprint-select"; +import "@blueprintjs/select/lib/css/blueprint-select.css"; +import "@blueprintjs/table/lib/css/table.css"; +import "./override.sass"; + +import styles from "./tables/edit-table.module.sass"; + +const h = hyper.styled(styles); + +export default h; diff --git a/pages/maps/ingestion/@id/main.module.sass b/pages/maps/ingestion/@id/main.module.sass index 48e5fd735..6db07a53e 100644 --- a/pages/maps/ingestion/@id/main.module.sass +++ b/pages/maps/ingestion/@id/main.module.sass @@ -1,16 +1,20 @@ -body - margin: 0 - padding: 0 - :root --map-detail-stack-width: fit-content +.page + padding: 1em 2em + .single-map flex: 1 height: 100% margin: 0 --map-context-stack-width: 16em +.map-container + height: 100% + display: flex + flex-direction: column + .map-legend-container overflow-y: scroll @@ -23,9 +27,11 @@ body .legend-title display: flex flex-direction: row + &:hover cursor: pointer background: #eee + h4 margin: 0 margin-right: 0.5em @@ -37,8 +43,8 @@ body margin-right: 0.5em .edit-menu - display: flex - flex-direction: column + display: flex + flex-direction: column .m-0 margin: 0 @@ -57,16 +63,19 @@ body .edit-menu flex-grow: 1 + button.icon-button aspect-ratio: 1 / 1 margin: 5px display: flex flex-direction: column border-radius: 10px + .icon-container display: flex margin: auto padding: 6px + .icon-label padding-bottom: 10px @@ -78,9 +87,10 @@ body gap: 2em padding-bottom: 3em -.main-content - position: relative - flex-grow: 1 + +.main-panel border-radius: 8px overflow: hidden + box-shadow: 1px 1px 8px 1px #00000038 + border: 1px solid var(--panel-rule-color) diff --git a/pages/maps/ingestion/@id/reducer/data.ts b/pages/maps/ingestion/@id/reducer/data.ts index cb980de16..5954b8b99 100644 --- a/pages/maps/ingestion/@id/reducer/data.ts +++ b/pages/maps/ingestion/@id/reducer/data.ts @@ -1,4 +1,3 @@ - import { buildURL } from "../components/table-util"; import { applyTableUpdates, @@ -6,15 +5,18 @@ import { DataParameters, squashTableUpdates, cloneDataParameters, - Filter + Filter, } from "../utils/index"; -interface TableData { +export interface TableStoredState { + hiddenColumns: string[]; +} + +export interface TableData extends TableStoredState { loading: boolean; remoteData: Record[]; totalNumberOfRows?: number; allColumns: string[]; - hiddenColumns: string[]; tableUpdates: TableUpdate[]; parameters: DataParameters; } @@ -29,30 +31,37 @@ export const initialState: TableData = { parameters: { select: { page: "0", - pageSize: "50" + pageSize: "50", }, filter: { - "omit": new Filter("omit", "is_distinct_from", "true") - } - } + omit: new Filter("omit", "is_distinct_from", "true"), + }, + }, }; -export const addTableUpdates = (state: TableData, tableUpdates: TableUpdate[]) => { +export const addTableUpdates = ( + state: TableData, + tableUpdates: TableUpdate[] +) => { + /** Add a table update to the state */ // Squash new and existing updates - const newTableUpdates = squashTableUpdates([...state.tableUpdates, ...tableUpdates]); + const newTableUpdates = squashTableUpdates([ + ...state.tableUpdates, + ...tableUpdates, + ]); return { ...state, - tableUpdates: newTableUpdates - } -} + tableUpdates: newTableUpdates, + }; +}; export const clearTableUpdates = (state: TableData) => { return { ...state, - tableUpdates: [] + tableUpdates: [], }; -} +}; export const revertTableUpdate = (state: TableData) => { const newTableUpdates = [...state.tableUpdates]; @@ -60,95 +69,97 @@ export const revertTableUpdate = (state: TableData) => { return { ...state, - tableUpdates: newTableUpdates + tableUpdates: newTableUpdates, }; -} +}; export const updateColumns = (state: TableData, columns: string[]) => { return { ...state, - allColumns: columns + allColumns: columns, }; -} +}; export const hideColumn = (state: TableData, column: string) => { return { ...state, - hiddenColumns: [...state.hiddenColumns, column] + hiddenColumns: [...state.hiddenColumns, column], }; -} +}; export const showColumn = (state: TableData, column: string) => { return { ...state, - hiddenColumns: state.hiddenColumns.filter(c => c !== column) + hiddenColumns: state.hiddenColumns.filter((c) => c !== column), }; -} +}; export const showAllColumns = (state: TableData) => { return { ...state, - hiddenColumns: [] + hiddenColumns: [], }; -} +}; export const toggleShowOmittedRows = (state: TableData) => { - const newDataParameters = cloneDataParameters(state.parameters); - const currentlyHidden = newDataParameters.filter["omit"].is_valid() + const currentlyHidden = newDataParameters.filter["omit"].is_valid(); if (currentlyHidden) { - newDataParameters.filter["omit"] = new Filter("omit", "eq", null); + delete newDataParameters.filter["omit"]; } else { - newDataParameters.filter["omit"] = new Filter("omit", "is_distinct_from", "true"); + newDataParameters.filter["omit"] = new Filter( + "omit", + "is_distinct_from", + "true" + ); } return { ...state, - parameters: newDataParameters + parameters: newDataParameters, }; -} +}; export const updateData = ( state: TableData, - action : { - data: Record[], - totalNumberOfRows: number + action: { + data: Record[]; + totalNumberOfRows: number; } ) => { - // Check if there are new columns to record - const dataColumns = action.data.length == 0 ? [] : Object.keys(action.data[0]); + const dataColumns = + action.data.length == 0 ? [] : Object.keys(action.data[0]); const allColumns = [...new Set([...state.allColumns, ...dataColumns])]; // Add a filter for all the new columns - allColumns.forEach((c) => { - if (!(c in state.parameters.filter)) { - state.parameters.filter[c] = new Filter(c, "eq", null); - } - }) + // allColumns.forEach((c) => { + // if (!(c in state.parameters.filter)) { + // state.parameters.filter[c] = new Filter(c, "eq", null); + // } + // }); return { ...state, remoteData: action.data, totalNumberOfRows: action.totalNumberOfRows, allColumns, - loading: false - } -} + loading: false, + }; +}; export const appendData = ( state: TableData, data: Record[] ) => { - const remoteData = [...state.remoteData, ...data]; return { ...state, - remoteData + remoteData, }; -} +}; export const setPage = (state: TableData, page: string) => { const newDataParameters = cloneDataParameters(state.parameters); @@ -156,15 +167,15 @@ export const setPage = (state: TableData, page: string) => { return { ...state, - parameters: newDataParameters + parameters: newDataParameters, }; -} +}; -export const incrementPage = (state: TableData, increment: number | string ) => { - const page = parseInt(state.parameters.select.page) + - parseInt(increment.toString()); +export const incrementPage = (state: TableData, increment: number | string) => { + const page = + parseInt(state.parameters.select.page) + parseInt(increment.toString()); return setPage(state, page.toString()); -} +}; export const setPageSize = (state: TableData, pageSize: string) => { const newDataParameters = cloneDataParameters(state.parameters); @@ -172,15 +183,18 @@ export const setPageSize = (state: TableData, pageSize: string) => { return { ...state, - parameters: newDataParameters + parameters: newDataParameters, }; -} +}; -export const incrementPageSize = (state: TableData, increment: number | string) => { - const pageSize = parseInt(state.parameters.select.pageSize) + - parseInt(increment.toString()); +export const incrementPageSize = ( + state: TableData, + increment: number | string +) => { + const pageSize = + parseInt(state.parameters.select.pageSize) + parseInt(increment.toString()); return setPageSize(state, pageSize.toString()); -} +}; export const setGroupBy = (state: TableData, groupBy: string | undefined) => { const newDataParameters = cloneDataParameters(state.parameters); @@ -188,9 +202,9 @@ export const setGroupBy = (state: TableData, groupBy: string | undefined) => { return { ...state, - parameters: newDataParameters + parameters: newDataParameters, }; -} +}; export const setFilter = (state: TableData, filter: Filter) => { const newDataParameters = cloneDataParameters(state.parameters); @@ -198,9 +212,9 @@ export const setFilter = (state: TableData, filter: Filter) => { return { ...state, - parameters: newDataParameters + parameters: newDataParameters, }; -} +}; export const clearDataParameters = (state: TableData) => { const newDataParameters = cloneDataParameters(state.parameters); @@ -209,12 +223,41 @@ export const clearDataParameters = (state: TableData) => { return { ...state, - parameters: newDataParameters + parameters: newDataParameters, }; +}; -} - -export const tableDataReducer = (state: TableData, action: any): TableData => { +type Action = + | { + type: "updateData"; + data: Record[]; + totalNumberOfRows: number; + } + | { + type: "appendData"; + data: Record[]; + } + | { type: "updateColumns"; columns: string[] } + | { type: "updateHiddenColumns"; data: string[] } + | { type: "hideColumn"; column: string } + | { type: "showColumn"; column: string } + | { type: "showAllColumns" } + | { type: "toggleShowOmittedRows" } + | { type: "addTableUpdates"; tableUpdates: TableUpdate[] } + | { type: "clearTableUpdates" } + | { type: "revertTableUpdate" } + | { type: "setGroupBy"; groupBy: string | undefined } + | { type: "setFilter"; filter: Filter } + | { type: "clearDataParameters" } + | { type: "setPage"; page: string } + | { type: "incrementPage"; increment: number | string } + | { type: "setPageSize"; pageSize: string } + | { type: "incrementPageSize"; increment: number | string }; + +export const tableDataReducer = ( + state: TableData, + action: Action +): TableData => { switch (action.type) { case "updateData": return updateData(state, action); @@ -222,6 +265,8 @@ export const tableDataReducer = (state: TableData, action: any): TableData => { return appendData(state, action.data); case "updateColumns": return updateColumns(state, action.columns); + case "updateHiddenColumns": + return { ...state, hiddenColumns: action.data }; case "hideColumn": return hideColumn(state, action.column); case "showColumn": @@ -252,4 +297,3 @@ export const tableDataReducer = (state: TableData, action: any): TableData => { return incrementPageSize(state, action.increment); } }; - diff --git a/pages/maps/ingestion/@id/table.d.ts b/pages/maps/ingestion/@id/tables/defs.ts similarity index 78% rename from pages/maps/ingestion/@id/table.d.ts rename to pages/maps/ingestion/@id/tables/defs.ts index f424eb844..08e56c36f 100644 --- a/pages/maps/ingestion/@id/table.d.ts +++ b/pages/maps/ingestion/@id/tables/defs.ts @@ -1,4 +1,4 @@ -import { Filter } from "./components/table-util.js"; +import { Filter } from "../components/table-util"; export type ColumnOperators = | "eq" @@ -46,7 +46,7 @@ interface TableSelection { export interface ColumnConfigGenerator { url: string; - defaultColumnConfig: ColumnConfig; + sharedColumnConfig: ColumnConfig; dataParameters: DataParameters; addTableUpdate: (updates: TableUpdate[]) => void; transformedData: any[]; @@ -62,3 +62,17 @@ export interface CustomTableProps { url: string; ingestProcessId: number; } + +export const COMMON_COLUMNS = [ + "omit", + "source_layer", + "source_id", + "orig_id", + "descrip", +]; + +export enum FeatureType { + POINT = "point", + LINE = "line", + POLYGON = "polygon", +} diff --git a/pages/maps/ingestion/@id/tables/edit-table.module.sass b/pages/maps/ingestion/@id/tables/edit-table.module.sass new file mode 100644 index 000000000..9dae3e663 --- /dev/null +++ b/pages/maps/ingestion/@id/tables/edit-table.module.sass @@ -0,0 +1,66 @@ +.table-container + height: 100% + display: flex + flex-direction: column + +td + text-wrap: nowrap + background-color: #ffffff78 + +tr:nth-child(odd) td + background-color: #ffffff + +div.input-form + display: flex + flex-direction: row + +.update-input-group + flex-grow: 1 + +div.filter-header + padding-bottom: .4rem + font-size: 1rem + +div.filter-select + padding-bottom: .2rem + +div.filter-container + box-shadow: #00000038 1px 1px 8px + padding: 10px + border-radius: 10px + +div.warning + background-color: rgb(255 216 152 / 73%) + color: black + border: #ffe26c solid 1px + font-size: 1rem + padding-bottom: 0.2rem + +.editable-cell + height: 18px + padding: 1.7px 8px + font-size: 12px + min-height: 0px + min-width: 99% + box-shadow: none + border: 0 + z-index: 0 + position: relative + max-width: 99% + +.read-only-value + color: #ccc + +.row-header-text.omit + // Strikethrough + text-decoration: line-through + color: #666 + +.table-actions + display: flex + flex-direction: row + gap: 1em + align-items: baseline + + .spacer + flex-grow: 1 diff --git a/pages/maps/ingestion/@id/edit-table.ts b/pages/maps/ingestion/@id/tables/edit-table.ts similarity index 57% rename from pages/maps/ingestion/@id/edit-table.ts rename to pages/maps/ingestion/@id/tables/edit-table.ts index bcfe4c0cb..c51b8925d 100644 --- a/pages/maps/ingestion/@id/edit-table.ts +++ b/pages/maps/ingestion/@id/tables/edit-table.ts @@ -1,102 +1,129 @@ -import hyper from "@macrostrat/hyper"; - -import { Icon, useHotkeys } from "@blueprintjs/core"; +import { Button, Checkbox, Icon, useHotkeys } from "@blueprintjs/core"; import { + Cell, Column, ColumnHeaderCell2, FocusedCellCoordinates, + RegionCardinality, RowHeaderCell2, - SelectionModes, Table2, } from "@blueprintjs/table"; import { + Dispatch, + MutableRefObject, useCallback, - useReducer, useEffect, useMemo, - useState, + useReducer, useRef, - MutableRefObject, + useState, } from "react"; import { - Filter, + applyTableUpdates, + createTableUpdate, createTableUpdateCopyColumn, + Filter, isColumnActive, - createTableUpdate, - applyTableUpdates, submitTableUpdates, -} from "./utils/"; -import { tableDataReducer, initialState } from "./reducer/"; +} from "../utils"; +import { initialState, TableData, tableDataReducer } from "../reducer"; import { ingestPrefix } from "@macrostrat-web/settings"; import { + downloadSourceFiles, EditableCell, + getCellSelected, + getData, + getSelectedColumns, ProgressPopover, ProgressPopoverProps, - TableMenu, - getSelectedColumns, + reorderColumns, selectionToText, + TableMenu, textToTableUpdates, - getData, - getCellSelected, - download_file, - sleep, - reorderColumns, - downloadSourceFiles, -} from "./components/index"; + toBoolean, +} from "../components"; import { ColumnConfig, ColumnConfigGenerator, OperatorQueryParameter, Selection, -} from "./table"; - -import "@blueprintjs/table/lib/css/table.css"; -import styles from "./edit-table.module.sass"; -import "./override.sass"; -import TableHeader from "#/maps/ingestion/@id/components/table-header"; + FeatureType, +} from "./defs"; +import h from "../hyper"; +import classNames from "classnames"; -const h = hyper.styled(styles); +import TableHeader from "../components/table-header"; +import { postgrest } from "~/_providers"; +import { createAppToaster, useAsyncEffect } from "@macrostrat/ui-components"; -const INTERNAL_COLUMNS = ["_pkid", "source_id"]; +const INTERNAL_COLUMNS = ["_pkid", "source_id", "omit"]; export interface EditTableProps { url: string; ingestProcessId: number; finalColumns: string[]; columnGenerator: (props: ColumnConfigGenerator) => ColumnConfig; + featureType: FeatureType; } -export function TableInterface({ +const Toaster = createAppToaster(); + +enum ColumnShowMode { + ALL = "all", + FINAL = "final", + ORIGINAL = "original", +} + +function editColumnForFeatureType(featureType: FeatureType) { + return featureType + "_state"; +} + +function useTableData({ + ref, + allColumns, url, ingestProcessId, - finalColumns, - columnGenerator, -}: EditTableProps) { + featureType, +}): [TableData, Dispatch] { const [tableData, dispatch] = useReducer(tableDataReducer, { ...initialState, - allColumns: finalColumns, + allColumns, }); - // Selection State - const [selection, setSelection] = useState([]); - const [copiedSelection, setCopiedSelection] = useState< - Selection[] | undefined - >(undefined); - - // Cell refs - const ref = useRef[][]>(null); - - // Error State - const [error, setError] = useState(undefined); - - // Table Update State - const [updateProgress, setUpdateProgress] = - useState(undefined); - - // Focused Cell - const [focusedCell, setFocusedCell] = useState< - FocusedCellCoordinates | undefined - >(undefined); + const client = useRef(postgrest.from("map_ingest_metadata")); + + const [currentData, setCurrentData] = useState(null); + + // Handle column changes + const columnName = editColumnForFeatureType(featureType); + useAsyncEffect(async () => { + const res = await client.current + .select(columnName) + .eq("id", ingestProcessId) + .single(); + const data = res.data[columnName] ?? {}; + setCurrentData(data); + + const hiddenColumns = data.hiddenColumns ?? []; + + dispatch({ type: "updateHiddenColumns", data: hiddenColumns }); + }, []); + + useAsyncEffect(async () => { + if (currentData == null) return; + const newData = { ...currentData, hiddenColumns: tableData.hiddenColumns }; + try { + await client.current + .update({ [columnName]: newData }) + .eq("id", ingestProcessId); + } catch (err) { + console.error(err); + Toaster.show({ + message: "Error updating hidden columns", + intent: "danger", + }); + } + }, [tableData.hiddenColumns]); useEffect(() => { (async () => { @@ -123,6 +150,45 @@ export function TableInterface({ })(); }, [tableData.parameters]); + return [tableData, dispatch]; +} + +export function TableInterface({ + url, + ingestProcessId, + finalColumns, + columnGenerator, + featureType, +}: EditTableProps) { + // Cell refs + const ref = useRef[][]>(null); + + const [tableData, dispatch] = useTableData({ + ref, + allColumns: finalColumns, + ingestProcessId, + url, + featureType, + }); + + // Selection State + const [selection, setSelection] = useState([]); + const [copiedSelection, setCopiedSelection] = useState< + Selection[] | undefined + >(undefined); + + // Error State + const [error, setError] = useState(undefined); + + // Table Update State + const [updateProgress, setUpdateProgress] = + useState(undefined); + + // Focused Cell + const [focusedCell, setFocusedCell] = useState< + FocusedCellCoordinates | undefined + >(undefined); + const transformedData = useMemo(() => { let data = structuredClone(tableData.remoteData); data = applyTableUpdates(data, tableData.tableUpdates); @@ -227,6 +293,7 @@ export function TableInterface({ return h( ColumnHeaderCell2, { + enableColumnReordering: columnName != "source_layer", nameRenderer: () => h( "div.column-name", @@ -313,91 +380,51 @@ export function TableInterface({ name = name.slice(0, 47) + "..."; } - return h(RowHeaderCell2, { name: name.toString() }, []); + const omit = transformedData[rowIndex]["omit"] ?? false; + return h(RowHeaderCell2, { + name: h( + "span.row-header-text", + { className: classNames({ omit }) }, + name.toString() + ), + }); }, [tableData.parameters, transformedData] ); - const defaultColumnConfig = useMemo(() => { - if (visibleColumns.length == 0) { - return {}; - } - - return visibleColumns.reduce((prev, columnName, index) => { - return { - ...prev, - [columnName]: h(Column, { - name: columnName, - className: finalColumns.includes(columnName) ? "final-column" : "", - columnHeaderCellRenderer: columnHeaderCellRenderer, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(EditableCell, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch {} - }, - columnName: columnName, - onConfirm: (value) => { - if (value != transformedData[rowIndex][columnName]) { - dispatch({ - type: "addTableUpdates", - tableUpdates: [ - createTableUpdate( - url, - value, - columnName, - transformedData[rowIndex], - tableData.parameters - ), - ], - }); - } - }, - onCopy: (e) => handleCopy(e), - onPaste: handlePaste, - intent: - tableData.remoteData[rowIndex][columnName] != - transformedData[rowIndex][columnName] - ? "success" - : undefined, - value: - transformedData.length == 0 - ? "" - : transformedData[rowIndex][columnName], - }), - key: columnName, - }), - }; - }, {}); - }, [ + const sharedColumnConfig = useSharedColumns({ visibleColumns, - tableData.remoteData, - tableData.parameters, + finalColumns, + columnHeaderCellRenderer, transformedData, + tableData, + ref, + url, handleCopy, handlePaste, - ]); + dispatch, + selection, + }); const columnConfig = useMemo(() => { if (visibleColumns.length == 0) { - return defaultColumnConfig; + return sharedColumnConfig; } - const generatedColumns = columnGenerator({ + /** Here, we generate the column configuration */ + return columnGenerator({ url, - defaultColumnConfig, + sharedColumnConfig, dataParameters: tableData.parameters, addTableUpdate: (t) => dispatch({ type: "addTableUpdates", tableUpdates: t }), transformedData, data: tableData.remoteData, + selection, ref, }); - - return generatedColumns; }, [ - defaultColumnConfig, + sharedColumnConfig, tableData.parameters, transformedData, tableData.remoteData, @@ -417,56 +444,79 @@ export function TableInterface({ [ h("div.table-container", {}, [ h.if(error != undefined)("div.warning", {}, [error]), - h(TableHeader, { - hiddenColumns: tableData.hiddenColumns, - tableUpdates: tableData.tableUpdates, - dataParameters: tableData.parameters, - totalNumberOfRows: tableData.totalNumberOfRows, - showAllColumns: () => dispatch({ type: "showAllColumns" }), - toggleShowOmittedRows: () => - dispatch({ type: "toggleShowOmittedRows" }), - clearTableUpdates: () => dispatch({ type: "clearTableUpdates" }), - submitTableUpdates: async () => { - await submitTableUpdates(tableData.tableUpdates, setUpdateProgress); - // Update the table data - dispatch({ - type: "updateData", - ...(await getData(url, tableData.parameters)), - }); - dispatch({ type: "clearTableUpdates" }); - }, - downloadSourceFiles: async () => downloadSourceFiles(ingestProcessId), - clearDataParameters: () => dispatch({ type: "clearDataParameters" }), - markAsHarmonized: async () => { - const response = await fetch( - `${ingestPrefix}/ingest-process/${ingestProcessId}`, - { - method: "PATCH", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - body: JSON.stringify({ state: "post_harmonization" }), - } - ); - if (response.ok) { - dispatch({ type: "clearTableUpdates" }); + h( + TableHeader, + { + hiddenColumns: tableData.hiddenColumns, + tableUpdates: tableData.tableUpdates, + dataParameters: tableData.parameters, + totalNumberOfRows: tableData.totalNumberOfRows, + showAllColumns: () => dispatch({ type: "showAllColumns" }), + toggleShowOmittedRows: () => + dispatch({ type: "toggleShowOmittedRows" }), + clearTableUpdates: () => dispatch({ type: "clearTableUpdates" }), + submitTableUpdates: async () => { + await submitTableUpdates( + tableData.tableUpdates, + setUpdateProgress + ); + // Update the table data dispatch({ type: "updateData", ...(await getData(url, tableData.parameters)), }); - } else { - console.error("uh oh", response); - } + dispatch({ type: "clearTableUpdates" }); + }, + downloadSourceFiles: async () => + downloadSourceFiles(ingestProcessId), + clearDataParameters: () => + dispatch({ type: "clearDataParameters" }), + markAsHarmonized: async () => { + const response = await fetch( + `${ingestPrefix}/ingest-process/${ingestProcessId}`, + { + method: "PATCH", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ state: "post_harmonization" }), + } + ); + if (response.ok) { + dispatch({ type: "clearTableUpdates" }); + dispatch({ + type: "updateData", + ...(await getData(url, tableData.parameters)), + }); + } else { + console.error("uh oh", response); + } + }, }, - }), + h(TableActions, { + dispatch, + selection, + data: transformedData, + setSelection, + updateProps: { + url, + dataParameters: tableData.parameters, + }, + }) + ), h( Table2, { enableFocusedCell: true, enableColumnReordering: true, - selectionModes: SelectionModes.COLUMNS_AND_CELLS, - rowHeaderCellRenderer: rowHeaderCellRenderer, + selectedRegions: selection, + selectionModes: [ + RegionCardinality.FULL_COLUMNS, + RegionCardinality.FULL_ROWS, + RegionCardinality.CELLS, + ], + rowHeaderCellRenderer, onFocusedCell: (focusedCellCoordinates) => { setFocusedCell(focusedCellCoordinates); }, @@ -518,6 +568,149 @@ export function TableInterface({ ); } +function getSelectedRows(selection: Selection[], data: any[]): number[] { + return selection + .map((s) => { + if (s.rows == null) return []; + const start = Math.min(s.rows[0], s.rows[1]); + const end = Math.max(s.rows[0], s.rows[1]); + return Array.from({ length: end - start + 1 }, (_, i) => { + return start + i; + }); + }) + .flat(); +} + +const hasSelection = (selection: Selection[]) => { + return selection != null && selection.length > 0; +}; + +function selectionCardinality(selection: Selection[]): RegionCardinality { + if (selection.length == 0) { + return RegionCardinality.NONE; + } + + const firstSelection = selection[0]; + if (firstSelection.rows == null && firstSelection.cols == null) { + return RegionCardinality.FULL_TABLE; + } + + if (firstSelection.cols == null) { + return RegionCardinality.FULL_ROWS; + } + + if (firstSelection.rows == null) { + return RegionCardinality.FULL_COLUMNS; + } + + return RegionCardinality.CELLS; +} + +function TableActions({ + dispatch, + selection, + data, + setSelection, + updateProps, +}) { + const cardinality = selectionCardinality(selection); + + const name = nameForCardinality(cardinality); + + let actions = h("p", "No selection"); + + if (cardinality == RegionCardinality.FULL_ROWS) { + actions = h([ + h("h4", name + " actions"), + h(RowActions, { + rows: getSelectedRows(selection, data), + dispatch, + data, + updateProps, + }), + ]); + } else if (cardinality == RegionCardinality.CELLS) { + actions = h("p", "No cell actions defined"); + } else if (cardinality == RegionCardinality.FULL_COLUMNS) { + actions = h("p", "No column actions defined"); + } + + return h("div.table-actions", [ + h("h4", "Selection"), + h( + Button, + { + disabled: !hasSelection(selection), + small: true, + minimal: true, + intent: "warning", + onClick() { + setSelection([]); + }, + }, + "Clear" + ), + actions, + h("div.spacer"), + ]); +} + +function nameForCardinality(cardinality: RegionCardinality) { + switch (cardinality) { + case RegionCardinality.FULL_TABLE: + return "Table"; + case RegionCardinality.FULL_COLUMNS: + return "Column"; + case RegionCardinality.FULL_ROWS: + return "Row"; + case RegionCardinality.CELLS: + return "Cell"; + default: + return null; + } +} + +function RowActions({ rows, dispatch, data, updateProps }) { + if (rows == null || rows.length == 0) { + return null; + } + + console.log(data); + const allRowsChecked = rows.every((i) => toBoolean(data[i]["omit"])); + const allRowsUnchecked = rows.every((i) => !toBoolean(data[i]["omit"])); + + let checked = null; + const indeterminate = !(allRowsChecked || allRowsUnchecked); + if (!indeterminate) { + checked = allRowsChecked; + } + + const { url, dataParameters } = updateProps; + + return h("div.table-actions", {}, [ + // Omit rows + h(Checkbox, { + checked, + indeterminate, + label: "Omit Rows", + onChange: (e) => { + // Get boolean value + const value = e.target.checked; + // If state is indeterminate, do nothing + if (value == null) return; + + // Synthesize updates (we don't support multi-row or ranged updates currently) + const updates = rows.map((i) => { + return createTableUpdate(url, value, "omit", data[i], dataParameters); + }); + + // Dispatch updates + dispatch({ type: "addTableUpdates", tableUpdates: updates }); + }, + }), + ]); +} + function HotkeysManager({ hotkeys, style, children }) { const { handleKeyDown, handleKeyUp } = useHotkeys(hotkeys); @@ -529,3 +722,93 @@ function HotkeysManager({ hotkeys, style, children }) { children, }); } + +function useSharedColumns({ + visibleColumns, + finalColumns, + columnHeaderCellRenderer, + transformedData, + tableData, + url, + handleCopy, + handlePaste, + dispatch, +}) { + return useMemo(() => { + if (visibleColumns.length == 0) { + return {}; + } + + return visibleColumns.reduce((prev, columnName, index) => { + return { + ...prev, + [columnName]: h(Column, { + name: columnName, + className: finalColumns.includes(columnName) ? "final-column" : "", + columnHeaderCellRenderer, + cellRenderer: (rowIndex: number, columnIndex: number) => { + if (columnName == "source_layer") { + return h( + Cell, + { + key: columnName, + columnName: columnName, + onCopy: (e) => handleCopy(e), + className: "read-only-cell", + }, + h( + "span.read-only-value", + null, + transformedData[rowIndex][columnName] + ) + ); + } + + const omit = toBoolean(transformedData[rowIndex]["omit"]); + + return h(EditableCell, { + disabled: omit, + className: classNames({ disabled: omit }), + columnName: columnName, + onConfirm: (value) => { + if (value != transformedData[rowIndex][columnName]) { + dispatch({ + type: "addTableUpdates", + tableUpdates: [ + createTableUpdate( + url, + value, + columnName, + transformedData[rowIndex], + tableData.parameters + ), + ], + }); + } + }, + onCopy: (e) => handleCopy(e), + onPaste: handlePaste, + intent: + tableData.remoteData[rowIndex][columnName] != + transformedData[rowIndex][columnName] + ? "success" + : undefined, + value: + transformedData.length == 0 + ? "" + : transformedData[rowIndex][columnName], + }); + }, + key: columnName, + }), + }; + }, {}); + }, [ + visibleColumns, + tableData.remoteData, + tableData.parameters, + transformedData, + handleCopy, + handlePaste, + ]); +} diff --git a/pages/maps/ingestion/@id/tables/index.ts b/pages/maps/ingestion/@id/tables/index.ts index 00cc500ec..34730fab2 100644 --- a/pages/maps/ingestion/@id/tables/index.ts +++ b/pages/maps/ingestion/@id/tables/index.ts @@ -1,5 +1,3 @@ export * from "./polygons"; export * from "./lines"; export * from "./points"; - -export const COMMON_COLUMNS = ["source_id", "orig_id", "descrip", "omit"]; diff --git a/pages/maps/ingestion/@id/tables/lines.ts b/pages/maps/ingestion/@id/tables/lines.ts index 9ece6ca5b..76baa265d 100644 --- a/pages/maps/ingestion/@id/tables/lines.ts +++ b/pages/maps/ingestion/@id/tables/lines.ts @@ -3,23 +3,15 @@ */ import { useCallback } from "react"; +import h from "../hyper"; -import hyper from "@macrostrat/hyper"; - -import { Column } from "@blueprintjs/table"; import { ColumnConfig, ColumnConfigGenerator, + COMMON_COLUMNS, CustomTableProps, -} from "#/maps/ingestion/@id/table"; -import CheckboxCell from "#/maps/ingestion/@id/components/cells/checkbox-cell"; -import { TableInterface } from "../edit-table"; -import styles from "../edit-table.module.sass"; -import { COMMON_COLUMNS } from "."; -import { toBoolean } from "../components/cells/util"; -import { createTableUpdate } from "#/maps/ingestion/@id/utils"; - -const h = hyper.styled(styles); +} from "./defs"; +import { TableInterface } from "./edit-table"; export function LinesTable({ url, ingestProcessId }: CustomTableProps) { const FINAL_LINE_COLUMNS = [ @@ -31,40 +23,9 @@ export function LinesTable({ url, ingestProcessId }: CustomTableProps) { ]; const linesColumnGenerator = useCallback( - ({ - url, - defaultColumnConfig, - dataParameters, - addTableUpdate, - transformedData, - ref, - }: ColumnConfigGenerator): ColumnConfig => { + ({ sharedColumnConfig }: ColumnConfigGenerator): ColumnConfig => { return { - ...defaultColumnConfig, - omit: h(Column, { - ...defaultColumnConfig?.["omit"]?.props, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(CheckboxCell, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch (e) {} - }, - onConfirm: (value) => { - addTableUpdate([ - createTableUpdate( - url, - value, - "omit", - rowIndex, - transformedData, - dataParameters - ), - ]); - }, - value: toBoolean(transformedData[rowIndex]["omit"]), - }), - }), + ...sharedColumnConfig, }; }, [] @@ -75,5 +36,6 @@ export function LinesTable({ url, ingestProcessId }: CustomTableProps) { ingestProcessId: ingestProcessId, finalColumns: FINAL_LINE_COLUMNS, columnGenerator: linesColumnGenerator, + featureType: "line", }); } diff --git a/pages/maps/ingestion/@id/tables/points.ts b/pages/maps/ingestion/@id/tables/points.ts index 546cc3184..b5f1b8b1d 100644 --- a/pages/maps/ingestion/@id/tables/points.ts +++ b/pages/maps/ingestion/@id/tables/points.ts @@ -2,24 +2,15 @@ * Generators for the table columns in the ingestion table */ -import { useCallback, useEffect, useState } from "react"; - -import hyper from "@macrostrat/hyper"; - -import { ColumnProps, Column } from "@blueprintjs/table"; +import { useCallback } from "react"; import { ColumnConfig, ColumnConfigGenerator, + COMMON_COLUMNS, CustomTableProps, -} from "#/maps/ingestion/@id/table"; -import CheckboxCell from "#/maps/ingestion/@id/components/cells/checkbox-cell"; -import { TableInterface } from "../edit-table"; -import styles from "#/maps/ingestion/@id/edit-table.module.sass"; -import { COMMON_COLUMNS } from "."; -import { toBoolean } from "#/maps/ingestion/@id/components/cells/util"; -import { createTableUpdate } from "#/maps/ingestion/@id/utils"; - -const h = hyper.styled(styles); +} from "./defs"; +import { TableInterface } from "./edit-table"; +import h from "../hyper"; export function PointsTable({ url, ingestProcessId }: CustomTableProps) { const FINAL_POINT_COLUMNS = [ @@ -33,41 +24,8 @@ export function PointsTable({ url, ingestProcessId }: CustomTableProps) { ]; const pointColumnGenerator = useCallback( - ({ - url, - defaultColumnConfig, - dataParameters, - addTableUpdate, - transformedData, - ref, - }: ColumnConfigGenerator): ColumnConfig => { - return { - ...defaultColumnConfig, - omit: h(Column, { - ...defaultColumnConfig?.["omit"]?.props, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(CheckboxCell, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch (e) {} - }, - onConfirm: (value) => { - addTableUpdate([ - createTableUpdate( - url, - value, - "omit", - rowIndex, - transformedData, - dataParameters - ), - ]); - }, - value: toBoolean(transformedData[rowIndex]["omit"]), - }), - }), - }; + ({ sharedColumnConfig }: ColumnConfigGenerator): ColumnConfig => { + return sharedColumnConfig; }, [] ); @@ -77,5 +35,6 @@ export function PointsTable({ url, ingestProcessId }: CustomTableProps) { ingestProcessId: ingestProcessId, finalColumns: FINAL_POINT_COLUMNS, columnGenerator: pointColumnGenerator, + featureType: "point", }); } diff --git a/pages/maps/ingestion/@id/tables/polygons.ts b/pages/maps/ingestion/@id/tables/polygons.ts index 84689ecc9..592254259 100644 --- a/pages/maps/ingestion/@id/tables/polygons.ts +++ b/pages/maps/ingestion/@id/tables/polygons.ts @@ -3,27 +3,18 @@ */ import { useCallback, useEffect, useState } from "react"; - -import hyper from "@macrostrat/hyper"; - -import { Column } from "@blueprintjs/table"; +import { Cell, Column, Region } from "@blueprintjs/table"; import { ColumnConfig, ColumnConfigGenerator, + COMMON_COLUMNS, CustomTableProps, -} from "#/maps/ingestion/@id/table"; -import IntervalSelection, { - Interval, -} from "#/maps/ingestion/@id/components/cells/interval-selection"; -import CheckboxCell from "#/maps/ingestion/@id/components/cells/checkbox-cell"; -import { TableInterface } from "../edit-table"; -import styles from "#/maps/ingestion/@id/edit-table.module.sass"; -import { COMMON_COLUMNS } from "."; -import { toBoolean } from "#/maps/ingestion/@id/components/cells/util"; +} from "./defs"; +import { IntervalSelection, Interval } from "../components"; +import h from "../hyper"; +import { TableInterface } from "./edit-table"; import { apiV2Prefix } from "@macrostrat-web/settings"; -import { createTableUpdate } from "#/maps/ingestion/@id/utils"; - -const h = hyper.styled(styles); +import { createTableUpdate } from "../utils"; export function PolygonsTable({ url, ingestProcessId }: CustomTableProps) { const FINAL_POLYGON_COLUMNS = [ @@ -61,135 +52,40 @@ export function PolygonsTable({ url, ingestProcessId }: CustomTableProps) { const polygonColumnGenerator = useCallback( ({ url, - defaultColumnConfig, + sharedColumnConfig, dataParameters, addTableUpdate, transformedData, data, - ref, + selection, }: ColumnConfigGenerator): ColumnConfig => { return { - ...defaultColumnConfig, + ...sharedColumnConfig, t_interval: h(Column, { - ...defaultColumnConfig?.["t_interval"]?.props, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(IntervalSelection, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch (e) {} - }, - intervals: intervals, - onConfirm: (value) => { - const tableUpdate = createTableUpdate( - url, - value, - "t_interval", - transformedData[rowIndex], - dataParameters - ); - - let newTableUpdates = [tableUpdate]; - - if ( - transformedData[rowIndex]["b_interval"] == undefined || - transformedData[rowIndex]["b_interval"] == "" - ) { - let oppositeIntervalTableUpdate = createTableUpdate( - url, - value, - "b_interval", - transformedData[rowIndex], - dataParameters - ); - - newTableUpdates.push(oppositeIntervalTableUpdate); - } - - addTableUpdate(newTableUpdates); - }, - intent: - data[rowIndex]["t_interval"] != - transformedData[rowIndex]["t_interval"] - ? "success" - : undefined, - value: - transformedData.length == 0 - ? "" - : transformedData[rowIndex]["t_interval"], - }), + ...sharedColumnConfig?.["t_interval"]?.props, + cellRenderer: useIntervalSelectionRenderer( + IntervalType.TOP, + data, + transformedData, + intervals, + dataParameters, + addTableUpdate, + url, + selection + ), }), b_interval: h(Column, { - ...defaultColumnConfig?.["b_interval"]?.props, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(IntervalSelection, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch (e) {} - }, - intervals: intervals, - onConfirm: (value) => { - const tableUpdate = createTableUpdate( - url, - value, - "b_interval", - transformedData[rowIndex], - dataParameters - ); - - let newTableUpdates = [tableUpdate]; - - if ( - transformedData[rowIndex]["t_interval"] == undefined || - transformedData[rowIndex]["t_interval"] == "" - ) { - let oppositeIntervalTableUpdate = createTableUpdate( - url, - value, - "t_interval", - transformedData[rowIndex], - dataParameters - ); - - newTableUpdates.push(oppositeIntervalTableUpdate); - } - - addTableUpdate(newTableUpdates); - }, - intent: - data[rowIndex]["b_interval"] != - transformedData[rowIndex]["b_interval"] - ? "success" - : undefined, - value: - transformedData.length == 0 - ? "" - : transformedData[rowIndex]["b_interval"], - }), - }), - omit: h(Column, { - ...defaultColumnConfig?.["omit"]?.props, - cellRenderer: (rowIndex: number, columnIndex: number) => - h(CheckboxCell, { - ref: (el) => { - try { - ref.current[rowIndex][columnIndex] = el; - } catch (e) {} - }, - onConfirm: (value) => { - addTableUpdate([ - createTableUpdate( - url, - value, - "omit", - transformedData[rowIndex], - dataParameters - ), - ]); - }, - value: toBoolean(transformedData[rowIndex]["omit"]), - }), + ...sharedColumnConfig?.["b_interval"]?.props, + cellRenderer: useIntervalSelectionRenderer( + IntervalType.BOTTOM, + data, + transformedData, + intervals, + dataParameters, + addTableUpdate, + url, + selection + ), }), }; }, @@ -201,5 +97,92 @@ export function PolygonsTable({ url, ingestProcessId }: CustomTableProps) { ingestProcessId, finalColumns: FINAL_POLYGON_COLUMNS, columnGenerator: polygonColumnGenerator, + featureType: "polygon", + }); +} + +enum IntervalType { + TOP = "t_interval", + BOTTOM = "b_interval", +} + +function useIntervalSelectionRenderer( + type: IntervalType, + data, + transformedData, + intervals, + dataParameters, + addTableUpdate, + url, + selection +) { + let currentInterval: string; + let oppInterval: string; + + if (type == IntervalType.TOP) { + currentInterval = "t_interval"; + oppInterval = "b_interval"; + } else if (type == IntervalType.BOTTOM) { + currentInterval = "b_interval"; + oppInterval = "t_interval"; + } + + return (rowIndex: number, columnIndex: number) => { + const cellValue = transformedData[rowIndex][currentInterval]; + let cellValueOpp = transformedData[rowIndex][oppInterval]; + if (cellValueOpp == "") { + cellValueOpp = null; + } + + return h(IntervalSelection, { + intervals: intervals, + onConfirm: (value) => { + let newTableUpdates = [ + createTableUpdate( + url, + value, + currentInterval, + transformedData[rowIndex], + dataParameters + ), + ]; + + if (cellValueOpp == null) { + // If the opposite interval is empty, set it to the same value + newTableUpdates.push( + createTableUpdate( + url, + value, + oppInterval, + transformedData[rowIndex], + dataParameters + ) + ); + } + + addTableUpdate(newTableUpdates); + }, + intent: + data[rowIndex][currentInterval] != cellValue ? "success" : undefined, + value: transformedData.length == 0 ? "" : cellValue, + }); + }; +} + +function isCellUniquelySelected( + rowIndex: number, + columnIndex: number, + selection: Region[] +): boolean { + return selection.some((region) => { + if (region.rows == undefined || region.cols == undefined) { + return false; + } + return ( + rowIndex >= region.rows[0] && + rowIndex <= region.rows[1] && + columnIndex >= region.cols[0] && + columnIndex <= region.cols[1] + ); }); } diff --git a/pages/maps/ingestion/@id/utils/filter.ts b/pages/maps/ingestion/@id/utils/filter.ts index 61b336571..f5fe74fa6 100644 --- a/pages/maps/ingestion/@id/utils/filter.ts +++ b/pages/maps/ingestion/@id/utils/filter.ts @@ -1,4 +1,4 @@ -import { ColumnOperators } from "#/maps/ingestion/@id/table"; +import { ColumnOperators } from "../tables/defs"; export class Filter { readonly column_name: string; @@ -69,7 +69,7 @@ export class Filter { }; is_valid = () => { - if (this.operator == undefined || this.value == null) { + if (this.operator == undefined) { return false; } return true; diff --git a/pages/maps/ingestion/@id/utils/table-update.ts b/pages/maps/ingestion/@id/utils/table-update.ts index 43b907472..89fbc0e48 100644 --- a/pages/maps/ingestion/@id/utils/table-update.ts +++ b/pages/maps/ingestion/@id/utils/table-update.ts @@ -88,17 +88,29 @@ export const createTableUpdate = ( row: Record, dataParameters: DataParameters ): TableUpdate => { + /** Create an update operation that is queued for application to the + * table + */ + console.log(url, value, columnName, row, dataParameters); let newDataParameters = cloneDataParameters(dataParameters); - if (newDataParameters?.group != undefined) { - newDataParameters.filter[newDataParameters?.group] = new Filter( - newDataParameters?.group, - "eq", - row[newDataParameters?.group] - ); + + // If we are grouped by a column, set the filter based on that. + + const group = newDataParameters.group; + + if (group != undefined) { + if (group != null) { + newDataParameters.filter[group] = new Filter(group, "eq", row[group]); + } else { + // special case for remaining elements not in a group + newDataParameters.filter[group] = new Filter(group, "is", "null"); + } } else { newDataParameters.filter["_pkid"] = new Filter("_pkid", "eq", row["_pkid"]); } + console.log(newDataParameters.filter); + const execute = async () => submitChange(url, value, [columnName], newDataParameters.filter); diff --git a/pages/maps/ingestion/components/ingest-process-card.ts b/pages/maps/ingestion/components/ingest-process-card.ts index 7bbc89184..32fa8a66f 100644 --- a/pages/maps/ingestion/components/ingest-process-card.ts +++ b/pages/maps/ingestion/components/ingest-process-card.ts @@ -31,10 +31,10 @@ export function IngestProcessCard({ h("div.flex.row", [ h("h3.map-card-title", name), h("div.spacer"), - h.if( - user !== undefined && - !["failed", "pending"].includes(ingestProcess.state) - )(AnchorButton, { href: edit_href, icon: "edit" }), + h.if(user !== undefined)(AnchorButton, { + href: edit_href, + icon: "edit", + }), ]), h(IngestTagDisplay, { ingestProcess: ingestProcess, onUpdate }), h("div.flex.row", [ diff --git a/pages/maps/legend/+Page.ts b/pages/maps/legend/+Page.ts index dc6848d21..93586a427 100644 --- a/pages/maps/legend/+Page.ts +++ b/pages/maps/legend/+Page.ts @@ -1,15 +1,15 @@ import { FullscreenPage } from "~/layouts"; import hyper from "@macrostrat/hyper"; import styles from "./main.module.sass"; -import { ColorCell } from "@macrostrat/data-sheet2"; +import { ColorCell, PostgRESTTableView } from "@macrostrat/data-sheet2"; +import { postgrestPrefix } from "@macrostrat-web/settings"; import { PageBreadcrumbs } from "~/components"; import { LongTextViewer, IntervalCell, lithologyRenderer, ExpandedLithologies, - PostgRESTTableView, -} from "~/components/legend-table"; +} from "~/components/data-table"; const h = hyper.styled(styles); @@ -18,6 +18,7 @@ export function Page() { h(PageBreadcrumbs), h("h1", "Map legend units"), h(PostgRESTTableView, { + endpoint: postgrestPrefix, table: "legend", order: { key: "legend_id", ascending: true }, columnOptions, diff --git a/pages/maps/legend/+config.ts b/pages/maps/legend/+config.ts index ac56ce592..868c69872 100644 --- a/pages/maps/legend/+config.ts +++ b/pages/maps/legend/+config.ts @@ -7,4 +7,5 @@ export default { }, }, }, + pageStyle: "fullscreen", }; diff --git a/server/index.ts b/server/index.ts index dd531957c..247fd02d3 100644 --- a/server/index.ts +++ b/server/index.ts @@ -16,9 +16,27 @@ const isProduction = process.env.NODE_ENV === "production"; // Serve the app out of the `src` directory. const root = resolve(join(__dirname, "..")); const port = process.env.PORT ? parseInt(process.env.PORT, 10) : 3000; + +// Set HMR variables +if (process.env.HMR_DOMAIN) { + const hmrDomain = new URL(process.env.HMR_DOMAIN); + process.env.HMR_HOST = hmrDomain.hostname; + process.env.HMR_PROTOCOL = hmrDomain.protocol.replace(":", ""); +} + const hmrPort = process.env.HMR_PORT ? parseInt(process.env.HMR_PORT, 10) : 24678; +const hmrHost = process.env.HMR_HOST ?? "localhost"; +const hmrProtocol = process.env.HMR_PROTOCOL ?? "ws"; + +const hmr = { + host: hmrHost, + port: hmrPort, + protocol: hmrProtocol, +}; + +console.log(hmr); interface Middleware< Context extends Record @@ -110,7 +128,10 @@ async function startServer() { const viteDevMiddleware = ( await vite.createServer({ root, - server: { middlewareMode: true, hmr: { port: hmrPort } }, + server: { + middlewareMode: true, + hmr, + }, }) ).middlewares; app.use(viteDevMiddleware); diff --git a/src/components/data-table.ts b/src/components/data-table.ts new file mode 100644 index 000000000..365dec6b4 --- /dev/null +++ b/src/components/data-table.ts @@ -0,0 +1,19 @@ +import h from "@macrostrat/hyper"; +import { IntervalCell, ExpandedLithologies } from "@macrostrat/data-sheet2"; +import { LithologyTag } from "~/components"; + +export { IntervalCell, ExpandedLithologies }; + +export function LongTextViewer({ value, onChange }) { + return h("div.long-text", value); +} + +export function lithologyRenderer(value) { + return h("span.liths", [ + addJoiner(value?.map((d) => h(LithologyTag, { data: d }))), + ]); +} + +function addJoiner(arr) { + return arr?.reduce((acc, curr) => [acc, " ", curr]); +} diff --git a/src/components/legend-table/data-loaders.ts b/src/components/legend-table/data-loaders.ts deleted file mode 100644 index 795d293b6..000000000 --- a/src/components/legend-table/data-loaders.ts +++ /dev/null @@ -1,277 +0,0 @@ -/** Lazy loading of data from a PostgREST endpoint */ - -import { useAsyncEffect } from "@macrostrat/ui-components"; -import { debounce } from "underscore"; -import { postgrest } from "~/_providers"; -import { useCallback, useReducer } from "react"; -import update, { Spec } from "immutability-helper"; - -interface ChunkIndex { - startRow: number; - endRow: number; - lastValue: any; -} - -interface LazyLoaderState { - data: (T | null)[]; - loading: boolean; - error: Error | null; - visibleRegion: RowRegion; - initialized: boolean; -} - -type LazyLoaderAction = - | { type: "start-loading" } - | { type: "loaded"; data: T[]; offset: number; totalSize: number } - | { type: "error"; error: Error } - | { type: "set-visible"; region: RowRegion } - | { type: "update-data"; changes: Spec }; - -function adjustArraySize(arr: T[], newSize: number) { - if (newSize == null || arr.length === newSize) { - return arr; - } else if (arr.length > newSize) { - // Trim the array - arr = arr.slice(0, newSize); - } - return [...arr, ...Array(newSize - arr.length).fill(null)]; -} - -function lazyLoadingReducer( - state: LazyLoaderState, - action: LazyLoaderAction -): LazyLoaderState { - console.log(action); - switch (action.type) { - case "start-loading": - return { - ...state, - loading: true, - initialized: true, - }; - case "set-visible": - return { - ...state, - visibleRegion: action.region, - }; - case "update-data": - return { - ...state, - loading: false, - data: update(state.data, action.changes), - }; - case "loaded": - let data = adjustArraySize(state.data, action.totalSize); - data = [ - ...data.slice(0, action.offset), - ...action.data, - ...data.slice(action.offset + action.data.length), - ]; - - return { - ...state, - data, - loading: false, - }; - case "error": - return { - ...state, - error: action.error, - loading: false, - }; - default: - return state; - } -} - -interface RowRegion { - rowIndexStart: number; - rowIndexEnd: number; -} - -enum LoadDirection { - "up", - "down", -} - -function overlapsNulls(data: any[], region: RowRegion) { - for (let i = region.rowIndexStart; i < region.rowIndexEnd; i++) { - if (data[i] == null) { - return true; - } - } - return false; -} - -function distanceToNextNonEmptyRow( - data: any[], - start: number, - direction: LoadDirection, - limit: number -): number { - let i = start; - while (i < data.length && i > 0 && limit > 0) { - if (data[i] != null) { - return i; - } - i += direction === LoadDirection.down ? 1 : -1; - limit -= 1; - } - return i; -} - -interface QueryConfig { - columns?: string; - count?: "exact" | "estimated"; - limit?: number; - offset?: number; - order?: { key: string; ascending: boolean }; - after?: any; -} - -function buildQuery(endpoint: string, config: QueryConfig) { - const { columns = "*", count } = config; - const opts = { count }; - - let query = postgrest.from(endpoint).select(columns, opts); - - if (config.order != null) { - query = query.order(config.order.key, { - ascending: config.order.ascending, - }); - if (config.after != null) { - const op = config.order.ascending ? "gt" : "lt"; - query = query[op](config.order.key, config.after); - } - } - if (config.limit != null) { - if (config.offset != null) { - query = query.range(config.offset, config.offset + config.limit - 1); - console.log(`Random seek from ${config.offset}, this will be slow`); - } else { - query = query.limit(config.limit); - } - } - return query; -} - -function _loadMoreData( - endpoint: string, - config: QueryConfig & { chunkSize: number }, - state: LazyLoaderState, - dispatch: any -) { - const rowIndex = indexOfFirstNullInRegion(state.data, state.visibleRegion); - if (state.loading || rowIndex == null) { - if (state.initialized) { - return; - } - } - - const { chunkSize = 100, ...rest } = config; - - const sortKey = config.order?.key ?? "id"; - - let cfg: QueryConfig = { - ...rest, - limit: chunkSize, - offset: null, - }; - - // Allows random seeking - const isInitialQuery = !state.initialized; - if (isInitialQuery) { - cfg.count = "exact"; - } - - // This only works for forward queries - if (!isInitialQuery) { - cfg.after = state.data[rowIndex - 1]?.[sortKey]; - if (cfg.after == null) { - cfg.offset = rowIndex; - } - } - - dispatch({ type: "start-loading" }); - - const query = buildQuery(endpoint, cfg); - - query.then((res) => { - const { data, count } = res; - dispatch({ - type: "loaded", - data, - offset: rowIndex, - totalSize: count, - }); - }); -} - -// Ensure only one data load is in progress at a time -const loadMoreData = debounce(_loadMoreData, 100); - -type LazyLoaderOptions = Omit & { - chunkSize?: number; - sortKey?: string; -}; - -export function usePostgRESTLazyLoader( - endpoint: string, - config: LazyLoaderOptions = {} -) { - const initialState: LazyLoaderState = { - data: [], - loading: false, - error: null, - visibleRegion: { rowIndexStart: 0, rowIndexEnd: 0 }, - initialized: false, - }; - - const [state, dispatch] = useReducer(lazyLoadingReducer, initialState); - const { data, loading } = state; - - useAsyncEffect(async () => { - loadMoreData(endpoint, config, state, dispatch); - }, [ - data, - state.visibleRegion.rowIndexStart, - state.visibleRegion.rowIndexEnd, - ]); - - const onScroll = useCallback( - debounce((visibleCells: RowRegion) => { - dispatch({ - type: "set-visible", - region: visibleCells, - }); - }, 500), - [dispatch] - ); - - return { - data, - loading, - onScroll, - dispatch, - }; -} - -function getRowIndexToLoadFrom( - data: (T | null)[], - visibleRegion: RowRegion, - chunkSize: number -) { - return indexOfFirstNullInRegion(data, visibleRegion); -} - -function indexOfFirstNullInRegion( - data: any[], - region: RowRegion -): number | null { - for (let i = region.rowIndexStart; i < region.rowIndexEnd; i++) { - if (data[i] == null) { - return i; - } - } - return null; -} diff --git a/src/components/legend-table/index.ts b/src/components/legend-table/index.ts deleted file mode 100644 index 321907e8e..000000000 --- a/src/components/legend-table/index.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { OverlayToaster, Tag } from "@blueprintjs/core"; -import hyper from "@macrostrat/hyper"; -import styles from "./main.module.sass"; -import DataSheet, { ColorCell } from "@macrostrat/data-sheet2"; //getRowsToDelete -import { LithologyTag } from "~/components"; -import { usePostgRESTLazyLoader } from "~/components/legend-table/data-loaders"; -import { HotkeysProvider } from "@blueprintjs/core"; -import { Spinner } from "@blueprintjs/core"; - -export * from "./data-loaders"; -import { postgrest } from "~/_providers"; -import { useCallback, useRef } from "react"; -import { ErrorBoundary } from "@macrostrat/ui-components"; -import { Spec } from "immutability-helper"; - -const h = hyper.styled(styles); - -interface PostgRESTTableViewProps { - table: string; - columnOptions?: any; - order?: any; - columns?: string; - editable?: boolean; -} - -export function PostgRESTTableView(props: PostgRESTTableViewProps) { - return h(ErrorBoundary, h(_PostgRESTTableView, props)); -} - -const successResponses = [200, 201]; - -export function _PostgRESTTableView({ - table, - columnOptions, - order, - columns, - editable = false, -}: PostgRESTTableViewProps) { - const { data, onScroll, dispatch } = usePostgRESTLazyLoader(table, { - order, - columns, - }); - - const toasterRef = useRef(null); - - const finishResponse = useCallback( - (promisedResult, changes) => { - promisedResult - .then((res) => { - if (!successResponses.includes(res.status)) { - // Throw an error with the status code - let err = new Error(res.error.message); - err["status"] = res.status; - throw err; - } - - // Merge new data with old data - dispatch({ type: "update-data", changes }); - }) - .catch((err: Error) => { - const status = err["status"]; - toasterRef.current?.show({ - message: h([ - h.if(status != null)([h("code", status), " "]), - err.message, - ]), - intent: "danger", - }); - }); - }, - [dispatch] - ); - - if (data == null) { - return h(Spinner); - } - - return h(HotkeysProvider, [ - h(OverlayToaster, { usePortal: false, ref: toasterRef }), - h(DataSheet, { - data, - columnSpecOptions: columnOptions ?? {}, - editable, - onVisibleCellsChange: onScroll, - onDeleteRows(selection) { - if (!editable) return; - - const rowIndices = //getRowsToDelete(selection); - - console.log(rowIndices); - - const ids = rowIndices.map((i) => data[i].id); - - dispatch({ type: "start-loading" }); - - const query = postgrest.from(table).delete().in("id", ids); - - finishResponse(query, { $delete: Array.from(rowIndices.keys()) }); - }, - onSaveData(updates, data) { - if (!editable) return; - - // Augment updates with primary key - - let changes: Spec = {}; - let updateRows: any[] = []; - for (let [key, update] of Object.entries(updates)) { - const value = { ...data[key], ...update }; - updateRows.push(value); - changes[key] = { $set: value }; - } - - dispatch({ type: "start-loading" }); - - // Save data - const query = postgrest - .from(table) - .upsert(updateRows, { defaultToNull: false }); - - finishResponse(query, changes); - }, - }), - ]); -} - -export function LongTextViewer({ value, onChange }) { - return h("div.long-text", value); -} - -export function IntervalCell({ value, children, ...rest }) { - return h(ColorCell, { value: value?.color, ...rest }, value?.name); -} - -export function lithologyRenderer(value) { - return h("span.liths", [ - addJoiner(value?.map((d) => h(LithologyTag, { data: d }))), - ]); -} - -export function ExpandedLithologies({ value, onChange }) { - if (value == null) return h("div.basis-panel", "No lithologies"); - return h("div.basis-panel", [ - h("table", [ - h("thead", h("tr", [h("th", "Lithology"), h("th", "Source")])), - h( - "tbody", - value.map((d) => { - return h("tr", { key: d.id }, [ - h("td", h(LithologyTag, { data: d })), - h( - "td.basis-col", - d.basis_col?.map((d) => { - return h(Tag, { minimal: true, key: d }, [ - h("span.tag-header", "Column"), - " ", - h("code", d), - ]); - }) - ), - ]); - }) - ), - ]), - ]); -} - -function addJoiner(arr) { - return arr?.reduce((acc, curr) => [acc, " ", curr]); -} diff --git a/src/components/legend-table/main.module.sass b/src/components/legend-table/main.module.sass deleted file mode 100644 index d818b3a2a..000000000 --- a/src/components/legend-table/main.module.sass +++ /dev/null @@ -1,51 +0,0 @@ -.lithology - font-weight: bold - display: inline-block - padding: 0 0.5em - border-radius: 0.5em - -.inline-lithology .lithology - line-height: 1.2em - -.basis-panel - :global(.bp5-tag) - margin: 0 0.5em 0.5em 0 - - td - vertical-align: top - - th - text-align: left - font-weight: 400 - font-size: 0.9em - font-style: italic - color: var(--secondary-color) - -.basis-panel, .long-text - max-width: 20em - padding: 8px - max-height: 30em - overflow-y: scroll - pointer-events: all - -.description - font-style: italic - - -.tag-header - font-weight: bold - text-transform: small-caps - font-size: 0.8em - color: var(--secondary-color) - -.basis-col - max-width: 15em - -.liths :global(.bp5-tag) - padding: 0px 4px - min-height: 16px - -.data-sheet-outer - position: relative - flex: 1 - display: flex diff --git a/src/components/map-navbar/index.ts b/src/components/map-navbar/index.ts index 6c4337b49..83624f96c 100644 --- a/src/components/map-navbar/index.ts +++ b/src/components/map-navbar/index.ts @@ -42,6 +42,7 @@ export function MapNavbar({ setOpen, parentRoute, minimal = false, + large = false, }) { if (minimal) { return MapMinimalNavbar({ isOpen, setOpen }); @@ -54,11 +55,12 @@ export function MapNavbar({ active: isOpen, onClick: () => setOpen(!isOpen), isLoading, + large, }), ]); } -function MapMinimalNavbar({ isOpen, setOpen }) { +function MapMinimalNavbar({ isOpen, setOpen, large = false }) { const { isLoading } = useMapStatus(); return h("div.map-minimal-navbar map-navbar", [ h(FloatingNavbar, { className: "searchbar" }, [ @@ -66,8 +68,8 @@ function MapMinimalNavbar({ isOpen, setOpen }) { active: isOpen, onClick: () => setOpen(!isOpen), isLoading, + large, }), ]), - h("div.spacer"), ]); } diff --git a/src/map-styles/index.ts b/src/map-styles/index.ts new file mode 100644 index 000000000..a65bf746a --- /dev/null +++ b/src/map-styles/index.ts @@ -0,0 +1,44 @@ +import { burwellTileDomain } from "@macrostrat-web/settings"; + +export function boundingGeometryMapStyle( + darkMode: boolean, + mapSlug: string = null +): mapboxgl.Style { + let url = "/maps/bounds"; + if (mapSlug != null) { + url += `/${mapSlug}`; + } + + const color = darkMode ? 255 : 20; + return { + version: 8, + sources: { + rgeom: { + type: "vector", + tiles: [burwellTileDomain + `${url}/{z}/{x}/{y}`], + maxzoom: 9, + }, + }, + layers: [ + { + id: "rgeom", + type: "fill", + source: "rgeom", + "source-layer": "bounds", + paint: { + "fill-color": `rgba(${color}, ${color}, ${color}, 0.1)`, + }, + }, + { + id: "rgeom-line", + type: "line", + source: "rgeom", + "source-layer": "bounds", + paint: { + "line-color": `rgba(${color}, ${color}, ${color}, 0.5)`, + "line-width": 1, + }, + }, + ], + }; +} diff --git a/yarn.lock b/yarn.lock index f48ef2f7a..d47e5b3ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5352,106 +5352,6 @@ __metadata: languageName: node linkType: hard -"@lezer/common@npm:^1.0.0": - version: 1.1.0 - resolution: "@lezer/common@npm:1.1.0" - checksum: 10/cabe34758bb41c6c7e38aaabdc8a6f51469b1307ed9b5760dd1fc7777d77a012e3e3f37c970a91319c10cc5e4d355db5c0e5515cc9392b9d0b833a66a8cc4120 - languageName: node - linkType: hard - -"@lezer/lr@npm:^1.0.0": - version: 1.3.12 - resolution: "@lezer/lr@npm:1.3.12" - dependencies: - "@lezer/common": "npm:^1.0.0" - checksum: 10/87153ac1bdf3727e0b57de268fb9d3b1d777610aa32b1c7585c1c7eab5a7159aa97b4dec5b3b2b0d54dc9b4cdc4b51492c61e78a50ff92ee8951d2d9b5ec5409 - languageName: node - linkType: hard - -"@lmdb/lmdb-darwin-arm64@npm:2.7.11": - version: 2.7.11 - resolution: "@lmdb/lmdb-darwin-arm64@npm:2.7.11" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@lmdb/lmdb-darwin-arm64@npm:2.8.5": - version: 2.8.5 - resolution: "@lmdb/lmdb-darwin-arm64@npm:2.8.5" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@lmdb/lmdb-darwin-x64@npm:2.7.11": - version: 2.7.11 - resolution: "@lmdb/lmdb-darwin-x64@npm:2.7.11" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@lmdb/lmdb-darwin-x64@npm:2.8.5": - version: 2.8.5 - resolution: "@lmdb/lmdb-darwin-x64@npm:2.8.5" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@lmdb/lmdb-linux-arm64@npm:2.7.11": - version: 2.7.11 - resolution: "@lmdb/lmdb-linux-arm64@npm:2.7.11" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@lmdb/lmdb-linux-arm64@npm:2.8.5": - version: 2.8.5 - resolution: "@lmdb/lmdb-linux-arm64@npm:2.8.5" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@lmdb/lmdb-linux-arm@npm:2.7.11": - version: 2.7.11 - resolution: "@lmdb/lmdb-linux-arm@npm:2.7.11" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@lmdb/lmdb-linux-arm@npm:2.8.5": - version: 2.8.5 - resolution: "@lmdb/lmdb-linux-arm@npm:2.8.5" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@lmdb/lmdb-linux-x64@npm:2.7.11": - version: 2.7.11 - resolution: "@lmdb/lmdb-linux-x64@npm:2.7.11" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@lmdb/lmdb-linux-x64@npm:2.8.5": - version: 2.8.5 - resolution: "@lmdb/lmdb-linux-x64@npm:2.8.5" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@lmdb/lmdb-win32-x64@npm:2.7.11": - version: 2.7.11 - resolution: "@lmdb/lmdb-win32-x64@npm:2.7.11" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@lmdb/lmdb-win32-x64@npm:2.8.5": - version: 2.8.5 - resolution: "@lmdb/lmdb-win32-x64@npm:2.8.5" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@loadable/component@npm:^5.14.1": version: 5.15.3 resolution: "@loadable/component@npm:5.15.3" @@ -5650,7 +5550,7 @@ __metadata: version: 0.0.0-use.local resolution: "@macrostrat/api-views@workspace:deps/web-components/packages/api-views" dependencies: - "@macrostrat/hyper": "npm:^2.2.1" + "@macrostrat/hyper": "npm:^3.0.0" "@macrostrat/ui-components": "workspace:*" peerDependencies: react: ^16.8.6||^17||^18 @@ -5662,7 +5562,7 @@ __metadata: resolution: "@macrostrat/auth-components@workspace:deps/web-components/packages/auth-components" dependencies: "@blueprintjs/core": "npm:^5.10.2" - "@macrostrat/hyper": "npm:^2.0.0" + "@macrostrat/hyper": "npm:^3.0.0" classnames: "npm:^2.3.1" react: "npm:^18" languageName: unknown @@ -5725,7 +5625,6 @@ __metadata: resolution: "@macrostrat/color-utils@workspace:deps/web-components/packages/color-utils" dependencies: chroma-js: "npm:^3.0.0" - parcel: "npm:^2.12.0" languageName: unknown linkType: soft @@ -5745,7 +5644,6 @@ __metadata: geologic-patterns: "npm:2.0.0-dev1" immutability-helper: "npm:^3.0.2" labella: "npm:^1.1.4" - parcel: "npm:^2.12.0" prop-types: "npm:^15.7.2" react-color: "npm:^2.18.0" react-dom: "npm:^16.12.0||^17.0.0||^18" @@ -5844,13 +5742,16 @@ __metadata: "@blueprintjs/core": "npm:^5.10.2" "@blueprintjs/table": "npm:^5.1.4" "@macrostrat/hyper": "npm:^2.0.0" + "@supabase/postgrest-js": "npm:^1.17.7" + "@types/underscore": "npm:^1" chroma-js: "npm:^2.4.2" classnames: "npm:^2.3.1" immutability-helper: "npm:^3.1.1" react: "npm:^17.0.2||^18" react-color: "npm:^2.19.3" react-colorful: "npm:^5.6.1" - typescript: "npm:^5.6.2" + underscore: "npm:^1.13.7" + zustand: "npm:^5.0.2" languageName: unknown linkType: soft @@ -5870,7 +5771,6 @@ __metadata: react-dnd: "npm:^14.0.2" react-dnd-html5-backend: "npm:^14.0.0" react-draggable: "npm:^4.4.3" - typescript: "npm:^5.6.2" languageName: unknown linkType: soft @@ -6001,7 +5901,6 @@ __metadata: kld-path-parser: "npm:^0.2.1" npm-run-all: "npm:^4.1.5" postcss: "npm:^8.3.6" - prettier: "npm:^2.0.5" prompt: "npm:^1.0.0" replace-in-file: "npm:^3.4.2" rimraf: "npm:^2.6.2" @@ -6032,7 +5931,6 @@ __metadata: d3-array: "npm:^3.2.4" d3-format: "npm:^3.1.0" mapbox-gl: "npm:^2.15.0" - parcel: "npm:^2.12.0" postcss: "npm:^8.0.0" postcss-modules: "npm:^4.3.0" query-string: "npm:^9.0.0" @@ -6052,7 +5950,6 @@ __metadata: dependencies: "@macrostrat/hyper": "npm:^3.0.0" "@macrostrat/mapbox-utils": "npm:^1.3.2" - "@parcel/config-default": "npm:^2.6.2" "@turf/bbox": "npm:^7.1.0" "@turf/centroid": "npm:^7.1.0" "@types/mapbox-gl": "npm:^2.7.5" @@ -6060,7 +5957,6 @@ __metadata: immutability-helper: "npm:^3.1.1" mapbox-gl: "npm:^2.15.0" mapbox-gl-controls: "npm:^2.3.5" - parcel: "npm:^2.6.2" zustand: "npm:^5.0.1" peerDependencies: "@blueprintjs/core": ^3||^4||^5.10.2 @@ -6073,10 +5969,8 @@ __metadata: version: 0.0.0-use.local resolution: "@macrostrat/mapbox-styles@workspace:deps/web-components/packages/mapbox-styles" dependencies: - "@parcel/config-default": "npm:^2.6.2" axios: "npm:^1.7.7" mapbox-gl: "npm:^2.15.0" - parcel: "npm:^2.6.2" ts-node: "npm:^10.7.0" languageName: unknown linkType: soft @@ -6085,11 +5979,9 @@ __metadata: version: 0.0.0-use.local resolution: "@macrostrat/mapbox-utils@workspace:deps/web-components/packages/mapbox-utils" dependencies: - "@parcel/config-default": "npm:^2.6.2" "@types/mapbox-gl": "npm:^2.7.5" axios: "npm:^1.7.7" mapbox-gl: "npm:^2.15.0" - parcel: "npm:^2.6.2" languageName: unknown linkType: soft @@ -6108,7 +6000,6 @@ __metadata: dependencies: "@blueprintjs/colors": "npm:^5.1.1" "@blueprintjs/core": "npm:^5.10.2" - vite: "npm:^5.4.8" languageName: unknown linkType: soft @@ -6127,7 +6018,6 @@ __metadata: "@macrostrat/column-components": "workspace:*" "@macrostrat/hyper": "npm:^2.0" "@macrostrat/timescale": "workspace:*" - "@parcel/transformer-typescript-tsc": "npm:^2.0.0-alpha.3" "@rehooks/local-storage": "npm:^2.4.0" "@rollup/plugin-babel": "npm:^5.2.0" "@rollup/plugin-commonjs": "npm:^15.0.0" @@ -6140,7 +6030,6 @@ __metadata: cssnano: "npm:^4.1.10" d3-array: "npm:^2.5.1" d3-format: "npm:^2.0.0" - parcel: "npm:^2.0.0-beta.1" rollup: "npm:^2.38.1" rollup-plugin-postcss: "npm:^3.1.6" stylus: "npm:^0.59.0" @@ -6165,7 +6054,6 @@ __metadata: classnames: "npm:^2.3.0" d3-array: "npm:^3.2.4" immutability-helper: "npm:^3.1.1" - parcel: "npm:^2.12.0" query-string: "npm:^9.0.0" react-color: "npm:^2.19.3" react-dropzone: "npm:^11.4.2" @@ -6250,6 +6138,7 @@ __metadata: "@visx/scale": "npm:^2.2.2" "@vitejs/plugin-react": "npm:^4.0.4" "@yarnpkg/sdks": "npm:^3.1.0" + allotment: "npm:^1.20.2" axios: "npm:^0.25.0" chalk: "npm:^5.3.0" chroma-js: "npm:^3.0.0" @@ -6551,59 +6440,6 @@ __metadata: languageName: node linkType: hard -"@mischnic/json-sourcemap@npm:^0.1.0": - version: 0.1.1 - resolution: "@mischnic/json-sourcemap@npm:0.1.1" - dependencies: - "@lezer/common": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - json5: "npm:^2.2.1" - checksum: 10/7e293f143db77c041553d147b5d29a65090f58b47688ecdc84183e99be37a85189eaf5f68e403253359c4a0e49daa14dc72d08c4ccd720206d8ae1405492dbda - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.2": - version: 3.0.2 - resolution: "@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.2" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-darwin-x64@npm:3.0.2": - version: 3.0.2 - resolution: "@msgpackr-extract/msgpackr-extract-darwin-x64@npm:3.0.2" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-linux-arm64@npm:3.0.2": - version: 3.0.2 - resolution: "@msgpackr-extract/msgpackr-extract-linux-arm64@npm:3.0.2" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-linux-arm@npm:3.0.2": - version: 3.0.2 - resolution: "@msgpackr-extract/msgpackr-extract-linux-arm@npm:3.0.2" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-linux-x64@npm:3.0.2": - version: 3.0.2 - resolution: "@msgpackr-extract/msgpackr-extract-linux-x64@npm:3.0.2" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-win32-x64@npm:3.0.2": - version: 3.0.2 - resolution: "@msgpackr-extract/msgpackr-extract-win32-x64@npm:3.0.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@next/eslint-plugin-next@npm:12.3.4": version: 12.3.4 resolution: "@next/eslint-plugin-next@npm:12.3.4" @@ -6616,1711 +6452,169 @@ __metadata: "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e - languageName: node - linkType: hard - -"@octokit/auth-token@npm:^2.4.0": - version: 2.5.0 - resolution: "@octokit/auth-token@npm:2.5.0" - dependencies: - "@octokit/types": "npm:^6.0.3" - checksum: 10/95d7928b6fcddf8960c7da27678e1cb425b4eaef2e6be615abb1f2b076b617dade72e0bf220c28bc5f106d8c029d5d064496657369d6d75372eb0c3b8d766380 - languageName: node - linkType: hard - -"@octokit/endpoint@npm:^6.0.1": - version: 6.0.12 - resolution: "@octokit/endpoint@npm:6.0.12" - dependencies: - "@octokit/types": "npm:^6.0.3" - is-plain-object: "npm:^5.0.0" - universal-user-agent: "npm:^6.0.0" - checksum: 10/d1b55a94aa3058f840f89cc8d353ef1c294c061c5a36fe05f09c375a62f82af3068b23ce531cc1802e36ee4a52359862523e454e9d2a81c99a5c09dddffb2925 - languageName: node - linkType: hard - -"@octokit/openapi-types@npm:^12.11.0": - version: 12.11.0 - resolution: "@octokit/openapi-types@npm:12.11.0" - checksum: 10/579bbbafe816ab02441d3088c04a7728f13b73aafbe306bbdd4deac374b345b453e520c343e45db454ae6091b75a7b3ce5b7f8434d3e53e45d0802023fcb84e0 - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^1.1.1": - version: 1.1.2 - resolution: "@octokit/plugin-paginate-rest@npm:1.1.2" - dependencies: - "@octokit/types": "npm:^2.0.1" - checksum: 10/b5766c00399296ecdd05612e0cfc25526331a725780d98177114fb54d47f9892a8b147d59fdefeaa84a963057b5bfe7856b2de6046d8146ebefb1c7aeb682214 - languageName: node - linkType: hard - -"@octokit/plugin-request-log@npm:^1.0.0": - version: 1.0.4 - resolution: "@octokit/plugin-request-log@npm:1.0.4" - peerDependencies: - "@octokit/core": ">=3" - checksum: 10/2086db00056aee0f8ebd79797b5b57149ae1014e757ea08985b71eec8c3d85dbb54533f4fd34b6b9ecaa760904ae6a7536be27d71e50a3782ab47809094bfc0c - languageName: node - linkType: hard - -"@octokit/plugin-rest-endpoint-methods@npm:2.4.0": - version: 2.4.0 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:2.4.0" - dependencies: - "@octokit/types": "npm:^2.0.1" - deprecation: "npm:^2.3.1" - checksum: 10/a370dc7ceecca11840b4fb987ff1f8e214ea73992831643e43946dc89de7ba7640f8b2a20edc82b957a3da9cc9dec6fcb947e36c3b12bff1eadbb337fcd54d1f - languageName: node - linkType: hard - -"@octokit/request-error@npm:^1.0.2": - version: 1.2.1 - resolution: "@octokit/request-error@npm:1.2.1" - dependencies: - "@octokit/types": "npm:^2.0.0" - deprecation: "npm:^2.0.0" - once: "npm:^1.4.0" - checksum: 10/4dee522a0a99ad39cbd6d290ba7199b2d5abf089cfea77ef8feba3152228230c9844b54d06d7b4944a11a72d976efb006671df3eae6917039f83d8e2a7b46796 - languageName: node - linkType: hard - -"@octokit/request-error@npm:^2.1.0": - version: 2.1.0 - resolution: "@octokit/request-error@npm:2.1.0" - dependencies: - "@octokit/types": "npm:^6.0.3" - deprecation: "npm:^2.0.0" - once: "npm:^1.4.0" - checksum: 10/baec2b5700498be01b4d958f9472cb776b3f3b0ea52924323a07e7a88572e24cac2cdf7eb04a0614031ba346043558b47bea2d346e98f0e8385b4261f138ef18 - languageName: node - linkType: hard - -"@octokit/request@npm:^5.2.0": - version: 5.6.3 - resolution: "@octokit/request@npm:5.6.3" - dependencies: - "@octokit/endpoint": "npm:^6.0.1" - "@octokit/request-error": "npm:^2.1.0" - "@octokit/types": "npm:^6.16.1" - is-plain-object: "npm:^5.0.0" - node-fetch: "npm:^2.6.7" - universal-user-agent: "npm:^6.0.0" - checksum: 10/0e5dbe6a335d8b1a5064a5305bd23cec20ba2bc9648749b5ab8b31e51e6f4ebbe363c23842fd702ca22f50e434ba963e2883a78604d97b3ddbc2439aeeed3d8c - languageName: node - linkType: hard - -"@octokit/rest@npm:^16.27.0": - version: 16.43.2 - resolution: "@octokit/rest@npm:16.43.2" - dependencies: - "@octokit/auth-token": "npm:^2.4.0" - "@octokit/plugin-paginate-rest": "npm:^1.1.1" - "@octokit/plugin-request-log": "npm:^1.0.0" - "@octokit/plugin-rest-endpoint-methods": "npm:2.4.0" - "@octokit/request": "npm:^5.2.0" - "@octokit/request-error": "npm:^1.0.2" - atob-lite: "npm:^2.0.0" - before-after-hook: "npm:^2.0.0" - btoa-lite: "npm:^1.0.0" - deprecation: "npm:^2.0.0" - lodash.get: "npm:^4.4.2" - lodash.set: "npm:^4.3.2" - lodash.uniq: "npm:^4.5.0" - octokit-pagination-methods: "npm:^1.1.0" - once: "npm:^1.4.0" - universal-user-agent: "npm:^4.0.0" - checksum: 10/462016be28370c232a056812c2a4a62016a978a8e5464a1403d9740ba95c84b8531e6b8b55af9d19a06381089fd056fe433a1219129812d6110aeb701ee1e58b - languageName: node - linkType: hard - -"@octokit/types@npm:^2.0.0, @octokit/types@npm:^2.0.1": - version: 2.16.2 - resolution: "@octokit/types@npm:2.16.2" - dependencies: - "@types/node": "npm:>= 8" - checksum: 10/b9dc4ed83adc2cd6174499c549544f6f199889d7e0395a8c512121943a6fbc46f78a2362671931ef26ad0fa9ff5100a5f8f7f52c7cb74a28cf3457d4f21ba3bf - languageName: node - linkType: hard - -"@octokit/types@npm:^6.0.3, @octokit/types@npm:^6.16.1": - version: 6.41.0 - resolution: "@octokit/types@npm:6.41.0" - dependencies: - "@octokit/openapi-types": "npm:^12.11.0" - checksum: 10/905c8553e46e1a32b27f3f8c665c6a390648204f0b05c23693cd22a874e0bf654534ae2e51de3e09a794c07cc67cfd7f067b57f93cea0f658a369767537a72f0 - languageName: node - linkType: hard - -"@parcel/bundler-default@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/bundler-default@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/graph": "npm:3.2.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - checksum: 10/0c70e43d42bd3e2cf38aa19a6d4bc6b9f0fdaac84b4579b7186e55b6b47faf7d7c50ac4d0b9f50215916f4436ec335a45bda3b6025c0506fbf16525b2d592ff5 - languageName: node - linkType: hard - -"@parcel/bundler-default@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/bundler-default@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/graph": "npm:2.9.3" - "@parcel/hash": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - checksum: 10/e67f69b221f68fbeacc26243154d019f1903749a7d8ed08287337342108a39d59f29afe364af0baa05da2d65ffcd23cfdd455aa97b596f2647b9f4df96377344 - languageName: node - linkType: hard - -"@parcel/cache@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/cache@npm:2.12.0" - dependencies: - "@parcel/fs": "npm:2.12.0" - "@parcel/logger": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - lmdb: "npm:2.8.5" - peerDependencies: - "@parcel/core": ^2.12.0 - checksum: 10/370be28d05522f397e37ab869aa7cfc355b698186bbd3c8393eea175db2634e3cb5a574180e9c1e98830d5c9c2d89335f99ae09bc8127ebd2c41120913164b37 - languageName: node - linkType: hard - -"@parcel/cache@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/cache@npm:2.9.3" - dependencies: - "@parcel/fs": "npm:2.9.3" - "@parcel/logger": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - lmdb: "npm:2.7.11" - peerDependencies: - "@parcel/core": ^2.9.3 - checksum: 10/132659a2b1e137810a17f402b82cf89902288afb57b4d14f417a8629bbdc4a955fba80cab156423f749a2c28a154258c6cabe92e76f65796c4e1565491afc246 - languageName: node - linkType: hard - -"@parcel/codeframe@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/codeframe@npm:2.12.0" - dependencies: - chalk: "npm:^4.1.0" - checksum: 10/1544d4012d5bf21aff066d95f1192800b1a6b4e9cec51c5e6df9d93117bd0e8bfebeefd364750a3ab9b4ae660341ec968674c5a7ca9be516fb57b2afac387f1a - languageName: node - linkType: hard - -"@parcel/codeframe@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/codeframe@npm:2.9.3" - dependencies: - chalk: "npm:^4.1.0" - checksum: 10/428fffa62510efe1c1c8996158a11746cf5f96a539d0470841c1ecac66404b74f63b5ab02796fa62a0a7ecc0159907ed298b2917bdeac75cb3aa5115caf19bef - languageName: node - linkType: hard - -"@parcel/compressor-raw@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/compressor-raw@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - checksum: 10/16c56704f33a91f7694a1a6b7ab157d731331123cbb32faf1ab09356327f7214fd2eb3c54babc120f7f41dded8742a6e58b524b5f410d3ef1bc47aaf47bc75c8 - languageName: node - linkType: hard - -"@parcel/compressor-raw@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/compressor-raw@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - checksum: 10/2124c347a538b18d880ee0ae9e3e574236e402fec46b8288ccde83fcf81b51eb0d85e39067eff3ff6e8872461cbe5b39de4be5a12669efc33e08f8dd70b2b943 - languageName: node - linkType: hard - -"@parcel/config-default@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/config-default@npm:2.12.0" - dependencies: - "@parcel/bundler-default": "npm:2.12.0" - "@parcel/compressor-raw": "npm:2.12.0" - "@parcel/namer-default": "npm:2.12.0" - "@parcel/optimizer-css": "npm:2.12.0" - "@parcel/optimizer-htmlnano": "npm:2.12.0" - "@parcel/optimizer-image": "npm:2.12.0" - "@parcel/optimizer-svgo": "npm:2.12.0" - "@parcel/optimizer-swc": "npm:2.12.0" - "@parcel/packager-css": "npm:2.12.0" - "@parcel/packager-html": "npm:2.12.0" - "@parcel/packager-js": "npm:2.12.0" - "@parcel/packager-raw": "npm:2.12.0" - "@parcel/packager-svg": "npm:2.12.0" - "@parcel/packager-wasm": "npm:2.12.0" - "@parcel/reporter-dev-server": "npm:2.12.0" - "@parcel/resolver-default": "npm:2.12.0" - "@parcel/runtime-browser-hmr": "npm:2.12.0" - "@parcel/runtime-js": "npm:2.12.0" - "@parcel/runtime-react-refresh": "npm:2.12.0" - "@parcel/runtime-service-worker": "npm:2.12.0" - "@parcel/transformer-babel": "npm:2.12.0" - "@parcel/transformer-css": "npm:2.12.0" - "@parcel/transformer-html": "npm:2.12.0" - "@parcel/transformer-image": "npm:2.12.0" - "@parcel/transformer-js": "npm:2.12.0" - "@parcel/transformer-json": "npm:2.12.0" - "@parcel/transformer-postcss": "npm:2.12.0" - "@parcel/transformer-posthtml": "npm:2.12.0" - "@parcel/transformer-raw": "npm:2.12.0" - "@parcel/transformer-react-refresh-wrap": "npm:2.12.0" - "@parcel/transformer-svg": "npm:2.12.0" - peerDependencies: - "@parcel/core": ^2.12.0 - checksum: 10/72877c5dc432d6f6a8ffe8dba1342a6c0c2f615d9346f78f654adc61b62cecb4cc425726ee7a088d86894742397b4fb25cfeee7abd1ad6cbe2cfd5d77cd5a781 - languageName: node - linkType: hard - -"@parcel/config-default@npm:2.9.3, @parcel/config-default@npm:^2.6.2": - version: 2.9.3 - resolution: "@parcel/config-default@npm:2.9.3" - dependencies: - "@parcel/bundler-default": "npm:2.9.3" - "@parcel/compressor-raw": "npm:2.9.3" - "@parcel/namer-default": "npm:2.9.3" - "@parcel/optimizer-css": "npm:2.9.3" - "@parcel/optimizer-htmlnano": "npm:2.9.3" - "@parcel/optimizer-image": "npm:2.9.3" - "@parcel/optimizer-svgo": "npm:2.9.3" - "@parcel/optimizer-swc": "npm:2.9.3" - "@parcel/packager-css": "npm:2.9.3" - "@parcel/packager-html": "npm:2.9.3" - "@parcel/packager-js": "npm:2.9.3" - "@parcel/packager-raw": "npm:2.9.3" - "@parcel/packager-svg": "npm:2.9.3" - "@parcel/reporter-dev-server": "npm:2.9.3" - "@parcel/resolver-default": "npm:2.9.3" - "@parcel/runtime-browser-hmr": "npm:2.9.3" - "@parcel/runtime-js": "npm:2.9.3" - "@parcel/runtime-react-refresh": "npm:2.9.3" - "@parcel/runtime-service-worker": "npm:2.9.3" - "@parcel/transformer-babel": "npm:2.9.3" - "@parcel/transformer-css": "npm:2.9.3" - "@parcel/transformer-html": "npm:2.9.3" - "@parcel/transformer-image": "npm:2.9.3" - "@parcel/transformer-js": "npm:2.9.3" - "@parcel/transformer-json": "npm:2.9.3" - "@parcel/transformer-postcss": "npm:2.9.3" - "@parcel/transformer-posthtml": "npm:2.9.3" - "@parcel/transformer-raw": "npm:2.9.3" - "@parcel/transformer-react-refresh-wrap": "npm:2.9.3" - "@parcel/transformer-svg": "npm:2.9.3" - peerDependencies: - "@parcel/core": ^2.9.3 - checksum: 10/61ef21351ede9475fbe8e49fecd1bcdd6d50aa323e2f080fdc95a55428f43f0b38929f13252e227267e5ecce933166ede4c1a89c2461c605e37e25e13b7cee13 - languageName: node - linkType: hard - -"@parcel/core@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/core@npm:2.12.0" - dependencies: - "@mischnic/json-sourcemap": "npm:^0.1.0" - "@parcel/cache": "npm:2.12.0" - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/events": "npm:2.12.0" - "@parcel/fs": "npm:2.12.0" - "@parcel/graph": "npm:3.2.0" - "@parcel/logger": "npm:2.12.0" - "@parcel/package-manager": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/profiler": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/types": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - "@parcel/workers": "npm:2.12.0" - abortcontroller-polyfill: "npm:^1.1.9" - base-x: "npm:^3.0.8" - browserslist: "npm:^4.6.6" - clone: "npm:^2.1.1" - dotenv: "npm:^7.0.0" - dotenv-expand: "npm:^5.1.0" - json5: "npm:^2.2.0" - msgpackr: "npm:^1.9.9" - nullthrows: "npm:^1.1.1" - semver: "npm:^7.5.2" - checksum: 10/6e7774c0c3bc58e6062efb6a3e4fc484b352e243c1d00747fd3158fb93fc4de2bd636b2e23ceb0017a67644c1e3261a186c6883eae454895ea892c5daa332aa9 - languageName: node - linkType: hard - -"@parcel/core@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/core@npm:2.9.3" - dependencies: - "@mischnic/json-sourcemap": "npm:^0.1.0" - "@parcel/cache": "npm:2.9.3" - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/events": "npm:2.9.3" - "@parcel/fs": "npm:2.9.3" - "@parcel/graph": "npm:2.9.3" - "@parcel/hash": "npm:2.9.3" - "@parcel/logger": "npm:2.9.3" - "@parcel/package-manager": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/profiler": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/types": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - "@parcel/workers": "npm:2.9.3" - abortcontroller-polyfill: "npm:^1.1.9" - base-x: "npm:^3.0.8" - browserslist: "npm:^4.6.6" - clone: "npm:^2.1.1" - dotenv: "npm:^7.0.0" - dotenv-expand: "npm:^5.1.0" - json5: "npm:^2.2.0" - msgpackr: "npm:^1.5.4" - nullthrows: "npm:^1.1.1" - semver: "npm:^7.5.2" - checksum: 10/f418a7735bc125451a40981ce23bbc2b7d4a9eeb946f3b52a01281729f1ecc2e2a1d55b967508ce32ffc02278d4fe8193bf26ae5c06b9442fdd58f0afcbb8dae - languageName: node - linkType: hard - -"@parcel/diagnostic@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/diagnostic@npm:2.12.0" - dependencies: - "@mischnic/json-sourcemap": "npm:^0.1.0" - nullthrows: "npm:^1.1.1" - checksum: 10/f6df95932f2c0f37ecd9b3ede6bd4fb13a0ea40ac50bab1792153b79de4eeacbba5e5000b16d330f7709b2a91a71e06232cdb533bfc5a96db901c2c872a0ce7c - languageName: node - linkType: hard - -"@parcel/diagnostic@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/diagnostic@npm:2.9.3" - dependencies: - "@mischnic/json-sourcemap": "npm:^0.1.0" - nullthrows: "npm:^1.1.1" - checksum: 10/8362374761070b5f8998ab139628c6c9c14ab389d9c9c9bfb53092410ece73a619de42c679fd1abdc4f735fc38f5d91a864f5d99a39412fa41e8e3c6fbc04e1f - languageName: node - linkType: hard - -"@parcel/events@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/events@npm:2.12.0" - checksum: 10/7ced4b53f772d55a3a71cc7b8f8f6707fb87c9a2318a80c4a01398cf5b0e9be8c949fed62fe20d3edeb3449e1f6fe64db7fbb0a54378ea42aa79fb216d2c29fa - languageName: node - linkType: hard - -"@parcel/events@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/events@npm:2.9.3" - checksum: 10/1e51a9c8f10840f14b65b0c26342c56e2838de21370ba833d3aee124b59937b3e12f2b23bd40144cae9edb33739ba96d88e8fb0e993ea1543b1d3739fde22925 - languageName: node - linkType: hard - -"@parcel/fs-search@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/fs-search@npm:2.9.3" - checksum: 10/46954a60503d22d8f7cbe88ed598678f69c46559b69723e427b39bb2b79aa21e1c51f54a9f26dbb7b365c128549badf0ec00cb42cb5a2df4565fd2a4b171ef34 - languageName: node - linkType: hard - -"@parcel/fs@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/fs@npm:2.12.0" - dependencies: - "@parcel/rust": "npm:2.12.0" - "@parcel/types": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - "@parcel/watcher": "npm:^2.0.7" - "@parcel/workers": "npm:2.12.0" - peerDependencies: - "@parcel/core": ^2.12.0 - checksum: 10/1793a6b06fc63f35eef426239e5ca95d0e71f834596a6a5e142c97e010571b0b3c7e96e1851d9b6639695926968af7df92ac05980497b4717db919666860699f - languageName: node - linkType: hard - -"@parcel/fs@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/fs@npm:2.9.3" - dependencies: - "@parcel/fs-search": "npm:2.9.3" - "@parcel/types": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - "@parcel/watcher": "npm:^2.0.7" - "@parcel/workers": "npm:2.9.3" - peerDependencies: - "@parcel/core": ^2.9.3 - checksum: 10/e57e8c48c049212783e3fe338fb67a86a727c19f9e40cd81ef787a12e8015092456bba5e0ae2b765998d99e683a1c417984866182b691700a14f3c9adaa1b63c - languageName: node - linkType: hard - -"@parcel/graph@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/graph@npm:2.9.3" - dependencies: - nullthrows: "npm:^1.1.1" - checksum: 10/9d12f718316eecdea4ce6853cb9ab18540a8804fcc7da412649caeabb1325601da9371fba0d531ddfbcbb8b61f40e93c3420d61e66f66e623a617e489ec86d28 - languageName: node - linkType: hard - -"@parcel/graph@npm:3.2.0": - version: 3.2.0 - resolution: "@parcel/graph@npm:3.2.0" - dependencies: - nullthrows: "npm:^1.1.1" - checksum: 10/fabfb3c68a6bb8ff5b8e9891f39e1086d46c6c84e60642bb6c22824d4abad83a1450eb1e027dcecacc2315402c38e251ca7558a6f99eac3014b05a0cb779b590 - languageName: node - linkType: hard - -"@parcel/hash@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/hash@npm:2.9.3" - dependencies: - xxhash-wasm: "npm:^0.4.2" - checksum: 10/b19092b59dee23bce65b5bd66a3ac7e985fb93ef9f24cb64252496a685e27aaa162c90905c0edad0c3fcd28ed70f64c8b514769ed98e8c56e815a7583afdbcd2 - languageName: node - linkType: hard - -"@parcel/logger@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/logger@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/events": "npm:2.12.0" - checksum: 10/51e26a813667f563827754d11e019d962e165f4ae9ea44ac78a6892c5032337dfea90e0bcb0f040697295870e3b35d65499f244912fe9ff0370a9588cc31533e - languageName: node - linkType: hard - -"@parcel/logger@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/logger@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/events": "npm:2.9.3" - checksum: 10/be2798f3536208e5bebc7f8227203b9658a64bc78c32385c725192a655ade102f6aaf7c23dfc80ffc5c2e497ad545cf9dbd31f99ee20c12ce78f887ef3e2013f - languageName: node - linkType: hard - -"@parcel/markdown-ansi@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/markdown-ansi@npm:2.12.0" - dependencies: - chalk: "npm:^4.1.0" - checksum: 10/a4b154fa9bf058717046cc9a9bcd9456c86b6876fb58aa12489049d52b24e0b604f5729c272ed10cd25ac1bbb20834f58a4cd90304f2fdd873089c0108dd2795 - languageName: node - linkType: hard - -"@parcel/markdown-ansi@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/markdown-ansi@npm:2.9.3" - dependencies: - chalk: "npm:^4.1.0" - checksum: 10/a860fb87a399d926369010c895aa3fa619da308d7149c80d88d6647c7eb07a38b5a0aec245ff97c21cf5497c04193986370a3f0c06bb4fdd54a1934abe5317ba - languageName: node - linkType: hard - -"@parcel/namer-default@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/namer-default@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - checksum: 10/6228422a24e66b587f32d9e736cd4ef777bbb7225aaf681ca7a94897ec5f73ec2f61c059d712d849fadbac6ce8f3a252c5b6ccaa95e77eff27bbb6b156dd678d - languageName: node - linkType: hard - -"@parcel/namer-default@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/namer-default@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - checksum: 10/27855dec955401251030153c5a5c0ec09f727695549d3899c1676ff341354d1d4cdf64bf2650e2778e6ad9378214dd927798edc8f314bf7f8a86924786e1162a - languageName: node - linkType: hard - -"@parcel/node-resolver-core@npm:3.0.3": - version: 3.0.3 - resolution: "@parcel/node-resolver-core@npm:3.0.3" - dependencies: - "@mischnic/json-sourcemap": "npm:^0.1.0" - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/fs": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - semver: "npm:^7.5.2" - checksum: 10/2aaf6e048c7e67e091fe5eb8f871995e3ac184a71d291b34018f98dc1bccde660b2f5dfa1d67c037e07037942f97681d5ab0b2e098036dcbee97766cb12cabf6 - languageName: node - linkType: hard - -"@parcel/node-resolver-core@npm:3.3.0": - version: 3.3.0 - resolution: "@parcel/node-resolver-core@npm:3.3.0" - dependencies: - "@mischnic/json-sourcemap": "npm:^0.1.0" - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/fs": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - semver: "npm:^7.5.2" - checksum: 10/ab0783ac2cd8c6483f923d24be34b5ae2489c48fa1b570b3ba1516f14966a619079621812c69d798db65b8aa61b28b4cac58bde04c95ba8049efd6effb5589ef - languageName: node - linkType: hard - -"@parcel/optimizer-css@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/optimizer-css@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.12.0" - browserslist: "npm:^4.6.6" - lightningcss: "npm:^1.22.1" - nullthrows: "npm:^1.1.1" - checksum: 10/51dedb63e3521f112e676ce55fb90e60b78104cd681dca35a5253fee615274bc793806d51ca21f877a92b159f1f0422a7c8324bf276958bc6096857a850e4671 - languageName: node - linkType: hard - -"@parcel/optimizer-css@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/optimizer-css@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.9.3" - browserslist: "npm:^4.6.6" - lightningcss: "npm:^1.16.1" - nullthrows: "npm:^1.1.1" - checksum: 10/3cc8f742805a41419f52fc788bced43426da2149b31ecdbda91a7f86e77253b32d2772c3122d5265ee6dbeb3836d19aa35f39dd6f5c17a677c78417134abf156 - languageName: node - linkType: hard - -"@parcel/optimizer-htmlnano@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/optimizer-htmlnano@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - htmlnano: "npm:^2.0.0" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - svgo: "npm:^2.4.0" - checksum: 10/64e571f56f959c4cf1fd724e3b50e741b57f90acf035ca5a6908cf7186c42993bfb372db9ac39f9a9dd9bd57be4bba12a527da451893547f6da27db55d63ff13 - languageName: node - linkType: hard - -"@parcel/optimizer-htmlnano@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/optimizer-htmlnano@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - htmlnano: "npm:^2.0.0" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - svgo: "npm:^2.4.0" - checksum: 10/32658dd81c75df9e85f348fe285d2b64805d47799f7b8574ca2bd79eebdb854385804d933818504f05d1368335e89cc22e001e739a68352967347dc6d7994228 - languageName: node - linkType: hard - -"@parcel/optimizer-image@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/optimizer-image@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - "@parcel/workers": "npm:2.12.0" - peerDependencies: - "@parcel/core": ^2.12.0 - checksum: 10/7d28379bf1619d6ea0c70fbfef8b6b05941ac2cc0c1de46f2639ec5c40b53a984985538dfeefd35ba20cde31778502631ace1294c9bc0bcce36607ac53c5a3a8 - languageName: node - linkType: hard - -"@parcel/optimizer-image@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/optimizer-image@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - "@parcel/workers": "npm:2.9.3" - peerDependencies: - "@parcel/core": ^2.9.3 - checksum: 10/803cec8e17162d298ade0d742da5dcd119b72bf9cc25538d4a65b693ab16bff93768752332d9476bda10bd93becd686a0559ebc956ded4d779ed85f2f517221c - languageName: node - linkType: hard - -"@parcel/optimizer-svgo@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/optimizer-svgo@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - svgo: "npm:^2.4.0" - checksum: 10/044779d5b8df1193404faa5c2feeeecbf2d002376304247c7beea8f82bb0194d97ebb6cb26c066eeaab8bbe58de61bc7d983d84f114a58da52079ada0a19a918 - languageName: node - linkType: hard - -"@parcel/optimizer-svgo@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/optimizer-svgo@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - svgo: "npm:^2.4.0" - checksum: 10/0c63770e9686c831353bf1c9da0d29ddf797d3d2598436354805309e8068ff2b672fb7833314edf5caa68c167f2bcc14463a6fae21e93f644127ca0be4073566 - languageName: node - linkType: hard - -"@parcel/optimizer-swc@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/optimizer-swc@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.12.0" - "@swc/core": "npm:^1.3.36" - nullthrows: "npm:^1.1.1" - checksum: 10/1fc670acc169530b94acb5fe604f5e032980210d37eac44afdca68ef54315a1706bd64e0f3e2c5663111a5a75a97056f4cf873955069742d85794013c72b6bf6 - languageName: node - linkType: hard - -"@parcel/optimizer-swc@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/optimizer-swc@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.9.3" - "@swc/core": "npm:^1.3.36" - nullthrows: "npm:^1.1.1" - checksum: 10/2c9972bb07e33bbdca020b4e8d49e24e836e9e7462474a203ee33272c94ea53e203d9c5b6fff676eac7341d6935b12ccacac00f6a2c26c17cbeecfe3d4b69402 - languageName: node - linkType: hard - -"@parcel/package-manager@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/package-manager@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/fs": "npm:2.12.0" - "@parcel/logger": "npm:2.12.0" - "@parcel/node-resolver-core": "npm:3.3.0" - "@parcel/types": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - "@parcel/workers": "npm:2.12.0" - "@swc/core": "npm:^1.3.36" - semver: "npm:^7.5.2" - peerDependencies: - "@parcel/core": ^2.12.0 - checksum: 10/26df14ba094364fef1148cd50d9679bab4e4bfcec0a2808d8550229f2ab81001a5bd14702c46669d1b74bf0cd57f92bc6495d4c826cb50e24f7216a8f39e2563 - languageName: node - linkType: hard - -"@parcel/package-manager@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/package-manager@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/fs": "npm:2.9.3" - "@parcel/logger": "npm:2.9.3" - "@parcel/node-resolver-core": "npm:3.0.3" - "@parcel/types": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - "@parcel/workers": "npm:2.9.3" - semver: "npm:^7.5.2" - peerDependencies: - "@parcel/core": ^2.9.3 - checksum: 10/41f237fd21bb280568ca21f34a3f15f56a26bf9e20ba50553943f87c000a17278f26c600c3f026fdf868f9e03ac011f2b1d553121666b540c39927201923cefa - languageName: node - linkType: hard - -"@parcel/packager-css@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/packager-css@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.12.0" - lightningcss: "npm:^1.22.1" - nullthrows: "npm:^1.1.1" - checksum: 10/9451161e59fff2aa6f1e47d2170d150e72a84c754c4b409e54ea51e7553491d939a50f607fb5af4b85c4e6457f1cdf3977aed3723d2c1209555c8e74004f3454 - languageName: node - linkType: hard - -"@parcel/packager-css@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/packager-css@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - checksum: 10/d03e753b9b5ccd9397a10c34a667ab47ca41e341c795482c25e4e929fbdcaaac11aa93239aa8d5350b448b973f372d935d4d4d72b888a5cc44ac17b36d007c6d - languageName: node - linkType: hard - -"@parcel/packager-html@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/packager-html@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/types": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - checksum: 10/087e0971925c64aa9d749daccb651a2d4b50fc7a3d3d7d6ae52c4920ad630850da9e85aaefab63b210979918a11c1af64835754233900f9b10c3993ccbc7f445 - languageName: node - linkType: hard - -"@parcel/packager-html@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/packager-html@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/types": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - checksum: 10/007df60738609db1b7e52e89a8e02ee0293413cb20df38918b1035baafe5341fb99a2b434afe06d95f2f994efea9346535609795bbf6c180a380791929cae01f - languageName: node - linkType: hard - -"@parcel/packager-js@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/packager-js@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/types": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - globals: "npm:^13.2.0" - nullthrows: "npm:^1.1.1" - checksum: 10/63936757e922860935bfc42556d430cbc74ab99e330bc11433fc53ddef01aac5655129f76b5f65be1f13521500b5e1859e352f80d3bfc57b5c48016b78a396cb - languageName: node - linkType: hard - -"@parcel/packager-js@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/packager-js@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/hash": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.9.3" - globals: "npm:^13.2.0" - nullthrows: "npm:^1.1.1" - checksum: 10/9a397af616e2b3e87a6e5a08fd77603e4c15b98e6cb18e3ed44c793f70d3ec371192925aaff58f80de9340ba17be0b5a4d04d32d91e6c392b26e1b17ab023576 - languageName: node - linkType: hard - -"@parcel/packager-raw@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/packager-raw@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - checksum: 10/eabe7d8600e889757f3a1a6ccb43a53d4f81f680b409be38fbd87b111e9bee99cb41e4c255ce1b289cb6ea16e9f79b94936f534fcd6a0732cb7c4641db45831d - languageName: node - linkType: hard - -"@parcel/packager-raw@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/packager-raw@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - checksum: 10/788800113ed0048a76d4abdacc009165bbf5cee1a56f97a7cd692a44ddd25d7ba83434cf3c8fa666793ade0a2c0e7f233fcd3e91434a94b54d8bfa87c9857548 - languageName: node - linkType: hard - -"@parcel/packager-svg@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/packager-svg@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/types": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - posthtml: "npm:^0.16.4" - checksum: 10/252abaf3ebf9949f1fa8e3484bbd9fab692f0a4146ae600b81a4cd36b8db2c1c9c1fb2f6185860b624d19b1bbe155f9063c236e95d5f12bdac88bb7ae9a7b804 - languageName: node - linkType: hard - -"@parcel/packager-svg@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/packager-svg@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/types": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - posthtml: "npm:^0.16.4" - checksum: 10/13a970685854dc9a45c39ca5981fa0ddecf3ef29fcbd2c0fe65f1004597589fc329a3dc6d1ff8c6c7f6c6690e1ad4eac11d12b31d50a5a5ee4c17a71a779c471 - languageName: node - linkType: hard - -"@parcel/packager-wasm@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/packager-wasm@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - checksum: 10/657f44b0879ffabca88f1b3d2091f9c76c304f05cb114e0ed112702e287fb19dd6e6f51e772a3fb169b6416001a5c3081f5f02966810acd969119551535faec2 - languageName: node - linkType: hard - -"@parcel/plugin@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/plugin@npm:2.12.0" - dependencies: - "@parcel/types": "npm:2.12.0" - checksum: 10/0b52f1dd0675ea4f597a3f882f47434b7c5dabc997a875d07f1cf178e37adc927ed86e084502030a04ac6c9b548152741dfdeb8b6d730f7d8af2bfe3465a77d3 - languageName: node - linkType: hard - -"@parcel/plugin@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/plugin@npm:2.9.3" - dependencies: - "@parcel/types": "npm:2.9.3" - checksum: 10/e9d775a4fdf4635940f900eb8dc8f2ef7f6ff087d48ce876cfac567e4070120614a8c8990146732c1d1c2c483d211f00db3ded8dd0610276c997bb2a7a3ba3a5 - languageName: node - linkType: hard - -"@parcel/profiler@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/profiler@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/events": "npm:2.12.0" - chrome-trace-event: "npm:^1.0.2" - checksum: 10/b8f9857620788711b1d4fef9de75bd09f8db4d3f8fea6023ba1958b63ea05196690837e53ae3e6de073010bf58d5bec339eb048fc163a58b0b938cbf91063f31 - languageName: node - linkType: hard - -"@parcel/profiler@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/profiler@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/events": "npm:2.9.3" - chrome-trace-event: "npm:^1.0.2" - checksum: 10/2dffecb357d8c257912aed3011eecdcfe3c17bf068f197ce5ac1a1382fc7ebe39ea2e67b45688c8e5f57627330162843201c264a5a64f22147dc1c8c02a61da7 - languageName: node - linkType: hard - -"@parcel/reporter-cli@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/reporter-cli@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/types": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - chalk: "npm:^4.1.0" - term-size: "npm:^2.2.1" - checksum: 10/9b0059fce8d49bfaff26dd722a4ab8d5b5f02a05709f3af30c6263b4335d010896f54b1b3503b78596de9086688149190bfb99a57667a8bd9bf65bff5a389f8b - languageName: node - linkType: hard - -"@parcel/reporter-cli@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/reporter-cli@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/types": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - chalk: "npm:^4.1.0" - term-size: "npm:^2.2.1" - checksum: 10/6b4d2104a4efacc801c0e42008c3f25122aafb669763b199db98165e96e3a6ed09b1e71fab6669f958de55c8cf9d06676f419f35f06a045e08cc30bb94224e21 - languageName: node - linkType: hard - -"@parcel/reporter-dev-server@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/reporter-dev-server@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - checksum: 10/4a7977ee3d5880ec0857088fe0bff78409fc5d1f30b67fa09dbb7ff135b5242762668b4d0de47c07097171f7515dece7f93b104944ae78f6c9e75fc6bc15b085 - languageName: node - linkType: hard - -"@parcel/reporter-dev-server@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/reporter-dev-server@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - checksum: 10/e08fc182a1850fd6e2b38dd7e521e4e888a2d1b0395f4aaf73b9992698f7214fbe4783476232a85e3f59177899797cd23bb6d4f26c26fcac89f16055ab030f74 - languageName: node - linkType: hard - -"@parcel/reporter-tracer@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/reporter-tracer@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - chrome-trace-event: "npm:^1.0.3" - nullthrows: "npm:^1.1.1" - checksum: 10/f526eee0dd53c905ddd12ba5fc8d9c5f4732cc383d040cff2501445aed15b70a477328b01b68666d4b9d3f833aef407c26c6ed267a00b36687a4c4723a0edc6a - languageName: node - linkType: hard - -"@parcel/reporter-tracer@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/reporter-tracer@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - chrome-trace-event: "npm:^1.0.3" - nullthrows: "npm:^1.1.1" - checksum: 10/47d0f563cd655efbc1bb53f01ee8b89efe92cefc869c4de675544fdeee3bd48fe1208f7176df533a57cadb13c93038f4b910f56def5c10f0574e8b6843c7c846 - languageName: node - linkType: hard - -"@parcel/resolver-default@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/resolver-default@npm:2.12.0" - dependencies: - "@parcel/node-resolver-core": "npm:3.3.0" - "@parcel/plugin": "npm:2.12.0" - checksum: 10/f42165e438700d0c3778c15a24de30add9ca9ab3d33da7bd474ccac47e358b7a6ecfbc761425f9ee9be9d6422175da8f21348bdf9407420f75b666a351247779 - languageName: node - linkType: hard - -"@parcel/resolver-default@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/resolver-default@npm:2.9.3" - dependencies: - "@parcel/node-resolver-core": "npm:3.0.3" - "@parcel/plugin": "npm:2.9.3" - checksum: 10/86959a84ab6edc016eed014604ae8451fe0ae5817910e5b483e08e24b7ce6e5053f25e3e4e3fda004491f2a3fe5e4a3498772f5ac43ff21858443cc5dc2e67c8 - languageName: node - linkType: hard - -"@parcel/runtime-browser-hmr@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/runtime-browser-hmr@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - checksum: 10/179c538625b4fc242a923d4e338c1a185acf629ba0c5bcfebf80778aac6e7295268de6265add7e4e78eb61ea0f631b70cd46123e5c908b8fa8a04db56ed19c57 - languageName: node - linkType: hard - -"@parcel/runtime-browser-hmr@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/runtime-browser-hmr@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - checksum: 10/fa2e878d5d15d4e31baf4469c54cd38c09fee97df0f3e46ecd94b7fc84336b183f4594f3b50863946f007fd8d372967cf97356fc016977f20e27221bed6f31ab - languageName: node - linkType: hard - -"@parcel/runtime-js@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/runtime-js@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - checksum: 10/8e2db0b5068ba1505bbe451a7e9b1a49ec425d4e27210667ad6adc4c9060c132df1ea6b52df6e6a2cb4f7f3e9cf084c0c5b0aab7956ccd30bc9550f7d2d01a3c - languageName: node - linkType: hard - -"@parcel/runtime-js@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/runtime-js@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - checksum: 10/c3b413f087d5c9308b8cc8328e0d3667ae1d6d455b77b2f0948191d426157cb10302761c8fbc7d3fe4a309b5ae37f4b3041fee1c556766643492f445457c83f0 - languageName: node - linkType: hard - -"@parcel/runtime-react-refresh@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/runtime-react-refresh@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - react-error-overlay: "npm:6.0.9" - react-refresh: "npm:^0.9.0" - checksum: 10/a185914780f33bea92a6da74308212cd663f75c0a85b73776e5a0961289b3ae8eebe7900f3b755ab516498bc302957968b2f3dfb6e81ea4377ca6f1e1eada601 - languageName: node - linkType: hard - -"@parcel/runtime-react-refresh@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/runtime-react-refresh@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - react-error-overlay: "npm:6.0.9" - react-refresh: "npm:^0.9.0" - checksum: 10/e30ec1d872d504e3844dcde82ae86fec9ca825b753bb726cae513de570fbebfbdf288be392e0bf71067c6c5418e22d28b56f84a27dd55dbdb2ab8766febbc519 - languageName: node - linkType: hard - -"@parcel/runtime-service-worker@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/runtime-service-worker@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - checksum: 10/768d128f28de24ae264ad74f37c6bfaa37a366c9333a4101d9afb88b4e3ac2820e86605294321d78397dae9884d83362044ed9d2be31fce4884880c209b671a5 - languageName: node - linkType: hard - -"@parcel/runtime-service-worker@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/runtime-service-worker@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - checksum: 10/8c607f4bdc703dc06153d982d9b71a177d9f1278595ed33cd8434e674a3bdab0123a7235855c782a408e1d5eb33a102009141861a63ed32479c32ca0acd55822 - languageName: node - linkType: hard - -"@parcel/rust@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/rust@npm:2.12.0" - checksum: 10/e2b2a7ea7de313349cffe22fd14f790c33b6c9a3826ffcda134fd11765aa7ec13748ffb3d99069f94a399b78f3d45924591e8e8a334e9b43d1e74a2a7b4f007f - languageName: node - linkType: hard - -"@parcel/source-map@npm:^2.1.1": - version: 2.1.1 - resolution: "@parcel/source-map@npm:2.1.1" - dependencies: - detect-libc: "npm:^1.0.3" - checksum: 10/aea380ae58457b47434078f1715f91e6e71e65e6a6678d17add75d007f7dca4df126a9f1071566ddefed69efd8159ef3203eb8b753656ee6db37904d35b44959 - languageName: node - linkType: hard - -"@parcel/transformer-babel@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-babel@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.12.0" - browserslist: "npm:^4.6.6" - json5: "npm:^2.2.0" - nullthrows: "npm:^1.1.1" - semver: "npm:^7.5.2" - checksum: 10/b3d6d5dcb4191618383555ef32c9adb90251d467f756dae3648aa862f860a91d0a70850d3074de132a4a301386626723a1e3691ec8eb84de3e91de3ff2d36271 - languageName: node - linkType: hard - -"@parcel/transformer-babel@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-babel@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.9.3" - browserslist: "npm:^4.6.6" - json5: "npm:^2.2.0" - nullthrows: "npm:^1.1.1" - semver: "npm:^7.5.2" - checksum: 10/eed033e00a29304be8e7d6d5f89ad98f07fcc69c9dd42248a8cec5e41dc50048192457617ab824231eea9f96df82c7eaff759835455a017d03685649abf4b188 - languageName: node - linkType: hard - -"@parcel/transformer-css@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-css@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.12.0" - browserslist: "npm:^4.6.6" - lightningcss: "npm:^1.22.1" - nullthrows: "npm:^1.1.1" - checksum: 10/9e9acc9da8146b3b71b280857e28daeea39f32993b5255d0792529e72d6786f4eddb20cc262165f4687c0b238c3477c4b7df6cc83a52c6fe821213a4c53bee35 - languageName: node - linkType: hard - -"@parcel/transformer-css@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-css@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.9.3" - browserslist: "npm:^4.6.6" - lightningcss: "npm:^1.16.1" - nullthrows: "npm:^1.1.1" - checksum: 10/df98e75811a1b249391873229a61397d5bb0b96e933736dcd8189e0fb362633db4b1eb1b71d632f777ee3f23c1947aa604f74d1215df0c82c6b623bc4e9f0bf6 - languageName: node - linkType: hard - -"@parcel/transformer-html@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-html@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - posthtml-parser: "npm:^0.10.1" - posthtml-render: "npm:^3.0.0" - semver: "npm:^7.5.2" - srcset: "npm:4" - checksum: 10/68c18f3a3073710901a64361305fc88cf705386467d824bdf3e23fa17e0793014835b876a0001d287cb6da30eba160362b8b2dfee046b52f04648ce9448d0b0f - languageName: node - linkType: hard - -"@parcel/transformer-html@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-html@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/hash": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - posthtml-parser: "npm:^0.10.1" - posthtml-render: "npm:^3.0.0" - semver: "npm:^7.5.2" - srcset: "npm:4" - checksum: 10/874a2bd69824f0bbb24ca127ff58cf2e87478e6d78707f1ea49d4119a1d5a7ceea202feab3000b08af268e30c17e40b333cc2d9dc7fbcc841f3d58b3d10fb731 - languageName: node - linkType: hard - -"@parcel/transformer-image@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-image@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - "@parcel/workers": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - peerDependencies: - "@parcel/core": ^2.12.0 - checksum: 10/79cb2669b64d64792ff27f2dfb6aeb0bde9276319124adda35b81e4b4afdfd09b90119f59e645edd1883f0ad9a87c05a4dbec702194a42d2001860c4f0d3debd - languageName: node - linkType: hard - -"@parcel/transformer-image@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-image@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - "@parcel/workers": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - peerDependencies: - "@parcel/core": ^2.9.3 - checksum: 10/da903279c4439f8ae5c53175eb7a276cfc2899c0e2143767e78049ba5b81f6b568be0ac2599bae22e85b4670bc4575654362801b1ec42512adb9511c57c88194 - languageName: node - linkType: hard - -"@parcel/transformer-js@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-js@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.12.0" - "@parcel/workers": "npm:2.12.0" - "@swc/helpers": "npm:^0.5.0" - browserslist: "npm:^4.6.6" - nullthrows: "npm:^1.1.1" - regenerator-runtime: "npm:^0.13.7" - semver: "npm:^7.5.2" - peerDependencies: - "@parcel/core": ^2.12.0 - checksum: 10/e40a2fa512bba8ebfe79c7cb8bff1dc1cf1b316d2c00ed0478e6587d59c0365271efb8ac7a02e83b22bd420c77372b381cc107f80fe1d46880a0a9cbb6f8b34c - languageName: node - linkType: hard - -"@parcel/transformer-js@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-js@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/utils": "npm:2.9.3" - "@parcel/workers": "npm:2.9.3" - "@swc/helpers": "npm:^0.5.0" - browserslist: "npm:^4.6.6" - nullthrows: "npm:^1.1.1" - regenerator-runtime: "npm:^0.13.7" - semver: "npm:^7.5.2" - peerDependencies: - "@parcel/core": ^2.9.3 - checksum: 10/95e8e6049595eeef719e4786845e7bd249ca569bd5ad9066ceb8e412740b74ed5dfd80331086ddf3eba9c01c7559ffc35f7f81c7cfecc17f19d4ac78fe19ab17 - languageName: node - linkType: hard - -"@parcel/transformer-json@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-json@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - json5: "npm:^2.2.0" - checksum: 10/96ff6b16cac6362e004492fe6140b3c5ce437a81da22e4cce5342e16146d4c10a587c7acf7b0a8feaaade8072ee76f4bee7770078aaa9471651f99a46016eb7e - languageName: node - linkType: hard - -"@parcel/transformer-json@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-json@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - json5: "npm:^2.2.0" - checksum: 10/7a231251bf112dc02f1f5893aa5e093c38ae9d3b93dbd1a317882d533adf432eaf62446808b8f735eeb1b59a79a785bd3f0c60e5847ff8b90498449a97d0ec2e - languageName: node - linkType: hard - -"@parcel/transformer-postcss@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-postcss@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - clone: "npm:^2.1.1" - nullthrows: "npm:^1.1.1" - postcss-value-parser: "npm:^4.2.0" - semver: "npm:^7.5.2" - checksum: 10/4d8eb27d079abe171875246627834c6495073daa1bcf27dd49a5ec8eccd334632a357beb42e9773175808fa6464e8600a8efc442097d9395cab96a9217c1e6b5 - languageName: node - linkType: hard - -"@parcel/transformer-postcss@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-postcss@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/hash": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - clone: "npm:^2.1.1" - nullthrows: "npm:^1.1.1" - postcss-value-parser: "npm:^4.2.0" - semver: "npm:^7.5.2" - checksum: 10/29a7567f003be8b2508044939b4f08985799efe30eb82c5e2319019fef5c31c3d44dda67a8a039824c82c64402adb66983320093cda6cc1451a76d864585e2d0 - languageName: node - linkType: hard - -"@parcel/transformer-posthtml@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-posthtml@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - posthtml-parser: "npm:^0.10.1" - posthtml-render: "npm:^3.0.0" - semver: "npm:^7.5.2" - checksum: 10/b056331712cf9a07388065c11ac1a2e38cb7b9f307ab79b6431812b7ba61f5d9280ba99fca35051345da0acc926924d813060b2577245462258856edddb8902a - languageName: node - linkType: hard - -"@parcel/transformer-posthtml@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-posthtml@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - posthtml-parser: "npm:^0.10.1" - posthtml-render: "npm:^3.0.0" - semver: "npm:^7.5.2" - checksum: 10/16cc5f099f7252e4e378960e50b9a8aa8502617c4cdb982eb22a83e0ef9847d331a8cd4213cf80321036b78bdc85c2554dff437231986016772c8bf925707db4 - languageName: node - linkType: hard - -"@parcel/transformer-raw@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-raw@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - checksum: 10/de6681e2e723d9877f3e2fd3c4983ac4de8ecae26f5d0c51ce6d231bd29d644f86db9558426cd69adfdbb89edd824c08ef92ada09aaceaa66dd1f44d1c027d60 - languageName: node - linkType: hard - -"@parcel/transformer-raw@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-raw@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - checksum: 10/b639e2f5fde4066124e58c343b56cd6eeb7820cb6dd1c4feeba5b40b1f3cc222c075d61de9dd8f381dbcbb42b44bdc7bf33c0fb4edbd3da59c4e3c66e4748d4b - languageName: node - linkType: hard - -"@parcel/transformer-react-refresh-wrap@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-react-refresh-wrap@npm:2.12.0" - dependencies: - "@parcel/plugin": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - react-refresh: "npm:^0.9.0" - checksum: 10/c3015df31f3cda37e0208445977ff3e38e6d53465af9ef67b19ff910b5a1011ee3abe32ceb3fb81683a49e670c134a1e06af8534919a1e8940ccbca40aa84f88 - languageName: node - linkType: hard - -"@parcel/transformer-react-refresh-wrap@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-react-refresh-wrap@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - react-refresh: "npm:^0.9.0" - checksum: 10/6d32cf933e3875950be0636eeaaca9773fab5280fb371ab9df46513713c04cbfe72a335e051529f64b12c9ae4f1aee711399c6e7580d210cfd35a75b8a708a57 - languageName: node - linkType: hard - -"@parcel/transformer-svg@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/transformer-svg@npm:2.12.0" - dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/plugin": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - posthtml-parser: "npm:^0.10.1" - posthtml-render: "npm:^3.0.0" - semver: "npm:^7.5.2" - checksum: 10/4a7b44566e496adfb9b85a5b889baee4fad98f8d21753f2f8df1e5abba66bafdffeb73e533b22004bc47fb1ef4b0ecb4896a526fef5739eb031c893ff5c0c53a - languageName: node - linkType: hard - -"@parcel/transformer-svg@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/transformer-svg@npm:2.9.3" - dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/hash": "npm:2.9.3" - "@parcel/plugin": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - posthtml: "npm:^0.16.5" - posthtml-parser: "npm:^0.10.1" - posthtml-render: "npm:^3.0.0" - semver: "npm:^7.5.2" - checksum: 10/592aff80beddde7c39bde684f9302d6f5cb667ef6e1bbe26621e64d2fbe501a21c6f7327bec5374486ca2610f87ca16437653456a89f314e358e10ee26c95d53 - languageName: node - linkType: hard - -"@parcel/transformer-typescript-tsc@npm:^2.0.0-alpha.3": - version: 2.9.3 - resolution: "@parcel/transformer-typescript-tsc@npm:2.9.3" - dependencies: - "@parcel/plugin": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/ts-utils": "npm:2.9.3" - peerDependencies: - typescript: ">=3.0.0" - checksum: 10/0f5f9bad308bbdc9fab195af09fc1545f099406cd9fc104ac76f992a7716f476c50f4760403671e2701cd6c1c65d23e435d35aa40e817291dc9fecd23918ab14 - languageName: node - linkType: hard - -"@parcel/ts-utils@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/ts-utils@npm:2.9.3" - dependencies: - nullthrows: "npm:^1.1.1" - peerDependencies: - typescript: ">=3.0.0" - checksum: 10/d3067c337d21d69c7d857c5c5b48da916636e6bd1fa87ab24c5858a3b2cf329d585fe45feb7f4e3b67d951bdaa64282ef4aeb6bfa25194323fbf6c80a3c20496 - languageName: node - linkType: hard - -"@parcel/types@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/types@npm:2.12.0" - dependencies: - "@parcel/cache": "npm:2.12.0" - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/fs": "npm:2.12.0" - "@parcel/package-manager": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/workers": "npm:2.12.0" - utility-types: "npm:^3.10.0" - checksum: 10/c203be51789967adf8d5d3400fdf626b29f0d19065cef0d2ff91b5548397892b95fc4cc1153d9b8cccc3a885dfa8b1ea2f7317ab8089462f1e29207440e05f47 - languageName: node - linkType: hard - -"@parcel/types@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/types@npm:2.9.3" - dependencies: - "@parcel/cache": "npm:2.9.3" - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/fs": "npm:2.9.3" - "@parcel/package-manager": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - "@parcel/workers": "npm:2.9.3" - utility-types: "npm:^3.10.0" - checksum: 10/266fd811b2b1169b17988db9a2c1f3daa492ddf0f3e1df08cf944bea7f0549b516b864bdcdae65cba0db216134ce126b4868c94338b29ab306dc1d8cb8d85985 - languageName: node - linkType: hard - -"@parcel/utils@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/utils@npm:2.12.0" - dependencies: - "@parcel/codeframe": "npm:2.12.0" - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/logger": "npm:2.12.0" - "@parcel/markdown-ansi": "npm:2.12.0" - "@parcel/rust": "npm:2.12.0" - "@parcel/source-map": "npm:^2.1.1" - chalk: "npm:^4.1.0" - nullthrows: "npm:^1.1.1" - checksum: 10/df133d29fc5ca53094001cc88d70abdfb873d9cf18256836a33d8e6fb7f18025eaa44d625e724334e54c3c2bf8fcc12fcd806a0c314d7afc3bd85e6e98429873 - languageName: node - linkType: hard - -"@parcel/utils@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/utils@npm:2.9.3" - dependencies: - "@parcel/codeframe": "npm:2.9.3" - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/hash": "npm:2.9.3" - "@parcel/logger": "npm:2.9.3" - "@parcel/markdown-ansi": "npm:2.9.3" - "@parcel/source-map": "npm:^2.1.1" - chalk: "npm:^4.1.0" - nullthrows: "npm:^1.1.1" - checksum: 10/8a6a5617d31e98d8571d9c1edc6bc831eaa69a2d8da80515f299ecf4f91d5f24c035766497992367ef1aa57f01165645bc4122df5dc3e3ecc42e8592b620bef3 + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b languageName: node linkType: hard -"@parcel/watcher-android-arm64@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-android-arm64@npm:2.3.0" - conditions: os=android & cpu=arm64 +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 languageName: node linkType: hard -"@parcel/watcher-darwin-arm64@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-darwin-arm64@npm:2.3.0" - conditions: os=darwin & cpu=arm64 +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 languageName: node linkType: hard -"@parcel/watcher-darwin-x64@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-darwin-x64@npm:2.3.0" - conditions: os=darwin & cpu=x64 +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e languageName: node linkType: hard -"@parcel/watcher-freebsd-x64@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-freebsd-x64@npm:2.3.0" - conditions: os=freebsd & cpu=x64 +"@octokit/auth-token@npm:^2.4.0": + version: 2.5.0 + resolution: "@octokit/auth-token@npm:2.5.0" + dependencies: + "@octokit/types": "npm:^6.0.3" + checksum: 10/95d7928b6fcddf8960c7da27678e1cb425b4eaef2e6be615abb1f2b076b617dade72e0bf220c28bc5f106d8c029d5d064496657369d6d75372eb0c3b8d766380 languageName: node linkType: hard -"@parcel/watcher-linux-arm-glibc@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.3.0" - conditions: os=linux & cpu=arm & libc=glibc +"@octokit/endpoint@npm:^6.0.1": + version: 6.0.12 + resolution: "@octokit/endpoint@npm:6.0.12" + dependencies: + "@octokit/types": "npm:^6.0.3" + is-plain-object: "npm:^5.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10/d1b55a94aa3058f840f89cc8d353ef1c294c061c5a36fe05f09c375a62f82af3068b23ce531cc1802e36ee4a52359862523e454e9d2a81c99a5c09dddffb2925 languageName: node linkType: hard -"@parcel/watcher-linux-arm64-glibc@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.3.0" - conditions: os=linux & cpu=arm64 & libc=glibc +"@octokit/openapi-types@npm:^12.11.0": + version: 12.11.0 + resolution: "@octokit/openapi-types@npm:12.11.0" + checksum: 10/579bbbafe816ab02441d3088c04a7728f13b73aafbe306bbdd4deac374b345b453e520c343e45db454ae6091b75a7b3ce5b7f8434d3e53e45d0802023fcb84e0 languageName: node linkType: hard -"@parcel/watcher-linux-arm64-musl@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.3.0" - conditions: os=linux & cpu=arm64 & libc=musl +"@octokit/plugin-paginate-rest@npm:^1.1.1": + version: 1.1.2 + resolution: "@octokit/plugin-paginate-rest@npm:1.1.2" + dependencies: + "@octokit/types": "npm:^2.0.1" + checksum: 10/b5766c00399296ecdd05612e0cfc25526331a725780d98177114fb54d47f9892a8b147d59fdefeaa84a963057b5bfe7856b2de6046d8146ebefb1c7aeb682214 languageName: node linkType: hard -"@parcel/watcher-linux-x64-glibc@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.3.0" - conditions: os=linux & cpu=x64 & libc=glibc +"@octokit/plugin-request-log@npm:^1.0.0": + version: 1.0.4 + resolution: "@octokit/plugin-request-log@npm:1.0.4" + peerDependencies: + "@octokit/core": ">=3" + checksum: 10/2086db00056aee0f8ebd79797b5b57149ae1014e757ea08985b71eec8c3d85dbb54533f4fd34b6b9ecaa760904ae6a7536be27d71e50a3782ab47809094bfc0c languageName: node linkType: hard -"@parcel/watcher-linux-x64-musl@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.3.0" - conditions: os=linux & cpu=x64 & libc=musl +"@octokit/plugin-rest-endpoint-methods@npm:2.4.0": + version: 2.4.0 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:2.4.0" + dependencies: + "@octokit/types": "npm:^2.0.1" + deprecation: "npm:^2.3.1" + checksum: 10/a370dc7ceecca11840b4fb987ff1f8e214ea73992831643e43946dc89de7ba7640f8b2a20edc82b957a3da9cc9dec6fcb947e36c3b12bff1eadbb337fcd54d1f languageName: node linkType: hard -"@parcel/watcher-win32-arm64@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-win32-arm64@npm:2.3.0" - conditions: os=win32 & cpu=arm64 +"@octokit/request-error@npm:^1.0.2": + version: 1.2.1 + resolution: "@octokit/request-error@npm:1.2.1" + dependencies: + "@octokit/types": "npm:^2.0.0" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10/4dee522a0a99ad39cbd6d290ba7199b2d5abf089cfea77ef8feba3152228230c9844b54d06d7b4944a11a72d976efb006671df3eae6917039f83d8e2a7b46796 languageName: node linkType: hard -"@parcel/watcher-win32-ia32@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-win32-ia32@npm:2.3.0" - conditions: os=win32 & cpu=ia32 +"@octokit/request-error@npm:^2.1.0": + version: 2.1.0 + resolution: "@octokit/request-error@npm:2.1.0" + dependencies: + "@octokit/types": "npm:^6.0.3" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10/baec2b5700498be01b4d958f9472cb776b3f3b0ea52924323a07e7a88572e24cac2cdf7eb04a0614031ba346043558b47bea2d346e98f0e8385b4261f138ef18 languageName: node linkType: hard -"@parcel/watcher-win32-x64@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-win32-x64@npm:2.3.0" - conditions: os=win32 & cpu=x64 +"@octokit/request@npm:^5.2.0": + version: 5.6.3 + resolution: "@octokit/request@npm:5.6.3" + dependencies: + "@octokit/endpoint": "npm:^6.0.1" + "@octokit/request-error": "npm:^2.1.0" + "@octokit/types": "npm:^6.16.1" + is-plain-object: "npm:^5.0.0" + node-fetch: "npm:^2.6.7" + universal-user-agent: "npm:^6.0.0" + checksum: 10/0e5dbe6a335d8b1a5064a5305bd23cec20ba2bc9648749b5ab8b31e51e6f4ebbe363c23842fd702ca22f50e434ba963e2883a78604d97b3ddbc2439aeeed3d8c languageName: node linkType: hard -"@parcel/watcher@npm:^2.0.7": - version: 2.3.0 - resolution: "@parcel/watcher@npm:2.3.0" - dependencies: - "@parcel/watcher-android-arm64": "npm:2.3.0" - "@parcel/watcher-darwin-arm64": "npm:2.3.0" - "@parcel/watcher-darwin-x64": "npm:2.3.0" - "@parcel/watcher-freebsd-x64": "npm:2.3.0" - "@parcel/watcher-linux-arm-glibc": "npm:2.3.0" - "@parcel/watcher-linux-arm64-glibc": "npm:2.3.0" - "@parcel/watcher-linux-arm64-musl": "npm:2.3.0" - "@parcel/watcher-linux-x64-glibc": "npm:2.3.0" - "@parcel/watcher-linux-x64-musl": "npm:2.3.0" - "@parcel/watcher-win32-arm64": "npm:2.3.0" - "@parcel/watcher-win32-ia32": "npm:2.3.0" - "@parcel/watcher-win32-x64": "npm:2.3.0" - detect-libc: "npm:^1.0.3" - is-glob: "npm:^4.0.3" - micromatch: "npm:^4.0.5" - node-addon-api: "npm:^7.0.0" - node-gyp: "npm:latest" - dependenciesMeta: - "@parcel/watcher-android-arm64": - optional: true - "@parcel/watcher-darwin-arm64": - optional: true - "@parcel/watcher-darwin-x64": - optional: true - "@parcel/watcher-freebsd-x64": - optional: true - "@parcel/watcher-linux-arm-glibc": - optional: true - "@parcel/watcher-linux-arm64-glibc": - optional: true - "@parcel/watcher-linux-arm64-musl": - optional: true - "@parcel/watcher-linux-x64-glibc": - optional: true - "@parcel/watcher-linux-x64-musl": - optional: true - "@parcel/watcher-win32-arm64": - optional: true - "@parcel/watcher-win32-ia32": - optional: true - "@parcel/watcher-win32-x64": - optional: true - checksum: 10/5ba2be3337153f0c26b4a0b3a4f78ee728a96c37855c1cd39a573ac60b68e3116e657404c61b121b3f77f5227ab3d2c94679a816e42e90d1a476d7c783225368 +"@octokit/rest@npm:^16.27.0": + version: 16.43.2 + resolution: "@octokit/rest@npm:16.43.2" + dependencies: + "@octokit/auth-token": "npm:^2.4.0" + "@octokit/plugin-paginate-rest": "npm:^1.1.1" + "@octokit/plugin-request-log": "npm:^1.0.0" + "@octokit/plugin-rest-endpoint-methods": "npm:2.4.0" + "@octokit/request": "npm:^5.2.0" + "@octokit/request-error": "npm:^1.0.2" + atob-lite: "npm:^2.0.0" + before-after-hook: "npm:^2.0.0" + btoa-lite: "npm:^1.0.0" + deprecation: "npm:^2.0.0" + lodash.get: "npm:^4.4.2" + lodash.set: "npm:^4.3.2" + lodash.uniq: "npm:^4.5.0" + octokit-pagination-methods: "npm:^1.1.0" + once: "npm:^1.4.0" + universal-user-agent: "npm:^4.0.0" + checksum: 10/462016be28370c232a056812c2a4a62016a978a8e5464a1403d9740ba95c84b8531e6b8b55af9d19a06381089fd056fe433a1219129812d6110aeb701ee1e58b languageName: node linkType: hard -"@parcel/workers@npm:2.12.0": - version: 2.12.0 - resolution: "@parcel/workers@npm:2.12.0" +"@octokit/types@npm:^2.0.0, @octokit/types@npm:^2.0.1": + version: 2.16.2 + resolution: "@octokit/types@npm:2.16.2" dependencies: - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/logger": "npm:2.12.0" - "@parcel/profiler": "npm:2.12.0" - "@parcel/types": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - nullthrows: "npm:^1.1.1" - peerDependencies: - "@parcel/core": ^2.12.0 - checksum: 10/e8eb665d7da166cc7d4efa0eab69beef3a98edc26ebf863c79a66964fd3eaf78110deb3ab4963ab28162aad408c8b03f2ccc3ebdcd05b8bfdf5db748d1e532e4 + "@types/node": "npm:>= 8" + checksum: 10/b9dc4ed83adc2cd6174499c549544f6f199889d7e0395a8c512121943a6fbc46f78a2362671931ef26ad0fa9ff5100a5f8f7f52c7cb74a28cf3457d4f21ba3bf languageName: node linkType: hard -"@parcel/workers@npm:2.9.3": - version: 2.9.3 - resolution: "@parcel/workers@npm:2.9.3" +"@octokit/types@npm:^6.0.3, @octokit/types@npm:^6.16.1": + version: 6.41.0 + resolution: "@octokit/types@npm:6.41.0" dependencies: - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/logger": "npm:2.9.3" - "@parcel/profiler": "npm:2.9.3" - "@parcel/types": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - nullthrows: "npm:^1.1.1" - peerDependencies: - "@parcel/core": ^2.9.3 - checksum: 10/0b636102db0304fb096ca9f6da2c10e0cc1b6549064f3dd7df23e2cda9694427a038a3694bb978479bd50b583131beba2295861285212036a0bbbf588351796c + "@octokit/openapi-types": "npm:^12.11.0" + checksum: 10/905c8553e46e1a32b27f3f8c665c6a390648204f0b05c23693cd22a874e0bf654534ae2e51de3e09a794c07cc67cfd7f067b57f93cea0f658a369767537a72f0 languageName: node linkType: hard @@ -9403,6 +7697,15 @@ __metadata: languageName: node linkType: hard +"@supabase/postgrest-js@npm:^1.17.7": + version: 1.17.7 + resolution: "@supabase/postgrest-js@npm:1.17.7" + dependencies: + "@supabase/node-fetch": "npm:^2.6.14" + checksum: 10/c21b76226c68f33f3eb70814847c1b3f18e2f1962ec29f3fea15331fb2f86a93e68c038370931369ad207a656d599ece2f6d85d8285e6277c548d3528ff1358e + languageName: node + linkType: hard + "@surma/rollup-plugin-off-main-thread@npm:^2.2.2": version: 2.2.3 resolution: "@surma/rollup-plugin-off-main-thread@npm:2.2.3" @@ -9859,184 +8162,53 @@ __metadata: axios: "npm:^1.4.0" minimatch: "npm:^7.4.3" process: "npm:^0.11.10" - ramda: "npm:~0.29.1" - ramda-adjunct: "npm:^4.1.1" - stampit: "npm:^4.3.2" - dependenciesMeta: - "@swagger-api/apidom-error": - optional: true - "@swagger-api/apidom-json-pointer": - optional: true - "@swagger-api/apidom-ns-asyncapi-2": - optional: true - "@swagger-api/apidom-ns-openapi-2": - optional: true - "@swagger-api/apidom-ns-openapi-3-0": - optional: true - "@swagger-api/apidom-ns-openapi-3-1": - optional: true - "@swagger-api/apidom-ns-workflows-1": - optional: true - "@swagger-api/apidom-parser-adapter-api-design-systems-json": - optional: true - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": - optional: true - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": - optional: true - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": - optional: true - "@swagger-api/apidom-parser-adapter-json": - optional: true - "@swagger-api/apidom-parser-adapter-openapi-json-2": - optional: true - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": - optional: true - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": - optional: true - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": - optional: true - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": - optional: true - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": - optional: true - "@swagger-api/apidom-parser-adapter-workflows-json-1": - optional: true - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": - optional: true - "@swagger-api/apidom-parser-adapter-yaml-1-2": - optional: true - checksum: 10/d77a23f76d552775e4cd8709a0b6aa1f65915b69d041333cf72e1d13377a9baf4fa783b15d5b18db7241c7de2239104b81efa86e70482c1b592b1b3d2111331a - languageName: node - linkType: hard - -"@swc/core-darwin-arm64@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-darwin-arm64@npm:1.3.87" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-darwin-x64@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-darwin-x64@npm:1.3.87" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@swc/core-linux-arm-gnueabihf@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.87" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@swc/core-linux-arm64-gnu@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.87" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@swc/core-linux-arm64-musl@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.87" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@swc/core-linux-x64-gnu@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.87" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@swc/core-linux-x64-musl@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-linux-x64-musl@npm:1.3.87" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@swc/core-win32-arm64-msvc@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.87" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-win32-ia32-msvc@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.87" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@swc/core-win32-x64-msvc@npm:1.3.87": - version: 1.3.87 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.87" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@swc/core@npm:^1.3.36": - version: 1.3.87 - resolution: "@swc/core@npm:1.3.87" - dependencies: - "@swc/core-darwin-arm64": "npm:1.3.87" - "@swc/core-darwin-x64": "npm:1.3.87" - "@swc/core-linux-arm-gnueabihf": "npm:1.3.87" - "@swc/core-linux-arm64-gnu": "npm:1.3.87" - "@swc/core-linux-arm64-musl": "npm:1.3.87" - "@swc/core-linux-x64-gnu": "npm:1.3.87" - "@swc/core-linux-x64-musl": "npm:1.3.87" - "@swc/core-win32-arm64-msvc": "npm:1.3.87" - "@swc/core-win32-ia32-msvc": "npm:1.3.87" - "@swc/core-win32-x64-msvc": "npm:1.3.87" - "@swc/types": "npm:^0.1.4" - peerDependencies: - "@swc/helpers": ^0.5.0 + ramda: "npm:~0.29.1" + ramda-adjunct: "npm:^4.1.1" + stampit: "npm:^4.3.2" dependenciesMeta: - "@swc/core-darwin-arm64": + "@swagger-api/apidom-error": optional: true - "@swc/core-darwin-x64": + "@swagger-api/apidom-json-pointer": optional: true - "@swc/core-linux-arm-gnueabihf": + "@swagger-api/apidom-ns-asyncapi-2": optional: true - "@swc/core-linux-arm64-gnu": + "@swagger-api/apidom-ns-openapi-2": optional: true - "@swc/core-linux-arm64-musl": + "@swagger-api/apidom-ns-openapi-3-0": optional: true - "@swc/core-linux-x64-gnu": + "@swagger-api/apidom-ns-openapi-3-1": optional: true - "@swc/core-linux-x64-musl": + "@swagger-api/apidom-ns-workflows-1": optional: true - "@swc/core-win32-arm64-msvc": + "@swagger-api/apidom-parser-adapter-api-design-systems-json": optional: true - "@swc/core-win32-ia32-msvc": + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": optional: true - "@swc/core-win32-x64-msvc": + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": optional: true - peerDependenciesMeta: - "@swc/helpers": + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": optional: true - checksum: 10/c4c82b5f85544559f1e794cb3aa0ca36b08899e8569ef754ae4e2d0acba56a7adaefcc7937e59a0486bf76ea627b33d26a6a35dceee30e44d3e78a13c0a6af6e - languageName: node - linkType: hard - -"@swc/helpers@npm:^0.5.0": - version: 0.5.2 - resolution: "@swc/helpers@npm:0.5.2" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10/3a3b179b3369acd26c5da89a0e779c756ae5231eb18a5507524c7abf955f488d34d86649f5b8417a0e19879688470d06319f5cfca2273d6d6b2046950e0d79af - languageName: node - linkType: hard - -"@swc/types@npm:^0.1.4": - version: 0.1.5 - resolution: "@swc/types@npm:0.1.5" - checksum: 10/5f4de8c60d2623bed607c7fa1e0cee4ffc682af28d5ffe88dc9ed9903a1c2088ccc39f684689d6bb314595c9fbb560beaec773d633be515fb856ffc81d738822 + "@swagger-api/apidom-parser-adapter-json": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-json-2": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": + optional: true + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": + optional: true + "@swagger-api/apidom-parser-adapter-workflows-json-1": + optional: true + "@swagger-api/apidom-parser-adapter-workflows-yaml-1": + optional: true + "@swagger-api/apidom-parser-adapter-yaml-1-2": + optional: true + checksum: 10/d77a23f76d552775e4cd8709a0b6aa1f65915b69d041333cf72e1d13377a9baf4fa783b15d5b18db7241c7de2239104b81efa86e70482c1b592b1b3d2111331a languageName: node linkType: hard @@ -12472,13 +10644,6 @@ __metadata: languageName: node linkType: hard -"abortcontroller-polyfill@npm:^1.1.9": - version: 1.7.5 - resolution: "abortcontroller-polyfill@npm:1.7.5" - checksum: 10/aac398f7fc076235fe731adaffd2c319fe6c1527af8ca561890242d5396351350e0705726478778dc90326a69a4c044890c156fe867cba7f3ffeb670f8665a51 - languageName: node - linkType: hard - "accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -12714,6 +10879,23 @@ __metadata: languageName: node linkType: hard +"allotment@npm:^1.20.2": + version: 1.20.2 + resolution: "allotment@npm:1.20.2" + dependencies: + classnames: "npm:^2.3.0" + eventemitter3: "npm:^5.0.0" + lodash.clamp: "npm:^4.0.0" + lodash.debounce: "npm:^4.0.0" + lodash.isequal: "npm:^4.5.0" + use-resize-observer: "npm:^9.0.0" + peerDependencies: + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + checksum: 10/79266656a8907626f8c3a60e586515d28e8c17b151903dd2359b38c347d68d482a3ca0805d319487ca4f04e20f110b5aa24d1bb453910496eae4874b7de20422 + languageName: node + linkType: hard + "alphanum-sort@npm:^1.0.0": version: 1.0.2 resolution: "alphanum-sort@npm:1.0.2" @@ -13673,15 +11855,6 @@ __metadata: languageName: node linkType: hard -"base-x@npm:^3.0.8": - version: 3.0.9 - resolution: "base-x@npm:3.0.9" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 10/957101d6fd09e1903e846fd8f69fd7e5e3e50254383e61ab667c725866bec54e5ece5ba49ce385128ae48f9ec93a26567d1d5ebb91f4d56ef4a9cc0d5a5481e8 - languageName: node - linkType: hard - "base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -13932,7 +12105,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.9, browserslist@npm:^4.6.6": +"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.9": version: 4.21.11 resolution: "browserslist@npm:4.21.11" dependencies: @@ -14582,7 +12755,7 @@ __metadata: languageName: node linkType: hard -"chrome-trace-event@npm:^1.0.2, chrome-trace-event@npm:^1.0.3": +"chrome-trace-event@npm:^1.0.2": version: 1.0.3 resolution: "chrome-trace-event@npm:1.0.3" checksum: 10/b5fbdae5bf00c96fa3213de919f2b2617a942bfcb891cdf735fbad2a6f4f3c25d42e3f2b1703328619d352c718b46b9e18999fd3af7ef86c26c91db6fae1f0da @@ -14774,13 +12947,6 @@ __metadata: languageName: node linkType: hard -"clone@npm:^2.1.1": - version: 2.1.2 - resolution: "clone@npm:2.1.2" - checksum: 10/d9c79efba655f0bf601ab299c57eb54cbaa9860fb011aee9d89ed5ac0d12df1660ab7642fddaabb9a26b7eff0e117d4520512cb70798319ff5d30a111b5310c2 - languageName: node - linkType: hard - "clsx@npm:^1.1.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" @@ -15472,23 +13638,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.0.0": - version: 8.3.6 - resolution: "cosmiconfig@npm:8.3.6" - dependencies: - import-fresh: "npm:^3.3.0" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.2.0" - path-type: "npm:^4.0.0" - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/91d082baca0f33b1c085bf010f9ded4af43cbedacba8821da0fb5667184d0a848addc52c31fadd080007f904a555319c238cf5f4c03e6d58ece2e4876b2e73d6 - languageName: node - linkType: hard - "create-error-class@npm:^3.0.0": version: 3.0.2 resolution: "create-error-class@npm:3.0.2" @@ -17025,16 +15174,7 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^1.0.3": - version: 1.0.3 - resolution: "detect-libc@npm:1.0.3" - bin: - detect-libc: ./bin/detect-libc.js - checksum: 10/3849fe7720feb153e4ac9407086956e073f1ce1704488290ef0ca8aab9430a8d48c8a9f8351889e7cdc64e5b1128589501e4fef48f3a4a49ba92cd6d112d0757 - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1": +"detect-libc@npm:^2.0.0": version: 2.0.3 resolution: "detect-libc@npm:2.0.3" checksum: 10/b4ea018d623e077bd395f168a9e81db77370dde36a5b01d067f2ad7989924a81d31cb547ff764acb2aa25d50bb7fdde0b0a93bec02212b0cb430621623246d39 @@ -17263,7 +15403,7 @@ __metadata: languageName: node linkType: hard -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.2.2, domhandler@npm:^4.3.1": +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": version: 4.3.1 resolution: "domhandler@npm:4.3.1" dependencies: @@ -17353,13 +15493,6 @@ __metadata: languageName: node linkType: hard -"dotenv-expand@npm:^5.1.0": - version: 5.1.0 - resolution: "dotenv-expand@npm:5.1.0" - checksum: 10/d52af2a6e4642979ae4221408f1b75102508dbe4f5bac1c0613f92a3cf3880d5c31f86b2f5cff3273f7c23e10421e75028546e8b6cd0376fcd20e3803b374e15 - languageName: node - linkType: hard - "dotenv-webpack@npm:^8.0.1": version: 8.1.0 resolution: "dotenv-webpack@npm:8.1.0" @@ -17385,13 +15518,6 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^7.0.0": - version: 7.0.0 - resolution: "dotenv@npm:7.0.0" - checksum: 10/7f9eb4828e663064bcb87431442e5c7664f040d06e2f9db73f1436753901522f48c2202ea9ce19ee499fd5b35c8d1c2c6eeea64277eff9b1ed4fc479bc0c8d5d - languageName: node - linkType: hard - "dotenv@npm:^8.2.0": version: 8.6.0 resolution: "dotenv@npm:8.6.0" @@ -17618,13 +15744,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^3.0.1": - version: 3.0.1 - resolution: "entities@npm:3.0.1" - checksum: 10/3706e0292ea3f3679720b3d3b1ed6290b164aaeb11116691a922a3acea144503871e0de2170b47671c3b735549b8b7f4741d0d3c2987e8f985ccaa0dd3762eba - languageName: node - linkType: hard - "env-ci@npm:^4.0.0": version: 4.5.2 resolution: "env-ci@npm:4.5.2" @@ -18816,6 +16935,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:^5.0.0": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 + languageName: node + linkType: hard + "events@npm:^3.2.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -20027,13 +18153,6 @@ __metadata: languageName: node linkType: hard -"get-port@npm:^4.2.0": - version: 4.2.0 - resolution: "get-port@npm:4.2.0" - checksum: 10/6c9a452b2d6e81fe36781a69ed201883d37c02f141ba5770eaef3eca768ca38777c2eba4bec303f6b8c3f45f29036f95d5606b255f613320a6b4b680e1975c07 - languageName: node - linkType: hard - "get-prefix@npm:^1.0.0": version: 1.0.0 resolution: "get-prefix@npm:1.0.0" @@ -20289,15 +18408,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.2.0": - version: 13.22.0 - resolution: "globals@npm:13.22.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10/2f05c268a544b9e55a7f76f27248923116e50bcd046371fe6fa0920d9fce8432af8f92f47311986f48a1393f61f009c9345de9ed82b3a902d89245c73d0a4047 - languageName: node - linkType: hard - "globalthis@npm:^1.0.3": version: 1.0.3 resolution: "globalthis@npm:1.0.3" @@ -20961,43 +19071,6 @@ __metadata: languageName: node linkType: hard -"htmlnano@npm:^2.0.0": - version: 2.0.4 - resolution: "htmlnano@npm:2.0.4" - dependencies: - cosmiconfig: "npm:^8.0.0" - posthtml: "npm:^0.16.5" - timsort: "npm:^0.3.0" - peerDependencies: - cssnano: ^6.0.0 - postcss: ^8.3.11 - purgecss: ^5.0.0 - relateurl: ^0.2.7 - srcset: 4.0.0 - svgo: ^3.0.2 - terser: ^5.10.0 - uncss: ^0.17.3 - peerDependenciesMeta: - cssnano: - optional: true - postcss: - optional: true - purgecss: - optional: true - relateurl: - optional: true - srcset: - optional: true - svgo: - optional: true - terser: - optional: true - uncss: - optional: true - checksum: 10/87c42d486fcb8293bc8e8fd89388b70066074f0851c594a31d4aefca1264eac23b6ddca0eaa532876b897c4ce82b23bfea22db581b57ef11d19879ba357484ca - languageName: node - linkType: hard - "htmlparser2@npm:3.10.1": version: 3.10.1 resolution: "htmlparser2@npm:3.10.1" @@ -21024,18 +19097,6 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:^7.1.1": - version: 7.2.0 - resolution: "htmlparser2@npm:7.2.0" - dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.2.2" - domutils: "npm:^2.8.0" - entities: "npm:^3.0.1" - checksum: 10/fd097e19c01fb4ac8f44e432ae2908a606a382ccfec90efc91354a5b153540feade679ab8dca5fdebbe4f27c5a700743e2a0794f5a7a1beae9cc59d47e0f24b5 - languageName: node - linkType: hard - "http-cache-semantics@npm:^3.8.1": version: 3.8.1 resolution: "http-cache-semantics@npm:3.8.1" @@ -21398,7 +19459,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -22049,13 +20110,6 @@ __metadata: languageName: node linkType: hard -"is-json@npm:^2.0.1": - version: 2.0.1 - resolution: "is-json@npm:2.0.1" - checksum: 10/29a768ad31d2ade15188578967120aa730cd2145e53a88ab88e022f0b4597368228f28a9de08c3cfbb0c80de1fae26fab21910e5b71c3b5661f2a41c05f9ae8d - languageName: node - linkType: hard - "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -23288,7 +21342,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.0, json5@npm:^2.2.1, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.2.0, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -23703,245 +21757,35 @@ __metadata: figgy-pudding: "npm:^3.5.1" get-stream: "npm:^4.0.0" npm-registry-fetch: "npm:^4.0.0" - checksum: 10/af3de9bbfe6efea9b7b3f611247e29a114b7d1370fbf9727bceaee456af7be9e23ac7d143df0c24188ecbb007c8162fe1bfe7cfa6f44d2225d87d540b52db346 - languageName: node - linkType: hard - -"libnpmteam@npm:^1.0.2": - version: 1.0.2 - resolution: "libnpmteam@npm:1.0.2" - dependencies: - aproba: "npm:^2.0.0" - figgy-pudding: "npm:^3.4.1" - get-stream: "npm:^4.0.0" - npm-registry-fetch: "npm:^4.0.0" - checksum: 10/dda34c6ba3f11f0a723ade223b5ceaa1d56f5e8cdcd5674d0f0ae9ea8f2d16242ae6bfddd9e317ba1f45f0ed5465531d9bd3a07c10805a79184afd99a29bec6b - languageName: node - linkType: hard - -"libnpx@npm:^10.2.4": - version: 10.2.4 - resolution: "libnpx@npm:10.2.4" - dependencies: - dotenv: "npm:^5.0.1" - npm-package-arg: "npm:^6.0.0" - rimraf: "npm:^2.6.2" - safe-buffer: "npm:^5.1.0" - update-notifier: "npm:^2.3.0" - which: "npm:^1.3.0" - y18n: "npm:^4.0.0" - yargs: "npm:^14.2.3" - checksum: 10/11d5dfded814cf21513b289537907952141d779a898a7c712c98eec4214dd9444d34cfe34d985555f9c6ce36dfca4a76d3e952171a2650b0ee987d8871bc1beb - languageName: node - linkType: hard - -"lightningcss-darwin-arm64@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-darwin-arm64@npm:1.22.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-darwin-arm64@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-darwin-arm64@npm:1.28.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-darwin-x64@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-darwin-x64@npm:1.22.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-darwin-x64@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-darwin-x64@npm:1.28.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-freebsd-x64@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-freebsd-x64@npm:1.22.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-freebsd-x64@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-freebsd-x64@npm:1.28.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-linux-arm-gnueabihf@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.22.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"lightningcss-linux-arm-gnueabihf@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.28.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"lightningcss-linux-arm64-gnu@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-linux-arm64-gnu@npm:1.22.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-arm64-gnu@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-linux-arm64-gnu@npm:1.28.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-arm64-musl@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-linux-arm64-musl@npm:1.22.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-linux-arm64-musl@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-linux-arm64-musl@npm:1.28.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-linux-x64-gnu@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-linux-x64-gnu@npm:1.22.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-x64-gnu@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-linux-x64-gnu@npm:1.28.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-x64-musl@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-linux-x64-musl@npm:1.22.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-linux-x64-musl@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-linux-x64-musl@npm:1.28.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-win32-arm64-msvc@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-win32-arm64-msvc@npm:1.28.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-win32-x64-msvc@npm:1.22.0": - version: 1.22.0 - resolution: "lightningcss-win32-x64-msvc@npm:1.22.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-win32-x64-msvc@npm:1.28.1": - version: 1.28.1 - resolution: "lightningcss-win32-x64-msvc@npm:1.28.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"lightningcss@npm:^1.16.1": - version: 1.22.0 - resolution: "lightningcss@npm:1.22.0" - dependencies: - detect-libc: "npm:^1.0.3" - lightningcss-darwin-arm64: "npm:1.22.0" - lightningcss-darwin-x64: "npm:1.22.0" - lightningcss-freebsd-x64: "npm:1.22.0" - lightningcss-linux-arm-gnueabihf: "npm:1.22.0" - lightningcss-linux-arm64-gnu: "npm:1.22.0" - lightningcss-linux-arm64-musl: "npm:1.22.0" - lightningcss-linux-x64-gnu: "npm:1.22.0" - lightningcss-linux-x64-musl: "npm:1.22.0" - lightningcss-win32-x64-msvc: "npm:1.22.0" - dependenciesMeta: - lightningcss-darwin-arm64: - optional: true - lightningcss-darwin-x64: - optional: true - lightningcss-freebsd-x64: - optional: true - lightningcss-linux-arm-gnueabihf: - optional: true - lightningcss-linux-arm64-gnu: - optional: true - lightningcss-linux-arm64-musl: - optional: true - lightningcss-linux-x64-gnu: - optional: true - lightningcss-linux-x64-musl: - optional: true - lightningcss-win32-x64-msvc: - optional: true - checksum: 10/4a5917ba7b976c1adc3c83dd69eddc532b25647a4047f2ba480967adc2781f5bb44044f5eb91dc31d73b4a0d9e18f13f81780a223f30c37f9400a4344c51ba73 + checksum: 10/af3de9bbfe6efea9b7b3f611247e29a114b7d1370fbf9727bceaee456af7be9e23ac7d143df0c24188ecbb007c8162fe1bfe7cfa6f44d2225d87d540b52db346 languageName: node linkType: hard -"lightningcss@npm:^1.22.1": - version: 1.28.1 - resolution: "lightningcss@npm:1.28.1" +"libnpmteam@npm:^1.0.2": + version: 1.0.2 + resolution: "libnpmteam@npm:1.0.2" dependencies: - detect-libc: "npm:^1.0.3" - lightningcss-darwin-arm64: "npm:1.28.1" - lightningcss-darwin-x64: "npm:1.28.1" - lightningcss-freebsd-x64: "npm:1.28.1" - lightningcss-linux-arm-gnueabihf: "npm:1.28.1" - lightningcss-linux-arm64-gnu: "npm:1.28.1" - lightningcss-linux-arm64-musl: "npm:1.28.1" - lightningcss-linux-x64-gnu: "npm:1.28.1" - lightningcss-linux-x64-musl: "npm:1.28.1" - lightningcss-win32-arm64-msvc: "npm:1.28.1" - lightningcss-win32-x64-msvc: "npm:1.28.1" - dependenciesMeta: - lightningcss-darwin-arm64: - optional: true - lightningcss-darwin-x64: - optional: true - lightningcss-freebsd-x64: - optional: true - lightningcss-linux-arm-gnueabihf: - optional: true - lightningcss-linux-arm64-gnu: - optional: true - lightningcss-linux-arm64-musl: - optional: true - lightningcss-linux-x64-gnu: - optional: true - lightningcss-linux-x64-musl: - optional: true - lightningcss-win32-arm64-msvc: - optional: true - lightningcss-win32-x64-msvc: - optional: true - checksum: 10/24851af95b75753917e73e786cb53b04898ad7c52815ad64865346682fae181c920cecb8077e09542a51782a1a539e7d39fa493b4e67c4e5271622f07463fa89 + aproba: "npm:^2.0.0" + figgy-pudding: "npm:^3.4.1" + get-stream: "npm:^4.0.0" + npm-registry-fetch: "npm:^4.0.0" + checksum: 10/dda34c6ba3f11f0a723ade223b5ceaa1d56f5e8cdcd5674d0f0ae9ea8f2d16242ae6bfddd9e317ba1f45f0ed5465531d9bd3a07c10805a79184afd99a29bec6b + languageName: node + linkType: hard + +"libnpx@npm:^10.2.4": + version: 10.2.4 + resolution: "libnpx@npm:10.2.4" + dependencies: + dotenv: "npm:^5.0.1" + npm-package-arg: "npm:^6.0.0" + rimraf: "npm:^2.6.2" + safe-buffer: "npm:^5.1.0" + update-notifier: "npm:^2.3.0" + which: "npm:^1.3.0" + y18n: "npm:^4.0.0" + yargs: "npm:^14.2.3" + checksum: 10/11d5dfded814cf21513b289537907952141d779a898a7c712c98eec4214dd9444d34cfe34d985555f9c6ce36dfca4a76d3e952171a2650b0ee987d8871bc1beb languageName: node linkType: hard @@ -23968,76 +21812,6 @@ __metadata: languageName: node linkType: hard -"lmdb@npm:2.7.11": - version: 2.7.11 - resolution: "lmdb@npm:2.7.11" - dependencies: - "@lmdb/lmdb-darwin-arm64": "npm:2.7.11" - "@lmdb/lmdb-darwin-x64": "npm:2.7.11" - "@lmdb/lmdb-linux-arm": "npm:2.7.11" - "@lmdb/lmdb-linux-arm64": "npm:2.7.11" - "@lmdb/lmdb-linux-x64": "npm:2.7.11" - "@lmdb/lmdb-win32-x64": "npm:2.7.11" - msgpackr: "npm:1.8.5" - node-addon-api: "npm:^4.3.0" - node-gyp: "npm:latest" - node-gyp-build-optional-packages: "npm:5.0.6" - ordered-binary: "npm:^1.4.0" - weak-lru-cache: "npm:^1.2.2" - dependenciesMeta: - "@lmdb/lmdb-darwin-arm64": - optional: true - "@lmdb/lmdb-darwin-x64": - optional: true - "@lmdb/lmdb-linux-arm": - optional: true - "@lmdb/lmdb-linux-arm64": - optional: true - "@lmdb/lmdb-linux-x64": - optional: true - "@lmdb/lmdb-win32-x64": - optional: true - bin: - download-lmdb-prebuilds: bin/download-prebuilds.js - checksum: 10/53055bc749a9c240b20cbc7978aba6e190eda4ff277e87f17b5a2639316812e370ada05b6551d8113e026bfcca05ad163ffcafbfbf0813477da75d42a3081a06 - languageName: node - linkType: hard - -"lmdb@npm:2.8.5": - version: 2.8.5 - resolution: "lmdb@npm:2.8.5" - dependencies: - "@lmdb/lmdb-darwin-arm64": "npm:2.8.5" - "@lmdb/lmdb-darwin-x64": "npm:2.8.5" - "@lmdb/lmdb-linux-arm": "npm:2.8.5" - "@lmdb/lmdb-linux-arm64": "npm:2.8.5" - "@lmdb/lmdb-linux-x64": "npm:2.8.5" - "@lmdb/lmdb-win32-x64": "npm:2.8.5" - msgpackr: "npm:^1.9.5" - node-addon-api: "npm:^6.1.0" - node-gyp: "npm:latest" - node-gyp-build-optional-packages: "npm:5.1.1" - ordered-binary: "npm:^1.4.1" - weak-lru-cache: "npm:^1.2.2" - dependenciesMeta: - "@lmdb/lmdb-darwin-arm64": - optional: true - "@lmdb/lmdb-darwin-x64": - optional: true - "@lmdb/lmdb-linux-arm": - optional: true - "@lmdb/lmdb-linux-arm64": - optional: true - "@lmdb/lmdb-linux-x64": - optional: true - "@lmdb/lmdb-win32-x64": - optional: true - bin: - download-lmdb-prebuilds: bin/download-prebuilds.js - checksum: 10/250625da0ba036b481d1dadafae1fd2ae09b2cad637fe2dba5f297675cdfb046a2828731872e9ed8aed532dce67714545f63bdcfee4d1b19ccfa1bbe8d8eefbc - languageName: node - linkType: hard - "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -24245,6 +22019,13 @@ __metadata: languageName: node linkType: hard +"lodash.clamp@npm:^4.0.0": + version: 4.0.3 + resolution: "lodash.clamp@npm:4.0.3" + checksum: 10/02baa03ebb96f2ce8d9cec28b21fa3ed808c32f3b8fe54e2f990f1177779b13dcda69232db72d7285763e14a0ee64666a82a2047558eaba7198580173756c888 + languageName: node + linkType: hard + "lodash.clonedeep@npm:^4.5.0, lodash.clonedeep@npm:~4.5.0": version: 4.5.0 resolution: "lodash.clonedeep@npm:4.5.0" @@ -24252,7 +22033,7 @@ __metadata: languageName: node linkType: hard -"lodash.debounce@npm:^4, lodash.debounce@npm:^4.0.8": +"lodash.debounce@npm:^4, lodash.debounce@npm:^4.0.0, lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" checksum: 10/cd0b2819786e6e80cb9f5cda26b1a8fc073daaf04e48d4cb462fa4663ec9adb3a5387aa22d7129e48eed1afa05b482e2a6b79bfc99b86886364449500cbb00fd @@ -25579,7 +23360,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": version: 4.0.5 resolution: "micromatch@npm:4.0.5" dependencies: @@ -26021,73 +23802,6 @@ __metadata: languageName: node linkType: hard -"msgpackr-extract@npm:^3.0.1, msgpackr-extract@npm:^3.0.2": - version: 3.0.2 - resolution: "msgpackr-extract@npm:3.0.2" - dependencies: - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "npm:3.0.2" - "@msgpackr-extract/msgpackr-extract-darwin-x64": "npm:3.0.2" - "@msgpackr-extract/msgpackr-extract-linux-arm": "npm:3.0.2" - "@msgpackr-extract/msgpackr-extract-linux-arm64": "npm:3.0.2" - "@msgpackr-extract/msgpackr-extract-linux-x64": "npm:3.0.2" - "@msgpackr-extract/msgpackr-extract-win32-x64": "npm:3.0.2" - node-gyp: "npm:latest" - node-gyp-build-optional-packages: "npm:5.0.7" - dependenciesMeta: - "@msgpackr-extract/msgpackr-extract-darwin-arm64": - optional: true - "@msgpackr-extract/msgpackr-extract-darwin-x64": - optional: true - "@msgpackr-extract/msgpackr-extract-linux-arm": - optional: true - "@msgpackr-extract/msgpackr-extract-linux-arm64": - optional: true - "@msgpackr-extract/msgpackr-extract-linux-x64": - optional: true - "@msgpackr-extract/msgpackr-extract-win32-x64": - optional: true - bin: - download-msgpackr-prebuilds: bin/download-prebuilds.js - checksum: 10/c37ff5f098aea43ad441df32b810c603d84f2c775132e5919a20dacdbd003995cbead794c80e8d2f1d673539fac9b90c621842391a868d5055be857ae30763b9 - languageName: node - linkType: hard - -"msgpackr@npm:1.8.5": - version: 1.8.5 - resolution: "msgpackr@npm:1.8.5" - dependencies: - msgpackr-extract: "npm:^3.0.1" - dependenciesMeta: - msgpackr-extract: - optional: true - checksum: 10/edf1680ba68f2be3d507bedc7f7f4b0b10247edb0933caaf4db5dc1444ae6e131bdc77fb3ffbc3d4e95d8e044e3d76673a992f023362917f3533ca5593e2cef1 - languageName: node - linkType: hard - -"msgpackr@npm:^1.5.4": - version: 1.9.9 - resolution: "msgpackr@npm:1.9.9" - dependencies: - msgpackr-extract: "npm:^3.0.2" - dependenciesMeta: - msgpackr-extract: - optional: true - checksum: 10/384d55e8d9ce5be19f2e4369c1bc185b2b0f56e140c5028b78a1ca7d30d8f32efe35f08b76b1c9a3a0dec2589a465fdae036486126b6e106f9ee63c9ec399873 - languageName: node - linkType: hard - -"msgpackr@npm:^1.9.5, msgpackr@npm:^1.9.9": - version: 1.11.2 - resolution: "msgpackr@npm:1.11.2" - dependencies: - msgpackr-extract: "npm:^3.0.2" - dependenciesMeta: - msgpackr-extract: - optional: true - checksum: 10/7602f1e91e5ba13f4289ec9cab0d3f3db87d4ed323bebcb40a0c43ba2f6153192bffb63a5bb4755faacb6e0985f307c35084f40eaba1c325b7035da91381f01a - languageName: node - linkType: hard - "multicast-dns@npm:^7.2.5": version: 7.2.5 resolution: "multicast-dns@npm:7.2.5" @@ -26236,33 +23950,6 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^4.3.0": - version: 4.3.0 - resolution: "node-addon-api@npm:4.3.0" - dependencies: - node-gyp: "npm:latest" - checksum: 10/d3b38d16cb9ad0714d965331d0e38cef1c27750c2c3343cd3464a9ed8158501a2910ccbf2fd9fdc476e806a19dbc9e0524ff9d66a7c779d42a9752a63ba30b80 - languageName: node - linkType: hard - -"node-addon-api@npm:^6.1.0": - version: 6.1.0 - resolution: "node-addon-api@npm:6.1.0" - dependencies: - node-gyp: "npm:latest" - checksum: 10/8eea1d4d965930a177a0508695beb0d89b4c1d80bf330646a035357a1e8fc31e0d09686e2374996e96e757b947a7ece319f98ede3146683f162597c0bcb4df90 - languageName: node - linkType: hard - -"node-addon-api@npm:^7.0.0": - version: 7.0.0 - resolution: "node-addon-api@npm:7.0.0" - dependencies: - node-gyp: "npm:latest" - checksum: 10/f1a54ae38f6cbd4cdfe69d1b2f3f0c4a3d227eb50f5073f0a3b985d29a0c39c94b82c88213e5075ee1bc262f2e869841c733ebe7111a5e376f1732649edf6a93 - languageName: node - linkType: hard - "node-bitmap@npm:0.0.1": version: 0.0.1 resolution: "node-bitmap@npm:0.0.1" @@ -26345,41 +24032,6 @@ __metadata: languageName: node linkType: hard -"node-gyp-build-optional-packages@npm:5.0.6": - version: 5.0.6 - resolution: "node-gyp-build-optional-packages@npm:5.0.6" - bin: - node-gyp-build-optional-packages: bin.js - node-gyp-build-optional-packages-optional: optional.js - node-gyp-build-optional-packages-test: build-test.js - checksum: 10/b2505e56b1ca1c719c8da7fe93dd3cdc1c4e7acef443055cf4e4ef48d0509b25b2ec3d1aae0d2d435fbad1dfefe84b60362f84357d8774e8c873b00de811db43 - languageName: node - linkType: hard - -"node-gyp-build-optional-packages@npm:5.0.7": - version: 5.0.7 - resolution: "node-gyp-build-optional-packages@npm:5.0.7" - bin: - node-gyp-build-optional-packages: bin.js - node-gyp-build-optional-packages-optional: optional.js - node-gyp-build-optional-packages-test: build-test.js - checksum: 10/f61780b83ee665d88a1b2d0f5375d3455fabed1af4a009fd4396ed0b19ed6ad2215d4adbc76bd6eea0aafde0c72990e2cee9c888eeb28d6da2c8e5f8bce3ca0f - languageName: node - linkType: hard - -"node-gyp-build-optional-packages@npm:5.1.1": - version: 5.1.1 - resolution: "node-gyp-build-optional-packages@npm:5.1.1" - dependencies: - detect-libc: "npm:^2.0.1" - bin: - node-gyp-build-optional-packages: bin.js - node-gyp-build-optional-packages-optional: optional.js - node-gyp-build-optional-packages-test: build-test.js - checksum: 10/96dbeeba03fe5b9e86e1dc4491d7932cbf4c23f4ef8e63fb83bbbdcaf4553d8cbd5f23b9bc3632cb76a0739524f4b64f829daa5b608ebd72285ffdb03a9bdd81 - languageName: node - linkType: hard - "node-gyp@npm:^5.0.2, node-gyp@npm:^5.1.1": version: 5.1.1 resolution: "node-gyp@npm:5.1.1" @@ -26905,13 +24557,6 @@ __metadata: languageName: node linkType: hard -"nullthrows@npm:^1.1.1": - version: 1.1.1 - resolution: "nullthrows@npm:1.1.1" - checksum: 10/c7cf377a095535dc301d81cf7959d3784d090a609a2a4faa40b6121a0c1d7f70d3a3aa534a34ab852e8553b66848ec503c28f2c19efd617ed564dc07dfbb6d33 - languageName: node - linkType: hard - "number-is-nan@npm:^1.0.0": version: 1.0.1 resolution: "number-is-nan@npm:1.0.1" @@ -27214,20 +24859,6 @@ __metadata: languageName: node linkType: hard -"ordered-binary@npm:^1.4.0": - version: 1.4.1 - resolution: "ordered-binary@npm:1.4.1" - checksum: 10/f6f96563d960140ab4120555c038d26f2b4c1a89c291c53c000f5276f9becb099af6b61a245be3c49c55900de9958b37aacb48cb0abc2be7ca574c730d63763f - languageName: node - linkType: hard - -"ordered-binary@npm:^1.4.1": - version: 1.5.3 - resolution: "ordered-binary@npm:1.5.3" - checksum: 10/52dae0dc08a0c77a16ae456e6b5fe98e6201add839e3b8b35617056f3fc0b96b8e866012d58d30aef933f964390fe5457c3d178117720378f9d7a90c1ca24e5f - languageName: node - linkType: hard - "os-homedir@npm:^1.0.0": version: 1.0.2 resolution: "os-homedir@npm:1.0.2" @@ -27515,54 +25146,6 @@ __metadata: languageName: node linkType: hard -"parcel@npm:^2.0.0-beta.1, parcel@npm:^2.6.2": - version: 2.9.3 - resolution: "parcel@npm:2.9.3" - dependencies: - "@parcel/config-default": "npm:2.9.3" - "@parcel/core": "npm:2.9.3" - "@parcel/diagnostic": "npm:2.9.3" - "@parcel/events": "npm:2.9.3" - "@parcel/fs": "npm:2.9.3" - "@parcel/logger": "npm:2.9.3" - "@parcel/package-manager": "npm:2.9.3" - "@parcel/reporter-cli": "npm:2.9.3" - "@parcel/reporter-dev-server": "npm:2.9.3" - "@parcel/reporter-tracer": "npm:2.9.3" - "@parcel/utils": "npm:2.9.3" - chalk: "npm:^4.1.0" - commander: "npm:^7.0.0" - get-port: "npm:^4.2.0" - bin: - parcel: lib/bin.js - checksum: 10/a1bf63f6ecef5076dffca26568033792e2bf1116704275c4d682828f6083550a39d8ffb20e3962713d58b4d440b9981437e2ae56db62ef5808a43035ba6445ee - languageName: node - linkType: hard - -"parcel@npm:^2.12.0": - version: 2.12.0 - resolution: "parcel@npm:2.12.0" - dependencies: - "@parcel/config-default": "npm:2.12.0" - "@parcel/core": "npm:2.12.0" - "@parcel/diagnostic": "npm:2.12.0" - "@parcel/events": "npm:2.12.0" - "@parcel/fs": "npm:2.12.0" - "@parcel/logger": "npm:2.12.0" - "@parcel/package-manager": "npm:2.12.0" - "@parcel/reporter-cli": "npm:2.12.0" - "@parcel/reporter-dev-server": "npm:2.12.0" - "@parcel/reporter-tracer": "npm:2.12.0" - "@parcel/utils": "npm:2.12.0" - chalk: "npm:^4.1.0" - commander: "npm:^7.0.0" - get-port: "npm:^4.2.0" - bin: - parcel: lib/bin.js - checksum: 10/cd2a831107df536007d8b0100aba24da22fcebe00b432bd704398ba04c5ffb53b76dd455cb059991f97e5fa48101431030f4f5907d065cf42d40654564e2d683 - languageName: node - linkType: hard - "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -28896,43 +26479,6 @@ __metadata: languageName: node linkType: hard -"posthtml-parser@npm:^0.10.1": - version: 0.10.2 - resolution: "posthtml-parser@npm:0.10.2" - dependencies: - htmlparser2: "npm:^7.1.1" - checksum: 10/2298b4e04bbd3efa0227e8cd0917680ac0f3f11bac4e53848be8fcf5f73d10704f171c593b1e1cbc09b1ef01e6f1c7f5d8592577be2100f23fd0b3f96a48f606 - languageName: node - linkType: hard - -"posthtml-parser@npm:^0.11.0": - version: 0.11.0 - resolution: "posthtml-parser@npm:0.11.0" - dependencies: - htmlparser2: "npm:^7.1.1" - checksum: 10/7a26e975b5e69ae0dcb900f2212aa2df2e1215a5aee13d5876217b7f2a6abf7c6535f10643e439d9afb404d8c6869cd51a9f8164fe7dca5d6435a60757a96217 - languageName: node - linkType: hard - -"posthtml-render@npm:^3.0.0": - version: 3.0.0 - resolution: "posthtml-render@npm:3.0.0" - dependencies: - is-json: "npm:^2.0.1" - checksum: 10/ca73e98b9d62c89eaa892b675643d4135431bcb5b1c5c00cb21802f875fd5c5caee208aa0ecdc1d803239ec3088a8138be416470eeb0b02f1f424cf90f20a8eb - languageName: node - linkType: hard - -"posthtml@npm:^0.16.4, posthtml@npm:^0.16.5": - version: 0.16.6 - resolution: "posthtml@npm:0.16.6" - dependencies: - posthtml-parser: "npm:^0.11.0" - posthtml-render: "npm:^3.0.0" - checksum: 10/e1ce9cda9b9fea0e1ddaccf13c945ca7e1bae2c6f54d34b2d0c9ed5b4b55d456684732257fc85113291807e99fcea585ad959acedca2de94d0744a84e15b31fb - languageName: node - linkType: hard - "potpack@npm:^2.0.0": version: 2.0.0 resolution: "potpack@npm:2.0.0" @@ -28983,7 +26529,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.0.5, prettier@npm:^2.7.1": +"prettier@npm:^2.7.1": version: 2.8.8 resolution: "prettier@npm:2.8.8" bin: @@ -29823,13 +27369,6 @@ __metadata: languageName: node linkType: hard -"react-error-overlay@npm:6.0.9": - version: 6.0.9 - resolution: "react-error-overlay@npm:6.0.9" - checksum: 10/754c4699340e18064cc3299423dbb58560d3d3e127a5da9858d95c4656561402eb674904619d5407ee2c01743b17260b87f15f89d7816f2c74ba08d6a71b80f9 - languageName: node - linkType: hard - "react-fast-compare@npm:^3.0.1": version: 3.2.2 resolution: "react-fast-compare@npm:3.2.2" @@ -30157,13 +27696,6 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.9.0": - version: 0.9.0 - resolution: "react-refresh@npm:0.9.0" - checksum: 10/618612e6e7165e0551ac7a78dd86d5bf12eaf04f5b95aba667476460f206609c6031925706d1d8663da68642cec6d63e229fb77588b86a4102e13d4226569e62 - languageName: node - linkType: hard - "react-remove-scroll-bar@npm:^2.3.4": version: 2.3.4 resolution: "react-remove-scroll-bar@npm:2.3.4" @@ -30914,13 +28446,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.13.7": - version: 0.13.11 - resolution: "regenerator-runtime@npm:0.13.11" - checksum: 10/d493e9e118abef5b099c78170834f18540c4933cedf9bfabc32d3af94abfb59a7907bd7950259cbab0a929ebca7db77301e8024e5121e6482a82f78283dfd20c - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.14.0": version: 0.14.0 resolution: "regenerator-runtime@npm:0.14.0" @@ -32387,7 +29912,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": +"semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: @@ -33113,13 +30638,6 @@ __metadata: languageName: node linkType: hard -"srcset@npm:4": - version: 4.0.0 - resolution: "srcset@npm:4.0.0" - checksum: 10/903c951fbf7afb9a73bb5356f2e7c714e67d03f9dd48dccf63da2a70b108f7ba07b944d529eeed56a36c8dd194d979ef92fe75e798611a575a41cf730be582aa - languageName: node - linkType: hard - "sshpk@npm:^1.7.0": version: 1.17.0 resolution: "sshpk@npm:1.17.0" @@ -33904,7 +31422,7 @@ __metadata: languageName: node linkType: hard -"svgo@npm:^2.4.0, svgo@npm:^2.7.0": +"svgo@npm:^2.7.0": version: 2.8.0 resolution: "svgo@npm:2.8.0" dependencies: @@ -34100,13 +31618,6 @@ __metadata: languageName: node linkType: hard -"term-size@npm:^2.2.1": - version: 2.2.1 - resolution: "term-size@npm:2.2.1" - checksum: 10/f96aca2d4139c91e3359f5949ffb86f0a58f8c254ab7fe4a64b65126974939c782db6aaa91bf51a56d0344e505e22f9a0186f2f689e23ac9382b54606603c537 - languageName: node - linkType: hard - "terminal-link@npm:^2.0.0": version: 2.1.1 resolution: "terminal-link@npm:2.1.1" @@ -35149,7 +32660,7 @@ __metadata: languageName: node linkType: hard -"underscore@npm:^1.13.1": +"underscore@npm:^1.13.1, underscore@npm:^1.13.7": version: 1.13.7 resolution: "underscore@npm:1.13.7" checksum: 10/1ce3368dbe73d1e99678fa5d341a9682bd27316032ad2de7883901918f0f5d50e80320ccc543f53c1862ab057a818abc560462b5f83578afe2dd8dd7f779766c @@ -35629,7 +33140,7 @@ __metadata: languageName: node linkType: hard -"use-resize-observer@npm:^9.1.0": +"use-resize-observer@npm:^9.0.0, use-resize-observer@npm:^9.1.0": version: 9.1.0 resolution: "use-resize-observer@npm:9.1.0" dependencies: @@ -35730,13 +33241,6 @@ __metadata: languageName: node linkType: hard -"utility-types@npm:^3.10.0": - version: 3.10.0 - resolution: "utility-types@npm:3.10.0" - checksum: 10/3ca80abfb9482b8f924110b643411d6a8c6bf84049e76212652fb46ccc9085c635485dd0351b63a8da6cf2cffbef32cc27d16e924dc7ad445881a481632b3da0 - languageName: node - linkType: hard - "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -36149,49 +33653,6 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.4.8": - version: 5.4.10 - resolution: "vite@npm:5.4.10" - dependencies: - esbuild: "npm:^0.21.3" - fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.43" - rollup: "npm:^4.20.0" - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - bin: - vite: bin/vite.js - checksum: 10/5d4a427d585d6f9114fc383114f707dca46408f54b221709e5eb6b0c16e0b4dec4baf908a7db9a8f1e5b16e64b655900ac14629abe61c698cbe296115c65ed8a - languageName: node - linkType: hard - "vitest@npm:^1.6.0": version: 1.6.0 resolution: "vitest@npm:1.6.0" @@ -36324,13 +33785,6 @@ __metadata: languageName: node linkType: hard -"weak-lru-cache@npm:^1.2.2": - version: 1.2.2 - resolution: "weak-lru-cache@npm:1.2.2" - checksum: 10/441f86236d34b9750ccf2bae1658cc62b49e805b740b3f3bf4b1d78e8cac50b6c05d31791f3f5bbf00f3b544834ae20c0f5a374efc833b7ba2a11dd8af37a790 - languageName: node - linkType: hard - "weakmap@npm:0.0.6": version: 0.0.6 resolution: "weakmap@npm:0.0.6" @@ -36979,13 +34433,6 @@ __metadata: languageName: node linkType: hard -"xxhash-wasm@npm:^0.4.2": - version: 0.4.2 - resolution: "xxhash-wasm@npm:0.4.2" - checksum: 10/6a54f2501181c82aa0cb9f91c8f9ce357283457887da00ff1c411da95ceb8890c20ec1449baaa946687db46c51ddcc4b737c6f7509dcb8c9b48b63841b6cb557 - languageName: node - linkType: hard - "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -37223,6 +34670,27 @@ __metadata: languageName: node linkType: hard +"zustand@npm:^5.0.2": + version: 5.0.2 + resolution: "zustand@npm:5.0.2" + peerDependencies: + "@types/react": ">=18.0.0" + immer: ">=9.0.6" + react: ">=18.0.0" + use-sync-external-store: ">=1.2.0" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + checksum: 10/9fb60796b9770dcc3f78dd794e7f424ff735e5676784cbc9726761037613942b62470b24a9ca9e98534ee4369a3b5429be570ff34281cb3c9d6d4e8df559ec3f + languageName: node + linkType: hard + "zwitch@npm:^1.0.0": version: 1.0.5 resolution: "zwitch@npm:1.0.5"