From 1572433f3d9bf2628e27ed41868c27a02d9a9529 Mon Sep 17 00:00:00 2001 From: Mustaqim Arifin Date: Thu, 26 Jun 2025 19:57:06 +0800 Subject: [PATCH 1/3] Fix:: 1 - Replaced `KY` with `GOT` to address looping issues in NextJS 2 - Replaced `React-Lazy-Images` wtih Native Image Component --- examples/full/pages/_app.tsx | 2 +- examples/minimal/next.config.js | 4 +- package.json | 3 +- packages/notion-client/package.json | 3 +- packages/notion-client/src/notion-api.ts | 54 ++- packages/notion-compat/package.json | 2 +- packages/notion-utils/package.json | 2 +- packages/react-notion-x/package.json | 6 +- .../src/components/lazy-image.tsx | 120 ++++--- packages/react-notion-x/src/context.tsx | 11 - packages/react-notion-x/src/next.tsx | 11 +- packages/react-notion-x/src/renderer.tsx | 5 - packages/react-notion-x/src/styles.css | 312 ++++++++-------- .../src/third-party/collection-utils.ts | 2 +- .../src/third-party/eval-formula.ts | 2 +- .../src/third-party/property.tsx | 6 +- pnpm-lock.yaml | 339 ++++++++++++++++-- pnpm-workspace.yaml | 31 +- 18 files changed, 583 insertions(+), 332 deletions(-) diff --git a/examples/full/pages/_app.tsx b/examples/full/pages/_app.tsx index 62ff3729..7fe40ea9 100644 --- a/examples/full/pages/_app.tsx +++ b/examples/full/pages/_app.tsx @@ -3,7 +3,7 @@ import 'katex/dist/katex.min.css' // used for code syntax highlighting (optional) import 'prismjs/themes/prism-tomorrow.css' // core styles shared by all of react-notion-x (required) -import 'react-notion-x/src/styles.css' +//import 'react-notion-x/src/styles.css' // app styles import '../styles/globals.css' diff --git a/examples/minimal/next.config.js b/examples/minimal/next.config.js index bb37e607..9f0ad109 100644 --- a/examples/minimal/next.config.js +++ b/examples/minimal/next.config.js @@ -1,4 +1,4 @@ -export default { +const nextConfig = { staticPageGenerationTimeout: 300, images: { domains: [ @@ -10,3 +10,5 @@ export default { formats: ['image/avif', 'image/webp'] } } + +export default nextConfig diff --git a/package.json b/package.json index 1aaee2bb..e7321c37 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "dev": "turbo dev --concurrency 50 --continue --filter='./packages/*'", "clean": "turbo clean", "test": "turbo test", - "test:format": "prettier --check \"**/*.{js,ts,tsx}\"", + "test:format": "prettier --check \"**/*.{js,ts,tsx}\" --write", "test:lint": "turbo test:lint", "test:typecheck": "turbo test:typecheck", "test:unit": "turbo test:unit", @@ -32,6 +32,7 @@ "bumpp": "catalog:", "del-cli": "catalog:", "eslint": "catalog:", + "got": "catalog:", "npm-run-all2": "catalog:", "prettier": "catalog:", "react": "catalog:", diff --git a/packages/notion-client/package.json b/packages/notion-client/package.json index eb8eb293..e776428e 100644 --- a/packages/notion-client/package.json +++ b/packages/notion-client/package.json @@ -22,12 +22,13 @@ "watch": "tsup --watch --silent --onSuccess 'echo build successful'", "clean": "del build", "test": "run-s test:*", - "test:lint": "eslint .", + "test:lint": "eslint . --fix", "test:typecheck": "tsc --noEmit", "test:unit": "vitest run" }, "dependencies": { "ky": "catalog:", + "got": "catalog:", "notion-types": "workspace:*", "notion-utils": "workspace:*", "p-map": "catalog:" diff --git a/packages/notion-client/src/notion-api.ts b/packages/notion-client/src/notion-api.ts index 8cfdc308..f5a8f17a 100644 --- a/packages/notion-client/src/notion-api.ts +++ b/packages/notion-client/src/notion-api.ts @@ -1,6 +1,5 @@ -// import { promises as fs } from 'fs' import type * as notion from 'notion-types' -import ky, { type Options as KyOptions } from 'ky' +import got, { type OptionsOfJSONResponseBody as Got_Options } from 'got' import { getBlockCollectionId, getPageContentBlockIds, @@ -19,7 +18,7 @@ export class NotionAPI { private readonly _authToken?: string private readonly _activeUser?: string private readonly _userTimeZone: string - private readonly _kyOptions?: KyOptions + private readonly _kyOptions?: Got_Options constructor({ apiBaseUrl = 'https://www.notion.so/api/v3', @@ -33,7 +32,7 @@ export class NotionAPI { userLocale?: string userTimeZone?: string activeUser?: string - kyOptions?: KyOptions + kyOptions?: Got_Options } = {}) { this._apiBaseUrl = apiBaseUrl this._authToken = authToken @@ -65,7 +64,7 @@ export class NotionAPI { throwOnCollectionErrors?: boolean collectionReducerLimit?: number fetchRelationPages?: boolean - kyOptions?: KyOptions + kyOptions?: Got_Options } = {} ): Promise { const page = await this.getPageRaw(pageId, { @@ -232,7 +231,7 @@ export class NotionAPI { fetchRelationPages = async ( recordMap: notion.ExtendedRecordMap, - kyOptions: KyOptions | undefined + kyOptions: Got_Options | undefined ): Promise => { const maxIterations = 10 @@ -320,7 +319,7 @@ export class NotionAPI { }: { recordMap: notion.ExtendedRecordMap contentBlockIds?: string[] - kyOptions?: KyOptions + kyOptions?: Got_Options }) { recordMap.signed_urls = {} @@ -401,7 +400,7 @@ export class NotionAPI { }: { chunkLimit?: number chunkNumber?: number - kyOptions?: KyOptions + kyOptions?: Got_Options } = {} ) { const parsedPageId = parsePageId(pageId) @@ -442,7 +441,7 @@ export class NotionAPI { userTimeZone?: string userLocale?: string loadContentCover?: boolean - kyOptions?: KyOptions + kyOptions?: Got_Options } = {} ) { const type = collectionView?.type @@ -620,7 +619,9 @@ export class NotionAPI { loader }, kyOptions: { - timeout: 60_000, + timeout: { + request: 60_000 + }, ...kyOptions, searchParams: { // TODO: spread kyOptions?.searchParams @@ -630,7 +631,7 @@ export class NotionAPI { }) } - public async getUsers(userIds: string[], kyOptions?: KyOptions) { + public async getUsers(userIds: string[], kyOptions?: Got_Options) { return this.fetch>({ endpoint: 'getRecordValues', body: { @@ -640,7 +641,7 @@ export class NotionAPI { }) } - public async getBlocks(blockIds: string[], kyOptions?: KyOptions) { + public async getBlocks(blockIds: string[], kyOptions?: Got_Options) { return this.fetch({ endpoint: 'syncRecordValues', body: { @@ -657,7 +658,7 @@ export class NotionAPI { public async getSignedFileUrls( urls: types.SignedUrlRequest[], - kyOptions?: KyOptions + kyOptions?: Got_Options ) { return this.fetch({ endpoint: 'getSignedFileUrls', @@ -668,7 +669,7 @@ export class NotionAPI { }) } - public async search(params: notion.SearchParams, kyOptions?: KyOptions) { + public async search(params: notion.SearchParams, kyOptions?: Got_Options) { const body = { type: 'BlocksInAncestor', source: 'quick_find_public', @@ -708,7 +709,7 @@ export class NotionAPI { }: { endpoint: string body: object - kyOptions?: KyOptions + kyOptions?: Got_Options headers?: any }): Promise { const headers: any = { @@ -728,21 +729,12 @@ export class NotionAPI { const url = `${this._apiBaseUrl}/${endpoint}` - const res = await ky.post(url, { - mode: 'no-cors', - ...this._kyOptions, - ...kyOptions, - json: body, - headers - }) - - // TODO: we're awaiting the first fetch and then separately awaiting - // `res.json()` because there seems to be some weird error which repros - // sporadically when loading collections where the body is already used. - // No idea why, but from my testing, separating these into two separate - // steps seems to fix the issue locally for me... - // console.log(endpoint, { bodyUsed: res.bodyUsed }) - - return res.json() + return got + .post(url, { + ...kyOptions, + json: body, + headers + }) + .json() } } diff --git a/packages/notion-compat/package.json b/packages/notion-compat/package.json index 6bd67040..4a6f01df 100644 --- a/packages/notion-compat/package.json +++ b/packages/notion-compat/package.json @@ -22,7 +22,7 @@ "watch": "tsup --watch --silent --onSuccess 'echo build successful'", "clean": "del build", "test": "run-s test:*", - "test:lint": "eslint .", + "test:lint": "eslint . --fix", "test:typecheck": "tsc --noEmit", "test:unit": "vitest run" }, diff --git a/packages/notion-utils/package.json b/packages/notion-utils/package.json index 8a099996..009524c1 100644 --- a/packages/notion-utils/package.json +++ b/packages/notion-utils/package.json @@ -28,7 +28,7 @@ "watch": "tsup --watch --silent --onSuccess 'echo build successful'", "clean": "del build", "test": "run-s test:*", - "test:lint": "eslint .", + "test:lint": "eslint . --fix", "test:typecheck": "tsc --noEmit", "test:unit": "vitest run" }, diff --git a/packages/react-notion-x/package.json b/packages/react-notion-x/package.json index 9cc6c3f3..83cb11f8 100644 --- a/packages/react-notion-x/package.json +++ b/packages/react-notion-x/package.json @@ -9,7 +9,7 @@ "main": "./build/index.js", "module": "./build/index.js", "types": "./build/index.d.ts", - "sideEffects": false, + "sideEffects": ["src/styles.css"], "exports": { ".": { "types": "./build/index.d.ts", @@ -51,7 +51,7 @@ "watch": "tsup --watch --silent --onSuccess 'echo build successful'", "clean": "del build", "test": "run-s test:*", - "test:lint": "eslint .", + "test:lint": "eslint . --fix", "test:typecheck": "tsc --noEmit" }, "dependencies": { @@ -78,7 +78,7 @@ "lodash.throttle": "catalog:", "react": "catalog:", "react-dom": "catalog:", - "react-pdf": "^9.1.1" + "react-pdf": "^9.1.1", "lightningcss": "catalog:" }, "peerDependencies": { "react": ">=18", diff --git a/packages/react-notion-x/src/components/lazy-image.tsx b/packages/react-notion-x/src/components/lazy-image.tsx index 7af234d0..768b2717 100644 --- a/packages/react-notion-x/src/components/lazy-image.tsx +++ b/packages/react-notion-x/src/components/lazy-image.tsx @@ -1,6 +1,5 @@ import { normalizeUrl } from 'notion-utils' import React from 'react' -import { ImageState, LazyImageFull } from 'react-lazy-images' import { useNotionContext } from '../context' import { cs } from '../utils' @@ -59,6 +58,23 @@ export function LazyImage({ [zoomable, attachZoom] ) + const [isLazyLoaded, setIsLazyLoaded] = React.useState(false) + const onLoadLazy = React.useCallback(() => { + setIsLazyLoaded(true) + }, []) + + const lazyImageRef = React.useCallback( + (image: HTMLImageElement) => { + attachZoomRef?.(image) + + // if the image is cached, we can trigger the onLoadLazy immediately + if (image.complete) { + onLoadLazy() + } + }, + [attachZoomRef, onLoadLazy] + ) + if (previewImage) { const aspectRatio = previewImage.originalHeight / previewImage.originalWidth @@ -81,60 +97,54 @@ export function LazyImage({ ) } - return ( - // @ts-expect-error LazyImage types are out-of-date. - - {({ imageState, ref }) => { - const isLoaded = imageState === ImageState.LoadSuccess - const wrapperStyle: React.CSSProperties = { - width: '100%' - } - const imgStyle: React.CSSProperties = {} - - if (height) { - wrapperStyle.height = height - } else { - imgStyle.position = 'absolute' - wrapperStyle.paddingBottom = `${aspectRatio * 100}%` - } - - return ( -
- {alt} - - {alt} -
- ) - }} -
- ) + return (() => { + const wrapperStyle: React.CSSProperties = { + width: '100%' + } + const imgStyle: React.CSSProperties = {} + + if (height) { + wrapperStyle.height = height + } else { + imgStyle.position = 'absolute' + wrapperStyle.paddingBottom = `${aspectRatio * 100}%` + } + + return ( +
+ {alt} + + {alt} +
+ ) + })() } else { // TODO: GracefulImage doesn't seem to support refs, but we'd like to prevent // invalid images from loading as error states diff --git a/packages/react-notion-x/src/context.tsx b/packages/react-notion-x/src/context.tsx index 7adb08fb..3a10982e 100644 --- a/packages/react-notion-x/src/context.tsx +++ b/packages/react-notion-x/src/context.tsx @@ -16,16 +16,13 @@ import { export interface NotionContext { recordMap: ExtendedRecordMap components: NotionComponents - mapPageUrl: MapPageUrlFn mapImageUrl: MapImageUrlFn searchNotion?: SearchNotionFn isShowingSearch?: boolean onHideSearch?: () => void - rootPageId?: string rootDomain?: string - fullPage: boolean darkMode: boolean previewImages: boolean @@ -35,14 +32,11 @@ export interface NotionContext { minTableOfContentsItems: number linkTableTitleProperties: boolean isLinkCollectionToUrlProperty: boolean - defaultPageIcon?: string | null defaultPageCover?: string | null defaultPageCoverPosition?: number - zoom: any } - export interface PartialNotionContext { recordMap?: ExtendedRecordMap components?: Partial @@ -52,10 +46,8 @@ export interface PartialNotionContext { searchNotion?: SearchNotionFn isShowingSearch?: boolean onHideSearch?: () => void - rootPageId?: string rootDomain?: string - fullPage?: boolean darkMode?: boolean previewImages?: boolean @@ -63,14 +55,11 @@ export interface PartialNotionContext { showCollectionViewDropdown?: boolean linkTableTitleProperties?: boolean isLinkCollectionToUrlProperty?: boolean - showTableOfContents?: boolean minTableOfContentsItems?: number - defaultPageIcon?: string | null defaultPageCover?: string | null defaultPageCoverPosition?: number - zoom?: any } diff --git a/packages/react-notion-x/src/next.tsx b/packages/react-notion-x/src/next.tsx index dea3a249..6df53b1f 100644 --- a/packages/react-notion-x/src/next.tsx +++ b/packages/react-notion-x/src/next.tsx @@ -71,26 +71,19 @@ export const wrapNextLegacyImage = (NextLegacyImage: any): React.FC => { export function wrapNextLink(NextLink: any) { return ({ href, - as, - passHref, prefetch, replace, scroll, - shallow, - locale, + onNavigate, ...linkProps }: any) => { return ( diff --git a/packages/react-notion-x/src/renderer.tsx b/packages/react-notion-x/src/renderer.tsx index d4be62b1..39ae963e 100644 --- a/packages/react-notion-x/src/renderer.tsx +++ b/packages/react-notion-x/src/renderer.tsx @@ -59,17 +59,13 @@ export function NotionRenderer({ linkTableTitleProperties?: boolean isLinkCollectionToUrlProperty?: boolean isImageZoomable?: boolean - showTableOfContents?: boolean minTableOfContentsItems?: number - defaultPageIcon?: string defaultPageCover?: string defaultPageCoverPosition?: number - className?: string bodyClassName?: string - header?: React.ReactNode footer?: React.ReactNode pageHeader?: React.ReactNode @@ -77,7 +73,6 @@ export function NotionRenderer({ pageTitle?: React.ReactNode pageAside?: React.ReactNode pageCover?: React.ReactNode - blockId?: string hideBlockId?: boolean disableHeader?: boolean diff --git a/packages/react-notion-x/src/styles.css b/packages/react-notion-x/src/styles.css index a27edeb1..0adb2c79 100644 --- a/packages/react-notion-x/src/styles.css +++ b/packages/react-notion-x/src/styles.css @@ -2,136 +2,136 @@ --notion-font: ui-sans-serif, system-ui, apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, 'Apple Color Emoji', Arial, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; - --fg-color: rgb(55, 53, 47); - --fg-color-0: rgba(55, 53, 47, 0.09); - --fg-color-1: rgba(55, 53, 47, 0.16); - --fg-color-2: rgba(55, 53, 47, 0.4); - --fg-color-3: rgba(55, 53, 47, 0.6); - --fg-color-4: #000; - --fg-color-5: rgba(55, 53, 47, 0.024); - --fg-color-6: rgba(55, 53, 47, 0.8); - --fg-color-7: rgba(55, 53, 47, 0.5); + --fg-color: oklch(33% 0 92); + --fg-color-0: oklch(33% 0 92 / 0.1); + --fg-color-1: oklch(33% 0 92 / 0.2); + --fg-color-2: oklch(33% 0 92 / 0.4); + --fg-color-3: oklch(33% 0 92 / 0.6); + --fg-color-4: oklch(0% 0 0); + --fg-color-5: oklch(33% 0 92 / 0); + --fg-color-6: oklch(33% 0 92 / 0.8); + --fg-color-7: oklch(33% 0 92 / 0.5); --fg-color-icon: var(--fg-color); - --bg-color: #fff; - --bg-color-0: rgba(135, 131, 120, 0.15); - --bg-color-1: rgb(247, 246, 243); - --bg-color-2: rgba(135, 131, 120, 0.15); - - --select-color-0: rgb(46, 170, 220); - --select-color-1: rgba(45, 170, 219, 0.3); - --select-color-2: #d9eff8; - - --notion-red: rgb(224, 62, 62); - --notion-pink: rgb(173, 26, 114); - --notion-blue: rgb(11, 110, 153); - --notion-purple: rgb(105, 64, 165); - --notion-teal: rgb(77, 100, 97); - --notion-yellow: rgb(223, 171, 1); - --notion-orange: rgb(217, 115, 13); - --notion-brown: rgb(100, 71, 58); - --notion-gray: rgb(155, 154, 151); - - --notion-red_background: rgb(251, 228, 228); - --notion-pink_background: rgb(244, 223, 235); - --notion-blue_background: rgb(221, 235, 241); - --notion-purple_background: rgb(234, 228, 242); - --notion-teal_background: rgb(221, 237, 234); - --notion-yellow_background: rgb(251, 243, 219); - --notion-orange_background: rgb(250, 235, 221); - --notion-brown_background: rgb(233, 229, 227); - --notion-gray_background: rgb(235, 236, 237); - - --notion-red_background_co: rgba(251, 228, 228, 0.3); - --notion-pink_background_co: rgba(244, 223, 235, 0.3); - --notion-blue_background_co: rgba(221, 235, 241, 0.3); - --notion-purple_background_co: rgba(234, 228, 242, 0.3); - --notion-teal_background_co: rgba(221, 237, 234, 0.3); - --notion-yellow_background_co: rgba(251, 243, 219, 0.3); - --notion-orange_background_co: rgba(250, 235, 221, 0.3); - --notion-brown_background_co: rgba(233, 229, 227, 0.3); - --notion-gray_background_co: rgba(235, 236, 237, 0.3); - - --notion-item-blue: rgb(211, 229, 239); - --notion-item-orange: rgb(250, 222, 201); - --notion-item-green: rgb(219, 237, 219); - --notion-item-pink: rgb(245, 224, 233); - --notion-item-brown: rgb(238, 224, 218); - --notion-item-red: rgb(255, 226, 221); - --notion-item-yellow: rgb(253, 236, 200); - --notion-item-default: rgba(227, 226, 224, 0.5); - --notion-item-purple: rgb(232, 222, 238); - --notion-item-gray: rgb(227, 226, 224); - - --notion-item-text-blue: rgb(24, 51, 71); - --notion-item-text-orange: rgb(73, 41, 14); - --notion-item-text-green: rgb(28, 56, 41); - --notion-item-text-pink: rgb(76, 35, 55); - --notion-item-text-brown: rgb(68, 42, 30); - --notion-item-text-red: rgb(93, 23, 21); - --notion-item-text-yellow: rgb(64, 44, 27); - --notion-item-text-default: rgb(50, 48, 44); - --notion-item-text-purple: rgb(65, 36, 84); - --notion-item-text-gray: rgb(50, 48, 44); - - --notion-item-bullet-blue: rgb(91, 151, 189); - --notion-item-bullet-orange: rgb(215, 129, 58); - --notion-item-bullet-green: rgb(108, 155, 125); - --notion-item-bullet-pink: rgb(205, 116, 159); - --notion-item-bullet-brown: rgb(187, 132, 108); - --notion-item-bullet-red: rgb(225, 111, 100); - --notion-item-bullet-yellow: rgb(203, 148, 51); - --notion-item-bullet-default: rgb(91, 151, 189); - --notion-item-bullet-purple: rgb(167, 130, 195); - --notion-item-bullet-gray: rgb(145, 145, 142); + --bg-color: oklch(100% 0 0); + --bg-color-0: oklch(61% 0 90 / 0.1); + --bg-color-1: oklch(97% 0 91); + --bg-color-2: oklch(61% 0 90 / 0.1); + + --select-color-0: oklch(69% 0.1 230); + --select-color-1: oklch(69% 0.1 230 / 0.3); + --select-color-2: oklch(94% 0 220); + + --notion-red: oklch(61% 0.2 25); + --notion-pink: oklch(50% 0.2 350); + --notion-blue: oklch(51% 0.1 240); + --notion-purple: oklch(47% 0.2 300); + --notion-teal: oklch(48% 0 190); + --notion-yellow: oklch(77% 0.2 87); + --notion-orange: oklch(66% 0.2 56); + --notion-brown: oklch(43% 0 45); + --notion-gray: oklch(69% 0 91); + + --notion-red_background: oklch(94% 0 18); + --notion-pink_background: oklch(92% 0 340); + --notion-blue_background: oklch(93% 0 230); + --notion-purple_background: oklch(93% 0 310); + --notion-teal_background: oklch(93% 0 180); + --notion-yellow_background: oklch(96% 0 92); + --notion-orange_background: oklch(95% 0 66); + --notion-brown_background: oklch(92% 0 49); + --notion-gray_background: oklch(94% 0 250); + + --notion-red_background_co: oklch(94% 0 18 / 0.3); + --notion-pink_background_co: oklch(92% 0 340 / 0.3); + --notion-blue_background_co: oklch(93% 0 230 / 0.3); + --notion-purple_background_co: oklch(93% 0 310 / 0.3); + --notion-teal_background_co: oklch(93% 0 180 / 0.3); + --notion-yellow_background_co: oklch(96% 0 92 / 0.3); + --notion-orange_background_co: oklch(95% 0 66 / 0.3); + --notion-brown_background_co: oklch(92% 0 49 / 0.3); + --notion-gray_background_co: oklch(94% 0 250 / 0.3); + + --notion-item-blue: oklch(91% 0 230); + --notion-item-orange: oklch(92% 0 59); + --notion-item-green: oklch(93% 0 150); + --notion-item-pink: oklch(93% 0 350); + --notion-item-brown: oklch(92% 0 45); + --notion-item-red: oklch(94% 0 29); + --notion-item-yellow: oklch(95% 0.1 86); + --notion-item-default: oklch(91% 0 85 / 0.5); + --notion-item-purple: oklch(91% 0 310); + --notion-item-gray: oklch(91% 0 85); + + --notion-item-text-blue: oklch(31% 0 240); + --notion-item-text-orange: oklch(32% 0.1 58); + --notion-item-text-green: oklch(31% 0 160); + --notion-item-text-pink: oklch(32% 0.1 350); + --notion-item-text-brown: oklch(31% 0 45); + --notion-item-text-red: oklch(32% 0.1 26); + --notion-item-text-yellow: oklch(31% 0 61); + --notion-item-text-default: oklch(31% 0 85); + --notion-item-text-purple: oklch(32% 0.1 310); + --notion-item-text-gray: oklch(31% 0 85); + + --notion-item-bullet-blue: oklch(65% 0.1 240); + --notion-item-bullet-orange: oklch(68% 0.1 57); + --notion-item-bullet-green: oklch(65% 0.1 160); + --notion-item-bullet-pink: oklch(67% 0.1 350); + --notion-item-bullet-brown: oklch(66% 0.1 44); + --notion-item-bullet-red: oklch(67% 0.1 27); + --notion-item-bullet-yellow: oklch(70% 0.1 78); + --notion-item-bullet-default: oklch(65% 0.1 240); + --notion-item-bullet-purple: oklch(67% 0.1 310); + --notion-item-bullet-gray: oklch(66% 0 110); --notion-max-width: 720px; --notion-header-height: 45px; } .dark-mode { - --fg-color: rgba(255, 255, 255, 0.9); + --fg-color: oklch(100% 0 0 / 0.9); --fg-color-0: var(--fg-color); --fg-color-1: var(--fg-color); --fg-color-2: var(--fg-color); --fg-color-3: var(--fg-color); --fg-color-4: var(--fg-color); - --fg-color-5: rgba(255, 255, 255, 0.7); - --fg-color-6: #fff; - --fg-color-icon: #fff; - - --bg-color: #2f3437; - --bg-color-0: rgb(71, 76, 80); - --bg-color-1: rgb(63, 68, 71); - --bg-color-2: rgba(135, 131, 120, 0.15); - - --notion-red: rgb(255, 115, 105); - --notion-pink: rgb(226, 85, 161); - --notion-blue: rgb(82, 156, 202); - --notion-purple: rgb(154, 109, 215); - --notion-teal: rgb(77, 171, 154); - --notion-yellow: rgb(255, 220, 73); - --notion-orange: rgb(255, 163, 68); - --notion-brown: rgb(147, 114, 100); - --notion-gray: rgba(151, 154, 155, 0.95); - --notion-red_background: rgb(89, 65, 65); - --notion-pink_background: rgb(83, 59, 76); - --notion-blue_background: rgb(54, 73, 84); - --notion-purple_background: rgb(68, 63, 87); - --notion-teal_background: rgb(53, 76, 75); - --notion-yellow_background: rgb(89, 86, 59); - --notion-orange_background: rgb(89, 74, 58); - --notion-brown_background: rgb(67, 64, 64); - --notion-gray_background: rgb(69, 75, 78); - --notion-red_background_co: rgba(89, 65, 65, 0.3); - --notion-pink_background_co: rgba(83, 59, 76, 0.3); - --notion-blue_background_co: rgba(120, 162, 187, 0.3); - --notion-purple_background_co: rgba(68, 63, 87, 0.3); - --notion-teal_background_co: rgba(53, 76, 75, 0.3); - --notion-yellow_background_co: rgba(89, 86, 59, 0.3); - --notion-orange_background_co: rgba(89, 74, 58, 0.3); - --notion-brown_background_co: rgba(67, 64, 64, 0.3); - --notion-gray_background_co: rgba(69, 75, 78, 0.3); + --fg-color-5: oklch(100% 0 0 / 0.7); + --fg-color-6: oklch(100% 0 0); + --fg-color-icon: oklch(100% 0 0); + + --bg-color: oklch(32% 0 230); + --bg-color-0: oklch(41% 0 240); + --bg-color-1: oklch(38% 0 230); + --bg-color-2: oklch(61% 0 90 / 0.1); + + --notion-red: oklch(72% 0.2 26); + --notion-pink: oklch(66% 0.2 350); + --notion-blue: oklch(66% 0.1 240); + --notion-purple: oklch(63% 0.2 300); + --notion-teal: oklch(68% 0.1 180); + --notion-yellow: oklch(90% 0.2 95); + --notion-orange: oklch(79% 0.2 63); + --notion-brown: oklch(58% 0 44); + --notion-gray: oklch(68% 0 220 / 0.9); + --notion-red_background: oklch(40% 0 19); + --notion-pink_background: oklch(39% 0 340); + --notion-blue_background: oklch(39% 0 230); + --notion-purple_background: oklch(38% 0 290); + --notion-teal_background: oklch(40% 0 190); + --notion-yellow_background: oklch(45% 0 100); + --notion-orange_background: oklch(42% 0 69); + --notion-brown_background: oklch(37% 0 17); + --notion-gray_background: oklch(41% 0 230); + --notion-red_background_co: oklch(40% 0 19 / 0.3); + --notion-pink_background_co: oklch(39% 0 340 / 0.3); + --notion-blue_background_co: oklch(69% 0.1 230 / 0.3); + --notion-purple_background_co: oklch(38% 0 290 / 0.3); + --notion-teal_background_co: oklch(40% 0 190 / 0.3); + --notion-yellow_background_co: oklch(45% 0 100 / 0.3); + --notion-orange_background_co: oklch(42% 0 69 / 0.3); + --notion-brown_background_co: oklch(37% 0 17 / 0.3); + --notion-gray_background_co: oklch(41% 0 230 / 0.3); } .notion * { @@ -830,7 +830,7 @@ svg.notion-page-icon { } .notion-inline-code { - color: #eb5757; + color: oklch(65% 0.2 24); padding: 0.2em 0.4em; background: var(--bg-color-2); border-radius: 3px; @@ -900,7 +900,7 @@ svg.notion-page-icon { .notion-asset-wrapper iframe { border: none; - background: rgb(247, 246, 245); + background: oklch(97% 0 68); } .notion-text { @@ -961,24 +961,24 @@ svg.notion-page-icon { color 0.2s cubic-bezier(0.3, 0, 0.5, 1), border-color 0.2s cubic-bezier(0.3, 0, 0.5, 1); box-shadow: - 0 1px 0 rgba(27, 31, 36, 0.04), - inset 0 1px 0 rgba(255, 255, 255, 0.25); - background-color: #f6f8fa; + 0 1px 0 oklch(24% 0 250 / 0), + inset 0 1px 0 oklch(100% 0 0 / 0.3); + background-color: oklch(98% 0 250); - color: #24292f; - border: 1px solid rgba(27, 31, 36, 0.15); + color: oklch(28% 0 250); + border: 1px solid oklch(24% 0 250 / 0.1); border-radius: 6px; } .notion-code-copy-button:hover { - background-color: #f3f4f6; - border-color: rgba(27, 31, 36, 0.15); + background-color: oklch(97% 0 260); + border-color: oklch(24% 0 250 / 0.1); transition-duration: 0.1s; } .notion-code-copy-button:active { - background: hsla(220, 14%, 93%, 1); - border-color: rgba(27, 31, 36, 0.15); + background: oklch(94% 0 260); + border-color: oklch(24% 0 250 / 0.1); transition: none; } @@ -1009,8 +1009,8 @@ svg.notion-page-icon { .notion-code-copy-tooltip > div { padding: 6px 8px; - background: #222; - color: #fff; + background: oklch(25% 0 0); + color: oklch(100% 0 0); border-radius: 6px; } @@ -1513,7 +1513,7 @@ svg.notion-page-icon { left: 1px; width: 14px; height: 14px; - fill: #fff; + fill: oklch(100% 0 0); } .notion-property-checkbox-unchecked { @@ -1558,8 +1558,8 @@ svg.notion-page-icon { text-decoration: none; box-shadow: - rgba(15, 15, 15, 0.1) 0 0 0 1px, - rgba(15, 15, 15, 0.1) 0 2px 4px; + oklch(17% 0 0 / 0.1) 0 0 0 1px, + oklch(17% 0 0 / 0.1) 0 2px 4px; border-radius: 3px; background: var(--bg-color); color: var(--fg-color); @@ -2474,7 +2474,7 @@ svg.notion-page-icon { left: 0; right: 0; bottom: 0; - background: rgba(15, 15, 15, 0.6); + background: oklch(17% 0 0 / 0.6); display: flex; justify-content: center; @@ -2484,9 +2484,9 @@ svg.notion-page-icon { .notion-search { box-shadow: - rgba(15, 15, 15, 0.05) 0px 0px 0px 1px, - rgba(15, 15, 15, 0.1) 0px 5px 10px, - rgba(15, 15, 15, 0.2) 0px 15px 40px; + oklch(17% 0 0 / 0.1) 0px 0px 0px 1px, + oklch(17% 0 0 / 0.1) 0px 5px 10px, + oklch(17% 0 0 / 0.2) 0px 15px 40px; border-radius: 3px; background: var(--bg-color); @@ -2501,8 +2501,8 @@ svg.notion-page-icon { font-size: 16px; line-height: 1.5; - color: rgb(55, 53, 47); - caret-color: rgb(55, 53, 47); + color: oklch(33% 0 92); + caret-color: oklch(33% 0 92); font-family: var(--notion-font); } @@ -2525,7 +2525,7 @@ svg.notion-page-icon { flex-direction: row; align-items: center; height: 52px; - box-shadow: rgba(55, 53, 47, 0.09) 0px 1px 0px; + box-shadow: oklch(33% 0 92 / 0.1) 0px 1px 0px; font-size: 18px; line-height: 27px; padding: 16px; @@ -2590,17 +2590,17 @@ svg.notion-page-icon { font-size: 14px; font-weight: 500; line-height: 20px; - color: rgba(55, 53, 47, 0.6); + color: oklch(33% 0 92 / 0.6); } .notion-search .noResultsDetail { font-size: 14px; margin-top: 2px; - color: rgba(55, 53, 47, 0.4); + color: oklch(33% 0 92 / 0.4); } .notion-search .resultsFooter { - box-shadow: rgba(55, 53, 47, 0.09) 0px -1px 0px; + box-shadow: oklch(33% 0 92 / 0.1) 0px -1px 0px; margin-top: 1px; font-size: 12px; min-height: 28px; @@ -2627,7 +2627,7 @@ svg.notion-page-icon { .notion-search .resultsPane .result { padding: 8px 14px; - border-bottom: 1px solid rgba(55, 53, 47, 0.06); + border-bottom: 1px solid oklch(33% 0 92 / 0.1); font-size: 14px; user-select: none; display: flex; @@ -2776,7 +2776,7 @@ svg.notion-page-icon { } .notion-external-block-desc { - color: rgba(55, 53, 47, 0.65); + color: oklch(33% 0 92 / 0.7); font-size: 12px; white-space: nowrap; padding-top: 4px; @@ -2792,8 +2792,8 @@ svg.notion-page-icon { z-index: 999; padding: 8px; box-shadow: - rgba(15, 15, 15, 0.1) 0 0 0 1px, - rgba(15, 15, 15, 0.1) 0 2px 4px; + oklch(17% 0 0 / 0.1) 0 0 0 1px, + oklch(17% 0 0 / 0.1) 0 2px 4px; } .notion-external-mention .notion-external-subtitle-item { @@ -2848,7 +2848,7 @@ svg.notion-page-icon { } .notion-yt-lite { - background-color: #000; + background-color: oklch(0% 0 0); position: absolute; width: 100%; height: 100%; @@ -2922,12 +2922,12 @@ svg.notion-page-icon { .notion-collection-view-dropdown-content { font-family: var(--notion-font); min-width: 220; - background: #fff; + background: oklch(100% 0 0); border-radius: 6; padding: 0; box-shadow: - 0px 10px 38px -10px rgba(22, 23, 24, 0.35), - 0px 10px 20px -15px rgba(22, 23, 24, 0.2); + 0px 10px 38px -10px oklch(20% 0 250 / 0.3), + 0px 10px 20px -15px oklch(20% 0 250 / 0.2); animation-duration: 400ms; animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); animation-fill-mode: forwards; @@ -2951,7 +2951,7 @@ svg.notion-page-icon { align-items: center; user-select: none; cursor: pointer; - color: rgb(55, 53, 47); + color: oklch(33% 0 92); font-size: 14px; } @@ -2961,7 +2961,7 @@ svg.notion-page-icon { } .notion-collection-view-tabs-content-item-active { - border-bottom: solid 2px #000; + border-bottom: solid 2px oklch(0% 0 0); font-weight: bold; } @@ -3045,11 +3045,11 @@ svg.notion-page-icon { height: 15rem; background: var(--bg-color); border-radius: 0.75rem; - border: 1px solid rgba(27, 31, 36, 0.15); + border: 1px solid oklch(24% 0 250 / 0.1); overflow: hidden; box-shadow: - 0 4px 6px -1px rgba(0, 0, 0, 0.1), - 0 2px 4px -1px rgba(0, 0, 0, 0.06); + 0 4px 6px -1px oklch(0% 0 0 / 0.1), + 0 2px 4px -1px oklch(0% 0 0 / 0.1); } .notion-link-mention-preview-thumbnail { diff --git a/packages/react-notion-x/src/third-party/collection-utils.ts b/packages/react-notion-x/src/third-party/collection-utils.ts index 7a2a1585..851dcbcc 100644 --- a/packages/react-notion-x/src/third-party/collection-utils.ts +++ b/packages/react-notion-x/src/third-party/collection-utils.ts @@ -34,7 +34,7 @@ export function getCollectionGroups( } // TODO: review dates format based on value.type ('week'|'month'|'year') - queryValue = format(new Date(queryLabel), 'MMM d, YYY hh:mm aa') + queryValue = format(new Date(queryLabel), 'MMM d, yyy hh:mm aa') } return { diff --git a/packages/react-notion-x/src/third-party/eval-formula.ts b/packages/react-notion-x/src/third-party/eval-formula.ts index 6658ae7f..60a56b0d 100644 --- a/packages/react-notion-x/src/third-party/eval-formula.ts +++ b/packages/react-notion-x/src/third-party/eval-formula.ts @@ -300,7 +300,7 @@ function evalFunctionFormula( case 'object': if (value instanceof Date) { - return format(value as Date, 'MMM d, YYY') + return format(value as Date, 'MMM d, yyy') } else { // shouldn't ever get here return `${value}` diff --git a/packages/react-notion-x/src/third-party/property.tsx b/packages/react-notion-x/src/third-party/property.tsx index f23df31b..329d910b 100644 --- a/packages/react-notion-x/src/third-party/property.tsx +++ b/packages/react-notion-x/src/third-party/property.tsx @@ -92,7 +92,7 @@ export function PropertyImpl(props: IPropertyProps) { } if (content instanceof Date) { - content = format(content, 'MMM d, YYY hh:mm aa') + content = format(content, 'MMM d, yyy hh:mm aa') } } catch { // console.log('error evaluating formula', schema.formula, err) @@ -437,7 +437,7 @@ export function PropertyImpl(props: IPropertyProps) { const renderCreatedTimeValue = React.useMemo( () => function CreatedTimeProperty() { - return format(new Date(block!.created_time), 'MMM d, YYY hh:mm aa') + return format(new Date(block!.created_time), 'MMM d, yyy hh:mm aa') }, [block] ) @@ -445,7 +445,7 @@ export function PropertyImpl(props: IPropertyProps) { const renderLastEditedTimeValue = React.useMemo( () => function LastEditedTimeProperty() { - return format(new Date(block!.last_edited_time), 'MMM d, YYY hh:mm aa') + return format(new Date(block!.last_edited_time), 'MMM d, yyy hh:mm aa') }, [block] ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b9dbfc1..7ac51f8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,8 +31,8 @@ catalogs: specifier: ^1.26.5 version: 1.26.5 '@types/react': - specifier: ^19.1.6 - version: 19.1.6 + specifier: ^19.1.8 + version: 19.1.8 '@types/react-dom': specifier: ^19.1.6 version: 19.1.6 @@ -63,6 +63,9 @@ catalogs: format-number: specifier: ^3.0.0 version: 3.0.0 + got: + specifier: ^14.4.7 + version: 14.4.7 is-url-superb: specifier: ^6.1.0 version: 6.1.0 @@ -72,6 +75,9 @@ catalogs: ky: specifier: ^1.8.1 version: 1.8.1 + lightningcss: + specifier: ^1.30.1 + version: 1.30.1 lodash.throttle: specifier: ^4.1.1 version: 4.1.1 @@ -157,7 +163,7 @@ importers: devDependencies: '@fisch0920/config': specifier: 'catalog:' - version: 1.1.2(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) + version: 1.1.2(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) '@total-typescript/ts-reset': specifier: 'catalog:' version: 0.6.1 @@ -173,6 +179,12 @@ importers: eslint: specifier: 'catalog:' version: 9.28.0(jiti@2.4.2) + got: + specifier: 'catalog:' + version: 14.4.7 + lightningcss: + specifier: 'catalog:' + version: 1.30.1 npm-run-all2: specifier: 'catalog:' version: 8.0.4 @@ -202,7 +214,7 @@ importers: version: 5.8.3 vitest: specifier: 'catalog:' - version: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) examples/cra: dependencies: @@ -211,10 +223,10 @@ importers: version: 22.15.30 '@types/react': specifier: 'catalog:' - version: 19.1.6 + version: 19.1.8 '@types/react-dom': specifier: 'catalog:' - version: 19.1.6(@types/react@19.1.6) + version: 19.1.6(@types/react@19.1.8) notion-types: specifier: workspace:* version: link:../../packages/notion-types @@ -315,6 +327,9 @@ importers: packages/notion-client: dependencies: + got: + specifier: 'catalog:' + version: 14.4.7 ky: specifier: 'catalog:' version: 1.8.1 @@ -411,7 +426,7 @@ importers: version: 1.26.5 '@types/react': specifier: 'catalog:' - version: 19.1.6 + version: 19.1.8 '@types/react-modal': specifier: 'catalog:' version: 3.16.3 @@ -424,6 +439,9 @@ importers: format-number: specifier: 'catalog:' version: 3.0.0 + lightningcss: + specifier: 'catalog:' + version: 1.30.1 lodash.throttle: specifier: 'catalog:' version: 4.1.1 @@ -436,7 +454,7 @@ importers: optionalDependencies: react-pdf: specifier: ^9.2.1 - version: 9.2.1(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 9.2.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) packages: @@ -2066,9 +2084,16 @@ packages: '@rushstack/eslint-patch@1.11.0': resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + '@sindresorhus/is@7.0.2': + resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + engines: {node: '>=18'} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} @@ -2144,6 +2169,10 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + '@tootallnate/once@1.1.2': resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -2209,6 +2238,9 @@ packages: '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} @@ -2274,8 +2306,8 @@ packages: '@types/react-modal@3.16.3': resolution: {integrity: sha512-xXuGavyEGaFQDgBv4UVm8/ZsG+qxeQ7f77yNrW3n+1J6XAstUy5rYHeIHPh1KzsGc6IkCIdu6lQ2xWzu1jBTLg==} - '@types/react@19.1.6': - resolution: {integrity: sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==} + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -2941,6 +2973,14 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@12.0.1: + resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} + engines: {node: '>=18'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -3447,6 +3487,10 @@ packages: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -4108,6 +4152,10 @@ packages: vue-template-compiler: optional: true + form-data-encoder@4.1.0: + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} + engines: {node: '>= 18'} + form-data@3.0.3: resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} engines: {node: '>= 6'} @@ -4198,6 +4246,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -4267,6 +4319,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@14.4.7: + resolution: {integrity: sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==} + engines: {node: '>=20'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4358,6 +4414,9 @@ packages: htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} @@ -4389,6 +4448,10 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -4618,6 +4681,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -5001,6 +5068,70 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -5071,6 +5202,10 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lqip-modern@2.2.1: resolution: {integrity: sha512-5XlvR9zczhDiNstMztH5kF3xs2cVbvPu7xmGWpgd4Qwb7UastgplSihZt2PHX9CBkZ241En9miZEDXyy0TgdiQ==} engines: {node: '>=18'} @@ -5197,6 +5332,10 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -5474,6 +5613,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-cancelable@4.0.1: + resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} + engines: {node: '>=14.16'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -6179,6 +6322,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} @@ -6396,6 +6543,9 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -6436,6 +6586,10 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -8785,11 +8939,11 @@ snapshots: '@eslint/core': 0.14.0 levn: 0.4.1 - '@fisch0920/config@1.1.2(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': + '@fisch0920/config@1.1.2(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@eslint/js': 9.28.0 '@total-typescript/ts-reset': 0.6.1 - '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) eslint: 9.28.0(jiti@2.4.2) eslint-config-prettier: 10.1.5(eslint@9.28.0(jiti@2.4.2)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) @@ -9387,8 +9541,12 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} + '@sec-ant/readable-stream@0.4.1': {} + '@sinclair/typebox@0.24.51': {} + '@sindresorhus/is@7.0.2': {} + '@sindresorhus/merge-streams@2.3.0': {} '@sinonjs/commons@1.8.6': @@ -9479,6 +9637,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + '@tootallnate/once@1.1.2': {} '@total-typescript/ts-reset@0.6.1': {} @@ -9566,6 +9728,8 @@ snapshots: '@types/html-minifier-terser@6.1.0': {} + '@types/http-cache-semantics@4.0.4': {} + '@types/http-errors@2.0.4': {} '@types/http-proxy@1.17.15': @@ -9619,15 +9783,15 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.1.6(@types/react@19.1.6)': + '@types/react-dom@19.1.6(@types/react@19.1.8)': dependencies: - '@types/react': 19.1.6 + '@types/react': 19.1.8 '@types/react-modal@3.16.3': dependencies: - '@types/react': 19.1.6 + '@types/react': 19.1.8 - '@types/react@19.1.6': + '@types/react@19.1.8': dependencies: csstype: 3.1.3 @@ -9860,13 +10024,13 @@ snapshots: '@typescript-eslint/types': 8.33.1 eslint-visitor-keys: 4.2.0 - '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.28.0(jiti@2.4.2) optionalDependencies: typescript: 5.8.3 - vitest: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -9878,13 +10042,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.2(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.2(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.2 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) '@vitest/pretty-format@3.2.2': dependencies: @@ -10502,6 +10666,18 @@ snapshots: cac@6.7.14: {} + cacheable-lookup@7.0.0: {} + + cacheable-request@12.0.1: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 9.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -10977,7 +11153,6 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - optional: true dedent@0.7.0: {} @@ -10994,6 +11169,8 @@ snapshots: dependencies: execa: 5.1.1 + defer-to-connect@2.0.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -11953,6 +12130,8 @@ snapshots: optionalDependencies: eslint: 9.28.0(jiti@2.4.2) + form-data-encoder@4.1.0: {} + form-data@3.0.3: dependencies: asynckit: 0.4.0 @@ -12057,6 +12236,11 @@ snapshots: get-stream@6.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -12148,6 +12332,20 @@ snapshots: gopd@1.2.0: {} + got@14.4.7: + dependencies: + '@sindresorhus/is': 7.0.2 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 12.0.1 + decompress-response: 6.0.0 + form-data-encoder: 4.1.0 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 4.0.1 + responselike: 3.0.0 + type-fest: 4.26.1 + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -12233,6 +12431,8 @@ snapshots: domutils: 2.8.0 entities: 2.2.0 + http-cache-semantics@4.2.0: {} + http-deceiver@1.2.7: {} http-errors@1.6.3: @@ -12280,6 +12480,11 @@ snapshots: transitivePeerDependencies: - debug + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -12474,6 +12679,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -13122,6 +13329,51 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + lilconfig@2.1.0: {} lilconfig@3.1.3: {} @@ -13177,6 +13429,8 @@ snapshots: dependencies: tslib: 2.8.1 + lowercase-keys@3.0.0: {} + lqip-modern@2.2.1: dependencies: p-map: 7.0.3 @@ -13236,9 +13490,9 @@ snapshots: merge-descriptors@1.0.3: {} - merge-refs@1.3.0(@types/react@19.1.6): + merge-refs@1.3.0(@types/react@19.1.8): optionalDependencies: - '@types/react': 19.1.6 + '@types/react': 19.1.8 optional: true merge-stream@2.0.0: {} @@ -13271,8 +13525,9 @@ snapshots: mimic-response@2.1.0: optional: true - mimic-response@3.1.0: - optional: true + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} min-indent@1.0.1: {} @@ -13570,6 +13825,8 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-cancelable@4.0.1: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -14241,6 +14498,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-lru@5.1.1: {} + raf@3.4.1: dependencies: performance-now: 2.1.0 @@ -14364,20 +14623,20 @@ snapshots: react-lifecycles-compat: 3.0.4 warning: 4.0.3 - react-pdf@9.2.1(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-pdf@9.2.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: clsx: 2.1.1 dequal: 2.0.3 make-cancellable-promise: 1.3.2 make-event-props: 1.6.2 - merge-refs: 1.3.0(@types/react@19.1.6) + merge-refs: 1.3.0(@types/react@19.1.8) pdfjs-dist: 4.8.69 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) tiny-invariant: 1.3.3 warning: 4.0.3 optionalDependencies: - '@types/react': 19.1.6 + '@types/react': 19.1.8 optional: true react-refresh@0.11.0: {} @@ -14585,6 +14844,8 @@ snapshots: requires-port@1.0.0: {} + resolve-alpn@1.2.1: {} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -14617,6 +14878,10 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + retry@0.13.1: {} reusify@1.0.4: {} @@ -15489,8 +15754,7 @@ snapshots: type-fest@3.13.1: {} - type-fest@4.26.1: - optional: true + type-fest@4.26.1: {} type-is@1.6.18: dependencies: @@ -15632,13 +15896,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -15653,7 +15917,7 @@ snapshots: - tsx - yaml - vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): + vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -15662,15 +15926,16 @@ snapshots: '@types/node': 22.15.30 fsevents: 2.3.3 jiti: 2.4.2 + lightningcss: 1.30.1 terser: 5.36.0 tsx: 4.19.4 yaml: 2.8.0 - vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.2 - '@vitest/mocker': 3.2.2(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.2.2(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.2 '@vitest/runner': 3.2.2 '@vitest/snapshot': 3.2.2 @@ -15688,8 +15953,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.30 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 05544bd2..f329ed14 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,21 +1,19 @@ packages: - packages/* - examples/* -onlyBuiltDependencies: - - simple-git-hooks catalog: - "@fisch0920/config": ^1.1.2 - "@fisch0920/eslint-config": ^1.4.0 - "@fisch0920/medium-zoom": ^1.0.7 - "@matejmazur/react-katex": ^3.1.3 - "@notionhq/client": ^2.3.0 - "@total-typescript/ts-reset": ^0.6.1 - "@types/lodash.throttle": ^4.1.6 - "@types/node": ^22.15.30 - "@types/prismjs": ^1.26.5 - "@types/react": ^19.1.6 - "@types/react-dom": ^19.1.6 - "@types/react-modal": ^3.16.3 + '@fisch0920/config': ^1.1.2 + '@fisch0920/eslint-config': ^1.4.0 + '@fisch0920/medium-zoom': ^1.0.7 + '@matejmazur/react-katex': ^3.1.3 + '@notionhq/client': ^2.3.0 + '@total-typescript/ts-reset': ^0.6.1 + '@types/lodash.throttle': ^4.1.6 + '@types/node': ^22.15.30 + '@types/prismjs': ^1.26.5 + '@types/react': ^19.1.8 + '@types/react-dom': ^19.1.6 + '@types/react-modal': ^3.16.3 bumpp: ^10.1.1 classnames: ^2.5.1 clipboard-copy: ^4.0.1 @@ -27,6 +25,7 @@ catalog: is-url-superb: ^6.1.0 katex: ^0.16.21 ky: ^1.8.1 + got: ^14.4.7 lodash.throttle: ^4.1.1 lqip-modern: ^2.1.0 memoize: ^10.1.0 @@ -53,3 +52,7 @@ catalog: turbo: ^2.5.4 typescript: ^5.8.3 vitest: ^3.2.2 +ignoredBuiltDependencies: + - '@fisch0920/config' +onlyBuiltDependencies: + - simple-git-hooks From 67e616512f0bad6ccc3ec38f2d7239a1fe0b9a0d Mon Sep 17 00:00:00 2001 From: terrorist Date: Fri, 27 Jun 2025 09:26:54 +0800 Subject: [PATCH 2/3] Fixes: notion-client: - ky pkg replaced with got --- examples/full/components/NotionPage.tsx | 4 +- examples/full/lib/notion.ts | 1 - examples/full/next.config.js | 26 +- examples/full/pages/_app.tsx | 2 +- package.json | 1 - packages/notion-client/package.json | 1 - packages/notion-client/tsup.config.ts | 2 +- packages/react-notion-x/package.json | 9 +- .../src/components/lazy-image-full.tsx | 429 ++++ .../src/components/lazy-image.tsx | 119 +- packages/react-notion-x/src/styles.css | 1943 ++++++----------- .../react-notion-x/src/third-party/pdf.tsx | 3 +- pnpm-lock.yaml | 435 ++-- pnpm-workspace.yaml | 3 +- 14 files changed, 1387 insertions(+), 1591 deletions(-) create mode 100644 packages/react-notion-x/src/components/lazy-image-full.tsx diff --git a/examples/full/components/NotionPage.tsx b/examples/full/components/NotionPage.tsx index c9350986..2c66646f 100644 --- a/examples/full/components/NotionPage.tsx +++ b/examples/full/components/NotionPage.tsx @@ -1,6 +1,6 @@ import dynamic from 'next/dynamic' import Head from 'next/head' -// import Image from 'next/image' +//import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' import { type ExtendedRecordMap } from 'notion-types' @@ -182,7 +182,7 @@ export function NotionPage({ previewImages={previewImagesEnabled} components={{ // NOTE (transitive-bullshit 3/12/2023): I'm disabling next/image for this repo for now because the amount of traffic started costing me hundreds of dollars a month in Vercel image optimization costs. I'll probably re-enable it in the future if I can find a better solution. - // nextLegacyImage: Image, + //nextImage: Image, nextLink: Link, Code, Collection, diff --git a/examples/full/lib/notion.ts b/examples/full/lib/notion.ts index 87da813a..6dafe25a 100644 --- a/examples/full/lib/notion.ts +++ b/examples/full/lib/notion.ts @@ -30,7 +30,6 @@ export async function getPage(pageId: string): Promise { return recordMap } - export async function search(params: SearchParams): Promise { if ('search' in notion) { return notion.search(params) diff --git a/examples/full/next.config.js b/examples/full/next.config.js index a7c8ca34..9623726b 100644 --- a/examples/full/next.config.js +++ b/examples/full/next.config.js @@ -1,14 +1,22 @@ -export default { - staticPageGenerationTimeout: 300, +/** @type {import('next').NextConfig} */ +const nextConfig = { + eslint: { + ignoreDuringBuilds: true + }, + typescript: { + ignoreBuildErrors: true + }, images: { - domains: [ - 'www.notion.so', - 'notion.so', - 'images.unsplash.com', - 'abs.twimg.com', - 'pbs.twimg.com', - 's3.us-west-2.amazonaws.com' + remotePatterns: [ + { protocol: 'https', hostname: 'www.notion.so' }, + { protocol: 'https', hostname: 'notion.so' }, + { protocol: 'https', hostname: 'images.unsplash.com' }, + { protocol: 'https', hostname: 'abs.twimg.com' }, + { protocol: 'https', hostname: 'pbs.twimg.com' }, + { protocol: 'https', hostname: 's3.us-west-2.amazonaws.com' } ], formats: ['image/avif', 'image/webp'] } } + +export default nextConfig diff --git a/examples/full/pages/_app.tsx b/examples/full/pages/_app.tsx index 7fe40ea9..62ff3729 100644 --- a/examples/full/pages/_app.tsx +++ b/examples/full/pages/_app.tsx @@ -3,7 +3,7 @@ import 'katex/dist/katex.min.css' // used for code syntax highlighting (optional) import 'prismjs/themes/prism-tomorrow.css' // core styles shared by all of react-notion-x (required) -//import 'react-notion-x/src/styles.css' +import 'react-notion-x/src/styles.css' // app styles import '../styles/globals.css' diff --git a/package.json b/package.json index e7321c37..e37cc911 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "bumpp": "catalog:", "del-cli": "catalog:", "eslint": "catalog:", - "got": "catalog:", "npm-run-all2": "catalog:", "prettier": "catalog:", "react": "catalog:", diff --git a/packages/notion-client/package.json b/packages/notion-client/package.json index e776428e..70d223d4 100644 --- a/packages/notion-client/package.json +++ b/packages/notion-client/package.json @@ -27,7 +27,6 @@ "test:unit": "vitest run" }, "dependencies": { - "ky": "catalog:", "got": "catalog:", "notion-types": "workspace:*", "notion-utils": "workspace:*", diff --git a/packages/notion-client/tsup.config.ts b/packages/notion-client/tsup.config.ts index 69c6c7dd..bd5caad7 100644 --- a/packages/notion-client/tsup.config.ts +++ b/packages/notion-client/tsup.config.ts @@ -8,7 +8,7 @@ export default defineConfig({ format: ['esm'], splitting: false, sourcemap: true, - minify: false, + minify: true, shims: false, dts: true }) diff --git a/packages/react-notion-x/package.json b/packages/react-notion-x/package.json index 83cb11f8..ea6c6f41 100644 --- a/packages/react-notion-x/package.json +++ b/packages/react-notion-x/package.json @@ -64,8 +64,9 @@ "react-fast-compare": "catalog:", "react-hotkeys-hook": "catalog:", "react-image": "catalog:", - "react-lazy-images": "catalog:", - "react-modal": "catalog:" + "react-intersection-observer": "catalog:", + "react-modal" : "catalog:", + "unionize" : "catalog:" }, "devDependencies": { "@types/lodash.throttle": "catalog:", @@ -78,13 +79,13 @@ "lodash.throttle": "catalog:", "react": "catalog:", "react-dom": "catalog:", - "react-pdf": "^9.1.1", "lightningcss": "catalog:" + "react-pdf": "^10.0.1" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalDependencies": { - "react-pdf": "^9.2.1" + "react-pdf": "^10.0.1" } } diff --git a/packages/react-notion-x/src/components/lazy-image-full.tsx b/packages/react-notion-x/src/components/lazy-image-full.tsx new file mode 100644 index 00000000..3c0b3838 --- /dev/null +++ b/packages/react-notion-x/src/components/lazy-image-full.tsx @@ -0,0 +1,429 @@ +//^^ Imported from https://github.com/fpapado/react-lazy-images/ +//^^ Edited by mustaqimarifin https://github.com/mustaqimarifin + +import { Component } from 'react' +import { InView } from 'react-intersection-observer' +import { ofType, unionize, type UnionOf } from 'unionize' + +/** + * Valid props for LazyImage components + */ +export type CommonLazyImageProps = ImageProps & { + // NOTE: if you add props here, remember to destructure them out of being + // passed to the children, in the render() callback. + + /** Whether to skip checking for viewport and always show the 'actual' component + * @see https://github.com/fpapado/react-lazy-images/#eager-loading--server-side-rendering-ssr + */ + loadEagerly?: boolean + + /** Subset of props for the IntersectionObserver + * @see https://github.com/thebuilder/react-intersection-observer#props + */ + observerProps?: ObserverProps + + /** Use the Image Decode API; + * The call to a new HTML element’s decode() function returns a promise, which, + * when fulfilled, ensures that the image can be appended to the DOM without causing + * a decoding delay on the next frame. + * @see: https://www.chromestatus.com/feature/5637156160667648 + */ + experimentalDecode?: boolean + + /** Whether to log out internal state transitions for the component */ + debugActions?: boolean + + /** Delay a certain duration before starting to load, in ms. + * This can help avoid loading images while the user scrolls quickly past them. + * TODO: naming things. + */ + debounceDurationMs?: number +} + +/** Valid props for LazyImageFull */ +export interface LazyImageFullProps extends CommonLazyImageProps { + /** Children should be either a function or a node */ + children: (args: RenderCallbackArgs) => React.ReactNode +} + +/** Values that the render props take */ +export interface RenderCallbackArgs { + imageState: ImageState + imageProps: ImageProps + /** When not loading eagerly, a ref to bind to the DOM element. This is needed for the intersection calculation to work. */ + ref?: React.RefObject | ((node?: Element | null) => void) +} + +export interface ImageProps { + /** The source of the image to load */ + src: string + + /** The source set of the image to load */ + srcSet?: string + + /** The alt text description of the image you are loading */ + alt?: string + + /** Sizes descriptor */ + sizes?: string +} + +/** Subset of react-intersection-observer's props */ +export interface ObserverProps { + /** + * Margin around the root that expands the area for intersection. + * @see https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/rootMargin + * @default "50px 0px" + * @example Declaration same as CSS margin: + * `"10px 20px 30px 40px"` (top, right, bottom, left). + */ + rootMargin?: string + + /** Number between 0 and 1 indicating the the percentage that should be + * visible before triggering. + * @default `0.01` + */ + threshold?: number +} + +/** States that the image loading can be in. + * Used together with LazyImageFull render props. + * External representation of the internal state. + * */ +export enum ImageState { + NotAsked = 'NotAsked', + Loading = 'Loading', + LoadSuccess = 'LoadSuccess', + LoadError = 'LoadError' +} + +/** The component's state */ +const LazyImageFullState = unionize({ + NotAsked: {}, + Buffering: {}, + // Could try to make it Promise, + // but we don't use the element anyway, and we cache promises + Loading: {}, + LoadSuccess: {}, + LoadError: ofType<{ msg: string }>() +}) + +type LazyImageFullState = UnionOf + +/** Actions that change the component's state. + * These are not unlike Actions in Redux or, the ones I'm inspired by, + * Msg in Elm. + */ +const Action = unionize({ + ViewChanged: ofType<{ inView: boolean }>(), + BufferingEnded: {}, + // MAYBE: Load: {}, + LoadSuccess: {}, + LoadError: ofType<{ msg: string }>() +}) + +type Action = UnionOf + +/** Commands (Cmd) describe side-effects as functions that take the instance */ +// FUTURE: These should be tied to giving back a Msg / asynchronoulsy giving a Msg with conditions +type Cmd = (instance: LazyImageFull) => void + +/** The output from a reducer is the next state and maybe a command */ +type ReducerResult = { + nextState: LazyImageFullState + cmd?: Cmd +} + +///// Commands, things that perform side-effects ///// +/** Get a command that sets a buffering Promise */ +const getBufferingCmd = + (durationMs: number): Cmd => + (instance) => { + // Make cancelable buffering Promise + const bufferingPromise = makeCancelable(delayedPromise(durationMs)) + + // Kick off promise chain + bufferingPromise.promise + .then(() => instance.update(Action.BufferingEnded())) + .catch( + (_err) => {} + //console.log({ isCanceled: _reason.isCanceled }) + ) + + // Side-effect; set the promise in the cache + instance.promiseCache.buffering = bufferingPromise + } + +/** Get a command that sets an image loading Promise */ +const getLoadingCmd = + (imageProps: ImageProps, experimentalDecode?: boolean): Cmd => + (instance) => { + // Make cancelable loading Promise + const loadingPromise = makeCancelable( + loadImage(imageProps, experimentalDecode) + ) + + // Kick off request for Image and attach listeners for response + loadingPromise.promise + .then((_res) => instance.update(Action.LoadSuccess({}))) + .catch((err) => { + // If the Loading Promise was canceled, it means we have stopped + // loading due to unmount, rather than an error. + if (!err.isCanceled) { + //@ts-expect-error No need for changing structure + instance.update(new Action.LoadError({ msg: 'LoadError' })) + } + }) + + // Side-effect; set the promise in the cache + instance.promiseCache.loading = loadingPromise + } + +/** Command that cancels the buffering Promise */ +const cancelBufferingCmd: Cmd = (instance) => { + // Side-effect; cancel the promise in the cache + // We know this exists if we are in a Buffering state + instance.promiseCache.buffering?.cancel() +} + +/** + * Component that preloads the image once it is in the viewport, + * and then swaps it in. Takes a render prop that allows to specify + * what is rendered based on the loading state. + */ +export class LazyImageFull extends Component< + LazyImageFullProps, + LazyImageFullState +> { + static displayName = 'LazyImageFull' + + /** A central place to store promises. + * A bit silly, but passing promises directly in the state + * was giving me weird timing issues. This way we can keep + * the promises in check, and pick them up from the respective methods. + * FUTURE: Could pass the relevant key in Buffering and Loading, so + * that at least we know where they are from a single source. + */ + promiseCache: { + [key: string]: CancelablePromise + } = {} + + initialState = LazyImageFullState.NotAsked() + + /** Emit the next state based on actions. + * This is the core of the component! + */ + static reducer( + action: Action, + prevState: LazyImageFullState, + props: LazyImageFullProps + ): ReducerResult { + return Action.match(action, { + ViewChanged: ({ inView }) => { + if (inView === true) { + // If src is not specified, then there is nothing to preload; skip to Loaded state + if (!props.src) { + return { nextState: LazyImageFullState.LoadSuccess() } // Error wtf + } else { + // If in view, only load something if NotAsked, otherwise leave untouched + return LazyImageFullState.match(prevState, { + NotAsked: () => { + // If debounce is specified, then start buffering + if (props.debounceDurationMs) { + return { + nextState: LazyImageFullState.Buffering(), + cmd: getBufferingCmd(props.debounceDurationMs) + } + } else { + // If no debounce is specified, then start loading immediately + return { + nextState: LazyImageFullState.Loading(), + cmd: getLoadingCmd(props, props.experimentalDecode) + } + } + }, + // Do nothing in other states + default: () => ({ nextState: prevState }) + }) + } + } else { + // If out of view, cancel if Buffering, otherwise leave untouched + return LazyImageFullState.match(prevState, { + Buffering: () => ({ + nextState: LazyImageFullState.NotAsked(), + cmd: cancelBufferingCmd + }), + // Do nothing in other states + default: () => ({ nextState: prevState }) + }) + } + }, + // Buffering has ended/succeeded, kick off request for image + BufferingEnded: () => ({ + nextState: LazyImageFullState.Loading(), + cmd: getLoadingCmd(props, props.experimentalDecode) + }), + // Loading the image succeeded, simple + LoadSuccess: () => ({ nextState: LazyImageFullState.LoadSuccess() }), + //@ts-expect-error No need for changing structure + LoadError: (e) => ({ nextState: new LazyImageFullState.LoadError(e) }) + }) + } + + constructor(props: LazyImageFullProps) { + super(props) + this.state = this.initialState + + // Bind methods + this.update = this.update.bind(this) + } + + update(action: Action) { + // Get the next state and any effects + const { nextState, cmd } = LazyImageFull.reducer( + action, + this.state, + this.props + ) + + // Debugging + if (this.props.debugActions) { + if (process.env.NODE_ENV === 'production') { + console.warn( + 'You are running LazyImage with debugActions="true" in production. This might have performance implications.' + ) + } + console.log({ action, prevState: this.state, nextState }) + } + + // Actually set the state, and kick off any effects after that + this.setState(nextState, () => cmd && cmd(this)) + } + + override componentWillUnmount() { + // Clear the Promise Cache + if (this.promiseCache.loading) { + // NOTE: This does not cancel the request, only the callback. + // We we would need fetch() and an AbortHandler for that. + this.promiseCache.loading.cancel() + } + if (this.promiseCache.buffering) { + this.promiseCache.buffering.cancel() + } + this.promiseCache = {} + } + + // Render function + override render() { + // This destructuring is silly + const { children, loadEagerly, observerProps, ...imageProps } = this.props + + if (loadEagerly) { + // If eager, skip the observer and view changing stuff; resolve the imageState as loaded. + return children({ + // We know that the state tags and the enum match up + imageState: LazyImageFullState.LoadSuccess().tag as ImageState, + imageProps + }) + } else { + return ( + + this.update(Action.ViewChanged({ inView })) + } + > + {({ ref }: RenderProps) => + children({ + // We know that the state tags and the enum match up, apart + // from Buffering not being exposed + imageState: + this.state.tag === 'Buffering' + ? ImageState.Loading + : (this.state.tag as ImageState), + imageProps, + ref + }) + } + + ) + } + } +} + +interface RenderProps { + inView: boolean + entry: IntersectionObserverEntry | undefined + ref: React.RefObject | ((node?: Element | null) => void) +} + +///// Utilities ///// + +/** Promise constructor for loading an image */ +const loadImage = ( + { src, srcSet, alt, sizes }: ImageProps, + experimentalDecode = false +) => + new Promise((resolve, reject) => { + const image = new Image() + if (srcSet) { + image.srcset = srcSet + } + if (alt) { + image.alt = alt + } + if (sizes) { + image.sizes = sizes + } + image.src = src + + /** @see: https://www.chromestatus.com/feature/5637156160667648 */ + if (experimentalDecode && 'decode' in image) { + return image + .decode() + .then(() => resolve(image)) + .catch((err: any) => reject(err)) + } + + image.addEventListener('load', resolve) + image.addEventListener = reject + }) + +/** Promise that resolves after a specified number of ms */ +const delayedPromise = (ms: number) => + new Promise((resolve) => setTimeout(resolve, ms)) + +interface CancelablePromise { + promise: Promise + cancel: () => void +} + +/** Make a Promise "cancelable". + * + * Rejects with {isCanceled: true} if canceled. + * + * The way this works is by wrapping it with internal hasCanceled_ state + * and checking it before resolving. + */ +const makeCancelable = (promise: Promise): CancelablePromise => { + let hasCanceled_ = false + + const wrappedPromise = new Promise((resolve, reject) => { + void promise.then((val: any) => + hasCanceled_ ? reject({ isCanceled: true }) : resolve(val) + ) + promise.catch((err: any) => + hasCanceled_ ? reject({ isCanceled: true }) : reject(err) + ) + }) + + return { + promise: wrappedPromise, + cancel() { + hasCanceled_ = true + } + } +} diff --git a/packages/react-notion-x/src/components/lazy-image.tsx b/packages/react-notion-x/src/components/lazy-image.tsx index 768b2717..b2d8209a 100644 --- a/packages/react-notion-x/src/components/lazy-image.tsx +++ b/packages/react-notion-x/src/components/lazy-image.tsx @@ -3,6 +3,7 @@ import React from 'react' import { useNotionContext } from '../context' import { cs } from '../utils' +import { ImageState, LazyImageFull } from './lazy-image-full' /** * Progressive, lazy images modeled after Medium's LQIP technique. @@ -58,23 +59,6 @@ export function LazyImage({ [zoomable, attachZoom] ) - const [isLazyLoaded, setIsLazyLoaded] = React.useState(false) - const onLoadLazy = React.useCallback(() => { - setIsLazyLoaded(true) - }, []) - - const lazyImageRef = React.useCallback( - (image: HTMLImageElement) => { - attachZoomRef?.(image) - - // if the image is cached, we can trigger the onLoadLazy immediately - if (image.complete) { - onLoadLazy() - } - }, - [attachZoomRef, onLoadLazy] - ) - if (previewImage) { const aspectRatio = previewImage.originalHeight / previewImage.originalWidth @@ -97,54 +81,59 @@ export function LazyImage({ ) } - return (() => { - const wrapperStyle: React.CSSProperties = { - width: '100%' - } - const imgStyle: React.CSSProperties = {} - - if (height) { - wrapperStyle.height = height - } else { - imgStyle.position = 'absolute' - wrapperStyle.paddingBottom = `${aspectRatio * 100}%` - } - - return ( -
- {alt} - - {alt} -
- ) - })() + return ( + + {({ imageState, ref }) => { + const isLoaded = imageState === ImageState.LoadSuccess + const wrapperStyle: React.CSSProperties = { + width: '100%' + } + const imgStyle: React.CSSProperties = {} + + if (height) { + wrapperStyle.height = height + } else { + imgStyle.position = 'absolute' + wrapperStyle.paddingBottom = `${aspectRatio * 100}%` + } + + return ( +
+ {alt} + + {alt} +
+ ) + }} +
+ ) } else { // TODO: GracefulImage doesn't seem to support refs, but we'd like to prevent // invalid images from loading as error states diff --git a/packages/react-notion-x/src/styles.css b/packages/react-notion-x/src/styles.css index 0adb2c79..82e1c352 100644 --- a/packages/react-notion-x/src/styles.css +++ b/packages/react-notion-x/src/styles.css @@ -1,213 +1,183 @@ :root { - --notion-font: ui-sans-serif, system-ui, apple-system, BlinkMacSystemFont, - 'Segoe UI', Helvetica, 'Apple Color Emoji', Arial, sans-serif, - 'Segoe UI Emoji', 'Segoe UI Symbol'; - --fg-color: oklch(33% 0 92); - --fg-color-0: oklch(33% 0 92 / 0.1); - --fg-color-1: oklch(33% 0 92 / 0.2); - --fg-color-2: oklch(33% 0 92 / 0.4); - --fg-color-3: oklch(33% 0 92 / 0.6); - --fg-color-4: oklch(0% 0 0); - --fg-color-5: oklch(33% 0 92 / 0); - --fg-color-6: oklch(33% 0 92 / 0.8); - --fg-color-7: oklch(33% 0 92 / 0.5); + --notion-font: ui-sans-serif,system-ui,apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,'Apple Color Emoji',Arial,sans-serif,'Segoe UI Emoji','Segoe UI Symbol'; + --fg-color: rgb(55, 53, 47); + --fg-color-0: rgba(55, 53, 47, 0.09); + --fg-color-1: rgba(55, 53, 47, 0.16); + --fg-color-2: rgba(55, 53, 47, 0.4); + --fg-color-3: rgba(55, 53, 47, 0.6); + --fg-color-4: #000; + --fg-color-5: rgba(55, 53, 47, 0.024); + --fg-color-6: rgba(55, 53, 47, 0.8); + --fg-color-7: rgba(55, 53, 47, 0.5); --fg-color-icon: var(--fg-color); - - --bg-color: oklch(100% 0 0); - --bg-color-0: oklch(61% 0 90 / 0.1); - --bg-color-1: oklch(97% 0 91); - --bg-color-2: oklch(61% 0 90 / 0.1); - - --select-color-0: oklch(69% 0.1 230); - --select-color-1: oklch(69% 0.1 230 / 0.3); - --select-color-2: oklch(94% 0 220); - - --notion-red: oklch(61% 0.2 25); - --notion-pink: oklch(50% 0.2 350); - --notion-blue: oklch(51% 0.1 240); - --notion-purple: oklch(47% 0.2 300); - --notion-teal: oklch(48% 0 190); - --notion-yellow: oklch(77% 0.2 87); - --notion-orange: oklch(66% 0.2 56); - --notion-brown: oklch(43% 0 45); - --notion-gray: oklch(69% 0 91); - - --notion-red_background: oklch(94% 0 18); - --notion-pink_background: oklch(92% 0 340); - --notion-blue_background: oklch(93% 0 230); - --notion-purple_background: oklch(93% 0 310); - --notion-teal_background: oklch(93% 0 180); - --notion-yellow_background: oklch(96% 0 92); - --notion-orange_background: oklch(95% 0 66); - --notion-brown_background: oklch(92% 0 49); - --notion-gray_background: oklch(94% 0 250); - - --notion-red_background_co: oklch(94% 0 18 / 0.3); - --notion-pink_background_co: oklch(92% 0 340 / 0.3); - --notion-blue_background_co: oklch(93% 0 230 / 0.3); - --notion-purple_background_co: oklch(93% 0 310 / 0.3); - --notion-teal_background_co: oklch(93% 0 180 / 0.3); - --notion-yellow_background_co: oklch(96% 0 92 / 0.3); - --notion-orange_background_co: oklch(95% 0 66 / 0.3); - --notion-brown_background_co: oklch(92% 0 49 / 0.3); - --notion-gray_background_co: oklch(94% 0 250 / 0.3); - - --notion-item-blue: oklch(91% 0 230); - --notion-item-orange: oklch(92% 0 59); - --notion-item-green: oklch(93% 0 150); - --notion-item-pink: oklch(93% 0 350); - --notion-item-brown: oklch(92% 0 45); - --notion-item-red: oklch(94% 0 29); - --notion-item-yellow: oklch(95% 0.1 86); - --notion-item-default: oklch(91% 0 85 / 0.5); - --notion-item-purple: oklch(91% 0 310); - --notion-item-gray: oklch(91% 0 85); - - --notion-item-text-blue: oklch(31% 0 240); - --notion-item-text-orange: oklch(32% 0.1 58); - --notion-item-text-green: oklch(31% 0 160); - --notion-item-text-pink: oklch(32% 0.1 350); - --notion-item-text-brown: oklch(31% 0 45); - --notion-item-text-red: oklch(32% 0.1 26); - --notion-item-text-yellow: oklch(31% 0 61); - --notion-item-text-default: oklch(31% 0 85); - --notion-item-text-purple: oklch(32% 0.1 310); - --notion-item-text-gray: oklch(31% 0 85); - - --notion-item-bullet-blue: oklch(65% 0.1 240); - --notion-item-bullet-orange: oklch(68% 0.1 57); - --notion-item-bullet-green: oklch(65% 0.1 160); - --notion-item-bullet-pink: oklch(67% 0.1 350); - --notion-item-bullet-brown: oklch(66% 0.1 44); - --notion-item-bullet-red: oklch(67% 0.1 27); - --notion-item-bullet-yellow: oklch(70% 0.1 78); - --notion-item-bullet-default: oklch(65% 0.1 240); - --notion-item-bullet-purple: oklch(67% 0.1 310); - --notion-item-bullet-gray: oklch(66% 0 110); - + --bg-color: #fff; + --bg-color-0: rgba(135, 131, 120, 0.15); + --bg-color-1: rgb(247, 246, 243); + --bg-color-2: rgba(135, 131, 120, 0.15); + --select-color-0: rgb(46, 170, 220); + --select-color-1: rgba(45, 170, 219, 0.3); + --select-color-2: #d9eff8; + --notion-red: rgb(224, 62, 62); + --notion-pink: rgb(173, 26, 114); + --notion-blue: rgb(11, 110, 153); + --notion-purple: rgb(105, 64, 165); + --notion-teal: rgb(77, 100, 97); + --notion-yellow: rgb(223, 171, 1); + --notion-orange: rgb(217, 115, 13); + --notion-brown: rgb(100, 71, 58); + --notion-gray: rgb(155, 154, 151); + --notion-red_background: rgb(251, 228, 228); + --notion-pink_background: rgb(244, 223, 235); + --notion-blue_background: rgb(221, 235, 241); + --notion-purple_background: rgb(234, 228, 242); + --notion-teal_background: rgb(221, 237, 234); + --notion-yellow_background: rgb(251, 243, 219); + --notion-orange_background: rgb(250, 235, 221); + --notion-brown_background: rgb(233, 229, 227); + --notion-gray_background: rgb(235, 236, 237); + --notion-red_background_co: rgba(251, 228, 228, 0.3); + --notion-pink_background_co: rgba(244, 223, 235, 0.3); + --notion-blue_background_co: rgba(221, 235, 241, 0.3); + --notion-purple_background_co: rgba(234, 228, 242, 0.3); + --notion-teal_background_co: rgba(221, 237, 234, 0.3); + --notion-yellow_background_co: rgba(251, 243, 219, 0.3); + --notion-orange_background_co: rgba(250, 235, 221, 0.3); + --notion-brown_background_co: rgba(233, 229, 227, 0.3); + --notion-gray_background_co: rgba(235, 236, 237, 0.3); + --notion-item-blue: rgb(211, 229, 239); + --notion-item-orange: rgb(250, 222, 201); + --notion-item-green: rgb(219, 237, 219); + --notion-item-pink: rgb(245, 224, 233); + --notion-item-brown: rgb(238, 224, 218); + --notion-item-red: rgb(255, 226, 221); + --notion-item-yellow: rgb(253, 236, 200); + --notion-item-default: rgba(227, 226, 224, 0.5); + --notion-item-purple: rgb(232, 222, 238); + --notion-item-gray: rgb(227, 226, 224); + --notion-item-text-blue: rgb(24, 51, 71); + --notion-item-text-orange: rgb(73, 41, 14); + --notion-item-text-green: rgb(28, 56, 41); + --notion-item-text-pink: rgb(76, 35, 55); + --notion-item-text-brown: rgb(68, 42, 30); + --notion-item-text-red: rgb(93, 23, 21); + --notion-item-text-yellow: rgb(64, 44, 27); + --notion-item-text-default: rgb(50, 48, 44); + --notion-item-text-purple: rgb(65, 36, 84); + --notion-item-text-gray: rgb(50, 48, 44); + --notion-item-bullet-blue: rgb(91, 151, 189); + --notion-item-bullet-orange: rgb(215, 129, 58); + --notion-item-bullet-green: rgb(108, 155, 125); + --notion-item-bullet-pink: rgb(205, 116, 159); + --notion-item-bullet-brown: rgb(187, 132, 108); + --notion-item-bullet-red: rgb(225, 111, 100); + --notion-item-bullet-yellow: rgb(203, 148, 51); + --notion-item-bullet-default: rgb(91, 151, 189); + --notion-item-bullet-purple: rgb(167, 130, 195); + --notion-item-bullet-gray: rgb(145, 145, 142); --notion-max-width: 720px; - --notion-header-height: 45px; + --notion-header-height: 45px } - .dark-mode { - --fg-color: oklch(100% 0 0 / 0.9); + --fg-color: rgba(255, 255, 255, 0.9); --fg-color-0: var(--fg-color); --fg-color-1: var(--fg-color); --fg-color-2: var(--fg-color); --fg-color-3: var(--fg-color); --fg-color-4: var(--fg-color); - --fg-color-5: oklch(100% 0 0 / 0.7); - --fg-color-6: oklch(100% 0 0); - --fg-color-icon: oklch(100% 0 0); - - --bg-color: oklch(32% 0 230); - --bg-color-0: oklch(41% 0 240); - --bg-color-1: oklch(38% 0 230); - --bg-color-2: oklch(61% 0 90 / 0.1); - - --notion-red: oklch(72% 0.2 26); - --notion-pink: oklch(66% 0.2 350); - --notion-blue: oklch(66% 0.1 240); - --notion-purple: oklch(63% 0.2 300); - --notion-teal: oklch(68% 0.1 180); - --notion-yellow: oklch(90% 0.2 95); - --notion-orange: oklch(79% 0.2 63); - --notion-brown: oklch(58% 0 44); - --notion-gray: oklch(68% 0 220 / 0.9); - --notion-red_background: oklch(40% 0 19); - --notion-pink_background: oklch(39% 0 340); - --notion-blue_background: oklch(39% 0 230); - --notion-purple_background: oklch(38% 0 290); - --notion-teal_background: oklch(40% 0 190); - --notion-yellow_background: oklch(45% 0 100); - --notion-orange_background: oklch(42% 0 69); - --notion-brown_background: oklch(37% 0 17); - --notion-gray_background: oklch(41% 0 230); - --notion-red_background_co: oklch(40% 0 19 / 0.3); - --notion-pink_background_co: oklch(39% 0 340 / 0.3); - --notion-blue_background_co: oklch(69% 0.1 230 / 0.3); - --notion-purple_background_co: oklch(38% 0 290 / 0.3); - --notion-teal_background_co: oklch(40% 0 190 / 0.3); - --notion-yellow_background_co: oklch(45% 0 100 / 0.3); - --notion-orange_background_co: oklch(42% 0 69 / 0.3); - --notion-brown_background_co: oklch(37% 0 17 / 0.3); - --notion-gray_background_co: oklch(41% 0 230 / 0.3); -} - + --fg-color-5: rgba(255, 255, 255, 0.7); + --fg-color-6: #fff; + --fg-color-icon: #fff; + --bg-color: #2f3437; + --bg-color-0: rgb(71, 76, 80); + --bg-color-1: rgb(63, 68, 71); + --bg-color-2: rgba(135, 131, 120, 0.15); + --notion-red: rgb(255, 115, 105); + --notion-pink: rgb(226, 85, 161); + --notion-blue: rgb(82, 156, 202); + --notion-purple: rgb(154, 109, 215); + --notion-teal: rgb(77, 171, 154); + --notion-yellow: rgb(255, 220, 73); + --notion-orange: rgb(255, 163, 68); + --notion-brown: rgb(147, 114, 100); + --notion-gray: rgba(151, 154, 155, 0.95); + --notion-red_background: rgb(89, 65, 65); + --notion-pink_background: rgb(83, 59, 76); + --notion-blue_background: rgb(54, 73, 84); + --notion-purple_background: rgb(68, 63, 87); + --notion-teal_background: rgb(53, 76, 75); + --notion-yellow_background: rgb(89, 86, 59); + --notion-orange_background: rgb(89, 74, 58); + --notion-brown_background: rgb(67, 64, 64); + --notion-gray_background: rgb(69, 75, 78); + --notion-red_background_co: rgba(89, 65, 65, 0.3); + --notion-pink_background_co: rgba(83, 59, 76, 0.3); + --notion-blue_background_co: rgba(120, 162, 187, 0.3); + --notion-purple_background_co: rgba(68, 63, 87, 0.3); + --notion-teal_background_co: rgba(53, 76, 75, 0.3); + --notion-yellow_background_co: rgba(89, 86, 59, 0.3); + --notion-orange_background_co: rgba(89, 74, 58, 0.3); + --notion-brown_background_co: rgba(67, 64, 64, 0.3); + --notion-gray_background_co: rgba(69, 75, 78, 0.3) +} .notion * { - box-sizing: border-box; + box-sizing: border-box } - .notion { font-size: 16px; line-height: 1.5; color: var(--fg-color); caret-color: var(--fg-color); - font-family: var(--notion-font); + font-family: var(--notion-font) } - .notion > * { - padding: 3px 0; + padding: 3px 0 } - .notion * { margin-block-start: 0; - margin-block-end: 0; + margin-block-end: 0 } - -.notion *::selection { - background: var(--select-color-1); +.notion ::selection { + background: var(--select-color-1) } - .notion *, -.notion *:focus { - outline: 0; +.notion :focus { + outline: 0 } - .notion-page-content { width: 100%; display: flex; - flex-direction: column; + flex-direction: column } - -@media (min-width: 1300px) and (min-height: 300px) { +@media (min-width:1300px) and (min-height:300px) { .notion-page-content-has-aside { display: flex; flex-direction: row; - width: calc((100vw + var(--notion-max-width)) / 2); + width: calc((100vw + var(--notion-max-width))/ 2) } - .notion-page-content-has-aside .notion-aside { - display: flex; + display: flex } - .notion-page-content-has-aside .notion-page-content-inner { width: var(--notion-max-width); - max-width: var(--notion-max-width); + max-width: var(--notion-max-width) } } - .notion-page-content-inner { position: relative; display: flex; flex-direction: column; - align-items: flex-start; + align-items: flex-start } - .notion-aside { position: sticky; top: 148px; z-index: 101; - /* top: calc((100vh - 48px - 100%) / 2); */ - align-self: flex-start; flex: 1; - display: none; flex-direction: column; - align-items: center; + align-items: center } - .notion-aside-table-of-contents { display: flex; flex-direction: column; @@ -216,350 +186,311 @@ min-width: 222px; overflow: auto; background: var(--bg-color); - border-radius: 4px; + border-radius: 4px } - .notion-aside-table-of-contents-header { text-transform: uppercase; font-weight: 400; font-size: 1.1em; - word-break: break-word; + word-break: break-word } - .notion-aside-table-of-contents .notion-table-of-contents-item { - line-height: 1; + line-height: 1 } - -.notion-aside-table-of-contents - .notion-table-of-contents-item-indent-level-0:first-of-type { - margin-top: 0; +.notion-aside-table-of-contents .notion-table-of-contents-item-indent-level-0:first-of-type { + margin-top: 0 } - .notion-aside-table-of-contents .notion-table-of-contents-item-indent-level-0 { - margin-top: 0.25em; + margin-top: .25em } - .notion-aside-table-of-contents .notion-table-of-contents-item-indent-level-1 { - font-size: 13px; + font-size: 13px } - .notion-aside-table-of-contents .notion-table-of-contents-item-indent-level-2 { - font-size: 12px; + font-size: 12px } - .notion-aside-table-of-contents .notion-table-of-contents-item-body { - border: 0 none; + border: 0 none } - .notion-table-of-contents-active-item { - color: var(--select-color-0) !important; + color: var(--select-color-0)!important } - .notion-app { position: relative; background: var(--bg-color); - min-height: 100vh; + min-height: 100vh } - .notion-viewport { position: relative; - padding: 0px; + padding: 0; top: 0; left: 0; right: 0; - bottom: 0; + bottom: 0 } - .medium-zoom-overlay { - z-index: 300; + z-index: 300 } - .medium-zoom-image { - border-radius: 0; + border-radius: 0 } - .medium-zoom-image--opened { - margin: unset !important; - min-width: unset !important; - min-height: unset !important; - z-index: 301; + margin: unset!important; + min-width: unset!important; + min-height: unset!important; + z-index: 301 } - .notion-frame { display: flex; flex-direction: column; width: 100%; height: 100%; - padding: 0; + padding: 0 } - .notion-page-scroller { position: relative; display: flex; flex-direction: column; flex-grow: 1; align-items: center; - min-height: calc(100vh - var(--notion-header-height)); + min-height: calc(100vh - var(--notion-header-height)) } - .notion-red, .notion-red_co { - color: var(--notion-red); + color: var(--notion-red) } .notion-pink, .notion-pink_co { - color: var(--notion-pink); + color: var(--notion-pink) } .notion-blue, .notion-blue_co { - color: var(--notion-blue); + color: var(--notion-blue) } .notion-purple, .notion-purple_co { - color: var(--notion-purple); + color: var(--notion-purple) } .notion-teal, .notion-teal_co { - color: var(--notion-teal); + color: var(--notion-teal) } .notion-yellow, .notion-yellow_co { - color: var(--notion-yellow); + color: var(--notion-yellow) } .notion-orange, .notion-orange_co { - color: var(--notion-orange); + color: var(--notion-orange) } .notion-brown, .notion-brown_co { - color: var(--notion-brown); + color: var(--notion-brown) } .notion-gray, .notion-gray_co { - color: var(--notion-gray); + color: var(--notion-gray) } .notion-red_background { - background-color: var(--notion-red_background); + background-color: var(--notion-red_background) } .notion-pink_background { - background-color: var(--notion-pink_background); + background-color: var(--notion-pink_background) } .notion-blue_background { - background-color: var(--notion-blue_background); + background-color: var(--notion-blue_background) } .notion-purple_background { - background-color: var(--notion-purple_background); + background-color: var(--notion-purple_background) } .notion-teal_background { - background-color: var(--notion-teal_background); + background-color: var(--notion-teal_background) } .notion-yellow_background { - background-color: var(--notion-yellow_background); + background-color: var(--notion-yellow_background) } .notion-orange_background { - background-color: var(--notion-orange_background); + background-color: var(--notion-orange_background) } .notion-brown_background { - background-color: var(--notion-brown_background); + background-color: var(--notion-brown_background) } .notion-gray_background { - background-color: var(--notion-gray_background); + background-color: var(--notion-gray_background) } .notion-red_background_co { - background-color: var(--notion-red_background_co); + background-color: var(--notion-red_background_co) } .notion-pink_background_co { - background-color: var(--notion-pink_background_co); + background-color: var(--notion-pink_background_co) } .notion-blue_background_co { - background-color: var(--notion-blue_background_co); + background-color: var(--notion-blue_background_co) } .notion-purple_background_co { - background-color: var(--notion-purple_background_co); + background-color: var(--notion-purple_background_co) } .notion-teal_background_co { - background-color: var(--notion-teal_background_co); + background-color: var(--notion-teal_background_co) } .notion-yellow_background_co { - background-color: var(--notion-yellow_background_co); + background-color: var(--notion-yellow_background_co) } .notion-orange_background_co { - background-color: var(--notion-orange_background_co); + background-color: var(--notion-orange_background_co) } .notion-brown_background_co { - background-color: var(--notion-brown_background_co); + background-color: var(--notion-brown_background_co) } .notion-gray_background_co { - background-color: var(--notion-gray_background_co); + background-color: var(--notion-gray_background_co) } - .notion-item-blue { background-color: var(--notion-item-blue); - color: var(--notion-item-text-blue); + color: var(--notion-item-text-blue) } .notion-item-orange { background-color: var(--notion-item-orange); - color: var(--notion-item-text-orange); + color: var(--notion-item-text-orange) } .notion-item-green { background-color: var(--notion-item-green); - color: var(--notion-item-text-green); + color: var(--notion-item-text-green) } .notion-item-pink { background-color: var(--notion-item-pink); - color: var(--notion-item-text-pink); + color: var(--notion-item-text-pink) } .notion-item-brown { background-color: var(--notion-item-brown); - color: var(--notion-item-text-brown); + color: var(--notion-item-text-brown) } .notion-item-red { background-color: var(--notion-item-red); - color: var(--notion-item-text-red); + color: var(--notion-item-text-red) } .notion-item-yellow { background-color: var(--notion-item-yellow); - color: var(--notion-item-text-yellow); + color: var(--notion-item-text-yellow) } .notion-item-default, .notion-item-default-inferred { background-color: var(--notion-item-default); - color: var(--notion-item-text-default); + color: var(--notion-item-text-default) } .notion-item-purple { background-color: var(--notion-item-purple); - color: var(--notion-item-text-purple); + color: var(--notion-item-text-purple) } .notion-item-gray { background-color: var(--notion-item-gray); - color: var(--notion-item-text-gray); + color: var(--notion-item-text-gray) } - .notion-item-bullet-blue { - background-color: var(--notion-item-bullet-blue); + background-color: var(--notion-item-bullet-blue) } .notion-item-bullet-orange { - background-color: var(--notion-item-bullet-orange); + background-color: var(--notion-item-bullet-orange) } .notion-item-bullet-green { - background-color: var(--notion-item-bullet-green); + background-color: var(--notion-item-bullet-green) } .notion-item-bullet-pink { - background-color: var(--notion-item-bullet-pink); + background-color: var(--notion-item-bullet-pink) } .notion-item-bullet-brown { - background-color: var(--notion-item-bullet-brown); + background-color: var(--notion-item-bullet-brown) } .notion-item-bullet-red { - background-color: var(--notion-item-bullet-red); + background-color: var(--notion-item-bullet-red) } .notion-item-bullet-yellow { - background-color: var(--notion-item-bullet-yellow); + background-color: var(--notion-item-bullet-yellow) } .notion-item-bullet-default { - background-color: var(--notion-item-bullet-default); + background-color: var(--notion-item-bullet-default) } .notion-item-bullet-default-inferred { - background-color: var(--notion-item-bullet-gray); + background-color: var(--notion-item-bullet-gray) } .notion-item-bullet-purple { - background-color: var(--notion-item-bullet-purple); + background-color: var(--notion-item-bullet-purple) } .notion-item-bullet-gray { - background-color: var(--notion-item-bullet-gray); + background-color: var(--notion-item-bullet-gray) } - .notion b { - font-weight: 600; + font-weight: 600 } - .notion-title { width: 100%; font-size: 2.5em; font-weight: 600; margin-bottom: 20px; - line-height: 1.2; + line-height: 1.2 } - .notion-h { position: relative; display: inline; - font-weight: 600; line-height: 1.3; padding: 3px 2px; margin-bottom: 1px; - max-width: 100%; white-space: pre-wrap; - word-break: break-word; + word-break: break-word } - .notion-h1 { font-size: 1.875em; - margin-top: 1.08em; + margin-top: 1.08em } - .notion-header-anchor { position: absolute; top: -54px; - left: 0; + left: 0 } - .notion-title + .notion-h1, .notion-title + .notion-h2, .notion-title + .notion-h3 { - margin-top: 0; + margin-top: 0 } -/* TODO: notion-page-content */ .notion-h1:first-child { - margin-top: 0; + margin-top: 0 } -/* .notion-h1:first-of-type { - margin-top: 2px; -} */ .notion-h2 { font-size: 1.5em; - margin-top: 1.1em; + margin-top: 1.1em } .notion-h3 { font-size: 1.25em; - margin-top: 1em; + margin-top: 1em } - .notion-h:hover .notion-hash-link { - opacity: 1; + opacity: 1 } - -/* Add specific styles for headings in sync blocks */ .notion-sync-block .notion-h { - display: block; + display: block } - -/* Preserve original styles for toggle headings */ details.notion-toggle .notion-h { - display: inline; + display: inline } - .notion-hash-link { opacity: 0; text-decoration: none; float: left; margin-left: -20px; padding-right: 4px; - fill: var(--fg-color-icon); + fill: var(--fg-color-icon) } - .notion-page-cover { display: block; object-fit: cover; width: 100%; - height: 30vh !important; - min-height: 30vh !important; - max-height: 30vh !important; - padding: 0; + height: 30vh!important; + min-height: 30vh!important; + max-height: 30vh!important; + padding: 0 } - .notion-page-cover-wrapper { width: 100%; height: 30vh; @@ -567,27 +498,23 @@ details.notion-toggle .notion-h { max-height: 30vh; display: flex; justify-content: center; - align-items: center; + align-items: center } - .notion-collection-card-cover { - overflow: hidden; + overflow: hidden +} +.notion-collection-card-cover img, +.notion-collection-card-cover span { + min-height: 100%!important; + max-height: 100%!important +} +.notion-page-cover-wrapper img, +.notion-page-cover-wrapper span { + width: 100%!important; + height: 30vh!important; + min-height: 30vh!important; + max-height: 30vh!important } - -.notion-collection-card-cover span, -.notion-collection-card-cover img { - min-height: 100% !important; - max-height: 100% !important; -} - -.notion-page-cover-wrapper span, -.notion-page-cover-wrapper img { - width: 100% !important; - height: 30vh !important; - min-height: 30vh !important; - max-height: 30vh !important; -} - .notion-page { position: relative; padding: 0; @@ -598,197 +525,162 @@ details.notion-toggle .notion-h { flex-shrink: 0; align-items: flex-start; width: 100%; - max-width: 100%; + max-width: 100% } - .notion-full-page { - padding-bottom: calc(max(10vh, 120px)); + padding-bottom: calc(max(10vh,120px)) } - .notion-page-no-cover { - margin-top: 48px !important; - padding-top: 96px; + margin-top: 48px!important; + padding-top: 96px } - .notion-page-no-cover.notion-page-no-icon { - padding-top: 0; + padding-top: 0 } - .notion-page-no-cover.notion-page-has-image-icon { - padding-top: 148px; + padding-top: 148px } - .notion-page-has-cover.notion-page-no-icon { - padding-top: 48px; + padding-top: 48px } - .notion-page-has-cover { - padding-top: 96px; + padding-top: 96px } - .notion-page-has-cover.notion-page-has-icon.notion-page-has-text-icon { - padding-top: 64px; + padding-top: 64px } - .notion-page-icon-hero { position: absolute; top: 0; left: 50%; display: flex; flex-direction: row; - justify-content: center; + justify-content: center } - .notion-page-icon-hero.notion-page-icon-image { width: 124px; height: 124px; - margin-left: -62px; + margin-left: -62px } - .notion-page-icon-hero.notion-page-icon-span { height: 78px; width: 78px; - margin-left: -39px; + margin-left: -39px } - .notion-page-icon-hero .notion-page-icon { position: relative; - display: block; + display: block } - .notion-page-has-cover .notion-page-icon-hero.notion-page-icon-image { - top: -62px; + top: -62px } - .notion-page-has-cover .notion-page-icon-hero.notion-page-icon-span { - top: -42px; + top: -42px } - .notion-page-icon-hero.notion-page-icon-span .notion-page-icon { font-size: 78px; line-height: 1.1; margin-left: 0; - color: var(--fg-color-icon); + color: var(--fg-color-icon) } - .notion-page-icon-hero.notion-page-icon-image .notion-page-icon { display: block; border-radius: 3px; width: 100%; height: 100%; max-width: 100%; - max-height: 100%; + max-height: 100% } - .notion-page-icon-hero.notion-page-icon-image img { - object-fit: cover; + object-fit: cover } - .notion-page-icon { - font-family: 'Apple Color Emoji', 'Segoe UI Emoji', NotoColorEmoji, - 'Noto Color Emoji', 'Segoe UI Symbol', 'Android Emoji', EmojiSymbols; + font-family: 'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Noto Color Emoji','Segoe UI Symbol','Android Emoji',EmojiSymbols; font-size: 1.1em; fill: var(--fg-color-6); - color: var(--fg-color-icon); + color: var(--fg-color-icon) } - .notion-search .notion-page-icon { fill: var(--fg-color-6); - color: var(--fg-color); + color: var(--fg-color) } - img.notion-page-icon, svg.notion-page-icon { display: block; object-fit: fill; border-radius: 3px; max-width: 100%; - max-height: 100%; + max-height: 100% } - .notion-page-icon-inline { width: 22px; height: 22px; max-width: 22px; max-height: 22px; - margin: 0 4px; + margin: 0 4px } - .notion-page-icon-inline span { max-width: 100%; - max-height: 100%; + max-height: 100% } - .notion-page-icon-inline img { - object-fit: cover; + object-fit: cover } - .notion-page { box-sizing: border-box; width: var(--notion-max-width); - padding-left: calc(min(16px, 8vw)); - padding-right: calc(min(16px, 8vw)); + padding-left: calc(min(16px,8vw)); + padding-right: calc(min(16px,8vw)) } - .notion-full-width { box-sizing: border-box; --notion-max-width: calc(min(1920px, 98vw)); - padding-left: calc(min(96px, 8vw)); - padding-right: calc(min(96px, 8vw)); + padding-left: calc(min(96px,8vw)); + padding-right: calc(min(96px,8vw)) } - .notion-small-text { - font-size: 14px; + font-size: 14px } - .notion-quote { display: block; width: 100%; white-space: pre-wrap; word-break: break-word; border-left: 3px solid currentcolor; - padding: 0.2em 0.9em; + padding: .2em .9em; margin: 6px 0; - font-size: 1.2em; + font-size: 1.2em } - .notion-hr { width: 100%; margin: 6px 0; padding: 0; border: none; - border-bottom: 1px solid var(--bg-color-0); + border-bottom: 1px solid var(--bg-color-0) } - .notion-link { color: inherit; word-break: break-word; text-decoration: inherit; - border-bottom: 0.05em solid; + border-bottom: .05em solid; border-color: var(--fg-color-2); - opacity: 0.7; - transition: - border-color 100ms ease-in, - opacity 100ms ease-in; + opacity: .7; + transition: border-color .1s ease-in,opacity .1s ease-in } - .notion-link:hover { border-color: var(--fg-color-6); - opacity: 1; + opacity: 1 } - .notion-collection .notion-link { - opacity: 1; + opacity: 1 } - .notion-blank { width: 100%; min-height: 1rem; padding: 3px 2px; margin-top: 1px; - margin-bottom: 1px; + margin-bottom: 1px } - .notion-page-link { display: flex; color: var(--fg-color); @@ -796,29 +688,25 @@ svg.notion-page-icon { width: 100%; height: 30px; margin: 1px 0; - transition: background 120ms ease-in 0s; + transition: background 120ms ease-in 0s } - .notion-page-link:hover { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-collection-card .notion-page-link { height: unset; margin: 0; - transition: unset; + transition: unset } .notion-collection-card .notion-page-link { - background: unset; + background: unset } - .notion-icon { display: block; width: 18px; height: 18px; - color: var(--fg-color-icon); + color: var(--fg-color-icon) } - .notion-page-text { white-space: nowrap; overflow: hidden; @@ -826,105 +714,87 @@ svg.notion-page-icon { font-weight: 500; line-height: 1.3; border-bottom: 1px solid var(--fg-color-1); - margin: 4px 0; + margin: 4px 0 } - .notion-inline-code { - color: oklch(65% 0.2 24); - padding: 0.2em 0.4em; + color: #eb5757; + padding: .2em .4em; background: var(--bg-color-2); border-radius: 3px; font-size: 85%; - font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, - monospace; + font-family: SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,monospace } - .notion-inline-underscore { - text-decoration: underline; + text-decoration: underline } - .notion-list { margin: 0; margin-block-start: 0.6em; - margin-block-end: 0.6em; + margin-block-end: 0.6em } - .notion-list-disc { list-style-type: disc; padding-inline-start: 1.7em; margin-top: 0; - margin-bottom: 0; + margin-bottom: 0 } .notion-list-numbered { list-style-type: decimal; padding-inline-start: 1.6em; margin-top: 0; - margin-bottom: 0; + margin-bottom: 0 } - .notion-list-disc li { - padding-left: 0.1em; + padding-left: .1em } - .notion-list-numbered li { - padding-left: 0.2em; + padding-left: .2em } - .notion-list li { padding: 6px 0; - white-space: pre-wrap; + white-space: pre-wrap } - .notion-asset-wrapper { - margin: 0.5rem 0; + margin: .5rem 0; max-width: 100vw; min-width: 100%; align-self: center; display: flex; - flex-direction: column; + flex-direction: column } - .notion-asset-wrapper-image { - max-width: 100%; + max-width: 100% } - .notion-asset-wrapper-full { - max-width: 100vw; + max-width: 100vw } - .notion-asset-wrapper img { width: 100%; height: 100%; - max-height: 100%; + max-height: 100% } - .notion-asset-wrapper iframe { border: none; - background: oklch(97% 0 68); + background: #f7f6f5 } - .notion-text { width: 100%; white-space: pre-wrap; word-break: break-word; padding: 3px 2px; - margin: 1px 0; + margin: 1px 0 } - .notion-text:first-child { - margin-top: 2px; + margin-top: 2px } - .notion-text-children { padding-left: 1.5em; display: flex; - flex-direction: column; + flex-direction: column } - .notion .notion-code { - font-size: 85%; + font-size: 85% } - .notion-code { position: relative; width: 100%; @@ -936,64 +806,48 @@ svg.notion-page-icon { box-sizing: border-box; overflow: auto; background: var(--bg-color-1); - font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, - monospace; + font-family: SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,monospace } - .notion-code-copy { position: absolute; top: 1em; right: 1em; user-select: none; z-index: 9; - transition: opacity 0.2s cubic-bezier(0.3, 0, 0.5, 1); + transition: opacity .2s cubic-bezier(.3, 0, .5, 1) } - .notion-code-copy-button { display: inline-block; - padding: 0.6em; + padding: .6em; font-size: 1.25em; line-height: 1em; cursor: pointer; - - transition: - background-color 0.2s cubic-bezier(0.3, 0, 0.5, 1), - color 0.2s cubic-bezier(0.3, 0, 0.5, 1), - border-color 0.2s cubic-bezier(0.3, 0, 0.5, 1); - box-shadow: - 0 1px 0 oklch(24% 0 250 / 0), - inset 0 1px 0 oklch(100% 0 0 / 0.3); - background-color: oklch(98% 0 250); - - color: oklch(28% 0 250); - border: 1px solid oklch(24% 0 250 / 0.1); - border-radius: 6px; -} - + transition: background-color .2s cubic-bezier(.3, 0, .5, 1),color .2s cubic-bezier(.3, 0, .5, 1),border-color .2s cubic-bezier(.3, 0, .5, 1); + box-shadow: 0 1px 0 rgba(27,31,36,.04),inset 0 1px 0 rgba(255,255,255,.25); + background-color: #f6f8fa; + color: #24292f; + border: 1px solid rgba(27,31,36,.15); + border-radius: 6px +} .notion-code-copy-button:hover { - background-color: oklch(97% 0 260); - border-color: oklch(24% 0 250 / 0.1); - transition-duration: 0.1s; + background-color: #f3f4f6; + border-color: rgba(27,31,36,.15); + transition-duration: .1s } - .notion-code-copy-button:active { - background: oklch(94% 0 260); - border-color: oklch(24% 0 250 / 0.1); - transition: none; + background: #eaecef; + border-color: rgba(27,31,36,.15); + transition: none } - .notion-code .notion-code-copy { - opacity: 0; + opacity: 0 } - .notion-code:hover .notion-code-copy { - opacity: 1; + opacity: 1 } - .notion-code-copy-button svg { - display: block; + display: block } - .notion-code-copy-tooltip { pointer-events: none; position: absolute; @@ -1004,56 +858,47 @@ svg.notion-page-icon { flex-direction: row; justify-content: center; z-index: 99; - font-size: 14px; + font-size: 14px } - .notion-code-copy-tooltip > div { padding: 6px 8px; - background: oklch(25% 0 0); - color: oklch(100% 0 0); - border-radius: 6px; + background: #222; + color: #fff; + border-radius: 6px } - .notion-column { display: flex; flex-direction: column; padding-top: 12px; - padding-bottom: 12px; + padding-bottom: 12px } - -.notion-column > *:first-child { +.notion-column > :first-child { margin-top: 0; margin-left: 0; - margin-right: 0; + margin-right: 0 } - -.notion-column > *:last-child { +.notion-column > :last-child { margin-left: 0; margin-right: 0; - margin-bottom: 0; + margin-bottom: 0 } - .notion-row { display: flex; overflow: hidden; width: 100%; - max-width: 100%; + max-width: 100% } - -@media (max-width: 640px) { +@media (max-width:640px) { .notion-row { - flex-direction: column; + flex-direction: column } - .notion-row .notion-column { - width: 100% !important; + width: 100%!important } - .notion-row .notion-spacer { - display: none; + display: none } } - .notion-bookmark { margin: 4px 0; width: 100%; @@ -1063,21 +908,18 @@ svg.notion-page-icon { border-radius: 3px; display: flex; overflow: hidden; - user-select: none; + user-select: none } - .dark-mode .notion-bookmark { - border-color: var(--bg-color-0); + border-color: var(--bg-color-0) } - .notion-bookmark > div:first-child { flex: 4 1 180px; padding: 12px 14px 14px; overflow: hidden; text-align: left; - color: var(--fg-color); + color: var(--fg-color) } - .notion-bookmark-title { font-size: 14px; line-height: 20px; @@ -1085,72 +927,60 @@ svg.notion-page-icon { overflow: hidden; text-overflow: ellipsis; min-height: 24px; - margin-bottom: 2px; + margin-bottom: 2px } - .notion-bookmark-description { font-size: 12px; line-height: 16px; - opacity: 0.8; + opacity: .8; height: 32px; - overflow: hidden; + overflow: hidden } - .notion-bookmark-link { display: flex; - margin-top: 6px; + margin-top: 6px } - .notion-bookmark-link-icon { width: 16px; height: 16px; min-width: 16px; - margin-right: 6px; + margin-right: 6px } - .notion-bookmark-link-text { font-size: 12px; line-height: 16px; color: var(--fg-color); white-space: nowrap; overflow: hidden; - text-overflow: ellipsis; + text-overflow: ellipsis } - .notion-bookmark-link-icon img { max-width: 100%; - max-height: 100%; + max-height: 100% } - .notion-bookmark-image { flex: 1 1 180px; - position: relative; + position: relative } - .notion-bookmark-image > * { - position: absolute !important; + position: absolute!important; width: 100%; - height: 100%; + height: 100% } - .notion-bookmark-image span { - width: 100% !important; - height: 100% !important; - max-height: 100%; + width: 100%!important; + height: 100%!important; + max-height: 100% } - .notion-column .notion-bookmark-image { - display: none; + display: none } - .notion-spacer { - width: calc(min(32px, 4vw)); + width: calc(min(32px,4vw)) } - .notion-spacer:last-child { - display: none; + display: none } - .notion-asset-object-fit { position: absolute; left: 0; @@ -1159,15 +989,13 @@ svg.notion-page-icon { bottom: 0; width: 100%; height: 100%; - border-radius: 1px; + border-radius: 1px } - .notion-image { display: block; width: 100%; - border-radius: 1px; + border-radius: 1px } - .notion-asset-caption { padding: 6px 0 6px 2px; white-space: pre-wrap; @@ -1175,9 +1003,8 @@ svg.notion-page-icon { caret-color: var(--fg-color); font-size: 14px; line-height: 1.4; - color: var(--fg-color-3); + color: var(--fg-color-3) } - .notion-callout { padding: 16px 16px 16px 12px; display: inline-flex; @@ -1187,59 +1014,51 @@ svg.notion-page-icon { align-items: center; box-sizing: border-box; margin: 4px 0; - border: 1px solid var(--fg-color-0); + border: 1px solid var(--fg-color-0) } - .dark-mode .notion-callout { - border-color: var(--bg-color-2); + border-color: var(--bg-color-2) } - .notion-callout .notion-page-icon-inline { align-self: flex-start; width: 24px; height: 24px; line-height: 24px; - font-size: 1.3em; + font-size: 1.3em } - .notion-callout-text { margin-left: 8px; white-space: pre-wrap; word-break: break-word; - width: 100%; + width: 100% } - -.notion-callout-text > *:first-child { +.notion-callout-text > :first-child { margin-top: 0; - padding-top: 0; + padding-top: 0 } - .notion-toggle { width: 100%; - padding: 3px 2px; + padding: 3px 2px } .notion-toggle > summary { cursor: pointer; - outline: none; + outline: 0 } .notion-toggle > div { - margin-left: 1.1em; + margin-left: 1.1em } - .notion-collection { align-self: center; - min-width: 100%; + min-width: 100% } - .notion-collection-header { display: flex; align-items: center; height: 42px; padding: 4px 2px; white-space: nowrap; - overflow: hidden; + overflow: hidden } - .notion-collection-header-title { display: inline-flex; align-items: center; @@ -1248,99 +1067,83 @@ svg.notion-page-icon { font-weight: 600; white-space: pre-wrap; word-break: break-word; - margin-right: 0.5em; + margin-right: .5em } - .notion-collection-view-dropdown { cursor: pointer; padding: 6px 8px; border: 0 none; border-radius: 3px; transition: background 120ms ease-in 0s; - background: transparent; + background: 0 0 } - .notion-collection-view-dropdown:hover { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-collection-view-dropdown-icon { position: relative; top: 2px; - margin-left: 4px; + margin-left: 4px } - .notion-collection-view-type { display: flex; align-items: center; - font-size: 14px; + font-size: 14px } - .notion-collection-view-type-icon { display: inline-block; width: 14px; height: 14px; - /* fill: var(--fg-color); */ - fill: rgba(55, 53, 47); - margin-right: 6px; + fill: rgba(55,53,47); + margin-right: 6px } - .notion-collection-view-type-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - color: var(--fg-color); + color: var(--fg-color) } - .notion-table { width: 100vw; max-width: 100vw; align-self: center; - overflow: auto hidden; + overflow: auto hidden } - .notion-table-view { position: relative; float: left; min-width: var(--notion-max-width); - padding-left: 0; + padding-left: 0 } - .notion-table-header { display: flex; position: absolute; z-index: 82; height: 33px; color: var(--fg-color-3); - min-width: var(--notion-max-width); + min-width: var(--notion-max-width) } - .notion-table-header-inner { width: 100%; display: inline-flex; border-top: 1px solid var(--fg-color-1); - border-bottom: 1px solid var(--fg-color-1); - /* box-shadow: white -3px 0 0, rgba(55, 53, 47, 0.16) 0 1px 0; */ + border-bottom: 1px solid var(--fg-color-1) } - .notion-table-header-placeholder { - height: 34px; + height: 34px } - .notion-table-th { display: flex; - position: relative; + position: relative } - .notion-table-view-header-cell { display: flex; flex-shrink: 0; overflow: hidden; height: 32px; font-size: 14px; - padding: 0; + padding: 0 } - .notion-table-view-header-cell-inner { user-select: none; display: flex; @@ -1348,21 +1151,18 @@ svg.notion-page-icon { height: 100%; padding-left: 8px; padding-right: 8px; - border-right: 1px solid var(--fg-color-0); + border-right: 1px solid var(--fg-color-0) } - .notion-table-th:last-child .notion-table-view-header-cell-inner { - border-right: 0 none; + border-right: 0 none } - .notion-collection-column-title { display: flex; align-items: center; line-height: 120%; min-width: 0; - font-size: 14px; + font-size: 14px } - .notion-collection-column-title-icon { display: inline-block; width: 14px; @@ -1370,25 +1170,21 @@ svg.notion-page-icon { min-width: 14px; min-height: 14px; fill: var(--fg-color-2); - margin-right: 6px; + margin-right: 6px } - .notion-collection-column-title-body { white-space: nowrap; overflow: hidden; - text-overflow: ellipsis; + text-overflow: ellipsis } - .notion-table-body { position: relative; - min-width: var(--notion-max-width); + min-width: var(--notion-max-width) } - .notion-table-row { display: flex; - border-bottom: 1px solid var(--fg-color-1); + border-bottom: 1px solid var(--fg-color-1) } - .notion-table-cell { min-height: 32px; padding: 5px 8px 6px; @@ -1397,53 +1193,44 @@ svg.notion-page-icon { white-space: normal; overflow: hidden; word-break: break-word; - border-right: 1px solid var(--fg-color-1); + border-right: 1px solid var(--fg-color-1) } - .notion-table-cell:last-child { - border-right: 0 none; + border-right: 0 none } - .notion-table-cell-title { - font-weight: 500; + font-weight: 500 } - .notion-table-cell-text { - white-space: pre-wrap; + white-space: pre-wrap } - -.notion-table-cell-text, -.notion-table-cell-number, -.notion-table-cell-url, .notion-table-cell-email, -.notion-table-cell-phone_number { - line-height: 1.5; +.notion-table-cell-number, +.notion-table-cell-phone_number, +.notion-table-cell-text, +.notion-table-cell-url { + line-height: 1.5 } - .notion-table-cell-number { - white-space: pre-wrap; + white-space: pre-wrap } - -.notion-table-cell-select, -.notion-table-cell-multi_select { - padding: 7px 8px 0; +.notion-table-cell-multi_select, +.notion-table-cell-select { + padding: 7px 8px 0 } - .notion-table-cell-auto_increment_id { - color: var(--fg-color-7); + color: var(--fg-color-7) } - +.notion-property-multi_select, .notion-property-select, -.notion-property-status, -.notion-property-multi_select { +.notion-property-status { display: flex; flex-wrap: wrap; - gap: 6px; + gap: 6px } - +.notion-property-multi_select-item, .notion-property-select-item, -.notion-property-status-item, -.notion-property-multi_select-item { +.notion-property-status-item { display: flex; align-items: center; padding: 0 6px; @@ -1452,142 +1239,114 @@ svg.notion-page-icon { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - line-height: 120%; + line-height: 120% } - .notion-property-status-item { - border-radius: 20px; + border-radius: 20px } - .notion-property-file { display: flex; flex-wrap: wrap; - align-content: flex-start; + align-content: flex-start } - .notion-property-file img { max-height: 24px; max-width: 100%; - margin-right: 6px; + margin-right: 6px } - .notion-collection-card-cover .notion-property-file { - height: 100%; + height: 100% } - .notion-collection-card-cover .notion-property-file img { width: 100%; margin: 0; - max-height: 100%; + max-height: 100% } - .notion-collection-card .notion-property-checkbox-container { - display: flex; + display: flex } - .notion-property-checkbox-text { - display: none; + display: none } - .notion-collection-card .notion-property-checkbox-text { display: inline-block; - margin-left: 6px; + margin-left: 6px } - .notion-property-checkbox { width: 16px; - height: 16px; + height: 16px } - .notion-property-checkbox-checked { width: 16px; height: 16px; - background: var(--select-color-0); + background: var(--select-color-0) } - .notion-property-checkbox-checked svg { position: relative; display: block; - /* top: -3px; */ top: 1px; left: 1px; width: 14px; height: 14px; - fill: oklch(100% 0 0); + fill: #fff } - .notion-property-checkbox-unchecked { width: 16px; height: 16px; - border: 1.3px solid var(--fg-color); + border: 1.3px solid var(--fg-color) } - .notion-gallery { - align-self: center; + align-self: center } - .notion-gallery-view { position: relative; padding-left: 0; - transition: padding 200ms ease-out; + transition: padding .2s ease-out } - .notion-gallery-grid { display: grid; position: relative; - grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + grid-template-columns: repeat(auto-fill,minmax(260px,1fr)); grid-auto-rows: 1fr; gap: 16px; border-top: 1px solid var(--fg-color-1); padding-top: 16px; - padding-bottom: 4px; + padding-bottom: 4px } - .notion-gallery-grid-size-small { - grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + grid-template-columns: repeat(auto-fill,minmax(180px,1fr)) } - .notion-gallery-grid-size-large { - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + grid-template-columns: repeat(auto-fill,minmax(320px,1fr)) } - .notion-collection-card { display: flex; flex-direction: column; overflow: hidden; - text-decoration: none; - box-shadow: - oklch(17% 0 0 / 0.1) 0 0 0 1px, - oklch(17% 0 0 / 0.1) 0 2px 4px; + box-shadow: rgba(15,15,15,.1) 0 0 0 1px,rgba(15,15,15,.1) 0 2px 4px; border-radius: 3px; background: var(--bg-color); color: var(--fg-color); - transition: background 100ms ease-out 0s; - + transition: background .1s ease-out 0s; user-select: none; - cursor: pointer; + cursor: pointer } - .notion-collection-card:hover { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-collection-card-cover { position: relative; width: 100%; height: 190px; border-bottom: 1px solid var(--fg-color-0); - overflow: hidden; + overflow: hidden } - .notion-collection-card-cover img { width: 100%; height: 100%; - border-radius: 1px 1px 0 0; - /* object-fit: cover; */ + border-radius: 1px 1px 0 0 } - .notion-collection-card-cover .notion-collection-card-cover-empty { width: 100%; height: 100%; @@ -1595,67 +1354,56 @@ svg.notion-page-icon { overflow: hidden; background: var(--fg-color-5); box-shadow: var(--fg-color-0) 0 -1px 0 0 inset; - padding: 8px 8px 0; + padding: 8px 8px 0 } - .notion-collection-card-size-small .notion-collection-card-cover { - height: 124px; + height: 124px } - .notion-collection-card-body { display: flex; flex-direction: column; - padding: 4px 10px; + padding: 4px 10px } - .notion-collection-card-property { padding: 4px 0; white-space: nowrap; word-break: break-word; overflow: hidden; text-overflow: ellipsis; - font-size: 12px; + font-size: 12px } - .notion-collection-card-property:first-child { font-size: 14px; - font-weight: 500; + font-weight: 500 } - .notion-collection-card-property:not(:first-child) { white-space: nowrap; - text-overflow: clip; + text-overflow: clip } - .notion-collection-card-property img { - max-height: 18px; + max-height: 18px } - .notion-list-collection { - align-self: center; + align-self: center } - .notion-list-collection { width: 100%; - max-width: 100%; + max-width: 100% } - .notion-list-view { position: relative; padding-left: 0; - transition: padding 200ms ease-out; - max-width: 100%; + transition: padding .2s ease-out; + max-width: 100% } - .notion-list-body { display: flex; flex-direction: column; border-top: 1px solid var(--fg-color-1); padding-top: 8px; max-width: 100%; - overflow: hidden; + overflow: hidden } - .notion-list-item { display: flex; justify-content: space-between; @@ -1663,9 +1411,8 @@ svg.notion-page-icon { padding: 0 4px; margin: 1px 0; max-width: 100%; - overflow: hidden; + overflow: hidden } - .notion-list-item-title { display: flex; align-items: center; @@ -1673,77 +1420,64 @@ svg.notion-page-icon { overflow: hidden; text-overflow: ellipsis; font-weight: 500; - line-height: 1.3; + line-height: 1.3 } - .notion-list-item-body { display: flex; align-items: center; flex-wrap: nowrap; - overflow: hidden; + overflow: hidden } - .notion-list-item-property { - /* display: flex; - align-items: center; */ margin-left: 14px; - font-size: 14px; + font-size: 14px } - -.notion-list-item-property .notion-property-date, .notion-list-item-property .notion-property-created_time, +.notion-list-item-property .notion-property-date, .notion-list-item-property .notion-property-last_edited_time, .notion-list-item-property .notion-property-url { display: inline-block; color: var(--fg-color-3); font-size: 12px; - /* white-space: nowrap; */ overflow: hidden; - text-overflow: ellipsis; + text-overflow: ellipsis } - .notion-board { width: 100vw; max-width: 100vw; align-self: center; - overflow: auto hidden; + overflow: auto hidden } - .notion-board-view { position: relative; float: left; min-width: 100%; padding-left: 0; - transition: padding 200ms ease-out; + transition: padding .2s ease-out } - .notion-board-header { display: flex; position: absolute; z-index: 82; height: 44px; - min-width: 100%; + min-width: 100% } - .notion-board-header-inner { display: inline-flex; border-top: 1px solid var(--fg-color-1); - border-bottom: 1px solid var(--fg-color-1); + border-bottom: 1px solid var(--fg-color-1) } - .notion-board-header-placeholder { - height: var(--notion-header-height); + height: var(--notion-header-height) } - .notion-board-th { display: flex; align-items: center; font-size: 14px; padding-right: 16px; box-sizing: content-box; - flex-shrink: 0; + flex-shrink: 0 } - .notion-board-th-body { display: flex; align-items: center; @@ -1752,149 +1486,116 @@ svg.notion-page-icon { padding-left: 2px; padding-right: 4px; white-space: nowrap; - overflow: hidden; + overflow: hidden } - .notion-board-th-count { color: var(--fg-color-3); font-weight: 500; - padding: 0 8px; + padding: 0 8px } - .notion-board-th-empty { margin-right: 6px; position: relative; - top: 2px; + top: 2px } - .notion-board-body { - display: inline-flex; + display: inline-flex } - .notion-board-group { flex: 0 0 auto; padding-right: 16px; - box-sizing: content-box; + box-sizing: content-box } - .notion-board-group-card { - margin-bottom: 8px; + margin-bottom: 8px } - -.notion-board-view .notion-board-th, -.notion-board-view .notion-board-group { - width: 260px; +.notion-board-view .notion-board-group, +.notion-board-view .notion-board-th { + width: 260px } - -.notion-board-view-size-small .notion-board-th, -.notion-board-view-size-small .notion-board-group { - width: 180px; +.notion-board-view-size-small .notion-board-group, +.notion-board-view-size-small .notion-board-th { + width: 180px } - -.notion-board-view-size-large .notion-board-th, -.notion-board-view-size-large .notion-board-group { - width: 320px; +.notion-board-view-size-large .notion-board-group, +.notion-board-view-size-large .notion-board-th { + width: 320px } - .notion-board-view .notion-collection-card .notion-collection-card-cover { - height: 148px; + height: 148px } - -.notion-board-view-size-small - .notion-collection-card - .notion-collection-card-cover { - height: 100px; +.notion-board-view-size-small .notion-collection-card .notion-collection-card-cover { + height: 100px } - -.notion-board-view-size-large - .notion-collection-card - .notion-collection-card-cover { - height: 180px; +.notion-board-view-size-large .notion-collection-card .notion-collection-card-cover { + height: 180px } - .notion-collection-page-properties { width: 100%; display: flex; - flex-direction: column; + flex-direction: column } - .notion-table-of-contents { width: 100%; - margin: 4px 0; + margin: 4px 0 } - .notion-table-of-contents-item { color: var(--fg-color); - opacity: 0.7; - transition: - background 100ms ease-in, - opacity 100ms ease-in; - + opacity: .7; + transition: background .1s ease-in,opacity .1s ease-in; text-decoration: none; user-select: none; transition: background 20ms ease-in 0s; cursor: pointer; width: 100%; - padding: 6px; font-size: 14px; line-height: 1.3; display: flex; align-items: center; - white-space: nowrap; overflow: hidden; - text-overflow: ellipsis; + text-overflow: ellipsis } - .notion-table-of-contents-item:hover { background: var(--bg-color-0); - opacity: 1; + opacity: 1 } - .notion-table-of-contents-item-body { - border-bottom: 1px solid var(--fg-color-1); + border-bottom: 1px solid var(--fg-color-1) } - .notion-to-do { width: 100%; display: flex; - flex-direction: column; + flex-direction: column } - .notion-to-do-item { width: 100%; display: flex; align-items: center; width: 100%; padding-left: 2px; - min-height: calc(1.5em + 3px + 3px); + min-height: calc(1.5em + 3px + 3px) } - .notion-to-do-children { - padding-left: 1.5em; + padding-left: 1.5em } - .notion-to-do-checked .notion-to-do-item { text-decoration: line-through; - opacity: 0.375; + opacity: .375 } - .notion-to-do-body { white-space: pre-wrap; - word-break: break-word; + word-break: break-word } - .notion-to-do-item .notion-property-checkbox { - margin-right: 8px; + margin-right: 8px } - .notion-google-drive { width: 100%; align-self: center; - margin: 4px 0; + margin: 4px 0 } - .notion-google-drive-link { position: relative; display: flex; @@ -1904,24 +1605,20 @@ svg.notion-page-icon { width: 100%; border: 1px solid var(--fg-color-1); border-radius: 3px; - user-select: none; transition: background 20ms ease-in 0s; - cursor: pointer; + cursor: pointer } - .notion-google-drive-link:hover { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-google-drive-preview { display: block; position: relative; width: 100%; padding-bottom: 55%; - overflow: hidden; + overflow: hidden } - .notion-google-drive-preview img { position: absolute; width: 100%; @@ -1930,61 +1627,53 @@ svg.notion-page-icon { bottom: 0; right: 0; object-fit: cover; - object-position: center top; + object-position: center top } - .notion-google-drive-body { width: 100%; min-height: 60px; padding: 12px 14px 14px; overflow: hidden; - border-top: 1px solid var(--fg-color-1); + border-top: 1px solid var(--fg-color-1) } - .notion-google-drive-body-title { font-size: 14px; line-height: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - margin-bottom: 2px; + margin-bottom: 2px } - .notion-google-drive-body-modified-time { font-size: 12px; line-height: 1.3; color: var(--fg-color-3); max-height: 32px; - overflow: hidden; + overflow: hidden } - .notion-google-drive-body-source { display: flex; align-items: center; - margin-top: 6px; + margin-top: 6px } - .notion-google-drive-body-source-icon { flex-shrink: 0; background-size: cover; width: 16px; height: 16px; - margin-right: 6px; + margin-right: 6px } - .notion-google-drive-body-source-domain { font-size: 12px; line-height: 16px; white-space: nowrap; overflow: hidden; - text-overflow: ellipsis; + text-overflow: ellipsis } - .notion-file { width: 100%; - margin: 1px 0; + margin: 1px 0 } - .notion-file-link { display: flex; align-items: center; @@ -1992,13 +1681,11 @@ svg.notion-page-icon { border-radius: 3px; transition: background 20ms ease-in 0s; color: inherit; - text-decoration: none; + text-decoration: none } - .notion-file-link:hover { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-file-icon { margin-right: 2px; width: 1.35em; @@ -2008,20 +1695,17 @@ svg.notion-page-icon { flex-grow: 0; flex-shrink: 0; min-height: calc(1.5em + 3px + 3px); - height: 1.35em; + height: 1.35em } - .notion-file-info { display: flex; - align-items: baseline; + align-items: baseline } - .notion-file-title { white-space: nowrap; overflow: hidden; - text-overflow: ellipsis; + text-overflow: ellipsis } - .notion-file-size { white-space: nowrap; overflow: hidden; @@ -2029,17 +1713,14 @@ svg.notion-page-icon { color: var(--fg-color-3); font-size: 12px; line-height: 16px; - margin-left: 6px; + margin-left: 6px } - .notion-audio { - width: 100%; + width: 100% } - .notion-audio audio { - width: 100%; + width: 100% } - .notion-equation { position: relative; display: inline-flex; @@ -2047,15 +1728,13 @@ svg.notion-page-icon { fill: inherit; user-select: none; border-radius: 3px; - transition: background 20ms ease-in 0s; + transition: background 20ms ease-in 0s } - .notion-equation-inline { -webkit-user-select: all; -moz-user-select: all; - user-select: all; + user-select: all } - .notion-equation-block { display: flex; flex-direction: column; @@ -2064,34 +1743,28 @@ svg.notion-page-icon { max-width: 100%; padding: 4px 8px; margin: 4px 0; - cursor: pointer; + cursor: pointer } - .notion-equation:hover { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-equation:active, .notion-equation:focus { - background: var(--select-color-2); + background: var(--select-color-2) } - .notion-frame .katex-display .katex { - padding-right: 32px; + padding-right: 32px } - .notion-frame .katex > .katex-html { - white-space: normal; + white-space: normal } - .notion-page-title { display: inline-flex; max-width: 100%; align-items: center; line-height: 1.3; - transition: background 120ms ease-in 0s; + transition: background 120ms ease-in 0s } - .notion-page-title-icon { display: flex; align-items: center; @@ -2099,42 +1772,32 @@ svg.notion-page-icon { height: 22px; width: 22px; border-radius: 3px; - flex-shrink: 0; + flex-shrink: 0 } - .notion-page-title .notion-page-icon-inline { margin-left: 2px; - margin-right: 6px; + margin-right: 6px } - .notion-collection-card-property .notion-link { - border-bottom: 0 none; + border-bottom: 0 none } - .notion-collection-card-property .notion-page-title { - transition: none; + transition: none } - .notion-collection-card-property .notion-page-title:hover { - background: unset; + background: unset } - .notion-collection-card-property .notion-page-title-icon { margin-left: 0; height: 18px; - width: 18px; + width: 18px } - .notion-collection-card-property .notion-page-title-text { - border-bottom: 0 none; + border-bottom: 0 none } - -.notion-collection-card-property - .notion-property-relation - .notion-page-title-text { - border-bottom: 1px solid; +.notion-collection-card-property .notion-property-relation .notion-page-title-text { + border-bottom: 1px solid } - .notion-page-title-text { position: relative; top: 1px; @@ -2143,128 +1806,104 @@ svg.notion-page-icon { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - font-weight: 500; + font-weight: 500 } - -/* removes double underline with links */ .notion-link .notion-page-title-text { - border-bottom: 0 none; + border-bottom: 0 none } - .notion-collection-row { width: 100%; padding: 4px 0 8px; border-bottom: 1px solid var(--fg-color-0); - margin-bottom: 1em; + margin-bottom: 1em } - .notion-collection-row-body { display: flex; flex-direction: column; - gap: 4px; + gap: 4px } - .notion-collection-row-property { display: flex; - align-items: center; + align-items: center } - .notion-collection-row-value { flex: 1; padding: 6px 8px 7px; - font-size: 14px; + font-size: 14px } - .notion-collection-row-property .notion-collection-column-title { display: flex; align-items: center; width: 160px; height: 34px; color: var(--fg-color-3); - padding: 0 6px; + padding: 0 6px } - .notion-collection-row-property .notion-property { - width: 100%; + width: 100% } - .notion-collection-row-property .notion-property-auto_increment_id { - color: var(--fg-color-7); + color: var(--fg-color-7) } - .notion-collection-row-property .notion-collection-column-title-icon { width: 16px; height: 16px; min-width: 16px; - min-height: 16px; + min-height: 16px } - .notion-collection-row-property .notion-link { - border-bottom: 0 none; + border-bottom: 0 none } - -.notion-collection-row-property - .notion-property-relation - .notion-page-title-text { - border-bottom: 1px solid; +.notion-collection-row-property .notion-property-relation .notion-page-title-text { + border-bottom: 1px solid } - .notion-user { display: block; object-fit: cover; border-radius: 100%; width: 20px; - height: 20px; + height: 20px } - .notion-list-item-property .notion-property-multi_select-item { margin-bottom: 0; - flex-wrap: none; + flex-wrap: none } - .notion-list-item-property .notion-property-multi_select-item:last-of-type { - margin-right: 0; + margin-right: 0 } - -.notion-toggle .notion-collection-header, -.notion-toggle .notion-table-view, -.notion-toggle .notion-board-view, +.notion-column .notion-board-view, .notion-column .notion-collection-header, .notion-column .notion-table-view, -.notion-column .notion-board-view { - padding-left: 0 !important; - padding-right: 0 !important; +.notion-toggle .notion-board-view, +.notion-toggle .notion-collection-header, +.notion-toggle .notion-table-view { + padding-left: 0!important; + padding-right: 0!important } - -.notion-toggle .notion-table, -.notion-toggle .notion-board, +.notion-column .notion-board, .notion-column .notion-table, -.notion-column .notion-board { - width: 100% !important; - max-width: 100% !important; +.notion-toggle .notion-board, +.notion-toggle .notion-table { + width: 100%!important; + max-width: 100%!important } - -@media only screen and (max-width: 730px) { +@media only screen and (max-width:730px) { .notion-asset-wrapper { - max-width: 100%; + max-width: 100% } - .notion-asset-wrapper-full { - max-width: 100vw; + max-width: 100vw } } - -@media (max-width: 640px) { +@media (max-width:640px) { .notion-bookmark-image { - display: none; + display: none } } - .lazy-image-wrapper { position: relative; - overflow: hidden; + overflow: hidden } - .lazy-image-wrapper img { position: absolute; top: 0; @@ -2275,110 +1914,81 @@ svg.notion-page-icon { max-width: 100%; max-height: 100%; min-width: 100%; - min-height: 100%; + min-height: 100% } - .lazy-image-preview { filter: blur(20px); transform: scale(1.1); - opacity: 1; - transition: opacity 400ms ease-in !important; - transition-delay: 100ms; - will-change: opacity; + transition: opacity .4s ease-in!important; + transition-delay: 0.1s; + will-change: opacity } - .lazy-image-wrapper img.lazy-image-real { - position: relative; + position: relative } - .lazy-image-real { opacity: 0; - transition: opacity 400ms ease-out !important; - will-change: opacity; + transition: opacity .4s ease-out!important; + will-change: opacity } - .lazy-image-real.medium-zoom-image { - transition: - transform 0.3s cubic-bezier(0.2, 0, 0.2, 1), - opacity 400ms ease-out !important; - will-change: opacity, transform; + transition: transform .3s cubic-bezier(.2, 0, .2, 1),opacity .4s ease-out!important; + will-change: opacity,transform } - .medium-zoom-image--opened { object-fit: cover; - opacity: 1; + opacity: 1 } - -/* - NOTE: if we hide the preview image, there's a weird bug with react hydration where - the image will sometimes flicker to show the background during initial page load. - So I'm removing this `opacity: 0` for now, but it will cause issues if the real - image is transparent. - */ .lazy-image-loaded .lazy-image-preview { - opacity: 0; + opacity: 0 } - .lazy-image-loaded .lazy-image-real { - opacity: 1; + opacity: 1 } - .notion-page-cover.lazy-image-wrapper { - padding: 0 !important; + padding: 0!important } - .notion-collection-card-cover .lazy-image-wrapper { - padding: 0 !important; - height: 100%; + padding: 0!important; + height: 100% } - .notion-page-cover .lazy-image-preview, .notion-page-cover .lazy-image-real { - will-change: unset !important; + will-change: unset!important } - .notion-page-cover .lazy-image-loaded .lazy-image-preview { - opacity: 1; + opacity: 1 } - .notion-lite { - overflow-y: auto; + overflow-y: auto } - .notion-lite .notion-page { width: 100%; - padding: 0; - /* padding: calc(max(2vmin, 8px)); */ + padding: 0 } - +.notion-lite .notion-board-view, .notion-lite .notion-collection-header, -.notion-lite .notion-table-view, -.notion-lite .notion-board-view { - padding-left: 0 !important; - padding-right: 0 !important; +.notion-lite .notion-table-view { + padding-left: 0!important; + padding-right: 0!important } - .notion-lite .notion-board, .notion-lite .notion-table { - width: 100% !important; + width: 100%!important } - .notion-header { position: sticky; top: 0; left: 0; z-index: 200; - width: 100%; max-width: 100vw; overflow: hidden; height: var(--notion-header-height); min-height: var(--notion-header-height); - - background: var(--bg-color); + background: var(--bg-color) } - .notion-header .notion-nav-header { position: absolute; top: 0; @@ -2394,18 +2004,16 @@ svg.notion-page-icon { line-height: 1.5; line-height: 1.2; font-size: 14px; - gap: 12px; + gap: 12px } - .notion-header .breadcrumbs { display: flex; flex-direction: row; align-items: center; height: 100%; flex-grow: 0; - min-width: 0; + min-width: 0 } - .notion-header .breadcrumb { display: inline-flex; flex-direction: row; @@ -2413,83 +2021,66 @@ svg.notion-page-icon { align-items: center; white-space: nowrap; text-overflow: ellipsis; - color: var(--fg-color); text-decoration: none; - margin: 1px 0px; + margin: 1px 0; padding: 4px 6px; border-radius: 3px; transition: background 120ms ease-in 0s; user-select: none; - background: transparent; - cursor: pointer; + background: 0 0; + cursor: pointer } - .notion-header .breadcrumb .notion-page-icon-inline { font-size: 18px; line-height: 1.1; - margin: 0 6px 0 0; + margin: 0 6px 0 0 } - .notion-header .breadcrumb .notion-page-icon-span { position: relative; - top: 1px; + top: 1px } - .notion-header .searchIcon { width: 14px; height: 14px; color: var(--fg-color); - fill: var(--fg-color); + fill: var(--fg-color) } - .notion-search-button { - gap: 8px; + gap: 8px } - .notion-header .breadcrumb:not(.active):hover { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-header .breadcrumb:not(.active):active { - background: var(--bg-color-1); + background: var(--bg-color-1) } - .notion-header .breadcrumb.active { - cursor: default; + cursor: default } - .notion-header .spacer { margin: 0 2px; - color: var(--fg-color-2); + color: var(--fg-color-2) } - .notion-header .button { - padding: 12px; + padding: 12px } - .notion-search-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; - background: oklch(17% 0 0 / 0.6); - + background: rgba(15,15,15,.6); display: flex; justify-content: center; align-items: flex-start; - z-index: 1001; + z-index: 1001 } - .notion-search { - box-shadow: - oklch(17% 0 0 / 0.1) 0px 0px 0px 1px, - oklch(17% 0 0 / 0.1) 0px 5px 10px, - oklch(17% 0 0 / 0.2) 0px 15px 40px; + box-shadow: rgba(15,15,15,.05) 0 0 0 1px,rgba(15,15,15,.1) 0 5px 10px,rgba(15,15,15,.2) 0 15px 40px; border-radius: 3px; background: var(--bg-color); - position: relative; top: 90px; max-width: 600px; @@ -2497,19 +2088,16 @@ svg.notion-page-icon { max-height: 80vh; width: 75%; overflow: hidden; - outline: none; - + outline: 0; font-size: 16px; line-height: 1.5; - color: oklch(33% 0 92); - caret-color: oklch(33% 0 92); - font-family: var(--notion-font); + color: #37352f; + caret-color: rgb(55,53,47); + font-family: var(--notion-font) } - .notion-search input { - background-color: var(--bg-color); + background-color: var(--bg-color) } - .notion-search .quickFindMenu { display: flex; flex-direction: column; @@ -2517,90 +2105,76 @@ svg.notion-page-icon { max-width: calc(100vw - 24px); height: 100%; max-height: 80vh; - min-height: 50px; + min-height: 50px } - .notion-search .searchBar { display: flex; flex-direction: row; align-items: center; height: 52px; - box-shadow: oklch(33% 0 92 / 0.1) 0px 1px 0px; + box-shadow: rgba(55,53,47,.09) 0 1px 0; font-size: 18px; line-height: 27px; - padding: 16px; + padding: 16px } - .notion-search .searchInput { resize: none; white-space: nowrap; border: none; - outline: none; + outline: 0; flex: 1; - line-height: inherit; - font-size: inherit; + font-size: inherit } - .notion-search .inlineIcon { margin-right: 10px; - fill: var(--fg-color-2); + fill: var(--fg-color-2) } - .notion-search .clearButton { user-select: none; border-radius: 20px; cursor: pointer; - margin-left: 8px; + margin-left: 8px } - .notion-search .clearIcon { width: 14px; height: 14px; - fill: var(--fg-color-2); + fill: var(--fg-color-2) } - .notion-search .clearButton:hover .clearIcon { - fill: var(--fg-color-3); + fill: var(--fg-color-3) } - .notion-search .clearButton:active .clearIcon { - fill: var(--fg-color-6); + fill: var(--fg-color-6) } - @keyframes spinner { to { - transform: rotate(360deg); + transform: rotate(360deg) } } - .notion-search .loadingIcon { - animation: spinner 0.6s linear infinite; + animation: spinner .6s linear infinite } - .notion-search .noResultsPane { display: flex; flex-direction: column; justify-content: center; align-items: center; - padding: 32px 16px; + padding: 32px 16px } - .notion-search .noResults { font-size: 14px; font-weight: 500; line-height: 20px; - color: oklch(33% 0 92 / 0.6); + color: rgba(55,53,47,.6) } - .notion-search .noResultsDetail { font-size: 14px; margin-top: 2px; - color: oklch(33% 0 92 / 0.4); + color: rgba(55,53,47,.4) } - .notion-search .resultsFooter { - box-shadow: oklch(33% 0 92 / 0.1) 0px -1px 0px; + box-shadow: rgba(55,53,47,.09) 0 -1px 0; margin-top: 1px; font-size: 12px; min-height: 28px; @@ -2609,179 +2183,144 @@ svg.notion-page-icon { padding: 0 16px; display: flex; flex-direction: column; - justify-content: center; + justify-content: center } - .notion-search .resultsCount { font-weight: 500; - color: var(--fg-color-3); + color: var(--fg-color-3) } - .notion-search .resultsPane { display: flex; flex-direction: column; height: 100%; flex: 1; - overflow: auto; + overflow: auto } - .notion-search .resultsPane .result { padding: 8px 14px; - border-bottom: 1px solid oklch(33% 0 92 / 0.1); + border-bottom: 1px solid rgba(55,53,47,.06); font-size: 14px; user-select: none; display: flex; flex-direction: column; align-items: stretch; color: var(--fg-color); - text-decoration: none; + text-decoration: none } - .notion-search .resultsPane .result:hover { - background: var(--bg-color-2) !important; + background: var(--bg-color-2)!important } - .notion-search .resultsPane .result:active { - background: var(--fg-color-1) !important; + background: var(--fg-color-1)!important } - .notion-search .resultsPane .result { min-height: unset; - height: unset; + height: unset } - .notion-search .resultsPane .result .notion-page-title { - display: flex; + display: flex } - .notion-search .resultsPane .result .notion-search-result-highlight { font-size: 90%; - margin: 4px 0 0 30px; + margin: 4px 0 0 30px } - .notion-sync-block { - width: 100%; + width: 100% } - .notion-collection-group { - margin-bottom: 1em; + margin-bottom: 1em } - -.notion-collection-group > summary { -} - .notion-collection-group > summary > div { - transform: scale(0.85); + transform: scale(.85); transform-origin: 0% 50%; display: inline-flex; - align-items: center; + align-items: center } - .notion-simple-table { border: 1px solid var(--fg-color-5); border-collapse: collapse; border-spacing: 0; - font-size: 14px; + font-size: 14px } - -/* simple table header */ -/* row header */ .notion-simple-table-header-row td { - background: var(--bg-color-0); + background: var(--bg-color-0) } - -/* column header */ .notion-simple-table-header-cell { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-simple-table td { border: 1px solid var(--fg-color-5); padding: 8px 8px; - white-space: pre-wrap; + white-space: pre-wrap } - .notion-external { border-radius: 3px; transition: background 120ms ease-in 0s; - text-decoration: none; + text-decoration: none } - .notion-external:hover { - background: var(--bg-color-0); + background: var(--bg-color-0) } - .notion-external-block { width: 100%; margin-top: 4px; border: 1px solid var(--fg-color-1); padding: 6px 6px; - display: flex; + display: flex } - .notion-external-mention { display: inline-flex; padding: 0 4px; align-items: center; position: relative; - top: 3px; + top: 3px } - .notion-external-image { width: 32px; height: 32px; - margin: 3px 12px 3px 4px; + margin: 3px 12px 3px 4px } - .notion-external-mention .notion-external-image { display: inline-flex; align-items: center; width: 16px; height: 16px; margin: 0; - margin-right: 0.3em; + margin-right: .3em } - .notion-external-mention .notion-external-image svg { width: 100%; - height: 100%; + height: 100% } - .notion-external-description { display: flex; - flex-direction: column; + flex-direction: column } - .notion-external-mention .notion-external-description { display: inline-flex; flex-direction: row; - align-items: center; + align-items: center } - .notion-external-title { font-size: 14px; font-weight: 500; - color: var(--fg-color-4); + color: var(--fg-color-4) } - .notion-external-mention .notion-external-title { display: inline; font-size: 16px; - border-bottom: 0.05em solid var(--fg-color-1); + border-bottom: .05em solid var(--fg-color-1) } - .notion-external-subtitle { font-size: 12px; - color: var(--fg-color-3); + color: var(--fg-color-3) } - .notion-external-block-desc { - color: oklch(33% 0 92 / 0.7); + color: rgba(55,53,47,.65); font-size: 12px; white-space: nowrap; - padding-top: 4px; + padding-top: 4px } - .notion-external-mention .notion-external-subtitle { display: none; position: absolute; @@ -2791,64 +2330,53 @@ svg.notion-page-icon { background: var(--bg-color); z-index: 999; padding: 8px; - box-shadow: - oklch(17% 0 0 / 0.1) 0 0 0 1px, - oklch(17% 0 0 / 0.1) 0 2px 4px; + box-shadow: rgba(15,15,15,.1) 0 0 0 1px,rgba(15,15,15,.1) 0 2px 4px } - .notion-external-mention .notion-external-subtitle-item { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; line-height: 1.5; - padding: 4px 0; + padding: 4px 0 } - .notion-external-mention .notion-external-subtitle-item-name { flex: none; width: 70px; - font-weight: 500; + font-weight: 500 } - .notion-external-mention .notion-external-subtitle-item-desc { - flex: 1; + flex: 1 } - .notion-external-description:hover .notion-external-subtitle { - display: block; + display: block } - .notion-preview-card-domain-warp { display: flex; flex-direction: row; justify-content: flex-start; - align-items: center; + align-items: center } - .notion-preview-card-domain-warp .notion-preview-card-domain { - padding-left: 4px; + padding-left: 4px } .notion-preview-card-domain-warp .notion-preview-card-logo { width: 14px; - height: 14px; + height: 14px } - .notion-preview-card-title { font-size: 16px; line-height: 1.5; padding: 4px 0; font-weight: 500; - color: var(--fg-color-4); + color: var(--fg-color-4) } - .notion-preview-card-github-shields img { margin-right: 4px; - padding: 4px 0; + padding: 4px 0 } - .notion-yt-lite { - background-color: oklch(0% 0 0); + background-color: #000; position: absolute; width: 100%; height: 100%; @@ -2856,9 +2384,8 @@ svg.notion-page-icon { contain: content; background-position: center center; background-size: cover; - cursor: pointer; + cursor: pointer } - .notion-yt-lite::before { content: ''; display: block; @@ -2870,77 +2397,68 @@ svg.notion-page-icon { width: 100%; height: 60px; padding-bottom: 50px; - transition: all 0.2s cubic-bezier(0, 0, 0.2, 1); + transition: all .2s cubic-bezier(0, 0, .2, 1) } - .notion-yt-lite > iframe { width: 100%; height: 100%; position: absolute; top: 0; - left: 0; + left: 0 } .notion-yt-playbtn { width: 68px; height: 48px; position: absolute; cursor: pointer; - transform: translate3d(-50%, -50%, 0); + transform: translate3d(-50%,-50%,0); top: 50%; left: 50%; z-index: 1; background-color: transparent; - /* YT's actual play button svg */ background-image: url('data:image/svg+xml;utf8,'); filter: grayscale(100%); - transition: filter 0.1s cubic-bezier(0, 0, 0.2, 1); - border: none; + transition: filter .1s cubic-bezier(0, 0, .2, 1); + border: none } .notion-yt-lite:hover > .notion-yt-playbtn, .notion-yt-youtube .notion-yt-playbtn:focus { - filter: none; + filter: none } - .notion-yt-initialized { - cursor: unset; + cursor: unset } -.notion-yt-initialized::before, -.notion-yt-initialized > .notion-yt-playbtn { +.notion-yt-initialized > .notion-yt-playbtn, +.notion-yt-initialized::before { opacity: 0; - pointer-events: none; + pointer-events: none } - .notion-yt-thumbnail { position: absolute; top: 0; left: 0; width: 100%; height: 100%; - object-fit: cover; + object-fit: cover } - .notion-collection-view-dropdown-content { font-family: var(--notion-font); min-width: 220; - background: oklch(100% 0 0); + background: #fff; border-radius: 6; padding: 0; - box-shadow: - 0px 10px 38px -10px oklch(20% 0 250 / 0.3), - 0px 10px 20px -15px oklch(20% 0 250 / 0.2); - animation-duration: 400ms; - animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); + box-shadow: 0 10px 38px -10px rgba(22,23,24,.35),0 10px 20px -15px rgba(22,23,24,.2); + animation-duration: .4s; + animation-timing-function: cubic-bezier(0.16,1,0.3,1); animation-fill-mode: forwards; - will-change: transform, opacity; + will-change: transform,opacity } - .notion-collection-view-tabs-row { display: flex; flex-direction: row; flex-wrap: wrap; - width: 120%; + width: 120% } - .notion-collection-view-tabs-content-item { all: unset; position: relative; @@ -2951,153 +2469,128 @@ svg.notion-page-icon { align-items: center; user-select: none; cursor: pointer; - color: oklch(33% 0 92); - font-size: 14px; + color: #37352f; + font-size: 14px } - .notion-collection-view-tabs-content-item:hover { background-color: var(--fg-color-1); - border-radius: 3px; + border-radius: 3px } - .notion-collection-view-tabs-content-item-active { - border-bottom: solid 2px oklch(0% 0 0); - font-weight: bold; + border-bottom: solid 2px #000; + font-weight: 700 } - -@media only screen and (max-width: 730px) { +@media only screen and (max-width:730px) { .notion-collection-view-tabs-row { - width: 100%; + width: 100% } } - @keyframes slideDownAndFade { 0% { opacity: 0; - transform: translateY(-2px); + transform: translateY(-2px) } - 100% { opacity: 1; - transform: translateY(0); + transform: translateY(0) } } - -.notion-collection-view-dropdown-content[data-state='open'] { - animation-name: slideDownAndFade; +.notion-collection-view-dropdown-content[data-state=open] { + animation-name: slideDownAndFade } - .nested-form-link { - background: none !important; + background: 0 0!important; border: none; - padding: 0 !important; + padding: 0!important; text-decoration: underline; - cursor: pointer; + cursor: pointer } - -/* Link Mention Styles */ .notion-link-mention { position: relative; display: inline-flex; - align-items: center; - vertical-align: middle; + align-items: center; + vertical-align: middle } - .notion-link-mention-link { display: inline-flex; align-items: center; - gap: 0.5rem; + gap: .5rem } - .notion-link-mention-icon { width: 1.5rem; height: 1.5rem; - border-radius: 0.375rem; + border-radius: .375rem } - .notion-link-mention-provider { - font-size: 0.875rem; - color: var(--fg-color); + font-size: .875rem; + color: var(--fg-color) } - .notion-link-mention-title { - font-size: 0.875rem; + font-size: .875rem; font-weight: 600; - color: var(--fg-color); + color: var(--fg-color) } - -/* Preview card (appears on hover) */ .notion-link-mention-preview { display: none; position: absolute; top: 100%; left: 0; - margin-top: 0.5rem; - z-index: 100000; + margin-top: .5rem; + z-index: 100000 } - .notion-link-mention:hover .notion-link-mention-preview { - display: block; + display: block } - .notion-link-mention-card { - width: 18rem; - height: 15rem; + width: 18rem; + height: 15rem; background: var(--bg-color); - border-radius: 0.75rem; - border: 1px solid oklch(24% 0 250 / 0.1); + border-radius: .75rem; + border: 1px solid rgba(27,31,36,.15); overflow: hidden; - box-shadow: - 0 4px 6px -1px oklch(0% 0 0 / 0.1), - 0 2px 4px -1px oklch(0% 0 0 / 0.1); + box-shadow: 0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06) } - .notion-link-mention-preview-thumbnail { width: 100%; height: 55%; - object-fit: cover; + object-fit: cover } - .notion-link-mention-preview-content { display: flex; flex-direction: column; height: 45%; - padding: 0.5rem 1rem; - gap: 0.125rem; + padding: .5rem 1rem; + gap: .125rem } - .notion-link-mention-preview-title { - font-size: 0.875rem; + font-size: .875rem; font-weight: 700; color: var(--fg-color); - margin: 0; + margin: 0 } - .notion-link-mention-preview-description { - font-size: 0.875rem; + font-size: .875rem; color: var(--fg-color); display: -webkit-box; -webkit-line-clamp: 2; + line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; - margin: 0; + margin: 0 } - .notion-link-mention-preview-footer { display: flex; align-items: center; - gap: 0.375rem; + gap: .375rem; margin-top: auto; - padding-bottom: 0.5rem; + padding-bottom: .5rem } - .notion-link-mention-preview-icon { width: 1rem; height: 1rem; - border-radius: 0.25rem; + border-radius: .25rem } - .notion-link-mention-preview-provider { - font-size: 0.875rem; - color: var(--fg-color-2); -} + font-size: .875rem; + color: var(--fg-color-2) +} \ No newline at end of file diff --git a/packages/react-notion-x/src/third-party/pdf.tsx b/packages/react-notion-x/src/third-party/pdf.tsx index 343d9de7..c360b9e6 100644 --- a/packages/react-notion-x/src/third-party/pdf.tsx +++ b/packages/react-notion-x/src/third-party/pdf.tsx @@ -2,7 +2,8 @@ import React from 'react' import { Document, Page, pdfjs } from 'react-pdf' // ensure pdfjs can find its worker script regardless of how react-notion-x is bundled -pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.mjs` +//pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.mjs` +pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs` export function Pdf({ file, ...rest }: { file: string }) { const [numPages, setNumPages] = React.useState(0) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ac51f8b..84513bcd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,9 +75,6 @@ catalogs: ky: specifier: ^1.8.1 version: 1.8.1 - lightningcss: - specifier: ^1.30.1 - version: 1.30.1 lodash.throttle: specifier: ^4.1.1 version: 4.1.1 @@ -126,9 +123,9 @@ catalogs: react-image: specifier: ^4.0.3 version: 4.1.0 - react-lazy-images: - specifier: ^1.1.0 - version: 1.1.0 + react-intersection-observer: + specifier: ^9.16.0 + version: 9.16.0 react-modal: specifier: ^3.16.3 version: 3.16.3 @@ -153,6 +150,9 @@ catalogs: typescript: specifier: ^5.8.3 version: 5.8.3 + unionize: + specifier: ^3.1.0 + version: 3.1.0 vitest: specifier: ^3.2.2 version: 3.2.2 @@ -179,12 +179,6 @@ importers: eslint: specifier: 'catalog:' version: 9.28.0(jiti@2.4.2) - got: - specifier: 'catalog:' - version: 14.4.7 - lightningcss: - specifier: 'catalog:' - version: 1.30.1 npm-run-all2: specifier: 'catalog:' version: 8.0.4 @@ -330,9 +324,6 @@ importers: got: specifier: 'catalog:' version: 14.4.7 - ky: - specifier: 'catalog:' - version: 1.8.1 notion-types: specifier: workspace:* version: link:../notion-types @@ -411,12 +402,15 @@ importers: react-image: specifier: 'catalog:' version: 4.1.0(@babel/runtime@7.27.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react-lazy-images: + react-intersection-observer: specifier: 'catalog:' - version: 1.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 9.16.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react-modal: specifier: 'catalog:' version: 3.16.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + unionize: + specifier: 'catalog:' + version: 3.1.0 devDependencies: '@types/lodash.throttle': specifier: 'catalog:' @@ -439,9 +433,6 @@ importers: format-number: specifier: 'catalog:' version: 3.0.0 - lightningcss: - specifier: 'catalog:' - version: 1.30.1 lodash.throttle: specifier: 'catalog:' version: 4.1.1 @@ -453,8 +444,8 @@ importers: version: 19.1.0(react@19.1.0) optionalDependencies: react-pdf: - specifier: ^9.2.1 - version: 9.2.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^10.0.1 + version: 10.0.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) packages: @@ -1855,6 +1846,70 @@ packages: katex: '>=0.9' react: '>=16' + '@napi-rs/canvas-android-arm64@0.1.72': + resolution: {integrity: sha512-OW99TDJEdfOhpJWQ7SXFsQi1BXd6UFuWM8AoQvJ0SQMHWY/iwuopmb1UqGV6Df9aM/SWxvCWBN/onjeCM8KVKQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.72': + resolution: {integrity: sha512-gB8Pn/4GdS+B6P4HYuNqPGx8iQJ16Go1D6e5hIxfUbA/efupVGZ7e3OMGWGCUgF0vgbEPEF31sPzhcad4mdR5g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.72': + resolution: {integrity: sha512-x1zKtWVSnf+yLETHdSDAFJ1w6bctS/V2NP0wskTTBKkC+c/AmI2Dl+ZMIW11gF6rilBibrIzBeXJKPzV0GMWGA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.72': + resolution: {integrity: sha512-Ef6HMF+TBS+lqBNpcUj2D17ODJrbgevXaVPtr2nQFCao5IvoEhVMdmVwWk5YiI+GcgbAkg5AF3LiU47RoSY5yg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.72': + resolution: {integrity: sha512-i1tWu+Li1Z6G4t+ckT38JwuB/cAAREV6H8VD3dip2yTYU+qnLz6kG4i+whm+SEQb1e4vk3xA1lKnjYx3jlOy8g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.72': + resolution: {integrity: sha512-Mu+2hHZAT9SdrjiRtCxMD/Unac8vqVxF/p+Tvjb5sN1NZkLGu+l7WIfrug8aeX150OwrYgAvsR4mhrm0BZvLxg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.72': + resolution: {integrity: sha512-xBPG/ImL58I4Ep6VM+sCrpwl8rE/8e7Dt9U7zzggNvYHrWD13vIF3q5L2/N9VxdBMh1pee6dBC/VcaXLYccZNQ==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.72': + resolution: {integrity: sha512-jkC8L+QovHpzQrw+Jm1IUqxgLV5QB1hJ1cR8iYzxNRd0TOF7YfxLaIGxvd/ReRi9r48JT6PL7z2IGT7TqK8T4w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.72': + resolution: {integrity: sha512-PwPdPmHgJYnTMUr8Gff80eRVdpGjwrxueIqw+7v4aeFxbQjmQ+paa2xaGedFtkvdS2Dn5z8a0mVlrlbSfec+1Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-x64-msvc@0.1.72': + resolution: {integrity: sha512-hZhXJZZ/2ZjkAoOtyGUs3Mx6jA4o9ESbc5bk+NKYO6thZRvRNA7rqvT9WF9pZK0xcRK5EyWRymv8fCzqmSVEzg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.72': + resolution: {integrity: sha512-ypTJ/DXzsJbTU3o7qXFlWmZGgEbh42JWQl7v5/i+DJz/HURELcSnq9ler9e1ukqma70JzmCQcIseiE/Xs6sczw==} + engines: {node: '>= 10'} + '@next/env@15.3.3': resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==} @@ -2865,9 +2920,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -2882,9 +2934,6 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -2927,9 +2976,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -3025,10 +3071,6 @@ packages: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} engines: {node: '>=6'} - canvas@3.1.0: - resolution: {integrity: sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==} - engines: {node: ^18.12.0 || >= 20.9.0} - case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} @@ -3068,9 +3110,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3472,10 +3511,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - 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==} @@ -3673,9 +3708,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -4005,10 +4037,6 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - expect-type@1.2.1: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} @@ -4178,9 +4206,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -4261,9 +4286,6 @@ packages: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4481,9 +4503,6 @@ packages: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -4533,9 +4552,6 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -5222,8 +5238,8 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - make-cancellable-promise@1.3.2: - resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} + make-cancellable-promise@2.0.0: + resolution: {integrity: sha512-3SEQqTpV9oqVsIWqAcmDuaNeo7yBO3tqPtqGRcKkEo0lrzD3wqbKG9mkxO65KoOgXqj+zH2phJ2LiAsdzlogSw==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -5233,8 +5249,8 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-event-props@1.6.2: - resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} + make-event-props@2.0.0: + resolution: {integrity: sha512-G/hncXrl4Qt7mauJEXSg3AcdYzmpkIITTNl5I+rH9sog5Yw0kK6vseJjCaPfOXqOqQuPUP89Rkhfz5kPS8ijtw==} makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -5272,8 +5288,8 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-refs@1.3.0: - resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} + merge-refs@2.0.0: + resolution: {integrity: sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: @@ -5379,9 +5395,6 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - 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 @@ -5415,9 +5428,6 @@ 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==} - natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -5455,13 +5465,6 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abi@3.74.0: - resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} - engines: {node: '>=10'} - - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-fetch-native@1.6.6: resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} @@ -5722,10 +5725,6 @@ packages: resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} engines: {node: '>=18'} - path2d@0.2.2: - resolution: {integrity: sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==} - engines: {node: '>=6'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -5733,9 +5732,9 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - pdfjs-dist@4.8.69: - resolution: {integrity: sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==} - engines: {node: '>=18'} + pdfjs-dist@5.3.31: + resolution: {integrity: sha512-EhPdIjNX0fcdwYQO+e3BAAJPXt+XI29TZWC7COhIXs/K0JHcUt1Gdz1ITpebTwVMFiLsukdUZ3u0oTO7jij+VA==} + engines: {node: '>=20.16.0 || >=22.3.0'} perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -6240,11 +6239,6 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -6297,9 +6291,6 @@ packages: psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -6343,10 +6334,6 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-app-polyfill@3.0.0: resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} engines: {node: '>=14'} @@ -6385,10 +6372,14 @@ packages: react: '>=16.8' react-dom: '>=16.8' - react-intersection-observer@6.4.2: - resolution: {integrity: sha512-gL6YrkhniA0tIbyDbUterzBwKh61vHR520rsKULel5T37gG4YP07wnWI3WoqOcKK5bKAu0PZB2FHD7/OjawN+w==} + react-intersection-observer@9.16.0: + resolution: {integrity: sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==} peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -6399,12 +6390,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-lazy-images@1.1.0: - resolution: {integrity: sha512-h5DHFhkMJyh2qsDl3hXWu6d+On10FsgHtRJ+BH7xjgsFOvsqaii9CEwEESqPJrrAiHo1qrN1LgzrV8X3zctHKA==} - peerDependencies: - react: ^15 || ^16 - react-dom: ^15 || ^16 - react-lifecycles-compat@3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} @@ -6414,8 +6399,8 @@ packages: react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 - react-pdf@9.2.1: - resolution: {integrity: sha512-AJt0lAIkItWEZRA5d/mO+Om4nPCuTiQ0saA+qItO967DTjmGjnhmF+Bi2tL286mOTfBlF5CyLzJ35KTMaDoH+A==} + react-pdf@10.0.1: + resolution: {integrity: sha512-dblLZ5BqubeNFZwTzHkRi7Rexev2+Xb9z7sEvNYT+IOxmih1KgrByeqD4Hm0RnwR9nTWludXbiHQMe9d47DK2w==} 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 @@ -6801,9 +6786,6 @@ packages: simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-git-hooks@2.13.0: resolution: {integrity: sha512-N+goiLxlkHJlyaYEglFypzVNMaNplPAk5syu0+OPp/Bk6dwVoXF6FfOw2vO0Dp+JHsBaI+w6cm8TnFl2Hw6tDA==} hasBin: true @@ -6987,10 +6969,6 @@ packages: resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} engines: {node: '>=12'} - 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'} @@ -7075,13 +7053,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@2.1.2: - resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -7251,9 +7222,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@2.5.4: resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} cpu: [x64] @@ -7384,8 +7352,8 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} - unionize@2.2.0: - resolution: {integrity: sha512-lHXiL6LPVuRYBGCLOdUd4GMHoAGqM0HtYHAZcA6pUEiwN1nk+LEYlh8bud7saeL0bkFntJzCPEPVVJeFm3Cqsg==} + unionize@3.1.0: + resolution: {integrity: sha512-LQZvbanzvpzvK0QYgRvnaA9VVe+g4nTbRlyoGGWDKFrZn0HJnDN5LC2Ti0+BxpKKOCrL3BQcRBVFPy/t12Y24Q==} unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} @@ -9379,6 +9347,50 @@ snapshots: katex: 0.16.21 react: 19.1.0 + '@napi-rs/canvas-android-arm64@0.1.72': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.72': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.72': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.72': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.72': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.72': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.72': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.72': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.72': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.72': + optional: true + + '@napi-rs/canvas@0.1.72': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.72 + '@napi-rs/canvas-darwin-arm64': 0.1.72 + '@napi-rs/canvas-darwin-x64': 0.1.72 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.72 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.72 + '@napi-rs/canvas-linux-arm64-musl': 0.1.72 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.72 + '@napi-rs/canvas-linux-x64-gnu': 0.1.72 + '@napi-rs/canvas-linux-x64-musl': 0.1.72 + '@napi-rs/canvas-win32-x64-msvc': 0.1.72 + optional: true + '@next/env@15.3.3': {} '@next/swc-darwin-arm64@15.3.3': @@ -10525,9 +10537,6 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: - optional: true - batch@0.6.1: {} bfj@7.1.0: @@ -10542,13 +10551,6 @@ snapshots: binary-extensions@2.3.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - optional: true - bluebird@3.7.2: {} body-parser@1.20.3: @@ -10610,12 +10612,6 @@ snapshots: buffer-from@1.1.2: {} - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - optional: true - builtin-modules@3.3.0: {} builtin-modules@5.0.0: {} @@ -10729,12 +10725,6 @@ snapshots: - supports-color optional: true - canvas@3.1.0: - dependencies: - node-addon-api: 7.1.1 - prebuild-install: 7.1.3 - optional: true - case-sensitive-paths-webpack-plugin@2.4.0: {} chai@5.2.0: @@ -10780,9 +10770,6 @@ snapshots: dependencies: readdirp: 4.1.2 - chownr@1.1.4: - optional: true - chownr@2.0.0: optional: true @@ -11158,9 +11145,6 @@ snapshots: deep-eql@5.0.2: {} - deep-extend@0.6.0: - optional: true - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -11331,11 +11315,6 @@ snapshots: encodeurl@2.0.0: {} - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - optional: true - enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -11946,9 +11925,6 @@ snapshots: exit@0.1.2: {} - expand-template@2.0.3: - optional: true - expect-type@1.2.1: {} expect@27.5.1: @@ -12154,9 +12130,6 @@ snapshots: fresh@0.5.2: {} - fs-constants@1.0.0: - optional: true - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -12260,9 +12233,6 @@ snapshots: nypm: 0.6.0 pathe: 2.0.3 - github-from-package@0.0.0: - optional: true - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -12512,9 +12482,6 @@ snapshots: dependencies: harmony-reflect: 1.6.2 - ieee754@1.2.1: - optional: true - ignore@5.3.2: {} ignore@7.0.3: {} @@ -12554,10 +12521,6 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - invariant@2.2.4: - dependencies: - loose-envify: 1.4.0 - ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} @@ -13373,6 +13336,7 @@ snapshots: lightningcss-linux-x64-musl: 1.30.1 lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 + optional: true lilconfig@2.1.0: {} @@ -13450,7 +13414,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-cancellable-promise@1.3.2: + make-cancellable-promise@2.0.0: optional: true make-dir@3.1.0: @@ -13461,7 +13425,7 @@ snapshots: dependencies: semver: 7.7.2 - make-event-props@1.6.2: + make-event-props@2.0.0: optional: true makeerror@1.0.12: @@ -13490,7 +13454,7 @@ snapshots: merge-descriptors@1.0.3: {} - merge-refs@1.3.0(@types/react@19.1.8): + merge-refs@2.0.0(@types/react@19.1.8): optionalDependencies: '@types/react': 19.1.8 optional: true @@ -13569,9 +13533,6 @@ snapshots: yallist: 4.0.0 optional: true - mkdirp-classic@0.5.3: - optional: true - mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -13606,9 +13567,6 @@ snapshots: nanoid@3.3.10: {} - napi-build-utils@2.0.0: - optional: true - natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} @@ -13647,14 +13605,6 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-abi@3.74.0: - dependencies: - semver: 7.7.2 - optional: true - - node-addon-api@7.1.1: - optional: true - node-fetch-native@1.6.6: {} node-fetch@2.7.0: @@ -13918,17 +13868,13 @@ snapshots: path-type@6.0.0: {} - path2d@0.2.2: - optional: true - pathe@2.0.3: {} pathval@2.0.0: {} - pdfjs-dist@4.8.69: + pdfjs-dist@5.3.31: optionalDependencies: - canvas: 3.1.0 - path2d: 0.2.2 + '@napi-rs/canvas': 0.1.72 optional: true perfect-debounce@1.0.0: {} @@ -14412,22 +14358,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.0.4 - 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.74.0 - pump: 3.0.2 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.2 - tunnel-agent: 0.6.0 - optional: true - prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} @@ -14480,12 +14410,6 @@ snapshots: psl@1.9.0: {} - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - optional: true - punycode@2.3.1: {} q@1.5.1: {} @@ -14522,14 +14446,6 @@ snapshots: defu: 6.1.4 destr: 2.0.3 - 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-app-polyfill@3.0.0: dependencies: core-js: 3.38.1 @@ -14593,11 +14509,11 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-intersection-observer@6.4.2(react@19.1.0): + react-intersection-observer@9.16.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@babel/runtime': 7.26.10 - invariant: 2.2.4 react: 19.1.0 + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) react-is@16.13.1: {} @@ -14605,13 +14521,6 @@ snapshots: react-is@18.3.1: {} - react-lazy-images@1.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-intersection-observer: 6.4.2(react@19.1.0) - unionize: 2.2.0 - react-lifecycles-compat@3.0.4: {} react-modal@3.16.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -14623,14 +14532,14 @@ snapshots: react-lifecycles-compat: 3.0.4 warning: 4.0.3 - react-pdf@9.2.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-pdf@10.0.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: clsx: 2.1.1 dequal: 2.0.3 - make-cancellable-promise: 1.3.2 - make-event-props: 1.6.2 - merge-refs: 1.3.0(@types/react@19.1.8) - pdfjs-dist: 4.8.69 + make-cancellable-promise: 2.0.0 + make-event-props: 2.0.0 + merge-refs: 2.0.0(@types/react@19.1.8) + pdfjs-dist: 5.3.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) tiny-invariant: 1.3.3 @@ -15195,13 +15104,6 @@ snapshots: 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-hooks@2.13.0: {} simple-swizzle@0.2.2: @@ -15406,9 +15308,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: - optional: true - strip-json-comments@3.1.1: {} style-loader@3.3.4(webpack@5.95.0(esbuild@0.25.1)): @@ -15516,23 +15415,6 @@ snapshots: tapable@2.2.1: {} - tar-fs@2.1.2: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 - optional: true - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - optional: true - tar@6.2.1: dependencies: chownr: 2.0.0 @@ -15706,11 +15588,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - optional: true - turbo-darwin-64@2.5.4: optional: true @@ -15836,7 +15713,7 @@ snapshots: unicorn-magic@0.3.0: {} - unionize@2.2.0: {} + unionize@3.1.0: {} unique-string@2.0.0: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f329ed14..e90a182f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -41,8 +41,8 @@ catalog: react-dom: ^19.1.0 react-fast-compare: ^3.2.0 react-hotkeys-hook: ^4.5.1 + react-intersection-observer: ^9.16.0 react-image: ^4.0.3 - react-lazy-images: ^1.1.0 react-modal: ^3.16.3 react-scripts: 5.0.1 react-tweet-embed: ^2.0.0 @@ -51,6 +51,7 @@ catalog: tsx: ^4.19.4 turbo: ^2.5.4 typescript: ^5.8.3 + unionize: ^3.1.0 vitest: ^3.2.2 ignoredBuiltDependencies: - '@fisch0920/config' From a7ad773ebbcf010bfa1015e904d1e3eb738708bb Mon Sep 17 00:00:00 2001 From: Mustaqim Arifin Date: Sun, 10 Aug 2025 15:38:25 +0800 Subject: [PATCH 3/3] Rebased PR based on latest master - (Feature) Lazy-Images-Full with local dependencies. (Fix) Replace KY with OFetch. (Fix) Cleaned up unnceccesary and erroneous changes --- examples/full/components/NotionPage.tsx | 4 +- examples/full/lib/notion.ts | 1 + examples/full/next.config.js | 26 +- examples/minimal/next.config.js | 4 +- package.json | 4 +- packages/notion-client/package.json | 4 +- packages/notion-client/src/notion-api.ts | 123 +- packages/notion-client/tsup.config.ts | 2 +- packages/notion-compat/package.json | 2 +- packages/notion-utils/package.json | 2 +- packages/react-notion-x/package.json | 11 +- .../src/components/lazy-image-full.tsx | 2 +- packages/react-notion-x/src/context.tsx | 11 + packages/react-notion-x/src/next.tsx | 11 +- packages/react-notion-x/src/renderer.tsx | 5 + packages/react-notion-x/src/styles.css | 1707 +++++++++++------ .../src/third-party/collection-utils.ts | 2 +- .../src/third-party/eval-formula.ts | 2 +- .../react-notion-x/src/third-party/pdf.tsx | 3 +- .../src/third-party/property.tsx | 6 +- pnpm-lock.yaml | 696 +++---- pnpm-workspace.yaml | 34 +- 22 files changed, 1532 insertions(+), 1130 deletions(-) diff --git a/examples/full/components/NotionPage.tsx b/examples/full/components/NotionPage.tsx index 2c66646f..c9350986 100644 --- a/examples/full/components/NotionPage.tsx +++ b/examples/full/components/NotionPage.tsx @@ -1,6 +1,6 @@ import dynamic from 'next/dynamic' import Head from 'next/head' -//import Image from 'next/image' +// import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' import { type ExtendedRecordMap } from 'notion-types' @@ -182,7 +182,7 @@ export function NotionPage({ previewImages={previewImagesEnabled} components={{ // NOTE (transitive-bullshit 3/12/2023): I'm disabling next/image for this repo for now because the amount of traffic started costing me hundreds of dollars a month in Vercel image optimization costs. I'll probably re-enable it in the future if I can find a better solution. - //nextImage: Image, + // nextLegacyImage: Image, nextLink: Link, Code, Collection, diff --git a/examples/full/lib/notion.ts b/examples/full/lib/notion.ts index 6dafe25a..87da813a 100644 --- a/examples/full/lib/notion.ts +++ b/examples/full/lib/notion.ts @@ -30,6 +30,7 @@ export async function getPage(pageId: string): Promise { return recordMap } + export async function search(params: SearchParams): Promise { if ('search' in notion) { return notion.search(params) diff --git a/examples/full/next.config.js b/examples/full/next.config.js index 9623726b..a7c8ca34 100644 --- a/examples/full/next.config.js +++ b/examples/full/next.config.js @@ -1,22 +1,14 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - eslint: { - ignoreDuringBuilds: true - }, - typescript: { - ignoreBuildErrors: true - }, +export default { + staticPageGenerationTimeout: 300, images: { - remotePatterns: [ - { protocol: 'https', hostname: 'www.notion.so' }, - { protocol: 'https', hostname: 'notion.so' }, - { protocol: 'https', hostname: 'images.unsplash.com' }, - { protocol: 'https', hostname: 'abs.twimg.com' }, - { protocol: 'https', hostname: 'pbs.twimg.com' }, - { protocol: 'https', hostname: 's3.us-west-2.amazonaws.com' } + domains: [ + 'www.notion.so', + 'notion.so', + 'images.unsplash.com', + 'abs.twimg.com', + 'pbs.twimg.com', + 's3.us-west-2.amazonaws.com' ], formats: ['image/avif', 'image/webp'] } } - -export default nextConfig diff --git a/examples/minimal/next.config.js b/examples/minimal/next.config.js index 9f0ad109..bb37e607 100644 --- a/examples/minimal/next.config.js +++ b/examples/minimal/next.config.js @@ -1,4 +1,4 @@ -const nextConfig = { +export default { staticPageGenerationTimeout: 300, images: { domains: [ @@ -10,5 +10,3 @@ const nextConfig = { formats: ['image/avif', 'image/webp'] } } - -export default nextConfig diff --git a/package.json b/package.json index 69224c5d..066df29b 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "dev": "turbo dev --concurrency 50 --continue --filter='./packages/*'", "clean": "turbo clean", "test": "turbo test", - "test:format": "prettier --check \"**/*.{js,ts,tsx}\" --write", + "test:format": "prettier --check \"**/*.{js,ts,tsx}\"", "test:lint": "turbo test:lint", "test:typecheck": "turbo test:typecheck", "test:unit": "turbo test:unit", @@ -53,4 +53,4 @@ "eslint --fix" ] } -} +} \ No newline at end of file diff --git a/packages/notion-client/package.json b/packages/notion-client/package.json index e2ad0766..82e43d05 100644 --- a/packages/notion-client/package.json +++ b/packages/notion-client/package.json @@ -22,12 +22,12 @@ "watch": "tsup --watch --silent --onSuccess 'echo build successful'", "clean": "del build", "test": "run-s test:*", - "test:lint": "eslint . --fix", + "test:lint": "eslint .", "test:typecheck": "tsc --noEmit", "test:unit": "vitest run" }, "dependencies": { - "got": "catalog:", + "ofetch": "catalog:", "notion-types": "workspace:*", "notion-utils": "workspace:*", "p-map": "catalog:" diff --git a/packages/notion-client/src/notion-api.ts b/packages/notion-client/src/notion-api.ts index 56f5bae1..3556d159 100644 --- a/packages/notion-client/src/notion-api.ts +++ b/packages/notion-client/src/notion-api.ts @@ -1,11 +1,14 @@ +// import { promises as fs } from 'fs' +//import ky, { type Options as OfetchOptions } from 'ky' + import type * as notion from 'notion-types' -import got, { type OptionsOfJSONResponseBody as Got_Options } from 'got' import { getBlockCollectionId, getPageContentBlockIds, parsePageId, uuidToId } from 'notion-utils' +import { type FetchOptions as OfetchOptions, ofetch } from 'ofetch' import pMap from 'p-map' import type * as types from './types' @@ -18,27 +21,27 @@ export class NotionAPI { private readonly _authToken?: string private readonly _activeUser?: string private readonly _userTimeZone: string - private readonly _kyOptions?: Got_Options + private readonly _ofetchOptions?: OfetchOptions constructor({ apiBaseUrl = 'https://www.notion.so/api/v3', authToken, activeUser, userTimeZone = 'America/New_York', - kyOptions + ofetchOptions }: { apiBaseUrl?: string authToken?: string userLocale?: string userTimeZone?: string activeUser?: string - kyOptions?: Got_Options + ofetchOptions?: OfetchOptions } = {}) { this._apiBaseUrl = apiBaseUrl this._authToken = authToken this._activeUser = activeUser this._userTimeZone = userTimeZone - this._kyOptions = kyOptions + this._ofetchOptions = ofetchOptions } public async getPage( @@ -53,7 +56,7 @@ export class NotionAPI { throwOnCollectionErrors = false, collectionReducerLimit = 999, fetchRelationPages = false, - kyOptions + ofetchOptions }: { concurrency?: number fetchMissingBlocks?: boolean @@ -64,13 +67,13 @@ export class NotionAPI { throwOnCollectionErrors?: boolean collectionReducerLimit?: number fetchRelationPages?: boolean - kyOptions?: Got_Options + ofetchOptions?: OfetchOptions } = {} ): Promise { const page = await this.getPageRaw(pageId, { chunkLimit, chunkNumber, - kyOptions + ofetchOptions }) const recordMap = page?.recordMap as notion.ExtendedRecordMap @@ -99,9 +102,10 @@ export class NotionAPI { break } - const newBlocks = await this.getBlocks(pendingBlockIds, kyOptions).then( - (res) => res.recordMap.block - ) + const newBlocks = await this.getBlocks( + pendingBlockIds, + ofetchOptions + ).then((res) => res.recordMap.block) recordMap.block = { ...recordMap.block, ...newBlocks } } @@ -151,7 +155,7 @@ export class NotionAPI { collectionView, { limit: collectionReducerLimit, - kyOptions + ofetchOptions } ) @@ -218,11 +222,11 @@ export class NotionAPI { // because it is preferable for many use cases as opposed to making these API calls // lazily from the client-side. if (signFileUrls) { - await this.addSignedUrls({ recordMap, contentBlockIds, kyOptions }) + await this.addSignedUrls({ recordMap, contentBlockIds, ofetchOptions }) } if (fetchRelationPages) { - const newBlocks = await this.fetchRelationPages(recordMap, kyOptions) + const newBlocks = await this.fetchRelationPages(recordMap, ofetchOptions) recordMap.block = { ...recordMap.block, ...newBlocks } } @@ -231,7 +235,7 @@ export class NotionAPI { fetchRelationPages = async ( recordMap: notion.ExtendedRecordMap, - kyOptions: Got_Options | undefined + ofetchOptions: OfetchOptions | undefined ): Promise => { const maxIterations = 10 @@ -264,7 +268,7 @@ export class NotionAPI { try { const newBlocks = await this.getBlocks( missingRelationPageIds, - kyOptions + ofetchOptions ).then((res) => res.recordMap.block) recordMap.block = { ...recordMap.block, ...newBlocks } } catch (err: any) { @@ -315,11 +319,11 @@ export class NotionAPI { public async addSignedUrls({ recordMap, contentBlockIds, - kyOptions = {} + ofetchOptions = {} }: { recordMap: notion.ExtendedRecordMap contentBlockIds?: string[] - kyOptions?: Got_Options + ofetchOptions?: OfetchOptions }) { recordMap.signed_urls = {} @@ -371,7 +375,7 @@ export class NotionAPI { try { const { signedUrls } = await this.getSignedFileUrls( allFileInstances, - kyOptions + ofetchOptions ) if (signedUrls.length === allFileInstances.length) { @@ -394,13 +398,13 @@ export class NotionAPI { public async getPageRaw( pageId: string, { - kyOptions, + ofetchOptions, chunkLimit = 100, chunkNumber = 0 }: { chunkLimit?: number chunkNumber?: number - kyOptions?: Got_Options + ofetchOptions?: OfetchOptions } = {} ) { const parsedPageId = parsePageId(pageId) @@ -420,7 +424,7 @@ export class NotionAPI { return this.fetch({ endpoint: 'loadPageChunk', body, - kyOptions + ofetchOptions }) } @@ -433,7 +437,7 @@ export class NotionAPI { searchQuery = '', userTimeZone = this._userTimeZone, loadContentCover = true, - kyOptions + ofetchOptions }: { type?: notion.CollectionViewType limit?: number @@ -441,7 +445,7 @@ export class NotionAPI { userTimeZone?: string userLocale?: string loadContentCover?: boolean - kyOptions?: Got_Options + ofetchOptions?: OfetchOptions } = {} ) { const type = collectionView?.type @@ -625,30 +629,28 @@ export class NotionAPI { }, loader }, - kyOptions: { - timeout: { - request: 60_000 - }, - ...kyOptions, - searchParams: { - // TODO: spread kyOptions?.searchParams + ofetchOptions: { + timeout: 60_000, + ...ofetchOptions, + params: { + // TODO: spread ofetchOptions?.searchParams src: 'initial_load' } } }) } - public async getUsers(userIds: string[], kyOptions?: Got_Options) { + public async getUsers(userIds: string[], ofetchOptions?: OfetchOptions) { return this.fetch>({ endpoint: 'getRecordValues', body: { requests: userIds.map((id) => ({ id, table: 'notion_user' })) }, - kyOptions + ofetchOptions }) } - public async getBlocks(blockIds: string[], kyOptions?: Got_Options) { + public async getBlocks(blockIds: string[], ofetchOptions?: OfetchOptions) { return this.fetch({ endpoint: 'syncRecordValues', body: { @@ -659,24 +661,27 @@ export class NotionAPI { version: -1 })) }, - kyOptions + ofetchOptions }) } public async getSignedFileUrls( urls: types.SignedUrlRequest[], - kyOptions?: Got_Options + ofetchOptions?: OfetchOptions ) { return this.fetch({ endpoint: 'getSignedFileUrls', body: { urls }, - kyOptions + ofetchOptions }) } - public async search(params: notion.SearchParams, kyOptions?: Got_Options) { + public async search( + params: notion.SearchParams, + ofetchOptions?: OfetchOptions + ) { const body = { type: 'BlocksInAncestor', source: 'quick_find_public', @@ -704,25 +709,25 @@ export class NotionAPI { return this.fetch({ endpoint: 'search', body, - kyOptions + ofetchOptions }) } public async fetch({ endpoint, body, - kyOptions, + ofetchOptions, headers: clientHeaders }: { endpoint: string body: object - kyOptions?: Got_Options + ofetchOptions?: OfetchOptions headers?: any }): Promise { const headers: any = { ...clientHeaders, - ...this._kyOptions?.headers, - ...kyOptions?.headers, + ...this._ofetchOptions?.headers, + ...ofetchOptions?.headers, 'Content-Type': 'application/json' } @@ -736,12 +741,30 @@ export class NotionAPI { const url = `${this._apiBaseUrl}/${endpoint}` - return got - .post(url, { - ...kyOptions, - json: body, - headers - }) - .json() + /* const res = await ky.post(url, { + mode: 'no-cors', + ...this._ofetchOptions, + ...ofetchOptions, + json: body, + headers + }) */ + + // TODO: we're awaiting the first fetch and then separately awaiting + // `res.json()` because there seems to be some weird error which repros + // sporadically when loading collections where the body is already used. + // No idea why, but from my testing, separating these into two separate + // steps seems to fix the issue locally for me... + // console.log(endpoint, { bodyUsed: res.bodyUsed }) + + /* return res.json() */ + const res = ofetch(url, { + method: 'POST', + mode: 'no-cors', + ...this._ofetchOptions, + ...ofetchOptions, + body, + headers + }) + return res } } diff --git a/packages/notion-client/tsup.config.ts b/packages/notion-client/tsup.config.ts index bd5caad7..69c6c7dd 100644 --- a/packages/notion-client/tsup.config.ts +++ b/packages/notion-client/tsup.config.ts @@ -8,7 +8,7 @@ export default defineConfig({ format: ['esm'], splitting: false, sourcemap: true, - minify: true, + minify: false, shims: false, dts: true }) diff --git a/packages/notion-compat/package.json b/packages/notion-compat/package.json index 42685ea9..10f45bb5 100644 --- a/packages/notion-compat/package.json +++ b/packages/notion-compat/package.json @@ -22,7 +22,7 @@ "watch": "tsup --watch --silent --onSuccess 'echo build successful'", "clean": "del build", "test": "run-s test:*", - "test:lint": "eslint . --fix", + "test:lint": "eslint .", "test:typecheck": "tsc --noEmit", "test:unit": "vitest run" }, diff --git a/packages/notion-utils/package.json b/packages/notion-utils/package.json index cdb41a98..86c958d5 100644 --- a/packages/notion-utils/package.json +++ b/packages/notion-utils/package.json @@ -28,7 +28,7 @@ "watch": "tsup --watch --silent --onSuccess 'echo build successful'", "clean": "del build", "test": "run-s test:*", - "test:lint": "eslint . --fix", + "test:lint": "eslint .", "test:typecheck": "tsc --noEmit", "test:unit": "vitest run" }, diff --git a/packages/react-notion-x/package.json b/packages/react-notion-x/package.json index a1274c13..3296f40d 100644 --- a/packages/react-notion-x/package.json +++ b/packages/react-notion-x/package.json @@ -9,7 +9,7 @@ "main": "./build/index.js", "module": "./build/index.js", "types": "./build/index.d.ts", - "sideEffects": ["src/styles.css"], + "sideEffects": false, "exports": { ".": { "types": "./build/index.d.ts", @@ -51,7 +51,7 @@ "watch": "tsup --watch --silent --onSuccess 'echo build successful'", "clean": "del build", "test": "run-s test:*", - "test:lint": "eslint . --fix", + "test:lint": "eslint .", "test:typecheck": "tsc --noEmit" }, "dependencies": { @@ -65,8 +65,9 @@ "react-hotkeys-hook": "catalog:", "react-image": "catalog:", "react-intersection-observer": "catalog:", - "react-modal" : "catalog:", + "react-modal": "catalog:", "unionize" : "catalog:" + }, "devDependencies": { "@types/lodash.throttle": "catalog:", @@ -79,13 +80,13 @@ "lodash.throttle": "catalog:", "react": "catalog:", "react-dom": "catalog:", - "react-pdf": "^10.0.1" + "react-pdf": "^9.1.1" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalDependencies": { - "react-pdf": "^10.0.1" + "react-pdf": "^9.2.1" } } diff --git a/packages/react-notion-x/src/components/lazy-image-full.tsx b/packages/react-notion-x/src/components/lazy-image-full.tsx index 3c0b3838..a82768ef 100644 --- a/packages/react-notion-x/src/components/lazy-image-full.tsx +++ b/packages/react-notion-x/src/components/lazy-image-full.tsx @@ -389,7 +389,7 @@ const loadImage = ( } image.addEventListener('load', resolve) - image.addEventListener = reject + image.addEventListener('error', reject) }) /** Promise that resolves after a specified number of ms */ diff --git a/packages/react-notion-x/src/context.tsx b/packages/react-notion-x/src/context.tsx index 3a10982e..7adb08fb 100644 --- a/packages/react-notion-x/src/context.tsx +++ b/packages/react-notion-x/src/context.tsx @@ -16,13 +16,16 @@ import { export interface NotionContext { recordMap: ExtendedRecordMap components: NotionComponents + mapPageUrl: MapPageUrlFn mapImageUrl: MapImageUrlFn searchNotion?: SearchNotionFn isShowingSearch?: boolean onHideSearch?: () => void + rootPageId?: string rootDomain?: string + fullPage: boolean darkMode: boolean previewImages: boolean @@ -32,11 +35,14 @@ export interface NotionContext { minTableOfContentsItems: number linkTableTitleProperties: boolean isLinkCollectionToUrlProperty: boolean + defaultPageIcon?: string | null defaultPageCover?: string | null defaultPageCoverPosition?: number + zoom: any } + export interface PartialNotionContext { recordMap?: ExtendedRecordMap components?: Partial @@ -46,8 +52,10 @@ export interface PartialNotionContext { searchNotion?: SearchNotionFn isShowingSearch?: boolean onHideSearch?: () => void + rootPageId?: string rootDomain?: string + fullPage?: boolean darkMode?: boolean previewImages?: boolean @@ -55,11 +63,14 @@ export interface PartialNotionContext { showCollectionViewDropdown?: boolean linkTableTitleProperties?: boolean isLinkCollectionToUrlProperty?: boolean + showTableOfContents?: boolean minTableOfContentsItems?: number + defaultPageIcon?: string | null defaultPageCover?: string | null defaultPageCoverPosition?: number + zoom?: any } diff --git a/packages/react-notion-x/src/next.tsx b/packages/react-notion-x/src/next.tsx index 6df53b1f..dea3a249 100644 --- a/packages/react-notion-x/src/next.tsx +++ b/packages/react-notion-x/src/next.tsx @@ -71,19 +71,26 @@ export const wrapNextLegacyImage = (NextLegacyImage: any): React.FC => { export function wrapNextLink(NextLink: any) { return ({ href, + as, + passHref, prefetch, replace, scroll, - onNavigate, + shallow, + locale, ...linkProps }: any) => { return (
diff --git a/packages/react-notion-x/src/renderer.tsx b/packages/react-notion-x/src/renderer.tsx index 39ae963e..d4be62b1 100644 --- a/packages/react-notion-x/src/renderer.tsx +++ b/packages/react-notion-x/src/renderer.tsx @@ -59,13 +59,17 @@ export function NotionRenderer({ linkTableTitleProperties?: boolean isLinkCollectionToUrlProperty?: boolean isImageZoomable?: boolean + showTableOfContents?: boolean minTableOfContentsItems?: number + defaultPageIcon?: string defaultPageCover?: string defaultPageCoverPosition?: number + className?: string bodyClassName?: string + header?: React.ReactNode footer?: React.ReactNode pageHeader?: React.ReactNode @@ -73,6 +77,7 @@ export function NotionRenderer({ pageTitle?: React.ReactNode pageAside?: React.ReactNode pageCover?: React.ReactNode + blockId?: string hideBlockId?: boolean disableHeader?: boolean diff --git a/packages/react-notion-x/src/styles.css b/packages/react-notion-x/src/styles.css index 82e1c352..a27edeb1 100644 --- a/packages/react-notion-x/src/styles.css +++ b/packages/react-notion-x/src/styles.css @@ -1,5 +1,7 @@ :root { - --notion-font: ui-sans-serif,system-ui,apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,'Apple Color Emoji',Arial,sans-serif,'Segoe UI Emoji','Segoe UI Symbol'; + --notion-font: ui-sans-serif, system-ui, apple-system, BlinkMacSystemFont, + 'Segoe UI', Helvetica, 'Apple Color Emoji', Arial, sans-serif, + 'Segoe UI Emoji', 'Segoe UI Symbol'; --fg-color: rgb(55, 53, 47); --fg-color-0: rgba(55, 53, 47, 0.09); --fg-color-1: rgba(55, 53, 47, 0.16); @@ -10,13 +12,16 @@ --fg-color-6: rgba(55, 53, 47, 0.8); --fg-color-7: rgba(55, 53, 47, 0.5); --fg-color-icon: var(--fg-color); + --bg-color: #fff; --bg-color-0: rgba(135, 131, 120, 0.15); --bg-color-1: rgb(247, 246, 243); --bg-color-2: rgba(135, 131, 120, 0.15); + --select-color-0: rgb(46, 170, 220); --select-color-1: rgba(45, 170, 219, 0.3); --select-color-2: #d9eff8; + --notion-red: rgb(224, 62, 62); --notion-pink: rgb(173, 26, 114); --notion-blue: rgb(11, 110, 153); @@ -26,6 +31,7 @@ --notion-orange: rgb(217, 115, 13); --notion-brown: rgb(100, 71, 58); --notion-gray: rgb(155, 154, 151); + --notion-red_background: rgb(251, 228, 228); --notion-pink_background: rgb(244, 223, 235); --notion-blue_background: rgb(221, 235, 241); @@ -35,6 +41,7 @@ --notion-orange_background: rgb(250, 235, 221); --notion-brown_background: rgb(233, 229, 227); --notion-gray_background: rgb(235, 236, 237); + --notion-red_background_co: rgba(251, 228, 228, 0.3); --notion-pink_background_co: rgba(244, 223, 235, 0.3); --notion-blue_background_co: rgba(221, 235, 241, 0.3); @@ -44,6 +51,7 @@ --notion-orange_background_co: rgba(250, 235, 221, 0.3); --notion-brown_background_co: rgba(233, 229, 227, 0.3); --notion-gray_background_co: rgba(235, 236, 237, 0.3); + --notion-item-blue: rgb(211, 229, 239); --notion-item-orange: rgb(250, 222, 201); --notion-item-green: rgb(219, 237, 219); @@ -54,6 +62,7 @@ --notion-item-default: rgba(227, 226, 224, 0.5); --notion-item-purple: rgb(232, 222, 238); --notion-item-gray: rgb(227, 226, 224); + --notion-item-text-blue: rgb(24, 51, 71); --notion-item-text-orange: rgb(73, 41, 14); --notion-item-text-green: rgb(28, 56, 41); @@ -64,6 +73,7 @@ --notion-item-text-default: rgb(50, 48, 44); --notion-item-text-purple: rgb(65, 36, 84); --notion-item-text-gray: rgb(50, 48, 44); + --notion-item-bullet-blue: rgb(91, 151, 189); --notion-item-bullet-orange: rgb(215, 129, 58); --notion-item-bullet-green: rgb(108, 155, 125); @@ -74,9 +84,11 @@ --notion-item-bullet-default: rgb(91, 151, 189); --notion-item-bullet-purple: rgb(167, 130, 195); --notion-item-bullet-gray: rgb(145, 145, 142); + --notion-max-width: 720px; - --notion-header-height: 45px + --notion-header-height: 45px; } + .dark-mode { --fg-color: rgba(255, 255, 255, 0.9); --fg-color-0: var(--fg-color); @@ -87,10 +99,12 @@ --fg-color-5: rgba(255, 255, 255, 0.7); --fg-color-6: #fff; --fg-color-icon: #fff; + --bg-color: #2f3437; --bg-color-0: rgb(71, 76, 80); --bg-color-1: rgb(63, 68, 71); --bg-color-2: rgba(135, 131, 120, 0.15); + --notion-red: rgb(255, 115, 105); --notion-pink: rgb(226, 85, 161); --notion-blue: rgb(82, 156, 202); @@ -117,67 +131,83 @@ --notion-yellow_background_co: rgba(89, 86, 59, 0.3); --notion-orange_background_co: rgba(89, 74, 58, 0.3); --notion-brown_background_co: rgba(67, 64, 64, 0.3); - --notion-gray_background_co: rgba(69, 75, 78, 0.3) + --notion-gray_background_co: rgba(69, 75, 78, 0.3); } + .notion * { - box-sizing: border-box + box-sizing: border-box; } + .notion { font-size: 16px; line-height: 1.5; color: var(--fg-color); caret-color: var(--fg-color); - font-family: var(--notion-font) + font-family: var(--notion-font); } + .notion > * { - padding: 3px 0 + padding: 3px 0; } + .notion * { margin-block-start: 0; - margin-block-end: 0 + margin-block-end: 0; } -.notion ::selection { - background: var(--select-color-1) + +.notion *::selection { + background: var(--select-color-1); } + .notion *, -.notion :focus { - outline: 0 +.notion *:focus { + outline: 0; } + .notion-page-content { width: 100%; display: flex; - flex-direction: column + flex-direction: column; } -@media (min-width:1300px) and (min-height:300px) { + +@media (min-width: 1300px) and (min-height: 300px) { .notion-page-content-has-aside { display: flex; flex-direction: row; - width: calc((100vw + var(--notion-max-width))/ 2) + width: calc((100vw + var(--notion-max-width)) / 2); } + .notion-page-content-has-aside .notion-aside { - display: flex + display: flex; } + .notion-page-content-has-aside .notion-page-content-inner { width: var(--notion-max-width); - max-width: var(--notion-max-width) + max-width: var(--notion-max-width); } } + .notion-page-content-inner { position: relative; display: flex; flex-direction: column; - align-items: flex-start + align-items: flex-start; } + .notion-aside { position: sticky; top: 148px; z-index: 101; + /* top: calc((100vh - 48px - 100%) / 2); */ + align-self: flex-start; flex: 1; + display: none; flex-direction: column; - align-items: center + align-items: center; } + .notion-aside-table-of-contents { display: flex; flex-direction: column; @@ -186,311 +216,350 @@ min-width: 222px; overflow: auto; background: var(--bg-color); - border-radius: 4px + border-radius: 4px; } + .notion-aside-table-of-contents-header { text-transform: uppercase; font-weight: 400; font-size: 1.1em; - word-break: break-word + word-break: break-word; } + .notion-aside-table-of-contents .notion-table-of-contents-item { - line-height: 1 + line-height: 1; } -.notion-aside-table-of-contents .notion-table-of-contents-item-indent-level-0:first-of-type { - margin-top: 0 + +.notion-aside-table-of-contents + .notion-table-of-contents-item-indent-level-0:first-of-type { + margin-top: 0; } + .notion-aside-table-of-contents .notion-table-of-contents-item-indent-level-0 { - margin-top: .25em + margin-top: 0.25em; } + .notion-aside-table-of-contents .notion-table-of-contents-item-indent-level-1 { - font-size: 13px + font-size: 13px; } + .notion-aside-table-of-contents .notion-table-of-contents-item-indent-level-2 { - font-size: 12px + font-size: 12px; } + .notion-aside-table-of-contents .notion-table-of-contents-item-body { - border: 0 none + border: 0 none; } + .notion-table-of-contents-active-item { - color: var(--select-color-0)!important + color: var(--select-color-0) !important; } + .notion-app { position: relative; background: var(--bg-color); - min-height: 100vh + min-height: 100vh; } + .notion-viewport { position: relative; - padding: 0; + padding: 0px; top: 0; left: 0; right: 0; - bottom: 0 + bottom: 0; } + .medium-zoom-overlay { - z-index: 300 + z-index: 300; } + .medium-zoom-image { - border-radius: 0 + border-radius: 0; } + .medium-zoom-image--opened { - margin: unset!important; - min-width: unset!important; - min-height: unset!important; - z-index: 301 + margin: unset !important; + min-width: unset !important; + min-height: unset !important; + z-index: 301; } + .notion-frame { display: flex; flex-direction: column; width: 100%; height: 100%; - padding: 0 + padding: 0; } + .notion-page-scroller { position: relative; display: flex; flex-direction: column; flex-grow: 1; align-items: center; - min-height: calc(100vh - var(--notion-header-height)) + min-height: calc(100vh - var(--notion-header-height)); } + .notion-red, .notion-red_co { - color: var(--notion-red) + color: var(--notion-red); } .notion-pink, .notion-pink_co { - color: var(--notion-pink) + color: var(--notion-pink); } .notion-blue, .notion-blue_co { - color: var(--notion-blue) + color: var(--notion-blue); } .notion-purple, .notion-purple_co { - color: var(--notion-purple) + color: var(--notion-purple); } .notion-teal, .notion-teal_co { - color: var(--notion-teal) + color: var(--notion-teal); } .notion-yellow, .notion-yellow_co { - color: var(--notion-yellow) + color: var(--notion-yellow); } .notion-orange, .notion-orange_co { - color: var(--notion-orange) + color: var(--notion-orange); } .notion-brown, .notion-brown_co { - color: var(--notion-brown) + color: var(--notion-brown); } .notion-gray, .notion-gray_co { - color: var(--notion-gray) + color: var(--notion-gray); } .notion-red_background { - background-color: var(--notion-red_background) + background-color: var(--notion-red_background); } .notion-pink_background { - background-color: var(--notion-pink_background) + background-color: var(--notion-pink_background); } .notion-blue_background { - background-color: var(--notion-blue_background) + background-color: var(--notion-blue_background); } .notion-purple_background { - background-color: var(--notion-purple_background) + background-color: var(--notion-purple_background); } .notion-teal_background { - background-color: var(--notion-teal_background) + background-color: var(--notion-teal_background); } .notion-yellow_background { - background-color: var(--notion-yellow_background) + background-color: var(--notion-yellow_background); } .notion-orange_background { - background-color: var(--notion-orange_background) + background-color: var(--notion-orange_background); } .notion-brown_background { - background-color: var(--notion-brown_background) + background-color: var(--notion-brown_background); } .notion-gray_background { - background-color: var(--notion-gray_background) + background-color: var(--notion-gray_background); } .notion-red_background_co { - background-color: var(--notion-red_background_co) + background-color: var(--notion-red_background_co); } .notion-pink_background_co { - background-color: var(--notion-pink_background_co) + background-color: var(--notion-pink_background_co); } .notion-blue_background_co { - background-color: var(--notion-blue_background_co) + background-color: var(--notion-blue_background_co); } .notion-purple_background_co { - background-color: var(--notion-purple_background_co) + background-color: var(--notion-purple_background_co); } .notion-teal_background_co { - background-color: var(--notion-teal_background_co) + background-color: var(--notion-teal_background_co); } .notion-yellow_background_co { - background-color: var(--notion-yellow_background_co) + background-color: var(--notion-yellow_background_co); } .notion-orange_background_co { - background-color: var(--notion-orange_background_co) + background-color: var(--notion-orange_background_co); } .notion-brown_background_co { - background-color: var(--notion-brown_background_co) + background-color: var(--notion-brown_background_co); } .notion-gray_background_co { - background-color: var(--notion-gray_background_co) + background-color: var(--notion-gray_background_co); } + .notion-item-blue { background-color: var(--notion-item-blue); - color: var(--notion-item-text-blue) + color: var(--notion-item-text-blue); } .notion-item-orange { background-color: var(--notion-item-orange); - color: var(--notion-item-text-orange) + color: var(--notion-item-text-orange); } .notion-item-green { background-color: var(--notion-item-green); - color: var(--notion-item-text-green) + color: var(--notion-item-text-green); } .notion-item-pink { background-color: var(--notion-item-pink); - color: var(--notion-item-text-pink) + color: var(--notion-item-text-pink); } .notion-item-brown { background-color: var(--notion-item-brown); - color: var(--notion-item-text-brown) + color: var(--notion-item-text-brown); } .notion-item-red { background-color: var(--notion-item-red); - color: var(--notion-item-text-red) + color: var(--notion-item-text-red); } .notion-item-yellow { background-color: var(--notion-item-yellow); - color: var(--notion-item-text-yellow) + color: var(--notion-item-text-yellow); } .notion-item-default, .notion-item-default-inferred { background-color: var(--notion-item-default); - color: var(--notion-item-text-default) + color: var(--notion-item-text-default); } .notion-item-purple { background-color: var(--notion-item-purple); - color: var(--notion-item-text-purple) + color: var(--notion-item-text-purple); } .notion-item-gray { background-color: var(--notion-item-gray); - color: var(--notion-item-text-gray) + color: var(--notion-item-text-gray); } + .notion-item-bullet-blue { - background-color: var(--notion-item-bullet-blue) + background-color: var(--notion-item-bullet-blue); } .notion-item-bullet-orange { - background-color: var(--notion-item-bullet-orange) + background-color: var(--notion-item-bullet-orange); } .notion-item-bullet-green { - background-color: var(--notion-item-bullet-green) + background-color: var(--notion-item-bullet-green); } .notion-item-bullet-pink { - background-color: var(--notion-item-bullet-pink) + background-color: var(--notion-item-bullet-pink); } .notion-item-bullet-brown { - background-color: var(--notion-item-bullet-brown) + background-color: var(--notion-item-bullet-brown); } .notion-item-bullet-red { - background-color: var(--notion-item-bullet-red) + background-color: var(--notion-item-bullet-red); } .notion-item-bullet-yellow { - background-color: var(--notion-item-bullet-yellow) + background-color: var(--notion-item-bullet-yellow); } .notion-item-bullet-default { - background-color: var(--notion-item-bullet-default) + background-color: var(--notion-item-bullet-default); } .notion-item-bullet-default-inferred { - background-color: var(--notion-item-bullet-gray) + background-color: var(--notion-item-bullet-gray); } .notion-item-bullet-purple { - background-color: var(--notion-item-bullet-purple) + background-color: var(--notion-item-bullet-purple); } .notion-item-bullet-gray { - background-color: var(--notion-item-bullet-gray) + background-color: var(--notion-item-bullet-gray); } + .notion b { - font-weight: 600 + font-weight: 600; } + .notion-title { width: 100%; font-size: 2.5em; font-weight: 600; margin-bottom: 20px; - line-height: 1.2 + line-height: 1.2; } + .notion-h { position: relative; display: inline; + font-weight: 600; line-height: 1.3; padding: 3px 2px; margin-bottom: 1px; + max-width: 100%; white-space: pre-wrap; - word-break: break-word + word-break: break-word; } + .notion-h1 { font-size: 1.875em; - margin-top: 1.08em + margin-top: 1.08em; } + .notion-header-anchor { position: absolute; top: -54px; - left: 0 + left: 0; } + .notion-title + .notion-h1, .notion-title + .notion-h2, .notion-title + .notion-h3 { - margin-top: 0 + margin-top: 0; } +/* TODO: notion-page-content */ .notion-h1:first-child { - margin-top: 0 + margin-top: 0; } +/* .notion-h1:first-of-type { + margin-top: 2px; +} */ .notion-h2 { font-size: 1.5em; - margin-top: 1.1em + margin-top: 1.1em; } .notion-h3 { font-size: 1.25em; - margin-top: 1em + margin-top: 1em; } + .notion-h:hover .notion-hash-link { - opacity: 1 + opacity: 1; } + +/* Add specific styles for headings in sync blocks */ .notion-sync-block .notion-h { - display: block + display: block; } + +/* Preserve original styles for toggle headings */ details.notion-toggle .notion-h { - display: inline + display: inline; } + .notion-hash-link { opacity: 0; text-decoration: none; float: left; margin-left: -20px; padding-right: 4px; - fill: var(--fg-color-icon) + fill: var(--fg-color-icon); } + .notion-page-cover { display: block; object-fit: cover; width: 100%; - height: 30vh!important; - min-height: 30vh!important; - max-height: 30vh!important; - padding: 0 + height: 30vh !important; + min-height: 30vh !important; + max-height: 30vh !important; + padding: 0; } + .notion-page-cover-wrapper { width: 100%; height: 30vh; @@ -498,23 +567,27 @@ details.notion-toggle .notion-h { max-height: 30vh; display: flex; justify-content: center; - align-items: center + align-items: center; } + .notion-collection-card-cover { - overflow: hidden -} -.notion-collection-card-cover img, -.notion-collection-card-cover span { - min-height: 100%!important; - max-height: 100%!important -} -.notion-page-cover-wrapper img, -.notion-page-cover-wrapper span { - width: 100%!important; - height: 30vh!important; - min-height: 30vh!important; - max-height: 30vh!important + overflow: hidden; } + +.notion-collection-card-cover span, +.notion-collection-card-cover img { + min-height: 100% !important; + max-height: 100% !important; +} + +.notion-page-cover-wrapper span, +.notion-page-cover-wrapper img { + width: 100% !important; + height: 30vh !important; + min-height: 30vh !important; + max-height: 30vh !important; +} + .notion-page { position: relative; padding: 0; @@ -525,162 +598,197 @@ details.notion-toggle .notion-h { flex-shrink: 0; align-items: flex-start; width: 100%; - max-width: 100% + max-width: 100%; } + .notion-full-page { - padding-bottom: calc(max(10vh,120px)) + padding-bottom: calc(max(10vh, 120px)); } + .notion-page-no-cover { - margin-top: 48px!important; - padding-top: 96px + margin-top: 48px !important; + padding-top: 96px; } + .notion-page-no-cover.notion-page-no-icon { - padding-top: 0 + padding-top: 0; } + .notion-page-no-cover.notion-page-has-image-icon { - padding-top: 148px + padding-top: 148px; } + .notion-page-has-cover.notion-page-no-icon { - padding-top: 48px + padding-top: 48px; } + .notion-page-has-cover { - padding-top: 96px + padding-top: 96px; } + .notion-page-has-cover.notion-page-has-icon.notion-page-has-text-icon { - padding-top: 64px + padding-top: 64px; } + .notion-page-icon-hero { position: absolute; top: 0; left: 50%; display: flex; flex-direction: row; - justify-content: center + justify-content: center; } + .notion-page-icon-hero.notion-page-icon-image { width: 124px; height: 124px; - margin-left: -62px + margin-left: -62px; } + .notion-page-icon-hero.notion-page-icon-span { height: 78px; width: 78px; - margin-left: -39px + margin-left: -39px; } + .notion-page-icon-hero .notion-page-icon { position: relative; - display: block + display: block; } + .notion-page-has-cover .notion-page-icon-hero.notion-page-icon-image { - top: -62px + top: -62px; } + .notion-page-has-cover .notion-page-icon-hero.notion-page-icon-span { - top: -42px + top: -42px; } + .notion-page-icon-hero.notion-page-icon-span .notion-page-icon { font-size: 78px; line-height: 1.1; margin-left: 0; - color: var(--fg-color-icon) + color: var(--fg-color-icon); } + .notion-page-icon-hero.notion-page-icon-image .notion-page-icon { display: block; border-radius: 3px; width: 100%; height: 100%; max-width: 100%; - max-height: 100% + max-height: 100%; } + .notion-page-icon-hero.notion-page-icon-image img { - object-fit: cover + object-fit: cover; } + .notion-page-icon { - font-family: 'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Noto Color Emoji','Segoe UI Symbol','Android Emoji',EmojiSymbols; + font-family: 'Apple Color Emoji', 'Segoe UI Emoji', NotoColorEmoji, + 'Noto Color Emoji', 'Segoe UI Symbol', 'Android Emoji', EmojiSymbols; font-size: 1.1em; fill: var(--fg-color-6); - color: var(--fg-color-icon) + color: var(--fg-color-icon); } + .notion-search .notion-page-icon { fill: var(--fg-color-6); - color: var(--fg-color) + color: var(--fg-color); } + img.notion-page-icon, svg.notion-page-icon { display: block; object-fit: fill; border-radius: 3px; max-width: 100%; - max-height: 100% + max-height: 100%; } + .notion-page-icon-inline { width: 22px; height: 22px; max-width: 22px; max-height: 22px; - margin: 0 4px + margin: 0 4px; } + .notion-page-icon-inline span { max-width: 100%; - max-height: 100% + max-height: 100%; } + .notion-page-icon-inline img { - object-fit: cover + object-fit: cover; } + .notion-page { box-sizing: border-box; width: var(--notion-max-width); - padding-left: calc(min(16px,8vw)); - padding-right: calc(min(16px,8vw)) + padding-left: calc(min(16px, 8vw)); + padding-right: calc(min(16px, 8vw)); } + .notion-full-width { box-sizing: border-box; --notion-max-width: calc(min(1920px, 98vw)); - padding-left: calc(min(96px,8vw)); - padding-right: calc(min(96px,8vw)) + padding-left: calc(min(96px, 8vw)); + padding-right: calc(min(96px, 8vw)); } + .notion-small-text { - font-size: 14px + font-size: 14px; } + .notion-quote { display: block; width: 100%; white-space: pre-wrap; word-break: break-word; border-left: 3px solid currentcolor; - padding: .2em .9em; + padding: 0.2em 0.9em; margin: 6px 0; - font-size: 1.2em + font-size: 1.2em; } + .notion-hr { width: 100%; margin: 6px 0; padding: 0; border: none; - border-bottom: 1px solid var(--bg-color-0) + border-bottom: 1px solid var(--bg-color-0); } + .notion-link { color: inherit; word-break: break-word; text-decoration: inherit; - border-bottom: .05em solid; + border-bottom: 0.05em solid; border-color: var(--fg-color-2); - opacity: .7; - transition: border-color .1s ease-in,opacity .1s ease-in + opacity: 0.7; + transition: + border-color 100ms ease-in, + opacity 100ms ease-in; } + .notion-link:hover { border-color: var(--fg-color-6); - opacity: 1 + opacity: 1; } + .notion-collection .notion-link { - opacity: 1 + opacity: 1; } + .notion-blank { width: 100%; min-height: 1rem; padding: 3px 2px; margin-top: 1px; - margin-bottom: 1px + margin-bottom: 1px; } + .notion-page-link { display: flex; color: var(--fg-color); @@ -688,25 +796,29 @@ svg.notion-page-icon { width: 100%; height: 30px; margin: 1px 0; - transition: background 120ms ease-in 0s + transition: background 120ms ease-in 0s; } + .notion-page-link:hover { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-collection-card .notion-page-link { height: unset; margin: 0; - transition: unset + transition: unset; } .notion-collection-card .notion-page-link { - background: unset + background: unset; } + .notion-icon { display: block; width: 18px; height: 18px; - color: var(--fg-color-icon) + color: var(--fg-color-icon); } + .notion-page-text { white-space: nowrap; overflow: hidden; @@ -714,87 +826,105 @@ svg.notion-page-icon { font-weight: 500; line-height: 1.3; border-bottom: 1px solid var(--fg-color-1); - margin: 4px 0 + margin: 4px 0; } + .notion-inline-code { color: #eb5757; - padding: .2em .4em; + padding: 0.2em 0.4em; background: var(--bg-color-2); border-radius: 3px; font-size: 85%; - font-family: SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,monospace + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, + monospace; } + .notion-inline-underscore { - text-decoration: underline + text-decoration: underline; } + .notion-list { margin: 0; margin-block-start: 0.6em; - margin-block-end: 0.6em + margin-block-end: 0.6em; } + .notion-list-disc { list-style-type: disc; padding-inline-start: 1.7em; margin-top: 0; - margin-bottom: 0 + margin-bottom: 0; } .notion-list-numbered { list-style-type: decimal; padding-inline-start: 1.6em; margin-top: 0; - margin-bottom: 0 + margin-bottom: 0; } + .notion-list-disc li { - padding-left: .1em + padding-left: 0.1em; } + .notion-list-numbered li { - padding-left: .2em + padding-left: 0.2em; } + .notion-list li { padding: 6px 0; - white-space: pre-wrap + white-space: pre-wrap; } + .notion-asset-wrapper { - margin: .5rem 0; + margin: 0.5rem 0; max-width: 100vw; min-width: 100%; align-self: center; display: flex; - flex-direction: column + flex-direction: column; } + .notion-asset-wrapper-image { - max-width: 100% + max-width: 100%; } + .notion-asset-wrapper-full { - max-width: 100vw + max-width: 100vw; } + .notion-asset-wrapper img { width: 100%; height: 100%; - max-height: 100% + max-height: 100%; } + .notion-asset-wrapper iframe { border: none; - background: #f7f6f5 + background: rgb(247, 246, 245); } + .notion-text { width: 100%; white-space: pre-wrap; word-break: break-word; padding: 3px 2px; - margin: 1px 0 + margin: 1px 0; } + .notion-text:first-child { - margin-top: 2px + margin-top: 2px; } + .notion-text-children { padding-left: 1.5em; display: flex; - flex-direction: column + flex-direction: column; } + .notion .notion-code { - font-size: 85% + font-size: 85%; } + .notion-code { position: relative; width: 100%; @@ -806,48 +936,64 @@ svg.notion-page-icon { box-sizing: border-box; overflow: auto; background: var(--bg-color-1); - font-family: SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,monospace + font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, + monospace; } + .notion-code-copy { position: absolute; top: 1em; right: 1em; user-select: none; z-index: 9; - transition: opacity .2s cubic-bezier(.3, 0, .5, 1) + transition: opacity 0.2s cubic-bezier(0.3, 0, 0.5, 1); } + .notion-code-copy-button { display: inline-block; - padding: .6em; + padding: 0.6em; font-size: 1.25em; line-height: 1em; cursor: pointer; - transition: background-color .2s cubic-bezier(.3, 0, .5, 1),color .2s cubic-bezier(.3, 0, .5, 1),border-color .2s cubic-bezier(.3, 0, .5, 1); - box-shadow: 0 1px 0 rgba(27,31,36,.04),inset 0 1px 0 rgba(255,255,255,.25); + + transition: + background-color 0.2s cubic-bezier(0.3, 0, 0.5, 1), + color 0.2s cubic-bezier(0.3, 0, 0.5, 1), + border-color 0.2s cubic-bezier(0.3, 0, 0.5, 1); + box-shadow: + 0 1px 0 rgba(27, 31, 36, 0.04), + inset 0 1px 0 rgba(255, 255, 255, 0.25); background-color: #f6f8fa; + color: #24292f; - border: 1px solid rgba(27,31,36,.15); - border-radius: 6px + border: 1px solid rgba(27, 31, 36, 0.15); + border-radius: 6px; } + .notion-code-copy-button:hover { background-color: #f3f4f6; - border-color: rgba(27,31,36,.15); - transition-duration: .1s + border-color: rgba(27, 31, 36, 0.15); + transition-duration: 0.1s; } + .notion-code-copy-button:active { - background: #eaecef; - border-color: rgba(27,31,36,.15); - transition: none + background: hsla(220, 14%, 93%, 1); + border-color: rgba(27, 31, 36, 0.15); + transition: none; } + .notion-code .notion-code-copy { - opacity: 0 + opacity: 0; } + .notion-code:hover .notion-code-copy { - opacity: 1 + opacity: 1; } + .notion-code-copy-button svg { - display: block + display: block; } + .notion-code-copy-tooltip { pointer-events: none; position: absolute; @@ -858,47 +1004,56 @@ svg.notion-page-icon { flex-direction: row; justify-content: center; z-index: 99; - font-size: 14px + font-size: 14px; } + .notion-code-copy-tooltip > div { padding: 6px 8px; background: #222; color: #fff; - border-radius: 6px + border-radius: 6px; } + .notion-column { display: flex; flex-direction: column; padding-top: 12px; - padding-bottom: 12px + padding-bottom: 12px; } -.notion-column > :first-child { + +.notion-column > *:first-child { margin-top: 0; margin-left: 0; - margin-right: 0 + margin-right: 0; } -.notion-column > :last-child { + +.notion-column > *:last-child { margin-left: 0; margin-right: 0; - margin-bottom: 0 + margin-bottom: 0; } + .notion-row { display: flex; overflow: hidden; width: 100%; - max-width: 100% + max-width: 100%; } -@media (max-width:640px) { + +@media (max-width: 640px) { .notion-row { - flex-direction: column + flex-direction: column; } + .notion-row .notion-column { - width: 100%!important + width: 100% !important; } + .notion-row .notion-spacer { - display: none + display: none; } } + .notion-bookmark { margin: 4px 0; width: 100%; @@ -908,18 +1063,21 @@ svg.notion-page-icon { border-radius: 3px; display: flex; overflow: hidden; - user-select: none + user-select: none; } + .dark-mode .notion-bookmark { - border-color: var(--bg-color-0) + border-color: var(--bg-color-0); } + .notion-bookmark > div:first-child { flex: 4 1 180px; padding: 12px 14px 14px; overflow: hidden; text-align: left; - color: var(--fg-color) + color: var(--fg-color); } + .notion-bookmark-title { font-size: 14px; line-height: 20px; @@ -927,60 +1085,72 @@ svg.notion-page-icon { overflow: hidden; text-overflow: ellipsis; min-height: 24px; - margin-bottom: 2px + margin-bottom: 2px; } + .notion-bookmark-description { font-size: 12px; line-height: 16px; - opacity: .8; + opacity: 0.8; height: 32px; - overflow: hidden + overflow: hidden; } + .notion-bookmark-link { display: flex; - margin-top: 6px + margin-top: 6px; } + .notion-bookmark-link-icon { width: 16px; height: 16px; min-width: 16px; - margin-right: 6px + margin-right: 6px; } + .notion-bookmark-link-text { font-size: 12px; line-height: 16px; color: var(--fg-color); white-space: nowrap; overflow: hidden; - text-overflow: ellipsis + text-overflow: ellipsis; } + .notion-bookmark-link-icon img { max-width: 100%; - max-height: 100% + max-height: 100%; } + .notion-bookmark-image { flex: 1 1 180px; - position: relative + position: relative; } + .notion-bookmark-image > * { - position: absolute!important; + position: absolute !important; width: 100%; - height: 100% + height: 100%; } + .notion-bookmark-image span { - width: 100%!important; - height: 100%!important; - max-height: 100% + width: 100% !important; + height: 100% !important; + max-height: 100%; } + .notion-column .notion-bookmark-image { - display: none + display: none; } + .notion-spacer { - width: calc(min(32px,4vw)) + width: calc(min(32px, 4vw)); } + .notion-spacer:last-child { - display: none + display: none; } + .notion-asset-object-fit { position: absolute; left: 0; @@ -989,13 +1159,15 @@ svg.notion-page-icon { bottom: 0; width: 100%; height: 100%; - border-radius: 1px + border-radius: 1px; } + .notion-image { display: block; width: 100%; - border-radius: 1px + border-radius: 1px; } + .notion-asset-caption { padding: 6px 0 6px 2px; white-space: pre-wrap; @@ -1003,8 +1175,9 @@ svg.notion-page-icon { caret-color: var(--fg-color); font-size: 14px; line-height: 1.4; - color: var(--fg-color-3) + color: var(--fg-color-3); } + .notion-callout { padding: 16px 16px 16px 12px; display: inline-flex; @@ -1014,51 +1187,59 @@ svg.notion-page-icon { align-items: center; box-sizing: border-box; margin: 4px 0; - border: 1px solid var(--fg-color-0) + border: 1px solid var(--fg-color-0); } + .dark-mode .notion-callout { - border-color: var(--bg-color-2) + border-color: var(--bg-color-2); } + .notion-callout .notion-page-icon-inline { align-self: flex-start; width: 24px; height: 24px; line-height: 24px; - font-size: 1.3em + font-size: 1.3em; } + .notion-callout-text { margin-left: 8px; white-space: pre-wrap; word-break: break-word; - width: 100% + width: 100%; } -.notion-callout-text > :first-child { + +.notion-callout-text > *:first-child { margin-top: 0; - padding-top: 0 + padding-top: 0; } + .notion-toggle { width: 100%; - padding: 3px 2px + padding: 3px 2px; } .notion-toggle > summary { cursor: pointer; - outline: 0 + outline: none; } .notion-toggle > div { - margin-left: 1.1em + margin-left: 1.1em; } + .notion-collection { align-self: center; - min-width: 100% + min-width: 100%; } + .notion-collection-header { display: flex; align-items: center; height: 42px; padding: 4px 2px; white-space: nowrap; - overflow: hidden + overflow: hidden; } + .notion-collection-header-title { display: inline-flex; align-items: center; @@ -1067,83 +1248,99 @@ svg.notion-page-icon { font-weight: 600; white-space: pre-wrap; word-break: break-word; - margin-right: .5em + margin-right: 0.5em; } + .notion-collection-view-dropdown { cursor: pointer; padding: 6px 8px; border: 0 none; border-radius: 3px; transition: background 120ms ease-in 0s; - background: 0 0 + background: transparent; } + .notion-collection-view-dropdown:hover { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-collection-view-dropdown-icon { position: relative; top: 2px; - margin-left: 4px + margin-left: 4px; } + .notion-collection-view-type { display: flex; align-items: center; - font-size: 14px + font-size: 14px; } + .notion-collection-view-type-icon { display: inline-block; width: 14px; height: 14px; - fill: rgba(55,53,47); - margin-right: 6px + /* fill: var(--fg-color); */ + fill: rgba(55, 53, 47); + margin-right: 6px; } + .notion-collection-view-type-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - color: var(--fg-color) + color: var(--fg-color); } + .notion-table { width: 100vw; max-width: 100vw; align-self: center; - overflow: auto hidden + overflow: auto hidden; } + .notion-table-view { position: relative; float: left; min-width: var(--notion-max-width); - padding-left: 0 + padding-left: 0; } + .notion-table-header { display: flex; position: absolute; z-index: 82; height: 33px; color: var(--fg-color-3); - min-width: var(--notion-max-width) + min-width: var(--notion-max-width); } + .notion-table-header-inner { width: 100%; display: inline-flex; border-top: 1px solid var(--fg-color-1); - border-bottom: 1px solid var(--fg-color-1) + border-bottom: 1px solid var(--fg-color-1); + /* box-shadow: white -3px 0 0, rgba(55, 53, 47, 0.16) 0 1px 0; */ } + .notion-table-header-placeholder { - height: 34px + height: 34px; } + .notion-table-th { display: flex; - position: relative + position: relative; } + .notion-table-view-header-cell { display: flex; flex-shrink: 0; overflow: hidden; height: 32px; font-size: 14px; - padding: 0 + padding: 0; } + .notion-table-view-header-cell-inner { user-select: none; display: flex; @@ -1151,18 +1348,21 @@ svg.notion-page-icon { height: 100%; padding-left: 8px; padding-right: 8px; - border-right: 1px solid var(--fg-color-0) + border-right: 1px solid var(--fg-color-0); } + .notion-table-th:last-child .notion-table-view-header-cell-inner { - border-right: 0 none + border-right: 0 none; } + .notion-collection-column-title { display: flex; align-items: center; line-height: 120%; min-width: 0; - font-size: 14px + font-size: 14px; } + .notion-collection-column-title-icon { display: inline-block; width: 14px; @@ -1170,21 +1370,25 @@ svg.notion-page-icon { min-width: 14px; min-height: 14px; fill: var(--fg-color-2); - margin-right: 6px + margin-right: 6px; } + .notion-collection-column-title-body { white-space: nowrap; overflow: hidden; - text-overflow: ellipsis + text-overflow: ellipsis; } + .notion-table-body { position: relative; - min-width: var(--notion-max-width) + min-width: var(--notion-max-width); } + .notion-table-row { display: flex; - border-bottom: 1px solid var(--fg-color-1) + border-bottom: 1px solid var(--fg-color-1); } + .notion-table-cell { min-height: 32px; padding: 5px 8px 6px; @@ -1193,44 +1397,53 @@ svg.notion-page-icon { white-space: normal; overflow: hidden; word-break: break-word; - border-right: 1px solid var(--fg-color-1) + border-right: 1px solid var(--fg-color-1); } + .notion-table-cell:last-child { - border-right: 0 none + border-right: 0 none; } + .notion-table-cell-title { - font-weight: 500 + font-weight: 500; } + .notion-table-cell-text { - white-space: pre-wrap + white-space: pre-wrap; } -.notion-table-cell-email, -.notion-table-cell-number, -.notion-table-cell-phone_number, + .notion-table-cell-text, -.notion-table-cell-url { - line-height: 1.5 +.notion-table-cell-number, +.notion-table-cell-url, +.notion-table-cell-email, +.notion-table-cell-phone_number { + line-height: 1.5; } + .notion-table-cell-number { - white-space: pre-wrap + white-space: pre-wrap; } -.notion-table-cell-multi_select, -.notion-table-cell-select { - padding: 7px 8px 0 + +.notion-table-cell-select, +.notion-table-cell-multi_select { + padding: 7px 8px 0; } + .notion-table-cell-auto_increment_id { - color: var(--fg-color-7) + color: var(--fg-color-7); } -.notion-property-multi_select, + .notion-property-select, -.notion-property-status { +.notion-property-status, +.notion-property-multi_select { display: flex; flex-wrap: wrap; - gap: 6px + gap: 6px; } -.notion-property-multi_select-item, + .notion-property-select-item, -.notion-property-status-item { +.notion-property-status-item, +.notion-property-multi_select-item { display: flex; align-items: center; padding: 0 6px; @@ -1239,114 +1452,142 @@ svg.notion-page-icon { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - line-height: 120% + line-height: 120%; } + .notion-property-status-item { - border-radius: 20px + border-radius: 20px; } + .notion-property-file { display: flex; flex-wrap: wrap; - align-content: flex-start + align-content: flex-start; } + .notion-property-file img { max-height: 24px; max-width: 100%; - margin-right: 6px + margin-right: 6px; } + .notion-collection-card-cover .notion-property-file { - height: 100% + height: 100%; } + .notion-collection-card-cover .notion-property-file img { width: 100%; margin: 0; - max-height: 100% + max-height: 100%; } + .notion-collection-card .notion-property-checkbox-container { - display: flex + display: flex; } + .notion-property-checkbox-text { - display: none + display: none; } + .notion-collection-card .notion-property-checkbox-text { display: inline-block; - margin-left: 6px + margin-left: 6px; } + .notion-property-checkbox { width: 16px; - height: 16px + height: 16px; } + .notion-property-checkbox-checked { width: 16px; height: 16px; - background: var(--select-color-0) + background: var(--select-color-0); } + .notion-property-checkbox-checked svg { position: relative; display: block; + /* top: -3px; */ top: 1px; left: 1px; width: 14px; height: 14px; - fill: #fff + fill: #fff; } + .notion-property-checkbox-unchecked { width: 16px; height: 16px; - border: 1.3px solid var(--fg-color) + border: 1.3px solid var(--fg-color); } + .notion-gallery { - align-self: center + align-self: center; } + .notion-gallery-view { position: relative; padding-left: 0; - transition: padding .2s ease-out + transition: padding 200ms ease-out; } + .notion-gallery-grid { display: grid; position: relative; - grid-template-columns: repeat(auto-fill,minmax(260px,1fr)); + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); grid-auto-rows: 1fr; gap: 16px; border-top: 1px solid var(--fg-color-1); padding-top: 16px; - padding-bottom: 4px + padding-bottom: 4px; } + .notion-gallery-grid-size-small { - grid-template-columns: repeat(auto-fill,minmax(180px,1fr)) + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); } + .notion-gallery-grid-size-large { - grid-template-columns: repeat(auto-fill,minmax(320px,1fr)) + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); } + .notion-collection-card { display: flex; flex-direction: column; overflow: hidden; + text-decoration: none; - box-shadow: rgba(15,15,15,.1) 0 0 0 1px,rgba(15,15,15,.1) 0 2px 4px; + box-shadow: + rgba(15, 15, 15, 0.1) 0 0 0 1px, + rgba(15, 15, 15, 0.1) 0 2px 4px; border-radius: 3px; background: var(--bg-color); color: var(--fg-color); - transition: background .1s ease-out 0s; + transition: background 100ms ease-out 0s; + user-select: none; - cursor: pointer + cursor: pointer; } + .notion-collection-card:hover { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-collection-card-cover { position: relative; width: 100%; height: 190px; border-bottom: 1px solid var(--fg-color-0); - overflow: hidden + overflow: hidden; } + .notion-collection-card-cover img { width: 100%; height: 100%; - border-radius: 1px 1px 0 0 + border-radius: 1px 1px 0 0; + /* object-fit: cover; */ } + .notion-collection-card-cover .notion-collection-card-cover-empty { width: 100%; height: 100%; @@ -1354,56 +1595,67 @@ svg.notion-page-icon { overflow: hidden; background: var(--fg-color-5); box-shadow: var(--fg-color-0) 0 -1px 0 0 inset; - padding: 8px 8px 0 + padding: 8px 8px 0; } + .notion-collection-card-size-small .notion-collection-card-cover { - height: 124px + height: 124px; } + .notion-collection-card-body { display: flex; flex-direction: column; - padding: 4px 10px + padding: 4px 10px; } + .notion-collection-card-property { padding: 4px 0; white-space: nowrap; word-break: break-word; overflow: hidden; text-overflow: ellipsis; - font-size: 12px + font-size: 12px; } + .notion-collection-card-property:first-child { font-size: 14px; - font-weight: 500 + font-weight: 500; } + .notion-collection-card-property:not(:first-child) { white-space: nowrap; - text-overflow: clip + text-overflow: clip; } + .notion-collection-card-property img { - max-height: 18px + max-height: 18px; } + .notion-list-collection { - align-self: center + align-self: center; } + .notion-list-collection { width: 100%; - max-width: 100% + max-width: 100%; } + .notion-list-view { position: relative; padding-left: 0; - transition: padding .2s ease-out; - max-width: 100% + transition: padding 200ms ease-out; + max-width: 100%; } + .notion-list-body { display: flex; flex-direction: column; border-top: 1px solid var(--fg-color-1); padding-top: 8px; max-width: 100%; - overflow: hidden + overflow: hidden; } + .notion-list-item { display: flex; justify-content: space-between; @@ -1411,8 +1663,9 @@ svg.notion-page-icon { padding: 0 4px; margin: 1px 0; max-width: 100%; - overflow: hidden + overflow: hidden; } + .notion-list-item-title { display: flex; align-items: center; @@ -1420,64 +1673,77 @@ svg.notion-page-icon { overflow: hidden; text-overflow: ellipsis; font-weight: 500; - line-height: 1.3 + line-height: 1.3; } + .notion-list-item-body { display: flex; align-items: center; flex-wrap: nowrap; - overflow: hidden + overflow: hidden; } + .notion-list-item-property { + /* display: flex; + align-items: center; */ margin-left: 14px; - font-size: 14px + font-size: 14px; } -.notion-list-item-property .notion-property-created_time, + .notion-list-item-property .notion-property-date, +.notion-list-item-property .notion-property-created_time, .notion-list-item-property .notion-property-last_edited_time, .notion-list-item-property .notion-property-url { display: inline-block; color: var(--fg-color-3); font-size: 12px; + /* white-space: nowrap; */ overflow: hidden; - text-overflow: ellipsis + text-overflow: ellipsis; } + .notion-board { width: 100vw; max-width: 100vw; align-self: center; - overflow: auto hidden + overflow: auto hidden; } + .notion-board-view { position: relative; float: left; min-width: 100%; padding-left: 0; - transition: padding .2s ease-out + transition: padding 200ms ease-out; } + .notion-board-header { display: flex; position: absolute; z-index: 82; height: 44px; - min-width: 100% + min-width: 100%; } + .notion-board-header-inner { display: inline-flex; border-top: 1px solid var(--fg-color-1); - border-bottom: 1px solid var(--fg-color-1) + border-bottom: 1px solid var(--fg-color-1); } + .notion-board-header-placeholder { - height: var(--notion-header-height) + height: var(--notion-header-height); } + .notion-board-th { display: flex; align-items: center; font-size: 14px; padding-right: 16px; box-sizing: content-box; - flex-shrink: 0 + flex-shrink: 0; } + .notion-board-th-body { display: flex; align-items: center; @@ -1486,116 +1752,149 @@ svg.notion-page-icon { padding-left: 2px; padding-right: 4px; white-space: nowrap; - overflow: hidden + overflow: hidden; } + .notion-board-th-count { color: var(--fg-color-3); font-weight: 500; - padding: 0 8px + padding: 0 8px; } + .notion-board-th-empty { margin-right: 6px; position: relative; - top: 2px + top: 2px; } + .notion-board-body { - display: inline-flex + display: inline-flex; } + .notion-board-group { flex: 0 0 auto; padding-right: 16px; - box-sizing: content-box + box-sizing: content-box; } + .notion-board-group-card { - margin-bottom: 8px + margin-bottom: 8px; } -.notion-board-view .notion-board-group, -.notion-board-view .notion-board-th { - width: 260px + +.notion-board-view .notion-board-th, +.notion-board-view .notion-board-group { + width: 260px; } -.notion-board-view-size-small .notion-board-group, -.notion-board-view-size-small .notion-board-th { - width: 180px + +.notion-board-view-size-small .notion-board-th, +.notion-board-view-size-small .notion-board-group { + width: 180px; } -.notion-board-view-size-large .notion-board-group, -.notion-board-view-size-large .notion-board-th { - width: 320px + +.notion-board-view-size-large .notion-board-th, +.notion-board-view-size-large .notion-board-group { + width: 320px; } + .notion-board-view .notion-collection-card .notion-collection-card-cover { - height: 148px + height: 148px; } -.notion-board-view-size-small .notion-collection-card .notion-collection-card-cover { - height: 100px + +.notion-board-view-size-small + .notion-collection-card + .notion-collection-card-cover { + height: 100px; } -.notion-board-view-size-large .notion-collection-card .notion-collection-card-cover { - height: 180px + +.notion-board-view-size-large + .notion-collection-card + .notion-collection-card-cover { + height: 180px; } + .notion-collection-page-properties { width: 100%; display: flex; - flex-direction: column + flex-direction: column; } + .notion-table-of-contents { width: 100%; - margin: 4px 0 + margin: 4px 0; } + .notion-table-of-contents-item { color: var(--fg-color); - opacity: .7; - transition: background .1s ease-in,opacity .1s ease-in; + opacity: 0.7; + transition: + background 100ms ease-in, + opacity 100ms ease-in; + text-decoration: none; user-select: none; transition: background 20ms ease-in 0s; cursor: pointer; width: 100%; + padding: 6px; font-size: 14px; line-height: 1.3; display: flex; align-items: center; + white-space: nowrap; overflow: hidden; - text-overflow: ellipsis + text-overflow: ellipsis; } + .notion-table-of-contents-item:hover { background: var(--bg-color-0); - opacity: 1 + opacity: 1; } + .notion-table-of-contents-item-body { - border-bottom: 1px solid var(--fg-color-1) + border-bottom: 1px solid var(--fg-color-1); } + .notion-to-do { width: 100%; display: flex; - flex-direction: column + flex-direction: column; } + .notion-to-do-item { width: 100%; display: flex; align-items: center; width: 100%; padding-left: 2px; - min-height: calc(1.5em + 3px + 3px) + min-height: calc(1.5em + 3px + 3px); } + .notion-to-do-children { - padding-left: 1.5em + padding-left: 1.5em; } + .notion-to-do-checked .notion-to-do-item { text-decoration: line-through; - opacity: .375 + opacity: 0.375; } + .notion-to-do-body { white-space: pre-wrap; - word-break: break-word + word-break: break-word; } + .notion-to-do-item .notion-property-checkbox { - margin-right: 8px + margin-right: 8px; } + .notion-google-drive { width: 100%; align-self: center; - margin: 4px 0 + margin: 4px 0; } + .notion-google-drive-link { position: relative; display: flex; @@ -1605,20 +1904,24 @@ svg.notion-page-icon { width: 100%; border: 1px solid var(--fg-color-1); border-radius: 3px; + user-select: none; transition: background 20ms ease-in 0s; - cursor: pointer + cursor: pointer; } + .notion-google-drive-link:hover { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-google-drive-preview { display: block; position: relative; width: 100%; padding-bottom: 55%; - overflow: hidden + overflow: hidden; } + .notion-google-drive-preview img { position: absolute; width: 100%; @@ -1627,53 +1930,61 @@ svg.notion-page-icon { bottom: 0; right: 0; object-fit: cover; - object-position: center top + object-position: center top; } + .notion-google-drive-body { width: 100%; min-height: 60px; padding: 12px 14px 14px; overflow: hidden; - border-top: 1px solid var(--fg-color-1) + border-top: 1px solid var(--fg-color-1); } + .notion-google-drive-body-title { font-size: 14px; line-height: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - margin-bottom: 2px + margin-bottom: 2px; } + .notion-google-drive-body-modified-time { font-size: 12px; line-height: 1.3; color: var(--fg-color-3); max-height: 32px; - overflow: hidden + overflow: hidden; } + .notion-google-drive-body-source { display: flex; align-items: center; - margin-top: 6px + margin-top: 6px; } + .notion-google-drive-body-source-icon { flex-shrink: 0; background-size: cover; width: 16px; height: 16px; - margin-right: 6px + margin-right: 6px; } + .notion-google-drive-body-source-domain { font-size: 12px; line-height: 16px; white-space: nowrap; overflow: hidden; - text-overflow: ellipsis + text-overflow: ellipsis; } + .notion-file { width: 100%; - margin: 1px 0 + margin: 1px 0; } + .notion-file-link { display: flex; align-items: center; @@ -1681,11 +1992,13 @@ svg.notion-page-icon { border-radius: 3px; transition: background 20ms ease-in 0s; color: inherit; - text-decoration: none + text-decoration: none; } + .notion-file-link:hover { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-file-icon { margin-right: 2px; width: 1.35em; @@ -1695,17 +2008,20 @@ svg.notion-page-icon { flex-grow: 0; flex-shrink: 0; min-height: calc(1.5em + 3px + 3px); - height: 1.35em + height: 1.35em; } + .notion-file-info { display: flex; - align-items: baseline + align-items: baseline; } + .notion-file-title { white-space: nowrap; overflow: hidden; - text-overflow: ellipsis + text-overflow: ellipsis; } + .notion-file-size { white-space: nowrap; overflow: hidden; @@ -1713,14 +2029,17 @@ svg.notion-page-icon { color: var(--fg-color-3); font-size: 12px; line-height: 16px; - margin-left: 6px + margin-left: 6px; } + .notion-audio { - width: 100% + width: 100%; } + .notion-audio audio { - width: 100% + width: 100%; } + .notion-equation { position: relative; display: inline-flex; @@ -1728,13 +2047,15 @@ svg.notion-page-icon { fill: inherit; user-select: none; border-radius: 3px; - transition: background 20ms ease-in 0s + transition: background 20ms ease-in 0s; } + .notion-equation-inline { -webkit-user-select: all; -moz-user-select: all; - user-select: all + user-select: all; } + .notion-equation-block { display: flex; flex-direction: column; @@ -1743,28 +2064,34 @@ svg.notion-page-icon { max-width: 100%; padding: 4px 8px; margin: 4px 0; - cursor: pointer + cursor: pointer; } + .notion-equation:hover { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-equation:active, .notion-equation:focus { - background: var(--select-color-2) + background: var(--select-color-2); } + .notion-frame .katex-display .katex { - padding-right: 32px + padding-right: 32px; } + .notion-frame .katex > .katex-html { - white-space: normal + white-space: normal; } + .notion-page-title { display: inline-flex; max-width: 100%; align-items: center; line-height: 1.3; - transition: background 120ms ease-in 0s + transition: background 120ms ease-in 0s; } + .notion-page-title-icon { display: flex; align-items: center; @@ -1772,32 +2099,42 @@ svg.notion-page-icon { height: 22px; width: 22px; border-radius: 3px; - flex-shrink: 0 + flex-shrink: 0; } + .notion-page-title .notion-page-icon-inline { margin-left: 2px; - margin-right: 6px + margin-right: 6px; } + .notion-collection-card-property .notion-link { - border-bottom: 0 none + border-bottom: 0 none; } + .notion-collection-card-property .notion-page-title { - transition: none + transition: none; } + .notion-collection-card-property .notion-page-title:hover { - background: unset + background: unset; } + .notion-collection-card-property .notion-page-title-icon { margin-left: 0; height: 18px; - width: 18px + width: 18px; } + .notion-collection-card-property .notion-page-title-text { - border-bottom: 0 none + border-bottom: 0 none; } -.notion-collection-card-property .notion-property-relation .notion-page-title-text { - border-bottom: 1px solid + +.notion-collection-card-property + .notion-property-relation + .notion-page-title-text { + border-bottom: 1px solid; } + .notion-page-title-text { position: relative; top: 1px; @@ -1806,104 +2143,128 @@ svg.notion-page-icon { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - font-weight: 500 + font-weight: 500; } + +/* removes double underline with links */ .notion-link .notion-page-title-text { - border-bottom: 0 none + border-bottom: 0 none; } + .notion-collection-row { width: 100%; padding: 4px 0 8px; border-bottom: 1px solid var(--fg-color-0); - margin-bottom: 1em + margin-bottom: 1em; } + .notion-collection-row-body { display: flex; flex-direction: column; - gap: 4px + gap: 4px; } + .notion-collection-row-property { display: flex; - align-items: center + align-items: center; } + .notion-collection-row-value { flex: 1; padding: 6px 8px 7px; - font-size: 14px + font-size: 14px; } + .notion-collection-row-property .notion-collection-column-title { display: flex; align-items: center; width: 160px; height: 34px; color: var(--fg-color-3); - padding: 0 6px + padding: 0 6px; } + .notion-collection-row-property .notion-property { - width: 100% + width: 100%; } + .notion-collection-row-property .notion-property-auto_increment_id { - color: var(--fg-color-7) + color: var(--fg-color-7); } + .notion-collection-row-property .notion-collection-column-title-icon { width: 16px; height: 16px; min-width: 16px; - min-height: 16px + min-height: 16px; } + .notion-collection-row-property .notion-link { - border-bottom: 0 none + border-bottom: 0 none; } -.notion-collection-row-property .notion-property-relation .notion-page-title-text { - border-bottom: 1px solid + +.notion-collection-row-property + .notion-property-relation + .notion-page-title-text { + border-bottom: 1px solid; } + .notion-user { display: block; object-fit: cover; border-radius: 100%; width: 20px; - height: 20px + height: 20px; } + .notion-list-item-property .notion-property-multi_select-item { margin-bottom: 0; - flex-wrap: none + flex-wrap: none; } + .notion-list-item-property .notion-property-multi_select-item:last-of-type { - margin-right: 0 + margin-right: 0; } -.notion-column .notion-board-view, + +.notion-toggle .notion-collection-header, +.notion-toggle .notion-table-view, +.notion-toggle .notion-board-view, .notion-column .notion-collection-header, .notion-column .notion-table-view, -.notion-toggle .notion-board-view, -.notion-toggle .notion-collection-header, -.notion-toggle .notion-table-view { - padding-left: 0!important; - padding-right: 0!important +.notion-column .notion-board-view { + padding-left: 0 !important; + padding-right: 0 !important; } -.notion-column .notion-board, -.notion-column .notion-table, + +.notion-toggle .notion-table, .notion-toggle .notion-board, -.notion-toggle .notion-table { - width: 100%!important; - max-width: 100%!important +.notion-column .notion-table, +.notion-column .notion-board { + width: 100% !important; + max-width: 100% !important; } -@media only screen and (max-width:730px) { + +@media only screen and (max-width: 730px) { .notion-asset-wrapper { - max-width: 100% + max-width: 100%; } + .notion-asset-wrapper-full { - max-width: 100vw + max-width: 100vw; } } -@media (max-width:640px) { + +@media (max-width: 640px) { .notion-bookmark-image { - display: none + display: none; } } + .lazy-image-wrapper { position: relative; - overflow: hidden + overflow: hidden; } + .lazy-image-wrapper img { position: absolute; top: 0; @@ -1914,81 +2275,110 @@ svg.notion-page-icon { max-width: 100%; max-height: 100%; min-width: 100%; - min-height: 100% + min-height: 100%; } + .lazy-image-preview { filter: blur(20px); transform: scale(1.1); + opacity: 1; - transition: opacity .4s ease-in!important; - transition-delay: 0.1s; - will-change: opacity + transition: opacity 400ms ease-in !important; + transition-delay: 100ms; + will-change: opacity; } + .lazy-image-wrapper img.lazy-image-real { - position: relative + position: relative; } + .lazy-image-real { opacity: 0; - transition: opacity .4s ease-out!important; - will-change: opacity + transition: opacity 400ms ease-out !important; + will-change: opacity; } + .lazy-image-real.medium-zoom-image { - transition: transform .3s cubic-bezier(.2, 0, .2, 1),opacity .4s ease-out!important; - will-change: opacity,transform + transition: + transform 0.3s cubic-bezier(0.2, 0, 0.2, 1), + opacity 400ms ease-out !important; + will-change: opacity, transform; } + .medium-zoom-image--opened { object-fit: cover; - opacity: 1 + opacity: 1; } + +/* + NOTE: if we hide the preview image, there's a weird bug with react hydration where + the image will sometimes flicker to show the background during initial page load. + So I'm removing this `opacity: 0` for now, but it will cause issues if the real + image is transparent. + */ .lazy-image-loaded .lazy-image-preview { - opacity: 0 + opacity: 0; } + .lazy-image-loaded .lazy-image-real { - opacity: 1 + opacity: 1; } + .notion-page-cover.lazy-image-wrapper { - padding: 0!important + padding: 0 !important; } + .notion-collection-card-cover .lazy-image-wrapper { - padding: 0!important; - height: 100% + padding: 0 !important; + height: 100%; } + .notion-page-cover .lazy-image-preview, .notion-page-cover .lazy-image-real { - will-change: unset!important + will-change: unset !important; } + .notion-page-cover .lazy-image-loaded .lazy-image-preview { - opacity: 1 + opacity: 1; } + .notion-lite { - overflow-y: auto + overflow-y: auto; } + .notion-lite .notion-page { width: 100%; - padding: 0 + padding: 0; + /* padding: calc(max(2vmin, 8px)); */ } -.notion-lite .notion-board-view, + .notion-lite .notion-collection-header, -.notion-lite .notion-table-view { - padding-left: 0!important; - padding-right: 0!important +.notion-lite .notion-table-view, +.notion-lite .notion-board-view { + padding-left: 0 !important; + padding-right: 0 !important; } + .notion-lite .notion-board, .notion-lite .notion-table { - width: 100%!important + width: 100% !important; } + .notion-header { position: sticky; top: 0; left: 0; z-index: 200; + width: 100%; max-width: 100vw; overflow: hidden; height: var(--notion-header-height); min-height: var(--notion-header-height); - background: var(--bg-color) + + background: var(--bg-color); } + .notion-header .notion-nav-header { position: absolute; top: 0; @@ -2004,16 +2394,18 @@ svg.notion-page-icon { line-height: 1.5; line-height: 1.2; font-size: 14px; - gap: 12px + gap: 12px; } + .notion-header .breadcrumbs { display: flex; flex-direction: row; align-items: center; height: 100%; flex-grow: 0; - min-width: 0 + min-width: 0; } + .notion-header .breadcrumb { display: inline-flex; flex-direction: row; @@ -2021,66 +2413,83 @@ svg.notion-page-icon { align-items: center; white-space: nowrap; text-overflow: ellipsis; + color: var(--fg-color); text-decoration: none; - margin: 1px 0; + margin: 1px 0px; padding: 4px 6px; border-radius: 3px; transition: background 120ms ease-in 0s; user-select: none; - background: 0 0; - cursor: pointer + background: transparent; + cursor: pointer; } + .notion-header .breadcrumb .notion-page-icon-inline { font-size: 18px; line-height: 1.1; - margin: 0 6px 0 0 + margin: 0 6px 0 0; } + .notion-header .breadcrumb .notion-page-icon-span { position: relative; - top: 1px + top: 1px; } + .notion-header .searchIcon { width: 14px; height: 14px; color: var(--fg-color); - fill: var(--fg-color) + fill: var(--fg-color); } + .notion-search-button { - gap: 8px + gap: 8px; } + .notion-header .breadcrumb:not(.active):hover { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-header .breadcrumb:not(.active):active { - background: var(--bg-color-1) + background: var(--bg-color-1); } + .notion-header .breadcrumb.active { - cursor: default + cursor: default; } + .notion-header .spacer { margin: 0 2px; - color: var(--fg-color-2) + color: var(--fg-color-2); } + .notion-header .button { - padding: 12px + padding: 12px; } + .notion-search-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; - background: rgba(15,15,15,.6); + background: rgba(15, 15, 15, 0.6); + display: flex; justify-content: center; align-items: flex-start; - z-index: 1001 + z-index: 1001; } + .notion-search { - box-shadow: rgba(15,15,15,.05) 0 0 0 1px,rgba(15,15,15,.1) 0 5px 10px,rgba(15,15,15,.2) 0 15px 40px; + box-shadow: + rgba(15, 15, 15, 0.05) 0px 0px 0px 1px, + rgba(15, 15, 15, 0.1) 0px 5px 10px, + rgba(15, 15, 15, 0.2) 0px 15px 40px; border-radius: 3px; background: var(--bg-color); + position: relative; top: 90px; max-width: 600px; @@ -2088,16 +2497,19 @@ svg.notion-page-icon { max-height: 80vh; width: 75%; overflow: hidden; - outline: 0; + outline: none; + font-size: 16px; line-height: 1.5; - color: #37352f; - caret-color: rgb(55,53,47); - font-family: var(--notion-font) + color: rgb(55, 53, 47); + caret-color: rgb(55, 53, 47); + font-family: var(--notion-font); } + .notion-search input { - background-color: var(--bg-color) + background-color: var(--bg-color); } + .notion-search .quickFindMenu { display: flex; flex-direction: column; @@ -2105,76 +2517,90 @@ svg.notion-page-icon { max-width: calc(100vw - 24px); height: 100%; max-height: 80vh; - min-height: 50px + min-height: 50px; } + .notion-search .searchBar { display: flex; flex-direction: row; align-items: center; height: 52px; - box-shadow: rgba(55,53,47,.09) 0 1px 0; + box-shadow: rgba(55, 53, 47, 0.09) 0px 1px 0px; font-size: 18px; line-height: 27px; - padding: 16px + padding: 16px; } + .notion-search .searchInput { resize: none; white-space: nowrap; border: none; - outline: 0; + outline: none; flex: 1; + line-height: inherit; - font-size: inherit + font-size: inherit; } + .notion-search .inlineIcon { margin-right: 10px; - fill: var(--fg-color-2) + fill: var(--fg-color-2); } + .notion-search .clearButton { user-select: none; border-radius: 20px; cursor: pointer; - margin-left: 8px + margin-left: 8px; } + .notion-search .clearIcon { width: 14px; height: 14px; - fill: var(--fg-color-2) + fill: var(--fg-color-2); } + .notion-search .clearButton:hover .clearIcon { - fill: var(--fg-color-3) + fill: var(--fg-color-3); } + .notion-search .clearButton:active .clearIcon { - fill: var(--fg-color-6) + fill: var(--fg-color-6); } + @keyframes spinner { to { - transform: rotate(360deg) + transform: rotate(360deg); } } + .notion-search .loadingIcon { - animation: spinner .6s linear infinite + animation: spinner 0.6s linear infinite; } + .notion-search .noResultsPane { display: flex; flex-direction: column; justify-content: center; align-items: center; - padding: 32px 16px + padding: 32px 16px; } + .notion-search .noResults { font-size: 14px; font-weight: 500; line-height: 20px; - color: rgba(55,53,47,.6) + color: rgba(55, 53, 47, 0.6); } + .notion-search .noResultsDetail { font-size: 14px; margin-top: 2px; - color: rgba(55,53,47,.4) + color: rgba(55, 53, 47, 0.4); } + .notion-search .resultsFooter { - box-shadow: rgba(55,53,47,.09) 0 -1px 0; + box-shadow: rgba(55, 53, 47, 0.09) 0px -1px 0px; margin-top: 1px; font-size: 12px; min-height: 28px; @@ -2183,144 +2609,179 @@ svg.notion-page-icon { padding: 0 16px; display: flex; flex-direction: column; - justify-content: center + justify-content: center; } + .notion-search .resultsCount { font-weight: 500; - color: var(--fg-color-3) + color: var(--fg-color-3); } + .notion-search .resultsPane { display: flex; flex-direction: column; height: 100%; flex: 1; - overflow: auto + overflow: auto; } + .notion-search .resultsPane .result { padding: 8px 14px; - border-bottom: 1px solid rgba(55,53,47,.06); + border-bottom: 1px solid rgba(55, 53, 47, 0.06); font-size: 14px; user-select: none; display: flex; flex-direction: column; align-items: stretch; color: var(--fg-color); - text-decoration: none + text-decoration: none; } + .notion-search .resultsPane .result:hover { - background: var(--bg-color-2)!important + background: var(--bg-color-2) !important; } + .notion-search .resultsPane .result:active { - background: var(--fg-color-1)!important + background: var(--fg-color-1) !important; } + .notion-search .resultsPane .result { min-height: unset; - height: unset + height: unset; } + .notion-search .resultsPane .result .notion-page-title { - display: flex + display: flex; } + .notion-search .resultsPane .result .notion-search-result-highlight { font-size: 90%; - margin: 4px 0 0 30px + margin: 4px 0 0 30px; } + .notion-sync-block { - width: 100% + width: 100%; } + .notion-collection-group { - margin-bottom: 1em + margin-bottom: 1em; } + +.notion-collection-group > summary { +} + .notion-collection-group > summary > div { - transform: scale(.85); + transform: scale(0.85); transform-origin: 0% 50%; display: inline-flex; - align-items: center + align-items: center; } + .notion-simple-table { border: 1px solid var(--fg-color-5); border-collapse: collapse; border-spacing: 0; - font-size: 14px + font-size: 14px; } + +/* simple table header */ +/* row header */ .notion-simple-table-header-row td { - background: var(--bg-color-0) + background: var(--bg-color-0); } + +/* column header */ .notion-simple-table-header-cell { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-simple-table td { border: 1px solid var(--fg-color-5); padding: 8px 8px; - white-space: pre-wrap + white-space: pre-wrap; } + .notion-external { border-radius: 3px; transition: background 120ms ease-in 0s; - text-decoration: none + text-decoration: none; } + .notion-external:hover { - background: var(--bg-color-0) + background: var(--bg-color-0); } + .notion-external-block { width: 100%; margin-top: 4px; border: 1px solid var(--fg-color-1); padding: 6px 6px; - display: flex + display: flex; } + .notion-external-mention { display: inline-flex; padding: 0 4px; align-items: center; position: relative; - top: 3px + top: 3px; } + .notion-external-image { width: 32px; height: 32px; - margin: 3px 12px 3px 4px + margin: 3px 12px 3px 4px; } + .notion-external-mention .notion-external-image { display: inline-flex; align-items: center; width: 16px; height: 16px; margin: 0; - margin-right: .3em + margin-right: 0.3em; } + .notion-external-mention .notion-external-image svg { width: 100%; - height: 100% + height: 100%; } + .notion-external-description { display: flex; - flex-direction: column + flex-direction: column; } + .notion-external-mention .notion-external-description { display: inline-flex; flex-direction: row; - align-items: center + align-items: center; } + .notion-external-title { font-size: 14px; font-weight: 500; - color: var(--fg-color-4) + color: var(--fg-color-4); } + .notion-external-mention .notion-external-title { display: inline; font-size: 16px; - border-bottom: .05em solid var(--fg-color-1) + border-bottom: 0.05em solid var(--fg-color-1); } + .notion-external-subtitle { font-size: 12px; - color: var(--fg-color-3) + color: var(--fg-color-3); } + .notion-external-block-desc { - color: rgba(55,53,47,.65); + color: rgba(55, 53, 47, 0.65); font-size: 12px; white-space: nowrap; - padding-top: 4px + padding-top: 4px; } + .notion-external-mention .notion-external-subtitle { display: none; position: absolute; @@ -2330,51 +2791,62 @@ svg.notion-page-icon { background: var(--bg-color); z-index: 999; padding: 8px; - box-shadow: rgba(15,15,15,.1) 0 0 0 1px,rgba(15,15,15,.1) 0 2px 4px + box-shadow: + rgba(15, 15, 15, 0.1) 0 0 0 1px, + rgba(15, 15, 15, 0.1) 0 2px 4px; } + .notion-external-mention .notion-external-subtitle-item { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; line-height: 1.5; - padding: 4px 0 + padding: 4px 0; } + .notion-external-mention .notion-external-subtitle-item-name { flex: none; width: 70px; - font-weight: 500 + font-weight: 500; } + .notion-external-mention .notion-external-subtitle-item-desc { - flex: 1 + flex: 1; } + .notion-external-description:hover .notion-external-subtitle { - display: block + display: block; } + .notion-preview-card-domain-warp { display: flex; flex-direction: row; justify-content: flex-start; - align-items: center + align-items: center; } + .notion-preview-card-domain-warp .notion-preview-card-domain { - padding-left: 4px + padding-left: 4px; } .notion-preview-card-domain-warp .notion-preview-card-logo { width: 14px; - height: 14px + height: 14px; } + .notion-preview-card-title { font-size: 16px; line-height: 1.5; padding: 4px 0; font-weight: 500; - color: var(--fg-color-4) + color: var(--fg-color-4); } + .notion-preview-card-github-shields img { margin-right: 4px; - padding: 4px 0 + padding: 4px 0; } + .notion-yt-lite { background-color: #000; position: absolute; @@ -2384,8 +2856,9 @@ svg.notion-page-icon { contain: content; background-position: center center; background-size: cover; - cursor: pointer + cursor: pointer; } + .notion-yt-lite::before { content: ''; display: block; @@ -2397,68 +2870,77 @@ svg.notion-page-icon { width: 100%; height: 60px; padding-bottom: 50px; - transition: all .2s cubic-bezier(0, 0, .2, 1) + transition: all 0.2s cubic-bezier(0, 0, 0.2, 1); } + .notion-yt-lite > iframe { width: 100%; height: 100%; position: absolute; top: 0; - left: 0 + left: 0; } .notion-yt-playbtn { width: 68px; height: 48px; position: absolute; cursor: pointer; - transform: translate3d(-50%,-50%,0); + transform: translate3d(-50%, -50%, 0); top: 50%; left: 50%; z-index: 1; background-color: transparent; + /* YT's actual play button svg */ background-image: url('data:image/svg+xml;utf8,'); filter: grayscale(100%); - transition: filter .1s cubic-bezier(0, 0, .2, 1); - border: none + transition: filter 0.1s cubic-bezier(0, 0, 0.2, 1); + border: none; } .notion-yt-lite:hover > .notion-yt-playbtn, .notion-yt-youtube .notion-yt-playbtn:focus { - filter: none + filter: none; } + .notion-yt-initialized { - cursor: unset + cursor: unset; } -.notion-yt-initialized > .notion-yt-playbtn, -.notion-yt-initialized::before { +.notion-yt-initialized::before, +.notion-yt-initialized > .notion-yt-playbtn { opacity: 0; - pointer-events: none + pointer-events: none; } + .notion-yt-thumbnail { position: absolute; top: 0; left: 0; width: 100%; height: 100%; - object-fit: cover + object-fit: cover; } + .notion-collection-view-dropdown-content { font-family: var(--notion-font); min-width: 220; background: #fff; border-radius: 6; padding: 0; - box-shadow: 0 10px 38px -10px rgba(22,23,24,.35),0 10px 20px -15px rgba(22,23,24,.2); - animation-duration: .4s; - animation-timing-function: cubic-bezier(0.16,1,0.3,1); + box-shadow: + 0px 10px 38px -10px rgba(22, 23, 24, 0.35), + 0px 10px 20px -15px rgba(22, 23, 24, 0.2); + animation-duration: 400ms; + animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); animation-fill-mode: forwards; - will-change: transform,opacity + will-change: transform, opacity; } + .notion-collection-view-tabs-row { display: flex; flex-direction: row; flex-wrap: wrap; - width: 120% + width: 120%; } + .notion-collection-view-tabs-content-item { all: unset; position: relative; @@ -2469,128 +2951,153 @@ svg.notion-page-icon { align-items: center; user-select: none; cursor: pointer; - color: #37352f; - font-size: 14px + color: rgb(55, 53, 47); + font-size: 14px; } + .notion-collection-view-tabs-content-item:hover { background-color: var(--fg-color-1); - border-radius: 3px + border-radius: 3px; } + .notion-collection-view-tabs-content-item-active { border-bottom: solid 2px #000; - font-weight: 700 + font-weight: bold; } -@media only screen and (max-width:730px) { + +@media only screen and (max-width: 730px) { .notion-collection-view-tabs-row { - width: 100% + width: 100%; } } + @keyframes slideDownAndFade { 0% { opacity: 0; - transform: translateY(-2px) + transform: translateY(-2px); } + 100% { opacity: 1; - transform: translateY(0) + transform: translateY(0); } } -.notion-collection-view-dropdown-content[data-state=open] { - animation-name: slideDownAndFade + +.notion-collection-view-dropdown-content[data-state='open'] { + animation-name: slideDownAndFade; } + .nested-form-link { - background: 0 0!important; + background: none !important; border: none; - padding: 0!important; + padding: 0 !important; text-decoration: underline; - cursor: pointer + cursor: pointer; } + +/* Link Mention Styles */ .notion-link-mention { position: relative; display: inline-flex; - align-items: center; - vertical-align: middle + align-items: center; + vertical-align: middle; } + .notion-link-mention-link { display: inline-flex; align-items: center; - gap: .5rem + gap: 0.5rem; } + .notion-link-mention-icon { width: 1.5rem; height: 1.5rem; - border-radius: .375rem + border-radius: 0.375rem; } + .notion-link-mention-provider { - font-size: .875rem; - color: var(--fg-color) + font-size: 0.875rem; + color: var(--fg-color); } + .notion-link-mention-title { - font-size: .875rem; + font-size: 0.875rem; font-weight: 600; - color: var(--fg-color) + color: var(--fg-color); } + +/* Preview card (appears on hover) */ .notion-link-mention-preview { display: none; position: absolute; top: 100%; left: 0; - margin-top: .5rem; - z-index: 100000 + margin-top: 0.5rem; + z-index: 100000; } + .notion-link-mention:hover .notion-link-mention-preview { - display: block + display: block; } + .notion-link-mention-card { - width: 18rem; - height: 15rem; + width: 18rem; + height: 15rem; background: var(--bg-color); - border-radius: .75rem; - border: 1px solid rgba(27,31,36,.15); + border-radius: 0.75rem; + border: 1px solid rgba(27, 31, 36, 0.15); overflow: hidden; - box-shadow: 0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06) + box-shadow: + 0 4px 6px -1px rgba(0, 0, 0, 0.1), + 0 2px 4px -1px rgba(0, 0, 0, 0.06); } + .notion-link-mention-preview-thumbnail { width: 100%; height: 55%; - object-fit: cover + object-fit: cover; } + .notion-link-mention-preview-content { display: flex; flex-direction: column; height: 45%; - padding: .5rem 1rem; - gap: .125rem + padding: 0.5rem 1rem; + gap: 0.125rem; } + .notion-link-mention-preview-title { - font-size: .875rem; + font-size: 0.875rem; font-weight: 700; color: var(--fg-color); - margin: 0 + margin: 0; } + .notion-link-mention-preview-description { - font-size: .875rem; + font-size: 0.875rem; color: var(--fg-color); display: -webkit-box; -webkit-line-clamp: 2; - line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; - margin: 0 + margin: 0; } + .notion-link-mention-preview-footer { display: flex; align-items: center; - gap: .375rem; + gap: 0.375rem; margin-top: auto; - padding-bottom: .5rem + padding-bottom: 0.5rem; } + .notion-link-mention-preview-icon { width: 1rem; height: 1rem; - border-radius: .25rem + border-radius: 0.25rem; } + .notion-link-mention-preview-provider { - font-size: .875rem; - color: var(--fg-color-2) -} \ No newline at end of file + font-size: 0.875rem; + color: var(--fg-color-2); +} diff --git a/packages/react-notion-x/src/third-party/collection-utils.ts b/packages/react-notion-x/src/third-party/collection-utils.ts index 851dcbcc..7a2a1585 100644 --- a/packages/react-notion-x/src/third-party/collection-utils.ts +++ b/packages/react-notion-x/src/third-party/collection-utils.ts @@ -34,7 +34,7 @@ export function getCollectionGroups( } // TODO: review dates format based on value.type ('week'|'month'|'year') - queryValue = format(new Date(queryLabel), 'MMM d, yyy hh:mm aa') + queryValue = format(new Date(queryLabel), 'MMM d, YYY hh:mm aa') } return { diff --git a/packages/react-notion-x/src/third-party/eval-formula.ts b/packages/react-notion-x/src/third-party/eval-formula.ts index 60a56b0d..6658ae7f 100644 --- a/packages/react-notion-x/src/third-party/eval-formula.ts +++ b/packages/react-notion-x/src/third-party/eval-formula.ts @@ -300,7 +300,7 @@ function evalFunctionFormula( case 'object': if (value instanceof Date) { - return format(value as Date, 'MMM d, yyy') + return format(value as Date, 'MMM d, YYY') } else { // shouldn't ever get here return `${value}` diff --git a/packages/react-notion-x/src/third-party/pdf.tsx b/packages/react-notion-x/src/third-party/pdf.tsx index c360b9e6..343d9de7 100644 --- a/packages/react-notion-x/src/third-party/pdf.tsx +++ b/packages/react-notion-x/src/third-party/pdf.tsx @@ -2,8 +2,7 @@ import React from 'react' import { Document, Page, pdfjs } from 'react-pdf' // ensure pdfjs can find its worker script regardless of how react-notion-x is bundled -//pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.mjs` -pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs` +pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.mjs` export function Pdf({ file, ...rest }: { file: string }) { const [numPages, setNumPages] = React.useState(0) diff --git a/packages/react-notion-x/src/third-party/property.tsx b/packages/react-notion-x/src/third-party/property.tsx index 329d910b..f23df31b 100644 --- a/packages/react-notion-x/src/third-party/property.tsx +++ b/packages/react-notion-x/src/third-party/property.tsx @@ -92,7 +92,7 @@ export function PropertyImpl(props: IPropertyProps) { } if (content instanceof Date) { - content = format(content, 'MMM d, yyy hh:mm aa') + content = format(content, 'MMM d, YYY hh:mm aa') } } catch { // console.log('error evaluating formula', schema.formula, err) @@ -437,7 +437,7 @@ export function PropertyImpl(props: IPropertyProps) { const renderCreatedTimeValue = React.useMemo( () => function CreatedTimeProperty() { - return format(new Date(block!.created_time), 'MMM d, yyy hh:mm aa') + return format(new Date(block!.created_time), 'MMM d, YYY hh:mm aa') }, [block] ) @@ -445,7 +445,7 @@ export function PropertyImpl(props: IPropertyProps) { const renderLastEditedTimeValue = React.useMemo( () => function LastEditedTimeProperty() { - return format(new Date(block!.last_edited_time), 'MMM d, yyy hh:mm aa') + return format(new Date(block!.last_edited_time), 'MMM d, YYY hh:mm aa') }, [block] ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84513bcd..b60463fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,8 +31,8 @@ catalogs: specifier: ^1.26.5 version: 1.26.5 '@types/react': - specifier: ^19.1.8 - version: 19.1.8 + specifier: ^19.1.6 + version: 19.1.6 '@types/react-dom': specifier: ^19.1.6 version: 19.1.6 @@ -63,9 +63,6 @@ catalogs: format-number: specifier: ^3.0.0 version: 3.0.0 - got: - specifier: ^14.4.7 - version: 14.4.7 is-url-superb: specifier: ^6.1.0 version: 6.1.0 @@ -93,6 +90,9 @@ catalogs: npm-run-all2: specifier: ^8.0.4 version: 8.0.4 + ofetch: + specifier: ^1.4.1 + version: 1.4.1 p-map: specifier: ^7.0.3 version: 7.0.3 @@ -163,7 +163,7 @@ importers: devDependencies: '@fisch0920/config': specifier: 'catalog:' - version: 1.1.2(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) + version: 1.1.2(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) '@total-typescript/ts-reset': specifier: 'catalog:' version: 0.6.1 @@ -208,7 +208,7 @@ importers: version: 5.8.3 vitest: specifier: 'catalog:' - version: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) examples/cra: dependencies: @@ -217,10 +217,10 @@ importers: version: 22.15.30 '@types/react': specifier: 'catalog:' - version: 19.1.8 + version: 19.1.6 '@types/react-dom': specifier: 'catalog:' - version: 19.1.6(@types/react@19.1.8) + version: 19.1.6(@types/react@19.1.6) notion-types: specifier: workspace:* version: link:../../packages/notion-types @@ -321,15 +321,15 @@ importers: packages/notion-client: dependencies: - got: - specifier: 'catalog:' - version: 14.4.7 notion-types: specifier: workspace:* version: link:../notion-types notion-utils: specifier: workspace:* version: link:../notion-utils + ofetch: + specifier: 'catalog:' + version: 1.4.1 p-map: specifier: 'catalog:' version: 7.0.3 @@ -420,7 +420,7 @@ importers: version: 1.26.5 '@types/react': specifier: 'catalog:' - version: 19.1.8 + version: 19.1.6 '@types/react-modal': specifier: 'catalog:' version: 3.16.3 @@ -444,8 +444,8 @@ importers: version: 19.1.0(react@19.1.0) optionalDependencies: react-pdf: - specifier: ^10.0.1 - version: 10.0.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^9.2.1 + version: 9.2.1(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) packages: @@ -1846,70 +1846,6 @@ packages: katex: '>=0.9' react: '>=16' - '@napi-rs/canvas-android-arm64@0.1.72': - resolution: {integrity: sha512-OW99TDJEdfOhpJWQ7SXFsQi1BXd6UFuWM8AoQvJ0SQMHWY/iwuopmb1UqGV6Df9aM/SWxvCWBN/onjeCM8KVKQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/canvas-darwin-arm64@0.1.72': - resolution: {integrity: sha512-gB8Pn/4GdS+B6P4HYuNqPGx8iQJ16Go1D6e5hIxfUbA/efupVGZ7e3OMGWGCUgF0vgbEPEF31sPzhcad4mdR5g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/canvas-darwin-x64@0.1.72': - resolution: {integrity: sha512-x1zKtWVSnf+yLETHdSDAFJ1w6bctS/V2NP0wskTTBKkC+c/AmI2Dl+ZMIW11gF6rilBibrIzBeXJKPzV0GMWGA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.72': - resolution: {integrity: sha512-Ef6HMF+TBS+lqBNpcUj2D17ODJrbgevXaVPtr2nQFCao5IvoEhVMdmVwWk5YiI+GcgbAkg5AF3LiU47RoSY5yg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/canvas-linux-arm64-gnu@0.1.72': - resolution: {integrity: sha512-i1tWu+Li1Z6G4t+ckT38JwuB/cAAREV6H8VD3dip2yTYU+qnLz6kG4i+whm+SEQb1e4vk3xA1lKnjYx3jlOy8g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/canvas-linux-arm64-musl@0.1.72': - resolution: {integrity: sha512-Mu+2hHZAT9SdrjiRtCxMD/Unac8vqVxF/p+Tvjb5sN1NZkLGu+l7WIfrug8aeX150OwrYgAvsR4mhrm0BZvLxg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.72': - resolution: {integrity: sha512-xBPG/ImL58I4Ep6VM+sCrpwl8rE/8e7Dt9U7zzggNvYHrWD13vIF3q5L2/N9VxdBMh1pee6dBC/VcaXLYccZNQ==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - - '@napi-rs/canvas-linux-x64-gnu@0.1.72': - resolution: {integrity: sha512-jkC8L+QovHpzQrw+Jm1IUqxgLV5QB1hJ1cR8iYzxNRd0TOF7YfxLaIGxvd/ReRi9r48JT6PL7z2IGT7TqK8T4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/canvas-linux-x64-musl@0.1.72': - resolution: {integrity: sha512-PwPdPmHgJYnTMUr8Gff80eRVdpGjwrxueIqw+7v4aeFxbQjmQ+paa2xaGedFtkvdS2Dn5z8a0mVlrlbSfec+1Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/canvas-win32-x64-msvc@0.1.72': - resolution: {integrity: sha512-hZhXJZZ/2ZjkAoOtyGUs3Mx6jA4o9ESbc5bk+NKYO6thZRvRNA7rqvT9WF9pZK0xcRK5EyWRymv8fCzqmSVEzg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/canvas@0.1.72': - resolution: {integrity: sha512-ypTJ/DXzsJbTU3o7qXFlWmZGgEbh42JWQl7v5/i+DJz/HURELcSnq9ler9e1ukqma70JzmCQcIseiE/Xs6sczw==} - engines: {node: '>= 10'} - '@next/env@15.3.3': resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==} @@ -2139,16 +2075,9 @@ packages: '@rushstack/eslint-patch@1.11.0': resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - '@sindresorhus/is@7.0.2': - resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} - engines: {node: '>=18'} - '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} @@ -2224,10 +2153,6 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} - '@tootallnate/once@1.1.2': resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -2293,9 +2218,6 @@ packages: '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} @@ -2361,8 +2283,8 @@ packages: '@types/react-modal@3.16.3': resolution: {integrity: sha512-xXuGavyEGaFQDgBv4UVm8/ZsG+qxeQ7f77yNrW3n+1J6XAstUy5rYHeIHPh1KzsGc6IkCIdu6lQ2xWzu1jBTLg==} - '@types/react@19.1.8': - resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + '@types/react@19.1.6': + resolution: {integrity: sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==} '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -2920,6 +2842,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -2934,6 +2859,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -2976,6 +2904,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -3019,14 +2950,6 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - - cacheable-request@12.0.1: - resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} - engines: {node: '>=18'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -3071,6 +2994,10 @@ packages: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} engines: {node: '>=6'} + canvas@3.1.0: + resolution: {integrity: sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==} + engines: {node: ^18.12.0 || >= 20.9.0} + case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} @@ -3110,6 +3037,9 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3511,6 +3441,10 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + 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==} @@ -3522,10 +3456,6 @@ packages: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -3708,6 +3638,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -4037,6 +3970,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expect-type@1.2.1: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} @@ -4180,10 +4117,6 @@ packages: vue-template-compiler: optional: true - form-data-encoder@4.1.0: - resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} - engines: {node: '>= 18'} - form-data@3.0.3: resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} engines: {node: '>= 6'} @@ -4206,6 +4139,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -4271,10 +4207,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -4286,6 +4218,9 @@ packages: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4341,10 +4276,6 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - got@14.4.7: - resolution: {integrity: sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==} - engines: {node: '>=20'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4436,9 +4367,6 @@ packages: htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} @@ -4470,10 +4398,6 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} - http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -4503,6 +4427,9 @@ packages: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -4697,10 +4624,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -5084,70 +5007,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-darwin-arm64@1.30.1: - resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.30.1: - resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.30.1: - resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.30.1: - resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.30.1: - resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.30.1: - resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.30.1: - resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.30.1: - resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.30.1: - resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.30.1: - resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} - engines: {node: '>= 12.0.0'} - lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -5218,10 +5077,6 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lqip-modern@2.2.1: resolution: {integrity: sha512-5XlvR9zczhDiNstMztH5kF3xs2cVbvPu7xmGWpgd4Qwb7UastgplSihZt2PHX9CBkZ241En9miZEDXyy0TgdiQ==} engines: {node: '>=18'} @@ -5238,8 +5093,8 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - 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-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -5249,8 +5104,8 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-event-props@2.0.0: - resolution: {integrity: sha512-G/hncXrl4Qt7mauJEXSg3AcdYzmpkIITTNl5I+rH9sog5Yw0kK6vseJjCaPfOXqOqQuPUP89Rkhfz5kPS8ijtw==} + make-event-props@1.6.2: + resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -5288,8 +5143,8 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - 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: @@ -5348,10 +5203,6 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -5395,6 +5246,9 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + 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 @@ -5428,6 +5282,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==} + natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -5465,6 +5322,13 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} + engines: {node: '>=10'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-fetch-native@1.6.6: resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} @@ -5582,6 +5446,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} @@ -5616,10 +5483,6 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - p-cancelable@4.0.1: - resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} - engines: {node: '>=14.16'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -5725,6 +5588,10 @@ packages: resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} engines: {node: '>=18'} + path2d@0.2.2: + resolution: {integrity: sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==} + engines: {node: '>=6'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -5732,9 +5599,9 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - pdfjs-dist@5.3.31: - resolution: {integrity: sha512-EhPdIjNX0fcdwYQO+e3BAAJPXt+XI29TZWC7COhIXs/K0JHcUt1Gdz1ITpebTwVMFiLsukdUZ3u0oTO7jij+VA==} - engines: {node: '>=20.16.0 || >=22.3.0'} + pdfjs-dist@4.8.69: + resolution: {integrity: sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==} + engines: {node: '>=18'} perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -6239,6 +6106,11 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -6291,6 +6163,9 @@ packages: psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -6313,10 +6188,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} @@ -6334,6 +6205,10 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + react-app-polyfill@3.0.0: resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} engines: {node: '>=14'} @@ -6399,8 +6274,8 @@ packages: react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 - react-pdf@10.0.1: - resolution: {integrity: sha512-dblLZ5BqubeNFZwTzHkRi7Rexev2+Xb9z7sEvNYT+IOxmih1KgrByeqD4Hm0RnwR9nTWludXbiHQMe9d47DK2w==} + 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 @@ -6528,9 +6403,6 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -6571,10 +6443,6 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -6786,6 +6654,9 @@ packages: simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-git-hooks@2.13.0: resolution: {integrity: sha512-N+goiLxlkHJlyaYEglFypzVNMaNplPAk5syu0+OPp/Bk6dwVoXF6FfOw2vO0Dp+JHsBaI+w6cm8TnFl2Hw6tDA==} hasBin: true @@ -6969,6 +6840,10 @@ packages: resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} engines: {node: '>=12'} + 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'} @@ -7053,6 +6928,13 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -7222,6 +7104,9 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + turbo-darwin-64@2.5.4: resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} cpu: [x64] @@ -8907,11 +8792,11 @@ snapshots: '@eslint/core': 0.14.0 levn: 0.4.1 - '@fisch0920/config@1.1.2(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': + '@fisch0920/config@1.1.2(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@eslint/js': 9.28.0 '@total-typescript/ts-reset': 0.6.1 - '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) eslint: 9.28.0(jiti@2.4.2) eslint-config-prettier: 10.1.5(eslint@9.28.0(jiti@2.4.2)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) @@ -9347,50 +9232,6 @@ snapshots: katex: 0.16.21 react: 19.1.0 - '@napi-rs/canvas-android-arm64@0.1.72': - optional: true - - '@napi-rs/canvas-darwin-arm64@0.1.72': - optional: true - - '@napi-rs/canvas-darwin-x64@0.1.72': - optional: true - - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.72': - optional: true - - '@napi-rs/canvas-linux-arm64-gnu@0.1.72': - optional: true - - '@napi-rs/canvas-linux-arm64-musl@0.1.72': - optional: true - - '@napi-rs/canvas-linux-riscv64-gnu@0.1.72': - optional: true - - '@napi-rs/canvas-linux-x64-gnu@0.1.72': - optional: true - - '@napi-rs/canvas-linux-x64-musl@0.1.72': - optional: true - - '@napi-rs/canvas-win32-x64-msvc@0.1.72': - optional: true - - '@napi-rs/canvas@0.1.72': - optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.72 - '@napi-rs/canvas-darwin-arm64': 0.1.72 - '@napi-rs/canvas-darwin-x64': 0.1.72 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.72 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.72 - '@napi-rs/canvas-linux-arm64-musl': 0.1.72 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.72 - '@napi-rs/canvas-linux-x64-gnu': 0.1.72 - '@napi-rs/canvas-linux-x64-musl': 0.1.72 - '@napi-rs/canvas-win32-x64-msvc': 0.1.72 - optional: true - '@next/env@15.3.3': {} '@next/swc-darwin-arm64@15.3.3': @@ -9553,12 +9394,8 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} - '@sec-ant/readable-stream@0.4.1': {} - '@sinclair/typebox@0.24.51': {} - '@sindresorhus/is@7.0.2': {} - '@sindresorhus/merge-streams@2.3.0': {} '@sinonjs/commons@1.8.6': @@ -9649,10 +9486,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 - '@tootallnate/once@1.1.2': {} '@total-typescript/ts-reset@0.6.1': {} @@ -9740,8 +9573,6 @@ snapshots: '@types/html-minifier-terser@6.1.0': {} - '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} '@types/http-proxy@1.17.15': @@ -9795,15 +9626,15 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.1.6(@types/react@19.1.8)': + '@types/react-dom@19.1.6(@types/react@19.1.6)': dependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.6 '@types/react-modal@3.16.3': dependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.6 - '@types/react@19.1.8': + '@types/react@19.1.6': dependencies: csstype: 3.1.3 @@ -10036,13 +9867,13 @@ snapshots: '@typescript-eslint/types': 8.33.1 eslint-visitor-keys: 4.2.0 - '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.28.0(jiti@2.4.2) optionalDependencies: typescript: 5.8.3 - vitest: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -10054,13 +9885,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.2(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.2(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.2 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) '@vitest/pretty-format@3.2.2': dependencies: @@ -10537,6 +10368,9 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: + optional: true + batch@0.6.1: {} bfj@7.1.0: @@ -10551,6 +10385,13 @@ snapshots: binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + bluebird@3.7.2: {} body-parser@1.20.3: @@ -10612,6 +10453,12 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + optional: true + builtin-modules@3.3.0: {} builtin-modules@5.0.0: {} @@ -10662,18 +10509,6 @@ snapshots: cac@6.7.14: {} - cacheable-lookup@7.0.0: {} - - cacheable-request@12.0.1: - dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 9.0.1 - http-cache-semantics: 4.2.0 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.1 - responselike: 3.0.0 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -10725,6 +10560,12 @@ snapshots: - supports-color optional: true + canvas@3.1.0: + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + optional: true + case-sensitive-paths-webpack-plugin@2.4.0: {} chai@5.2.0: @@ -10770,6 +10611,9 @@ snapshots: dependencies: readdirp: 4.1.2 + chownr@1.1.4: + optional: true + chownr@2.0.0: optional: true @@ -11140,11 +10984,15 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + optional: true dedent@0.7.0: {} deep-eql@5.0.2: {} + deep-extend@0.6.0: + optional: true + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -11153,8 +11001,6 @@ snapshots: dependencies: execa: 5.1.1 - defer-to-connect@2.0.1: {} - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -11315,6 +11161,11 @@ snapshots: encodeurl@2.0.0: {} + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + optional: true + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -11925,6 +11776,9 @@ snapshots: exit@0.1.2: {} + expand-template@2.0.3: + optional: true + expect-type@1.2.1: {} expect@27.5.1: @@ -12106,8 +11960,6 @@ snapshots: optionalDependencies: eslint: 9.28.0(jiti@2.4.2) - form-data-encoder@4.1.0: {} - form-data@3.0.3: dependencies: asynckit: 0.4.0 @@ -12130,6 +11982,9 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: + optional: true + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -12209,11 +12064,6 @@ snapshots: get-stream@6.0.1: {} - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -12233,6 +12083,9 @@ snapshots: nypm: 0.6.0 pathe: 2.0.3 + github-from-package@0.0.0: + optional: true + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -12302,20 +12155,6 @@ snapshots: gopd@1.2.0: {} - got@14.4.7: - dependencies: - '@sindresorhus/is': 7.0.2 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 12.0.1 - decompress-response: 6.0.0 - form-data-encoder: 4.1.0 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 4.0.1 - responselike: 3.0.0 - type-fest: 4.26.1 - graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -12401,8 +12240,6 @@ snapshots: domutils: 2.8.0 entities: 2.2.0 - http-cache-semantics@4.2.0: {} - http-deceiver@1.2.7: {} http-errors@1.6.3: @@ -12450,11 +12287,6 @@ snapshots: transitivePeerDependencies: - debug - http2-wrapper@2.2.1: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -12482,6 +12314,9 @@ snapshots: dependencies: harmony-reflect: 1.6.2 + ieee754@1.2.1: + optional: true + ignore@5.3.2: {} ignore@7.0.3: {} @@ -12642,8 +12477,6 @@ snapshots: is-stream@2.0.1: {} - is-stream@4.0.1: {} - is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -13292,52 +13125,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-darwin-arm64@1.30.1: - optional: true - - lightningcss-darwin-x64@1.30.1: - optional: true - - lightningcss-freebsd-x64@1.30.1: - optional: true - - lightningcss-linux-arm-gnueabihf@1.30.1: - optional: true - - lightningcss-linux-arm64-gnu@1.30.1: - optional: true - - lightningcss-linux-arm64-musl@1.30.1: - optional: true - - lightningcss-linux-x64-gnu@1.30.1: - optional: true - - lightningcss-linux-x64-musl@1.30.1: - optional: true - - lightningcss-win32-arm64-msvc@1.30.1: - optional: true - - lightningcss-win32-x64-msvc@1.30.1: - optional: true - - lightningcss@1.30.1: - dependencies: - detect-libc: 2.0.4 - optionalDependencies: - lightningcss-darwin-arm64: 1.30.1 - lightningcss-darwin-x64: 1.30.1 - lightningcss-freebsd-x64: 1.30.1 - lightningcss-linux-arm-gnueabihf: 1.30.1 - lightningcss-linux-arm64-gnu: 1.30.1 - lightningcss-linux-arm64-musl: 1.30.1 - lightningcss-linux-x64-gnu: 1.30.1 - lightningcss-linux-x64-musl: 1.30.1 - lightningcss-win32-arm64-msvc: 1.30.1 - lightningcss-win32-x64-msvc: 1.30.1 - optional: true - lilconfig@2.1.0: {} lilconfig@3.1.3: {} @@ -13393,8 +13180,6 @@ snapshots: dependencies: tslib: 2.8.1 - lowercase-keys@3.0.0: {} - lqip-modern@2.2.1: dependencies: p-map: 7.0.3 @@ -13414,7 +13199,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-cancellable-promise@2.0.0: + make-cancellable-promise@1.3.2: optional: true make-dir@3.1.0: @@ -13425,7 +13210,7 @@ snapshots: dependencies: semver: 7.7.2 - make-event-props@2.0.0: + make-event-props@1.6.2: optional: true makeerror@1.0.12: @@ -13454,9 +13239,9 @@ snapshots: merge-descriptors@1.0.3: {} - merge-refs@2.0.0(@types/react@19.1.8): + merge-refs@1.3.0(@types/react@19.1.6): optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.6 optional: true merge-stream@2.0.0: {} @@ -13489,9 +13274,8 @@ snapshots: mimic-response@2.1.0: optional: true - mimic-response@3.1.0: {} - - mimic-response@4.0.0: {} + mimic-response@3.1.0: + optional: true min-indent@1.0.1: {} @@ -13533,6 +13317,9 @@ snapshots: yallist: 4.0.0 optional: true + mkdirp-classic@0.5.3: + optional: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -13567,6 +13354,9 @@ snapshots: nanoid@3.3.10: {} + napi-build-utils@2.0.0: + optional: true + natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} @@ -13605,6 +13395,14 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-abi@3.74.0: + dependencies: + semver: 7.7.2 + optional: true + + node-addon-api@7.1.1: + optional: true + node-fetch-native@1.6.6: {} node-fetch@2.7.0: @@ -13729,6 +13527,12 @@ snapshots: obuf@1.1.2: {} + ofetch@1.4.1: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.6 + ufo: 1.6.1 + ohash@2.0.11: {} on-finished@2.4.1: @@ -13775,8 +13579,6 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - p-cancelable@4.0.1: {} - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -13868,13 +13670,17 @@ snapshots: path-type@6.0.0: {} + path2d@0.2.2: + optional: true + pathe@2.0.3: {} pathval@2.0.0: {} - pdfjs-dist@5.3.31: + pdfjs-dist@4.8.69: optionalDependencies: - '@napi-rs/canvas': 0.1.72 + canvas: 3.1.0 + path2d: 0.2.2 optional: true perfect-debounce@1.0.0: {} @@ -14358,6 +14164,22 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.4 + 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.74.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + optional: true + prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} @@ -14410,6 +14232,12 @@ snapshots: psl@1.9.0: {} + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + optional: true + punycode@2.3.1: {} q@1.5.1: {} @@ -14422,8 +14250,6 @@ snapshots: queue-microtask@1.2.3: {} - quick-lru@5.1.1: {} - raf@3.4.1: dependencies: performance-now: 2.1.0 @@ -14446,6 +14272,14 @@ snapshots: defu: 6.1.4 destr: 2.0.3 + 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-app-polyfill@3.0.0: dependencies: core-js: 3.38.1 @@ -14532,20 +14366,20 @@ snapshots: react-lifecycles-compat: 3.0.4 warning: 4.0.3 - react-pdf@10.0.1(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-pdf@9.2.1(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 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.1.8) - pdfjs-dist: 5.3.31 + make-cancellable-promise: 1.3.2 + make-event-props: 1.6.2 + merge-refs: 1.3.0(@types/react@19.1.6) + pdfjs-dist: 4.8.69 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) tiny-invariant: 1.3.3 warning: 4.0.3 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.6 optional: true react-refresh@0.11.0: {} @@ -14753,8 +14587,6 @@ snapshots: requires-port@1.0.0: {} - resolve-alpn@1.2.1: {} - resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -14787,10 +14619,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - responselike@3.0.0: - dependencies: - lowercase-keys: 3.0.0 - retry@0.13.1: {} reusify@1.0.4: {} @@ -15104,6 +14932,13 @@ snapshots: 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-hooks@2.13.0: {} simple-swizzle@0.2.2: @@ -15308,6 +15143,9 @@ snapshots: dependencies: min-indent: 1.0.1 + strip-json-comments@2.0.1: + optional: true + strip-json-comments@3.1.1: {} style-loader@3.3.4(webpack@5.95.0(esbuild@0.25.1)): @@ -15415,6 +15253,23 @@ snapshots: tapable@2.2.1: {} + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + optional: true + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -15588,6 +15443,11 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + optional: true + turbo-darwin-64@2.5.4: optional: true @@ -15631,7 +15491,8 @@ snapshots: type-fest@3.13.1: {} - type-fest@4.26.1: {} + type-fest@4.26.1: + optional: true type-is@1.6.18: dependencies: @@ -15773,13 +15634,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -15794,7 +15655,7 @@ snapshots: - tsx - yaml - vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): + vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -15803,16 +15664,15 @@ snapshots: '@types/node': 22.15.30 fsevents: 2.3.3 jiti: 2.4.2 - lightningcss: 1.30.1 terser: 5.36.0 tsx: 4.19.4 yaml: 2.8.0 - vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(jsdom@16.7.0(canvas@2.11.2))(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.2 - '@vitest/mocker': 3.2.2(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.2.2(vite@6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.2 '@vitest/runner': 3.2.2 '@vitest/snapshot': 3.2.2 @@ -15830,8 +15690,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.30 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e90a182f..f29a5dd6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,19 +1,21 @@ packages: - packages/* - examples/* +onlyBuiltDependencies: + - simple-git-hooks catalog: - '@fisch0920/config': ^1.1.2 - '@fisch0920/eslint-config': ^1.4.0 - '@fisch0920/medium-zoom': ^1.0.7 - '@matejmazur/react-katex': ^3.1.3 - '@notionhq/client': ^2.3.0 - '@total-typescript/ts-reset': ^0.6.1 - '@types/lodash.throttle': ^4.1.6 - '@types/node': ^22.15.30 - '@types/prismjs': ^1.26.5 - '@types/react': ^19.1.8 - '@types/react-dom': ^19.1.6 - '@types/react-modal': ^3.16.3 + "@fisch0920/config": ^1.1.2 + "@fisch0920/eslint-config": ^1.4.0 + "@fisch0920/medium-zoom": ^1.0.7 + "@matejmazur/react-katex": ^3.1.3 + "@notionhq/client": ^2.3.0 + "@total-typescript/ts-reset": ^0.6.1 + "@types/lodash.throttle": ^4.1.6 + "@types/node": ^22.15.30 + "@types/prismjs": ^1.26.5 + "@types/react": ^19.1.6 + "@types/react-dom": ^19.1.6 + "@types/react-modal": ^3.16.3 bumpp: ^10.1.1 classnames: ^2.5.1 clipboard-copy: ^4.0.1 @@ -25,13 +27,13 @@ catalog: is-url-superb: ^6.1.0 katex: ^0.16.21 ky: ^1.8.1 - got: ^14.4.7 lodash.throttle: ^4.1.1 lqip-modern: ^2.1.0 memoize: ^10.1.0 next: ^15.3.3 normalize-url: ^8.0.1 npm-run-all2: ^8.0.4 + ofetch: ^1.4.1 p-map: ^7.0.3 p-memoize: ^7.1.1 p-queue: ^8.1.0 @@ -41,8 +43,8 @@ catalog: react-dom: ^19.1.0 react-fast-compare: ^3.2.0 react-hotkeys-hook: ^4.5.1 - react-intersection-observer: ^9.16.0 react-image: ^4.0.3 + react-intersection-observer: ^9.16.0 react-modal: ^3.16.3 react-scripts: 5.0.1 react-tweet-embed: ^2.0.0 @@ -53,7 +55,3 @@ catalog: typescript: ^5.8.3 unionize: ^3.1.0 vitest: ^3.2.2 -ignoredBuiltDependencies: - - '@fisch0920/config' -onlyBuiltDependencies: - - simple-git-hooks