diff --git a/app/components/AdditionalLinkList/index.tsx b/app/components/AdditionalLinkList/index.tsx index 3ef20ac..7e51b03 100644 --- a/app/components/AdditionalLinkList/index.tsx +++ b/app/components/AdditionalLinkList/index.tsx @@ -63,7 +63,7 @@ function AdditionalLinkList({ linkType }: LinkListProps) { }, }); - const items = data?.publicLinks?.results ?? []; + const links = data?.publicLinks?.results ?? []; return ( )} + empty={links.length === 0} + emptyMessage={`No ${linkType.toLowerCase()} links found.`} > - {items.map((item) => ( + {links.map((link) => ( - {item.url} + {link.url} ))} diff --git a/app/components/DocumentList/index.tsx b/app/components/DocumentList/index.tsx index 86a6299..03475c2 100644 --- a/app/components/DocumentList/index.tsx +++ b/app/components/DocumentList/index.tsx @@ -68,6 +68,7 @@ function DocumentList(props: Props) { } + title="Preview not available" + description={`This file type cannot be previewed. ${isAuthenticated ? 'Please download the file to view it.' : ''}`} + /> + ); +} + +const viewerConfig: IConfig = { + header: { + disableHeader: true, + disableFileName: true, + }, + pdfVerticalScrollByDefault: true, + noRenderer: { + overrideComponent: NoRendererMessage, + }, +}; + +interface DocumentViewerProps { + fileUrl: string; + fileName?: string; +} + +function DocumentViewer({ + fileUrl, + fileName, +}: DocumentViewerProps) { + const documents = useMemo( + () => [{ uri: fileUrl, fileName }], + [fileUrl, fileName], + ); + return ( +
+ +
+ ); +} + +export default DocumentViewer; diff --git a/app/components/DocumentViewer/styles.module.css b/app/components/DocumentViewer/styles.module.css new file mode 100644 index 0000000..98e4957 --- /dev/null +++ b/app/components/DocumentViewer/styles.module.css @@ -0,0 +1,25 @@ + + +/* The pdf renderer's own floating bottom toolbar, pagination bar, and per-page page-number overlay */ +:global(#pdf-controls), +:global(#pdf-pagination), +:global(#pdf-page-info) { + display: none; +} + +/* + * docx/doc/xls/ppt files render through an iframe to the MS Office Online + * viewer. Its parent has no defined height, so its own `height: 100%` falls + * back to the ~150px iframe default, forcing the office viewer to scroll + * internally. Give it a tall, explicit height so the full document renders + * and the outer page scrolls instead. + */ +:global(#msdoc-renderer), +:global(#msdoc-iframe) { + height: 112vh; +} + +.no-renderer-message { + aspect-ratio: 5 / 3; + color: var(--go-ui-color-text-light); +} \ No newline at end of file diff --git a/app/components/PdfViewer/index.tsx b/app/components/PdfViewer/index.tsx deleted file mode 100644 index bcdf7c4..0000000 --- a/app/components/PdfViewer/index.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import 'react-pdf/dist/Page/AnnotationLayer.css'; -import 'react-pdf/dist/Page/TextLayer.css'; - -import { - useCallback, - useState, -} from 'react'; -import { - Document, - Page as PdfPage, - pdfjs, -} from 'react-pdf'; - -pdfjs.GlobalWorkerOptions.workerSrc = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`; - -interface PdfViewerProps { - file: string; - loadingMessage?: React.ReactNode; - errorMessage?: React.ReactNode; -} - -function PdfViewer({ - file, - loadingMessage =

Loading PDF…

, - errorMessage =

Failed to load PDF.

, -}: PdfViewerProps) { - const [numPages, setNumPages] = useState(0); - const [loadedPages, setLoadedPages] = useState(0); - const [containerWidth, setContainerWidth] = useState(); - - const allPagesLoaded = numPages > 0 && loadedPages === numPages; - const onContainerRef = useCallback((node: HTMLDivElement | null): void => { - if (node) { - setContainerWidth(node.getBoundingClientRect().width); - } - }, []); - - const onDocumentLoadSuccess = useCallback( - ({ numPages: nextNumPages }: { numPages: number }): void => { - setNumPages(nextNumPages); - }, - [], - ); - - const onPageLoadSuccess = useCallback((): void => { - setLoadedPages((prev) => prev + 1); - }, []); - return ( -
- {!allPagesLoaded && loadingMessage} -
- - {Array.from({ length: numPages }, (_, index) => ( - - ))} - -
-
- ); -} - -export default PdfViewer; diff --git a/app/components/PowerBiEmbed/index.tsx b/app/components/PowerBiEmbed/index.tsx index d8c0877..7d127b8 100644 --- a/app/components/PowerBiEmbed/index.tsx +++ b/app/components/PowerBiEmbed/index.tsx @@ -1,4 +1,8 @@ -/* eslint-disable no-console */ +import { + useMemo, + useState, +} from 'react'; +import { isFalsyString } from '@togglecorp/fujs'; import type { IReportEmbedConfiguration } from 'powerbi-client'; import { models } from 'powerbi-client'; import { PowerBIEmbed as PowerBI } from 'powerbi-client-react'; @@ -6,10 +10,44 @@ import type { ICustomEvent } from 'service'; import styles from './styles.module.css'; -function PowerBIEmbed({ embedUrl }: { embedUrl: string }) { - const embedConfig: IReportEmbedConfiguration = { +const VALID_EMBED_HOSTNAME_SUFFIXES = [ + 'powerbi.com', + 'powerbigov.us', + 'powerbi.cn', +]; + +function isValidEmbedUrl(embedUrl: string) { + if (isFalsyString(embedUrl)) { + return false; + } + + try { + const parsed = new URL(embedUrl); + return parsed.protocol === 'https:' + && VALID_EMBED_HOSTNAME_SUFFIXES.some( + (suffix) => parsed.hostname === suffix || parsed.hostname.endsWith(`.${suffix}`), + ); + } catch { + return false; + } +} + +interface Props { + embedUrl: string; +} + +function PowerBIEmbed(props: Props) { + const { embedUrl } = props; + + // Stores the last embedUrl that failed to load, so that passing in a + // different (or corrected) url is treated as a fresh attempt. + const [erroredUrl, setErroredUrl] = useState(); + + const embedConfig: IReportEmbedConfiguration = useMemo(() => ({ type: 'report', embedUrl, + // id/accessToken are unused for this public, token-less embed flow, + // but the type requires the keys to be present. id: undefined, accessToken: undefined, tokenType: models.TokenType.Embed, @@ -23,19 +61,36 @@ function PowerBIEmbed({ embedUrl }: { embedUrl: string }) { }, navContentPaneEnabled: true, }, - }; + }), [embedUrl]); + + const eventHandlers = useMemo(() => new Map([ + // powerbi-client-react expects a Map of PowerBI event names to + // handlers; 'error' is the only one we currently need. + ['error', (event?: ICustomEvent) => { + // eslint-disable-next-line no-console + console.error('PowerBI embed error:', event?.detail); + setErroredUrl(embedUrl); + }], + ]), [embedUrl]); + + // Comparing against embedUrl (rather than a plain boolean) lets a new/corrected + // url reset the error state automatically, without a useEffect. + const hasPreviouslyErrored = erroredUrl === embedUrl; + const canEmbed = isValidEmbedUrl(embedUrl) && !hasPreviouslyErrored; + + if (!canEmbed) { + return ( +
+ Unable to load this dashboard. The embed link is missing or invalid. +
+ ); + } return ( console.log('Report loaded')], - ['rendered', () => console.log('Report rendered')], - ['error', (event?: ICustomEvent) => console.error('Error:', event?.detail)], - ]) - } + eventHandlers={eventHandlers} /> ); } diff --git a/app/components/PowerBiEmbed/styles.module.css b/app/components/PowerBiEmbed/styles.module.css index 34c3e71..39c06f1 100644 --- a/app/components/PowerBiEmbed/styles.module.css +++ b/app/components/PowerBiEmbed/styles.module.css @@ -5,3 +5,14 @@ border: none; } } + +.embed-error { + display: flex; + align-items: center; + justify-content: center; + aspect-ratio: 5 / 3; + background-color: var(--go-ui-color-background); + padding: 1rem; + text-align: center; + color: var(--go-ui-color-text-light); +} diff --git a/app/components/ReportCard/index.tsx b/app/components/ReportCard/index.tsx index e194fef..c49e817 100644 --- a/app/components/ReportCard/index.tsx +++ b/app/components/ReportCard/index.tsx @@ -77,6 +77,7 @@ function ReportCard({ report }: ReportCardProps) { {description} diff --git a/app/components/ReportCard/styles.module.css b/app/components/ReportCard/styles.module.css index 11aad45..f635204 100644 --- a/app/components/ReportCard/styles.module.css +++ b/app/components/ReportCard/styles.module.css @@ -14,3 +14,12 @@ } } +.description { + display: -webkit-box; + overflow: hidden; + line-height: var(--go-ui-line-height-md); + -webkit-box-orient: vertical; + -webkit-line-clamp: 5; + line-clamp: 5; +} + diff --git a/app/views/CapacityAndResources/CapacityAndResourcesDetails/index.tsx b/app/views/CapacityAndResources/CapacityAndResourcesDetails/index.tsx index a1059fd..5af55e1 100644 --- a/app/views/CapacityAndResources/CapacityAndResourcesDetails/index.tsx +++ b/app/views/CapacityAndResources/CapacityAndResourcesDetails/index.tsx @@ -1,61 +1,99 @@ +import { useState } from 'react'; import { useParams } from 'react-router'; import { Container, ListView, } from '@ifrc-go/ui'; +import { isDefined } from '@togglecorp/fujs'; import { gql } from 'urql'; import Page from '#components/Page'; import PowerBIEmbed from '#components/PowerBiEmbed'; -import { useCapacityAndResourceQuery } from '#generated/types/graphql'; +import RegionSelectInput from '#components/RegionSelectInput'; +import { useCapacityAndResourcesAndDashboardsQuery } from '#generated/types/graphql'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -const CAPACITY_AND_RESOURCES_DETAIL_QUERY = gql` - query CapacityAndResource( +const CAPACITY_AND_RESOURCES_AND_DASHBOARDS_QUERY = gql` + query CapacityAndResourcesAndDashboards( $id: ID! + $pagination: OffsetPaginationInput + $filters: ExternalDashboardFilter ) { capacityAndResource(id: $id) { - title id + title description - dashboards { - url - id + } + + externalDashboards( + filters: $filters + pagination: $pagination + ) { + results { title + updatedAt + order + id + isActive + createdAt description + page + regionId + showOnHome + pageDisplay + url } + totalCount } } `; export default function CapacityAndResourcesDetails() { - const { id } = useParams<{ id: string }>(); + const { id: capacityAndResourceId } = useParams<{ id: string }>(); + const [regionId, setRegionId] = useState(undefined); - const [{ data, fetching: pending }] = useCapacityAndResourceQuery({ - variables: { id: id! }, - pause: !id, + const [{ data, fetching: pending }] = useCapacityAndResourcesAndDashboardsQuery({ + variables: { + id: capacityAndResourceId ?? '', + filters: { + regions: isDefined(regionId) ? [regionId] : null, + capacityAndResources: isDefined(capacityAndResourceId) + ? [capacityAndResourceId] : null, + isActive: true, + }, + }, + pause: !capacityAndResourceId, }); const resourceData = data?.capacityAndResource; + const dashboards = data?.externalDashboards.results; return ( + )} > - {resourceData?.dashboards && resourceData?.dashboards.map((items) => ( + {dashboards?.map((dashboard) => ( ))} - diff --git a/app/views/CapacityAndResources/index.tsx b/app/views/CapacityAndResources/index.tsx index 64c5a78..e34514b 100644 --- a/app/views/CapacityAndResources/index.tsx +++ b/app/views/CapacityAndResources/index.tsx @@ -1,4 +1,3 @@ -import { useState } from 'react'; import { SearchLineIcon } from '@ifrc-go/icons'; import { Container, @@ -14,7 +13,6 @@ import { gql } from 'urql'; import Link from '#components/Link'; import Page from '#components/Page'; -import RegionSelectInput from '#components/RegionSelectInput'; import { type CapacityAndResourcesQuery, useCapacityAndResourcesQuery, @@ -56,8 +54,6 @@ function ResourcesActions({ id }: {id: string}) { } function CapacityAndResourcesList() { - const [regionId, setRegionId] = useState(undefined); - const { limit, page, @@ -76,7 +72,6 @@ function CapacityAndResourcesList() { const [{ data, fetching }] = useCapacityAndResourcesQuery({ variables: { filters: { - regions: regionId ? [regionId] : null, isActive: true, title: { iContains: filter.searchText, @@ -112,13 +107,6 @@ function CapacityAndResourcesList() { ]; return ( - )} heading="Capacity and Resources" description="Monitor and allocate capacity and resources effectively to support humanitarian operations and response efforts." > diff --git a/app/views/DataAndReport/AIsummary/index.tsx b/app/views/DataAndReport/AIsummary/index.tsx index 0b3e3cc..b741e6b 100644 --- a/app/views/DataAndReport/AIsummary/index.tsx +++ b/app/views/DataAndReport/AIsummary/index.tsx @@ -1,42 +1,125 @@ -import { StarLineIcon } from '@ifrc-go/icons'; import { + useEffect, + useRef, + useState, +} from 'react'; +import { + CheckLineIcon, + CopyLineIcon, + MagicLineIcon, +} from '@ifrc-go/icons'; +import { + Button, Container, Description, Heading, + InlineLayout, InlineView, ListView, } from '@ifrc-go/ui'; +import { isTruthyString } from '@togglecorp/fujs'; import styles from './styles.module.css'; -interface AISummaryProps { - loading? : boolean, - summary: string +const pendingMessage = ( + + The AI summary is being generated and may take some time, especially for larger + reports. Feel free to come back and check again later + + {Array.from({ length: 5 }, (_, index) => ( + + . + + ))} + + +); + +const COPIED_FEEDBACK_DURATION = 2000; + +interface Props { + loading?: boolean; + summary: string; } -function AIsummary(props: AISummaryProps) { +function AIsummary(props: Props) { + const copiedTimeoutRef = useRef(undefined); const { loading, summary } = props; + + const hasSummary = isTruthyString(summary); + + const [copied, setCopied] = useState(false); + + const handleCopyClick = () => { + navigator.clipboard.writeText(summary).then(() => { + setCopied(true); + window.clearTimeout(copiedTimeoutRef.current); + copiedTimeoutRef.current = window.setTimeout(() => { + setCopied(false); + }, COPIED_FEEDBACK_DURATION); + }); + }; + + useEffect(() => () => { + window.clearTimeout(copiedTimeoutRef.current); + }, []); + return ( } - spacing="sm" + before={( + + + + )} + spacing="xs" contentAlignment="center" + className={styles.heading} > - AI Summary + AI Summary + {copied ? : } + + )} + /> + )} > - + {summary} diff --git a/app/views/DataAndReport/AIsummary/styles.module.css b/app/views/DataAndReport/AIsummary/styles.module.css index 9f13084..627f331 100644 --- a/app/views/DataAndReport/AIsummary/styles.module.css +++ b/app/views/DataAndReport/AIsummary/styles.module.css @@ -1,12 +1,67 @@ .ai-summary { - background: var(--go-ui-color-primary-red) ; - padding-top: var(--go-ui-spacing-4xl) !important; - height: 100%; + border-radius: 18px; + max-height: calc(100vh - 2 * var(--go-ui-spacing-sm)); + overflow: hidden; + + .heading { + border-bottom: var(--go-ui-width-separator-thin) solid var(--go-ui-color-separator); + padding: var(--go-ui-spacing-xs) 0; + } +} + +.ai-icon { + transform-origin: center; + animation: sparkle 2.4s ease-in-out infinite; +} + +@keyframes sparkle { + 0%, + 100% { + transform: scale(1) rotate(0deg); + opacity: 1; + } + + 50% { + transform: scale(0.85) rotate(-8deg); + opacity: 0.6; + } +} + +.summary-container { + min-height: 0; white-space: pre-line; - color: var(--go-ui-color-white); +} + +.summary-text { + line-height: 1.6; +} + +.pending-message { + .dots { + display: inline-block; + white-space: nowrap; + } + + .dot { + animation: blink 1.4s infinite both; + } +} + +@keyframes blink { + 0%, + 80%, + 100% { + opacity: 0; + } + + 40% { + opacity: 1; + } +} - .summary-container { - flex-grow: 1; - min-height: 0; +@media (prefers-reduced-motion: reduce) { + .dot { + opacity: 1; + animation: none; } -} \ No newline at end of file +} diff --git a/app/views/DataAndReport/ReportDetail/index.tsx b/app/views/DataAndReport/ReportDetail/index.tsx index 4498e83..82aa437 100644 --- a/app/views/DataAndReport/ReportDetail/index.tsx +++ b/app/views/DataAndReport/ReportDetail/index.tsx @@ -1,5 +1,14 @@ +import { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; import { useParams } from 'react-router'; +import { DownloadTwoFillIcon } from '@ifrc-go/icons'; import { + Button, Container, Description, Heading, @@ -11,9 +20,10 @@ import { encodeDate, isDefined, } from '@togglecorp/fujs'; +import { saveAs } from 'file-saver'; import { gql } from 'urql'; -import PdfViewer from '#components/PdfViewer'; +import DocumentViewer from '#components/DocumentViewer'; import PowerBIEmbed from '#components/PowerBiEmbed'; import { DocumentExtractionStatus, @@ -22,10 +32,14 @@ import { useReportQuery, useReportSummaryQuery, } from '#generated/types/graphql'; +import useAuth from '#hooks/useAuth'; import AIsummary from '#views/DataAndReport/AIsummary'; import styles from './styles.module.css'; +const SUMMARY_POLL_INTERVAL = 1000 * 60; +const MAX_SUMMARY_POLL_COUNT = 30; + // eslint-disable-next-line @typescript-eslint/no-unused-vars const REPORT_QUERY = gql` query Report($id: ID!) { @@ -51,12 +65,10 @@ const REPORT_QUERY = gql` // eslint-disable-next-line @typescript-eslint/no-unused-vars const REPORT_SUMMARY_QUERY = gql` query ReportSummary( - $pagination: OffsetPaginationInput, $filters: ReportSummaryFilter ) { reportSummaries( filters: $filters - pagination: $pagination ) { totalCount results { @@ -67,40 +79,86 @@ const REPORT_SUMMARY_QUERY = gql` status } totalCount - pageInfo { - offset - limit - } } } `; -function ReportDetail() { - const { id } = useParams<{ id: string }>(); +interface Props { + id: string | undefined; +} + +function ReportDetailContent(props: Props) { + const { id: reportId } = props; + const { isAuthenticated } = useAuth(); + const summaryPollCountRef = useRef(0); + const [summaryPollTimedOut, setSummaryPollTimedOut] = useState(false); const [{ fetching, data }] = useReportQuery({ - variables: { id: id! }, - pause: !id, + variables: { id: reportId! }, + pause: !reportId, }); const reportData = data?.report; - const [{ fetching: summaryLoading, data: summaryData }] = useReportSummaryQuery({ + const [ + { fetching: summaryLoading, data: summaryData }, + refetchSummary, + ] = useReportSummaryQuery({ variables: { filters: { - report: id, - status: DocumentExtractionStatus.Success, + report: reportId, chunkType: ExtractionType.DocumentSummary, }, }, - pause: !id || !reportData || reportData.contentType === ReportContentType.Iframe, + pause: !reportId || !reportData || reportData.contentType === ReportContentType.Iframe, }); - const aiSummary = summaryData?.reportSummaries.results - .map((summary) => summary.text) - .join('\n \n'); + const summaryResults = useMemo( + () => summaryData?.reportSummaries.results ?? [], + [summaryData?.reportSummaries.results], + ); + const summaryStatus = summaryResults[0]?.status; + + const aiSummary = summaryResults + ?.map((summary) => summary.text) + .join('\n \n') ?? ''; + + const showAiSummary = reportData?.contentType === ReportContentType.File + && (summaryResults?.length ?? 0) > 0 + && summaryStatus !== DocumentExtractionStatus.Failure + && !summaryPollTimedOut; + + const publishedDate = isDefined(reportData?.publishedAt) + ? encodeDate(new Date(reportData?.publishedAt)) + : '-'; + + const fileUrl = reportData?.file?.url ?? ''; + const fileName = reportData?.file?.name; + + const handleDownloadClick = useCallback(() => { + saveAs(fileUrl, fileName ?? fileUrl.split('/').pop()); + }, [fileUrl, fileName]); + + useEffect(() => { + if ( + summaryResults.length === 0 + || summaryStatus === DocumentExtractionStatus.Success + || summaryStatus === DocumentExtractionStatus.Failure + || summaryPollTimedOut + ) { + return undefined; + } + + const timeout = window.setTimeout(() => { + if (summaryPollCountRef.current >= MAX_SUMMARY_POLL_COUNT) { + setSummaryPollTimedOut(true); + return; + } + summaryPollCountRef.current += 1; + refetchSummary({ requestPolicy: 'network-only' }); + }, SUMMARY_POLL_INTERVAL); - const publishedDate = new Date(reportData?.publishedAt); - const encodedPublishedDate = reportData?.publishedAt ? encodeDate(publishedDate) : '-'; + return () => window.clearTimeout(timeout); + }, [summaryResults, summaryStatus, summaryPollTimedOut, refetchSummary]); return ( - {encodedPublishedDate} + {publishedDate} )} @@ -156,29 +213,47 @@ function ReportDetail() { layout="block" spacing="xs" > - - {reportData?.title} - + + + {reportData?.title} + + {isAuthenticated && ( + + )} + {reportData?.description} - {isDefined(reportData?.file?.url) - ? + {isDefined(fileUrl) + ? ( + + ) : ( - ) } + )} - {aiSummary && ( + {showAiSummary && (
@@ -190,4 +265,15 @@ function ReportDetail() { ); } +function ReportDetail() { + const { id } = useParams<{ id: string }>(); + + return ( + + ); +} + export default ReportDetail; diff --git a/app/views/DataAndReport/ReportDetail/styles.module.css b/app/views/DataAndReport/ReportDetail/styles.module.css index 09fbca7..33ed39e 100644 --- a/app/views/DataAndReport/ReportDetail/styles.module.css +++ b/app/views/DataAndReport/ReportDetail/styles.module.css @@ -13,5 +13,7 @@ .sticky-details { position: sticky; top: 0; + padding-top: var(--go-ui-spacing-md); + padding-bottom: var(--go-ui-spacing-md); height: 100vh; } diff --git a/backend b/backend index 62f92ee..cca87cb 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 62f92ee515fb2ca80c0c3f661a092ba68c9a9f7d +Subproject commit cca87cbf1b50ad0436a34efe48e74a3cb17a01b3 diff --git a/package.json b/package.json index 9075c35..2bf2f8f 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "typecheck": "tsc" }, "dependencies": { + "@cyntler/react-doc-viewer": "^1.17.1", "@graphql-codegen/cli": "^6.2.1", "@graphql-eslint/eslint-plugin": "^4.4.0", "@ifrc-go/icons": "^2.0.1", @@ -43,7 +44,6 @@ "react": "^19.2.4", "react-cookie": "^8.1.0", "react-dom": "^19.2.4", - "react-pdf": "^10.4.1", "react-router": "^7.14.0", "urql": "^5.0.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e44fec3..e5bf4df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@cyntler/react-doc-viewer': + specifier: ^1.17.1 + version: 1.17.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@graphql-codegen/cli': specifier: ^6.2.1 version: 6.2.1(@types/node@24.12.2)(graphql@16.13.2)(typescript@6.0.2) @@ -83,9 +86,6 @@ importers: react-dom: specifier: ^19.2.4 version: 19.2.4(react@19.2.4) - react-pdf: - specifier: ^10.4.1 - version: 10.4.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-router: specifier: ^7.14.0 version: 7.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -671,6 +671,12 @@ packages: peerDependencies: postcss: ^8.4 + '@cyntler/react-doc-viewer@1.17.1': + resolution: {integrity: sha512-KaH2iuwBP0PiLKu+tiTfq46AadiCdaUQALExAomxkR9TpNaDipTs0HDTneW/oDrnX5bJkb1FhshL/gro8+Q2kg==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} @@ -680,6 +686,12 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@envelop/core@5.5.1': resolution: {integrity: sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==} engines: {node: '>=18.0.0'} @@ -1239,76 +1251,6 @@ packages: resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} engines: {node: '>=6.0.0'} - '@napi-rs/canvas-android-arm64@0.1.100': - resolution: {integrity: sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/canvas-darwin-arm64@0.1.100': - resolution: {integrity: sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/canvas-darwin-x64@0.1.100': - resolution: {integrity: sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': - resolution: {integrity: sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/canvas-linux-arm64-gnu@0.1.100': - resolution: {integrity: sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/canvas-linux-arm64-musl@0.1.100': - resolution: {integrity: sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': - resolution: {integrity: sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - - '@napi-rs/canvas-linux-x64-gnu@0.1.100': - resolution: {integrity: sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/canvas-linux-x64-musl@0.1.100': - resolution: {integrity: sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/canvas-win32-arm64-msvc@0.1.100': - resolution: {integrity: sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/canvas-win32-x64-msvc@0.1.100': - resolution: {integrity: sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/canvas@0.1.100': - resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==} - engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1911,6 +1853,9 @@ packages: '@types/mapbox-gl@1.13.10': resolution: {integrity: sha512-0oUy5d5nT3L480MRviAnaBUEXuWCG/7M4ZQo0n8eJ/LLMgJ0nMbjv7M+qoPl4TAj6yVVWKTvkukXvW9QHH1GVw==} + '@types/mustache@4.2.6': + resolution: {integrity: sha512-t+8/QWTAhOFlrF1IVZqKnMRJi84EgkIK5Kh0p2JV4OLywUvCwJPFxbJAl7XAow7DVIHsF+xW9f1MVzg0L6Szjw==} + '@types/node@24.12.2': resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} @@ -2157,6 +2102,9 @@ packages: ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@7.2.4: + resolution: {integrity: sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==} + ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} @@ -2317,6 +2265,9 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.16: resolution: {integrity: sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==} engines: {node: '>=6.0.0'} @@ -2325,6 +2276,9 @@ packages: bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + brace-expansion@1.1.13: resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} @@ -2347,6 +2301,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + cacheable@2.3.4: resolution: {integrity: sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==} @@ -2380,6 +2337,10 @@ packages: caniuse-lite@1.0.30001786: resolution: {integrity: sha512-4oxTZEvqmLLrERwxO76yfKM7acZo310U+v4kqexI2TL1DkkUEMT8UijrxxcnVdxR3qkVf5awGRX+4Z6aPHVKrA==} + canvas@3.2.3: + resolution: {integrity: sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw==} + engines: {node: ^18.12.0 || >= 20.9.0} + capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -2413,6 +2374,9 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + cli-boxes@4.0.1: resolution: {integrity: sha512-5IOn+jcCEHEraYolBPs/sT4BxYCe2nHg374OPiItB1O96KZFseS2gthU4twyYzeDcFew4DaUM/xwc5BQf08JJw==} engines: {node: '>=18.20 <19 || >=20.10'} @@ -2519,6 +2483,9 @@ packages: core-js-pure@3.49.0: resolution: {integrity: sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==} + core-js@3.49.0: + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} + core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -2658,6 +2625,14 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2771,6 +2746,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3014,6 +2992,10 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -3131,6 +3113,9 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-exists-sync@0.1.0: resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} engines: {node: '>=0.10.0'} @@ -3198,6 +3183,9 @@ packages: getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + gl-matrix@3.4.4: resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} @@ -3894,11 +3882,11 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - make-cancellable-promise@2.0.0: - resolution: {integrity: sha512-3SEQqTpV9oqVsIWqAcmDuaNeo7yBO3tqPtqGRcKkEo0lrzD3wqbKG9mkxO65KoOgXqj+zH2phJ2LiAsdzlogSw==} + make-cancellable-promise@1.3.2: + resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} - make-event-props@2.0.0: - resolution: {integrity: sha512-G/hncXrl4Qt7mauJEXSg3AcdYzmpkIITTNl5I+rH9sog5Yw0kK6vseJjCaPfOXqOqQuPUP89Rkhfz5kPS8ijtw==} + make-event-props@1.6.2: + resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} @@ -3922,8 +3910,8 @@ packages: resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} engines: {node: '>=20'} - merge-refs@2.0.0: - resolution: {integrity: sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg==} + merge-refs@1.3.0: + resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: @@ -3963,6 +3951,10 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -3977,6 +3969,9 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -3990,6 +3985,10 @@ packages: murmurhash-js@1.0.0: resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + mute-stream@0.0.7: resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} @@ -4002,6 +4001,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + napi-postinstall@0.3.4: resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -4013,6 +4015,13 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@3.94.0: + resolution: {integrity: sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==} + engines: {node: '>=10'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -4215,6 +4224,10 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path2d@0.2.2: + resolution: {integrity: sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==} + engines: {node: '>=6'} + pattern-key-compare@1.0.0: resolution: {integrity: sha512-7wi8a7OFmdx4Hx31+KY9kcD7gO+MWWupXtlAx7ANqoE8Pypl501FsDAPX2tSYLOuafED82A0Mv3lzeNfn82Jlg==} @@ -4222,9 +4235,9 @@ packages: resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} hasBin: true - pdfjs-dist@5.4.296: - resolution: {integrity: sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==} - engines: {node: '>=20.16.0 || >=22.3.0'} + pdfjs-dist@4.8.69: + resolution: {integrity: sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==} + engines: {node: '>=18'} performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -4476,6 +4489,12 @@ packages: powerbi-router@0.1.5: resolution: {integrity: sha512-DFJCKxwh/DqMZXtHSo6xZl87mbRviZGn4P7Oi2rT0L4HMI4AjnWIrwg0JCSM7ymBzYnNe5UmrsCaf2Upur5RQA==} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. + hasBin: true + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -4505,6 +4524,9 @@ packages: psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -4526,6 +4548,10 @@ packages: quickselect@2.0.0: resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + react-clientside-effect@1.2.8: resolution: {integrity: sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==} peerDependencies: @@ -4563,8 +4589,8 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-pdf@10.4.1: - resolution: {integrity: sha512-kS/35staVCBqS29verTQJQZXw7RfsRCPO3fdJoW1KXylcv7A9dw6DZ3vJXC2w+bIBgLw5FN4pOFvKSQtkQhPfA==} + react-pdf@9.2.1: + resolution: {integrity: sha512-AJt0lAIkItWEZRA5d/mO+Om4nPCuTiQ0saA+qItO967DTjmGjnhmF+Bi2tL286mOTfBlF5CyLzJ35KTMaDoH+A==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4617,6 +4643,10 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -4839,6 +4869,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-git@3.36.0: resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} @@ -4949,6 +4985,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@4.0.0: resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} engines: {node: '>=4'} @@ -4969,6 +5008,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4980,6 +5023,22 @@ packages: style-search@0.1.0: resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + styled-components@6.4.3: + resolution: {integrity: sha512-wYXrhu+JmDjZ1Tv7O0OopGTfztbzun43Pjjhh2H+xc0h5A09dwpZ5FJbrifJDcL8g5TA9btpWOX2+iSRuJTExw==} + engines: {node: '>= 16'} + peerDependencies: + css-to-react-native: '>= 3.2.0' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-native: '>= 0.68.0' + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + stylelint-config-concentric@2.0.2: resolution: {integrity: sha512-R0d3GMB3FWyqNfhBlUiOXhOjzEzEbz2lBT/Kp8CMwbcB24rKtYB0Ot0jyIaCUqjjFcW05J2l3w2J9Oolwc9xyg==} peerDependencies: @@ -5020,6 +5079,9 @@ packages: engines: {node: '>=20.19.0'} hasBin: true + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + supercluster@7.1.5: resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==} @@ -5063,6 +5125,13 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + terminal-size@4.0.1: resolution: {integrity: sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==} engines: {node: '>=18'} @@ -6024,6 +6093,23 @@ snapshots: dependencies: postcss: 8.5.9 + '@cyntler/react-doc-viewer@1.17.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@types/mustache': 4.2.6 + '@types/papaparse': 5.5.2 + ajv: 7.2.4 + core-js: 3.49.0 + mustache: 4.2.0 + papaparse: 5.5.3 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-pdf: 9.2.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + styled-components: 6.4.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - '@types/react' + - css-to-react-native + - react-native + '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -6040,6 +6126,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + '@envelop/core@5.5.1': dependencies: '@envelop/instrumentation': 1.0.0 @@ -6772,54 +6864,6 @@ snapshots: '@mapbox/whoots-js@3.1.0': {} - '@napi-rs/canvas-android-arm64@0.1.100': - optional: true - - '@napi-rs/canvas-darwin-arm64@0.1.100': - optional: true - - '@napi-rs/canvas-darwin-x64@0.1.100': - optional: true - - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': - optional: true - - '@napi-rs/canvas-linux-arm64-gnu@0.1.100': - optional: true - - '@napi-rs/canvas-linux-arm64-musl@0.1.100': - optional: true - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': - optional: true - - '@napi-rs/canvas-linux-x64-gnu@0.1.100': - optional: true - - '@napi-rs/canvas-linux-x64-musl@0.1.100': - optional: true - - '@napi-rs/canvas-win32-arm64-msvc@0.1.100': - optional: true - - '@napi-rs/canvas-win32-x64-msvc@0.1.100': - optional: true - - '@napi-rs/canvas@0.1.100': - optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.100 - '@napi-rs/canvas-darwin-arm64': 0.1.100 - '@napi-rs/canvas-darwin-x64': 0.1.100 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.100 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.100 - '@napi-rs/canvas-linux-arm64-musl': 0.1.100 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.100 - '@napi-rs/canvas-linux-x64-gnu': 0.1.100 - '@napi-rs/canvas-linux-x64-musl': 0.1.100 - '@napi-rs/canvas-win32-arm64-msvc': 0.1.100 - '@napi-rs/canvas-win32-x64-msvc': 0.1.100 - optional: true - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.9.2 @@ -7356,6 +7400,8 @@ snapshots: dependencies: '@types/geojson': 7946.0.16 + '@types/mustache@4.2.6': {} + '@types/node@24.12.2': dependencies: undici-types: 7.16.0 @@ -7598,6 +7644,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@7.2.4: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -7761,12 +7814,22 @@ snapshots: balanced-match@4.0.4: {} + base64-js@1.5.1: + optional: true + baseline-browser-mapping@2.10.16: {} bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + brace-expansion@1.1.13: dependencies: balanced-match: 1.0.2 @@ -7794,6 +7857,12 @@ snapshots: node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + optional: true + cacheable@2.3.4: dependencies: '@cacheable/memory': 2.0.8 @@ -7832,6 +7901,12 @@ snapshots: caniuse-lite@1.0.30001786: {} + canvas@3.2.3: + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + optional: true + capital-case@1.0.4: dependencies: no-case: 3.0.4 @@ -7889,6 +7964,9 @@ snapshots: dependencies: readdirp: 4.1.2 + chownr@1.1.4: + optional: true + cli-boxes@4.0.1: {} cli-cursor@2.1.0: @@ -7980,6 +8058,8 @@ snapshots: core-js-pure@3.49.0: {} + core-js@3.49.0: {} + core-util-is@1.0.2: {} cosmiconfig@8.3.6(typescript@6.0.2): @@ -8103,6 +8183,14 @@ snapshots: decamelize@1.2.0: {} + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + optional: true + + deep-extend@0.6.0: + optional: true + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -8210,6 +8298,11 @@ snapshots: emoji-regex@9.2.2: {} + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + optional: true + entities@4.5.0: {} entities@7.0.1: {} @@ -8578,6 +8671,9 @@ snapshots: eventemitter3@5.0.4: {} + expand-template@2.0.3: + optional: true + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -8693,6 +8789,9 @@ snapshots: fraction.js@5.3.4: {} + fs-constants@1.0.0: + optional: true + fs-exists-sync@0.1.0: {} fs.realpath@1.0.0: {} @@ -8759,6 +8858,9 @@ snapshots: dependencies: assert-plus: 1.0.0 + github-from-package@0.0.0: + optional: true + gl-matrix@3.4.4: {} glob-parent@5.1.2: @@ -9480,9 +9582,9 @@ snapshots: dependencies: yallist: 3.1.1 - make-cancellable-promise@2.0.0: {} + make-cancellable-promise@1.3.2: {} - make-event-props@2.0.0: {} + make-event-props@1.6.2: {} map-cache@0.2.2: {} @@ -9519,7 +9621,7 @@ snapshots: meow@14.1.0: {} - merge-refs@2.0.0(@types/react@19.2.14): + merge-refs@1.3.0(@types/react@19.2.14): optionalDependencies: '@types/react': 19.2.14 @@ -9544,6 +9646,9 @@ snapshots: mimic-function@5.0.1: {} + mimic-response@3.1.0: + optional: true + minimatch@10.2.5: dependencies: brace-expansion: 5.0.5 @@ -9558,6 +9663,9 @@ snapshots: minimist@1.2.8: {} + mkdirp-classic@0.5.3: + optional: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -9568,12 +9676,17 @@ snapshots: murmurhash-js@1.0.0: {} + mustache@4.2.0: {} + mute-stream@0.0.7: {} mute-stream@2.0.0: {} nanoid@3.3.11: {} + napi-build-utils@2.0.0: + optional: true + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} @@ -9583,6 +9696,14 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-abi@3.94.0: + dependencies: + semver: 7.7.4 + optional: true + + node-addon-api@7.1.1: + optional: true + node-domexception@1.0.0: {} node-exports-info@1.6.0: @@ -9852,6 +9973,9 @@ snapshots: path-type@4.0.0: {} + path2d@0.2.2: + optional: true + pattern-key-compare@1.0.0: {} pbf@3.3.0: @@ -9859,9 +9983,10 @@ snapshots: ieee754: 1.2.1 resolve-protobuf-schema: 2.1.0 - pdfjs-dist@5.4.296: + pdfjs-dist@4.8.69: optionalDependencies: - '@napi-rs/canvas': 0.1.100 + canvas: 3.2.3 + path2d: 0.2.2 performance-now@2.1.0: {} @@ -10175,6 +10300,22 @@ snapshots: es6-promise: 3.3.1 route-recognizer: 0.1.11 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.94.0 + pump: 3.0.4 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.5 + tunnel-agent: 0.6.0 + optional: true + prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} @@ -10201,6 +10342,12 @@ snapshots: dependencies: punycode: 2.3.1 + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + optional: true + punycode@2.3.1: {} qified@0.9.1: @@ -10215,6 +10362,14 @@ snapshots: quickselect@2.0.0: {} + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + optional: true + react-clientside-effect@1.2.8(react@19.2.4): dependencies: '@babel/runtime': 7.29.2 @@ -10260,14 +10415,14 @@ snapshots: react-is@16.13.1: {} - react-pdf@10.4.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-pdf@9.2.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: clsx: 2.1.1 dequal: 2.0.3 - make-cancellable-promise: 2.0.0 - make-event-props: 2.0.0 - merge-refs: 2.0.0(@types/react@19.2.14) - pdfjs-dist: 5.4.296 + make-cancellable-promise: 1.3.2 + make-event-props: 1.6.2 + merge-refs: 1.3.0(@types/react@19.2.14) + pdfjs-dist: 4.8.69 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) tiny-invariant: 1.3.3 @@ -10312,6 +10467,13 @@ snapshots: react@19.2.4: {} + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + optional: true + readdirp@4.1.2: {} reflect.getprototypeof@1.0.10: @@ -10588,6 +10750,16 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: + optional: true + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + optional: true + simple-git@3.36.0: dependencies: '@kwsites/file-exists': 1.1.1 @@ -10738,6 +10910,11 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + optional: true + strip-ansi@4.0.0: dependencies: ansi-regex: 3.0.1 @@ -10756,12 +10933,24 @@ snapshots: strip-bom@3.0.0: {} + strip-json-comments@2.0.1: + optional: true + strip-json-comments@3.1.1: {} strip-json-comments@5.0.3: {} style-search@0.1.0: {} + styled-components@6.4.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + csstype: 3.2.3 + react: 19.2.4 + stylis: 4.3.6 + optionalDependencies: + react-dom: 19.2.4(react@19.2.4) + stylelint-config-concentric@2.0.2(stylelint@17.6.0(typescript@6.0.2)): dependencies: stylelint: 17.6.0(typescript@6.0.2) @@ -10849,6 +11038,8 @@ snapshots: - supports-color - typescript + stylis@4.3.6: {} + supercluster@7.1.5: dependencies: kdbush: 3.0.0 @@ -10894,6 +11085,23 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + tar-fs@2.1.5: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.4 + tar-stream: 2.2.0 + optional: true + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + terminal-size@4.0.1: {} through@2.3.8: {}