From d1269bc15b154aa34568863d9ea6e859a7f78d3d Mon Sep 17 00:00:00 2001 From: MoTheRoar Date: Sat, 26 Apr 2025 15:54:46 -0500 Subject: [PATCH 01/20] Fixed weird margin error on heading. Fixed list numbering bug --- package-lock.json | 39 +++++++++++++++---- src/components/Editor/editor.css | 5 --- src/components/Editor/schema.ts | 2 +- src/contexts/FileContext.tsx | 2 +- .../extensions/Blocks/nodes/BlockContainer.ts | 11 +++++- src/styles/tiptap.scss | 1 + 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index e201a5530..57e2c3ac0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5306,6 +5306,9 @@ "linux" ] }, + "node_modules/@lancedb/vectordb-linux-x64-msvc": { + "optional": true + }, "node_modules/@lancedb/vectordb-win32-x64-msvc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@lancedb/vectordb-win32-x64-msvc/-/vectordb-win32-x64-msvc-0.5.0.tgz", @@ -16616,6 +16619,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, "engines": { "node": ">=10" } @@ -16668,6 +16672,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "dev": true, "funding": [ { "type": "github", @@ -21803,6 +21808,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "dependencies": { "minipass": "^3.0.0" }, @@ -21814,6 +21820,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -21824,7 +21831,8 @@ "node_modules/fs-minipass/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/fs-monkey": { "version": "1.0.6", @@ -23314,6 +23322,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -23325,6 +23334,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -23335,7 +23345,8 @@ "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", @@ -31879,6 +31890,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -31891,6 +31903,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -31901,7 +31914,8 @@ "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/mkdirp": { "version": "1.0.4", @@ -32145,6 +32159,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -32155,12 +32170,14 @@ "node_modules/normalize-package-data/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -43256,6 +43273,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -43264,12 +43282,14 @@ "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -43278,7 +43298,8 @@ "node_modules/spdx-license-ids": { "version": "3.0.21", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true }, "node_modules/spdy": { "version": "4.0.2", @@ -44459,6 +44480,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -44498,6 +44520,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -44505,7 +44528,8 @@ "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/temp-dir": { "version": "2.0.0", @@ -45909,6 +45933,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" diff --git a/src/components/Editor/editor.css b/src/components/Editor/editor.css index 97ed2775f..0ea064e0d 100644 --- a/src/components/Editor/editor.css +++ b/src/components/Editor/editor.css @@ -100,11 +100,6 @@ display: list-item; } -[data-list-type='ul'], -[data-list-type='ol'] { - display: list-item; -} - .editor code { background-color: var(--color5); font-family: 'ui-monospace', 'SFMono-Regular', 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace; diff --git a/src/components/Editor/schema.ts b/src/components/Editor/schema.ts index c59ccdc48..d50dd8ca5 100644 --- a/src/components/Editor/schema.ts +++ b/src/components/Editor/schema.ts @@ -7,7 +7,7 @@ import { VideoBlock } from './types/Video/video' export const hmBlockSchema: BlockSchema = { paragraph: defaultBlockSchema.paragraph, heading: defaultBlockSchema.heading, - // bulletListItem: defaultBlockSchema.bulletListItem, + bulletListItem: defaultBlockSchema.bulletListItem, // numberedListItem: defaultBlockSchema.numberedListItem, image: ImageBlock, // @ts-ignore diff --git a/src/contexts/FileContext.tsx b/src/contexts/FileContext.tsx index 2d49e91bc..0a3a871a3 100644 --- a/src/contexts/FileContext.tsx +++ b/src/contexts/FileContext.tsx @@ -149,7 +149,7 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => blockSchema: hmBlockSchema, slashMenuItems, }) - + const [debouncedEditor] = useDebounce(editor?.topLevelBlocks, 3000) useEffect(() => { diff --git a/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts b/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts index aa253cceb..b9cddb0b9 100644 --- a/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts +++ b/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts @@ -157,7 +157,7 @@ class HeadingLinePlugin { this.line.style.left = `${rect.left - editorRect.left + groupPadding}px` this.line.style.width = `2.5px` this.line.style.height = `${rect.height - groupPadding * 2}px` - this.line.style.backgroundColor = 'var(--brand5)' + // this.line.style.backgroundColor = 'var(--brand5)' this.line.style.opacity = '0.4' } else { this.line.style.opacity = '0' @@ -325,6 +325,8 @@ export const BlockContainer = Node.create<{ BNUpdateBlock: (posInBlock, block) => ({ state, dispatch }) => { + console.log(`Updating block at position ${posInBlock} with block:`, block) + console.log(`State:`, state, " Dispatch:", dispatch) const blockInfo = getBlockInfoFromPos(state.doc, posInBlock) if (blockInfo === undefined) { return false @@ -490,6 +492,7 @@ export const BlockContainer = Node.create<{ if (dispatch) { // Creates a new block. Since the schema requires it to have a content node, a paragraph node is created // automatically, spanning newBlockContentPos to newBlockContentPos + 1. + console.log(`Inserting new block at position ${newBlockInsertionPos} using endpos: ${endPos}`) state.tr.insert(newBlockInsertionPos, newBlock) // Replaces the content of the newly created block's content node. Doesn't replace the whole content node so @@ -545,7 +548,7 @@ export const BlockContainer = Node.create<{ .chain() .deleteSelection() .BNSplitBlock(state.selection.from, false) - .UpdateGroup(-1, blockInfo.node.attrs.listType, true) + // .UpdateGroup(-1, blockInfo.node.attrs.listType, true) .run() }) } else { @@ -620,6 +623,9 @@ export const BlockContainer = Node.create<{ UpdateGroup: (posInBlock, listType, tab, isSank = false, turnInto = false) => ({ state, dispatch }) => { + const blockInfo = getBlockInfoFromPos(state.doc, posInBlock) + console.log(`Block info:`, blockInfo.contentType.name) + console.log(`Updating group at position ${posInBlock} with listType:`, listType) // Find block group, block container and depth it is at const { group, @@ -628,6 +634,7 @@ export const BlockContainer = Node.create<{ level: groupLevel, $pos, } = getGroupInfoFromPos(posInBlock < 0 ? state.selection.from : posInBlock, state) + console.log() if (isSank && group.attrs.listType === listType) return true // Change group type to div diff --git a/src/styles/tiptap.scss b/src/styles/tiptap.scss index 222bd5fe2..812d1c665 100644 --- a/src/styles/tiptap.scss +++ b/src/styles/tiptap.scss @@ -20,6 +20,7 @@ h5, h6 { line-height: 1.1; + margin: 0.4rem 0; } code { From 1a9dfceea2ec902d48e63435c2f9d42f2cf27fc5 Mon Sep 17 00:00:00 2001 From: MoTheRoar Date: Sat, 26 Apr 2025 15:57:39 -0500 Subject: [PATCH 02/20] Fixed weird margin error on headings. Fixed list numbering bug --- src/components/Editor/schema.ts | 2 +- src/contexts/FileContext.tsx | 2 +- .../core/extensions/Blocks/nodes/BlockContainer.ts | 6 ------ 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/components/Editor/schema.ts b/src/components/Editor/schema.ts index d50dd8ca5..eacae93a2 100644 --- a/src/components/Editor/schema.ts +++ b/src/components/Editor/schema.ts @@ -8,7 +8,7 @@ export const hmBlockSchema: BlockSchema = { paragraph: defaultBlockSchema.paragraph, heading: defaultBlockSchema.heading, bulletListItem: defaultBlockSchema.bulletListItem, - // numberedListItem: defaultBlockSchema.numberedListItem, + numberedListItem: defaultBlockSchema.numberedListItem, image: ImageBlock, // @ts-ignore 'code-block': { diff --git a/src/contexts/FileContext.tsx b/src/contexts/FileContext.tsx index 0a3a871a3..2d49e91bc 100644 --- a/src/contexts/FileContext.tsx +++ b/src/contexts/FileContext.tsx @@ -149,7 +149,7 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => blockSchema: hmBlockSchema, slashMenuItems, }) - + const [debouncedEditor] = useDebounce(editor?.topLevelBlocks, 3000) useEffect(() => { diff --git a/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts b/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts index b9cddb0b9..a360dce60 100644 --- a/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts +++ b/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts @@ -325,8 +325,6 @@ export const BlockContainer = Node.create<{ BNUpdateBlock: (posInBlock, block) => ({ state, dispatch }) => { - console.log(`Updating block at position ${posInBlock} with block:`, block) - console.log(`State:`, state, " Dispatch:", dispatch) const blockInfo = getBlockInfoFromPos(state.doc, posInBlock) if (blockInfo === undefined) { return false @@ -492,7 +490,6 @@ export const BlockContainer = Node.create<{ if (dispatch) { // Creates a new block. Since the schema requires it to have a content node, a paragraph node is created // automatically, spanning newBlockContentPos to newBlockContentPos + 1. - console.log(`Inserting new block at position ${newBlockInsertionPos} using endpos: ${endPos}`) state.tr.insert(newBlockInsertionPos, newBlock) // Replaces the content of the newly created block's content node. Doesn't replace the whole content node so @@ -624,8 +621,6 @@ export const BlockContainer = Node.create<{ (posInBlock, listType, tab, isSank = false, turnInto = false) => ({ state, dispatch }) => { const blockInfo = getBlockInfoFromPos(state.doc, posInBlock) - console.log(`Block info:`, blockInfo.contentType.name) - console.log(`Updating group at position ${posInBlock} with listType:`, listType) // Find block group, block container and depth it is at const { group, @@ -634,7 +629,6 @@ export const BlockContainer = Node.create<{ level: groupLevel, $pos, } = getGroupInfoFromPos(posInBlock < 0 ? state.selection.from : posInBlock, state) - console.log() if (isSank && group.attrs.listType === listType) return true // Change group type to div From 62ad58bcf4b956506255f8b64d57147e1989d553 Mon Sep 17 00:00:00 2001 From: MoTheRoar Date: Sun, 27 Apr 2025 15:16:05 -0500 Subject: [PATCH 03/20] Fixed pasting on non-media files. --- package-lock.json | 39 +++++++++++++++---- src/lib/blocknote/core/BlockNoteExtensions.ts | 2 +- .../extensions/Blocks/nodes/BlockContainer.ts | 2 +- .../extensions/Markdown/MarkdownExtension.ts | 35 +++++++++-------- 4 files changed, 53 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index e201a5530..57e2c3ac0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5306,6 +5306,9 @@ "linux" ] }, + "node_modules/@lancedb/vectordb-linux-x64-msvc": { + "optional": true + }, "node_modules/@lancedb/vectordb-win32-x64-msvc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@lancedb/vectordb-win32-x64-msvc/-/vectordb-win32-x64-msvc-0.5.0.tgz", @@ -16616,6 +16619,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, "engines": { "node": ">=10" } @@ -16668,6 +16672,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "dev": true, "funding": [ { "type": "github", @@ -21803,6 +21808,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "dependencies": { "minipass": "^3.0.0" }, @@ -21814,6 +21820,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -21824,7 +21831,8 @@ "node_modules/fs-minipass/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/fs-monkey": { "version": "1.0.6", @@ -23314,6 +23322,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -23325,6 +23334,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -23335,7 +23345,8 @@ "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", @@ -31879,6 +31890,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -31891,6 +31903,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -31901,7 +31914,8 @@ "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/mkdirp": { "version": "1.0.4", @@ -32145,6 +32159,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -32155,12 +32170,14 @@ "node_modules/normalize-package-data/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -43256,6 +43273,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -43264,12 +43282,14 @@ "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -43278,7 +43298,8 @@ "node_modules/spdx-license-ids": { "version": "3.0.21", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true }, "node_modules/spdy": { "version": "4.0.2", @@ -44459,6 +44480,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -44498,6 +44520,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -44505,7 +44528,8 @@ "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/temp-dir": { "version": "2.0.0", @@ -45909,6 +45933,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" diff --git a/src/lib/blocknote/core/BlockNoteExtensions.ts b/src/lib/blocknote/core/BlockNoteExtensions.ts index 8cfe31591..52ce2b92e 100644 --- a/src/lib/blocknote/core/BlockNoteExtensions.ts +++ b/src/lib/blocknote/core/BlockNoteExtensions.ts @@ -81,7 +81,7 @@ const getBlockNoteExtensions = (opts: { // copy paste: // @ts-ignore - createMarkdownExtension(), + createMarkdownExtension(opts.editor), // block manupulations: BlockManipulationExtension, diff --git a/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts b/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts index aa253cceb..93e85f1e6 100644 --- a/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts +++ b/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts @@ -87,7 +87,7 @@ const PastePlugin = new Plugin({ const { $from, $to } = selection const targetNode = state.doc.resolve($from.pos).parent - + if (targetNode.type.name === 'image') { tr = tr.insertText(event.clipboardData.getData('text/plain'), $from.pos, $to.pos) view.dispatch(tr) diff --git a/src/lib/blocknote/core/extensions/Markdown/MarkdownExtension.ts b/src/lib/blocknote/core/extensions/Markdown/MarkdownExtension.ts index d7a62b278..f4122fa83 100644 --- a/src/lib/blocknote/core/extensions/Markdown/MarkdownExtension.ts +++ b/src/lib/blocknote/core/extensions/Markdown/MarkdownExtension.ts @@ -2,6 +2,9 @@ import { Editor, Extension } from '@tiptap/core' import { Fragment, Node } from '@tiptap/pm/model' import { Plugin } from 'prosemirror-state' import { youtubeParser } from '@/components/Editor/types/utils' +import { BlockNoteEditor } from '../../BlockNoteEditor' +import { getBlockInfoFromPos } from '@/lib/utils' +import * as BlockUtils from '@/lib/utils/block-utils' function containsMarkdownSymbols(pastedText: string) { // Regex to detect unique Markdown symbols at the start of a line @@ -53,7 +56,7 @@ function getPastedNodes(parent: Node | Fragment, editor: Editor) { return nodes } -const createMarkdownExtension = () => { +const createMarkdownExtension = (bnEditor: BlockNoteEditor) => { const MarkdownExtension = Extension.create({ name: 'MarkdownPasteHandler', priority: 900, @@ -65,6 +68,7 @@ const createMarkdownExtension = () => { handlePaste: (view, event, slice) => { const selectedNode = view.state.selection.$from.parent // Don't proceed if pasting into code block + console.log(`Pasting content`) if (selectedNode.type.name === 'code-block' || selectedNode.firstChild?.type.name === 'code-block') { return false } @@ -76,6 +80,7 @@ const createMarkdownExtension = () => { const { selection } = state const isMarkdown = pastedHtml ? containsMarkdownSymbols(pastedText) : true + if (!isMarkdown) { if (hasList) { const firstBlockGroup = slice.content.firstChild?.type.name === 'blockGroup' @@ -95,9 +100,7 @@ const createMarkdownExtension = () => { return true } return false - } - - if (hasVideo) { + } else if (hasVideo) { let embedUrl = 'https://www.youtube.com/embed/' if (pastedText.includes('youtu.be') || pastedText.includes('youtube')) { const ytId = youtubeParser(pastedText) @@ -110,19 +113,19 @@ const createMarkdownExtension = () => { view.dispatch(view.state.tr.replaceSelectionWith(node)) } } + } else { + // This is not a media file, just plaintext + bnEditor.markdownToBlocks(pastedText).then((organizedBlocks: any) => { + const blockInfo = getBlockInfoFromPos(state.doc, selection.from) + console.log(`BLockINfo type: `, blockInfo.node.type.name) + bnEditor.replaceBlocks( + [blockInfo.node.attrs.id], + // @ts-ignore + organizedBlocks, + ) + BlockUtils.setGroupTypes(bnEditor._tiptapEditor, organizedBlocks) + }) } - - // bnEditor.markdownToBlocks(pastedText).then((organizedBlocks) => { - // const blockInfo = getBlockInfoFromPos(state.doc, selection.from) - // console.log(`BLockINfo type: `, blockInfo.node.type.name) - // bnEditor.replaceBlocks( - // [blockInfo.node.attrs.id], - // // @ts-ignore - // organizedBlocks, - // ) - // BlockUtils.setGroupTypes(bnEditor._tiptapEditor, organizedBlocks) - // }) - return true }, }, From 6d88c626e3dbaafd17015b6127fabcc617d5b432 Mon Sep 17 00:00:00 2001 From: MoTheRoar Date: Sun, 27 Apr 2025 15:19:17 -0500 Subject: [PATCH 04/20] Fixed pasting on non-media files. --- .../blocknote/core/extensions/Blocks/nodes/BlockContainer.ts | 2 +- .../blocknote/core/extensions/Markdown/MarkdownExtension.ts | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts b/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts index 93e85f1e6..aa253cceb 100644 --- a/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts +++ b/src/lib/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts @@ -87,7 +87,7 @@ const PastePlugin = new Plugin({ const { $from, $to } = selection const targetNode = state.doc.resolve($from.pos).parent - + if (targetNode.type.name === 'image') { tr = tr.insertText(event.clipboardData.getData('text/plain'), $from.pos, $to.pos) view.dispatch(tr) diff --git a/src/lib/blocknote/core/extensions/Markdown/MarkdownExtension.ts b/src/lib/blocknote/core/extensions/Markdown/MarkdownExtension.ts index f4122fa83..fe32e3321 100644 --- a/src/lib/blocknote/core/extensions/Markdown/MarkdownExtension.ts +++ b/src/lib/blocknote/core/extensions/Markdown/MarkdownExtension.ts @@ -68,7 +68,6 @@ const createMarkdownExtension = (bnEditor: BlockNoteEditor) => { handlePaste: (view, event, slice) => { const selectedNode = view.state.selection.$from.parent // Don't proceed if pasting into code block - console.log(`Pasting content`) if (selectedNode.type.name === 'code-block' || selectedNode.firstChild?.type.name === 'code-block') { return false } @@ -100,7 +99,8 @@ const createMarkdownExtension = (bnEditor: BlockNoteEditor) => { return true } return false - } else if (hasVideo) { + } + if (hasVideo) { let embedUrl = 'https://www.youtube.com/embed/' if (pastedText.includes('youtu.be') || pastedText.includes('youtube')) { const ytId = youtubeParser(pastedText) @@ -117,7 +117,6 @@ const createMarkdownExtension = (bnEditor: BlockNoteEditor) => { // This is not a media file, just plaintext bnEditor.markdownToBlocks(pastedText).then((organizedBlocks: any) => { const blockInfo = getBlockInfoFromPos(state.doc, selection.from) - console.log(`BLockINfo type: `, blockInfo.node.type.name) bnEditor.replaceBlocks( [blockInfo.node.attrs.id], // @ts-ignore From 08007bb7bbbf9f74d03c22f8306a3037b8000b7b Mon Sep 17 00:00:00 2001 From: milaiwi Date: Fri, 2 May 2025 15:30:55 -0500 Subject: [PATCH 05/20] Working on cleaning up semantic-similarity --- electron/main/filesystem/filesystem.ts | 23 ++ electron/main/filesystem/ipcHandlers.ts | 12 +- electron/main/path/ipcHandlers.ts | 5 + electron/preload/index.ts | 1 + package-lock.json | 229 +++--------------- package.json | 3 +- src/components/Editor/RichTextLink.tsx | 142 +++++++++++ .../Sidebars/SimilarFilesSidebar.tsx | 65 +---- src/contexts/FileContext.tsx | 11 +- src/lib/blocknote/core/BlockNoteExtensions.ts | 3 +- src/lib/semanticService.tsx | 32 +++ src/lib/utils/editor-state.ts | 11 + src/lib/utils/index.ts | 1 + 13 files changed, 281 insertions(+), 257 deletions(-) create mode 100644 src/lib/semanticService.tsx create mode 100644 src/lib/utils/editor-state.ts diff --git a/electron/main/filesystem/filesystem.ts b/electron/main/filesystem/filesystem.ts index 4070c8272..c37797b8d 100644 --- a/electron/main/filesystem/filesystem.ts +++ b/electron/main/filesystem/filesystem.ts @@ -194,3 +194,26 @@ export function splitDirectoryPathIntoBaseAndRepo(fullPath: string) { return { localModelPath, repoName } } + +export function findFileRecursive(dir: string, filename: string): string | null { + const files = fs.readdirSync(dir); + const basename = path.parse(filename).name + console.log(`Searching for basename: ${basename}`) + + for (const file of files) { + const fullPath = path.resolve(dir, file); + const stat = fs.statSync(fullPath); + + if (stat.isDirectory()) { + const result = findFileRecursive(fullPath, filename); + if (result) return result; + } else { // Check if files match + const fileName = path.parse(file).name; + if (fileName == basename) { + return fullPath + } + } + } + + return null; +} diff --git a/electron/main/filesystem/ipcHandlers.ts b/electron/main/filesystem/ipcHandlers.ts index e46653d25..57c2b750c 100644 --- a/electron/main/filesystem/ipcHandlers.ts +++ b/electron/main/filesystem/ipcHandlers.ts @@ -8,7 +8,7 @@ import WindowsManager from '../common/windowManager' import { StoreSchema } from '../electron-store/storeConfig' import { handleFileRename, updateFileInTable } from '../vector-database/tableHelperFunctions' -import { GetFilesInfoTree, createFileRecursive, isHidden, GetFilesInfoListForListOfPaths } from './filesystem' +import { GetFilesInfoTree, createFileRecursive, isHidden, GetFilesInfoListForListOfPaths, findFileRecursive } from './filesystem' import { FileInfoTree, WriteFileProps, RenameFileProps, FileInfoWithContent } from './types' import ImageStorage from './storage/ImageStore' import VideoStorage from './storage/VideoStore' @@ -217,6 +217,16 @@ const registerFileHandlers = (store: Store, _windowsManager: Window }) return result.filePaths }) + + ipcMain.handle('get-absolute-path', (event, fileName: string, dir: string | null = "") => { + dir = windowsManager.getVaultDirectoryForWinContents(event.sender) || dir + if (!dir) { + throw new Error('Vault directory not found.') + } + + const absolutePath = findFileRecursive(dir, fileName); + return absolutePath; + }); } export default registerFileHandlers diff --git a/electron/main/path/ipcHandlers.ts b/electron/main/path/ipcHandlers.ts index 9cb196eb5..74d89305e 100644 --- a/electron/main/path/ipcHandlers.ts +++ b/electron/main/path/ipcHandlers.ts @@ -24,6 +24,11 @@ const registerPathHandlers = () => { ) ipcMain.handle('path-ext-name', (event, pathString: string) => path.extname(pathString)) + + ipcMain.handle('find-absolute-path', (event, filePath: string) => { + const absolutePath = path.resolve(filePath) + return absolutePath + }) } export default registerPathHandlers diff --git a/electron/preload/index.ts b/electron/preload/index.ts index 14fcaf21a..cded841aa 100644 --- a/electron/preload/index.ts +++ b/electron/preload/index.ts @@ -108,6 +108,7 @@ const fileSystem = { deleteFile: createIPCHandler<(filePath: string) => Promise>('delete-file'), getAllFilenamesInDirectory: createIPCHandler<(dirName: string) => Promise>('get-files-in-directory'), getFiles: createIPCHandler<(filePaths: string[]) => Promise>('get-files'), + getAbsolutePath: createIPCHandler<(fileName: string, dir?: string | null) => Promise>('get-absolute-path'), } const path = { diff --git a/package-lock.json b/package-lock.json index 4954ea7c1..85efea2fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -148,7 +148,8 @@ "vaul": "^1.0.0", "vectordb": "0.4.10", "yjs": "^13.6.23", - "zod": "^3.23.8" + "zod": "^3.23.8", + "zustand": "^5.0.3" }, "devDependencies": { "@electron/notarize": "2.3.2", @@ -3549,9 +3550,6 @@ "linux" ] }, - "node_modules/@lancedb/vectordb-linux-x64-msvc": { - "optional": true - }, "node_modules/@lancedb/vectordb-win32-x64-msvc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@lancedb/vectordb-win32-x64-msvc/-/vectordb-win32-x64-msvc-0.5.0.tgz", @@ -11766,21 +11764,6 @@ "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", "dev": true }, - "node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, "node_modules/cjs-module-lexer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", @@ -14965,11 +14948,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -16143,75 +16121,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -23097,33 +23006,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -30658,66 +30540,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -31542,14 +31364,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, "node_modules/temp-file": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", @@ -32642,16 +32456,6 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -33320,6 +33124,35 @@ "zod": "^3.24.1" } }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index f8a46f41d..292b11d67 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,8 @@ "vaul": "^1.0.0", "vectordb": "0.4.10", "yjs": "^13.6.23", - "zod": "^3.23.8" + "zod": "^3.23.8", + "zustand": "^5.0.3" }, "devDependencies": { "@electron/notarize": "2.3.2", diff --git a/src/components/Editor/RichTextLink.tsx b/src/components/Editor/RichTextLink.tsx index bd21c6c52..a9fe79f94 100644 --- a/src/components/Editor/RichTextLink.tsx +++ b/src/components/Editor/RichTextLink.tsx @@ -1,6 +1,9 @@ import { InputRule, markInputRule, markPasteRule, PasteRule } from '@tiptap/core' import { Link } from '@tiptap/extension-link' import type { LinkOptions } from '@tiptap/extension-link' +import { useEditorState } from '@/lib/utils' +import { getSimilarFiles } from '@/lib/semanticService' + /** * The input regex for Markdown links with title support, and multiple quotation marks (required @@ -8,6 +11,17 @@ import type { LinkOptions } from '@tiptap/extension-link' */ const inputRegex = /(?:^|\s)\[([^\]]*)?\]\((\S+)(?: ["“](.+)["”])?\)$/i +/** + * The regex for Markdown links. Executes when it finds '[[' irrespective of the content after or inside + * the brackets + */ +const suggestFileRegex = /\[\[$/ + +/** + * Regex for finding enclosed brackets [[ .. ]] + */ +const fileRegex = /\[\[(.*?)\]\]/ + /** * The paste regex for Markdown links with title support, and multiple quotation marks (required * in case the `Typography` extension is being included). @@ -34,6 +48,106 @@ function linkInputRule(config: Parameters[0]) { }) } +/** + * Obsidian-style suggestion rule for links. When our editor detects a the start of a link (i.e. `[[`), it + * will trigger a search for all similar files. + * + * TODO: It will then display a popup containing the results of the search. Selecting one will automatically + * build a link to that file. + */ +function linkSuggestFilesInputRule(config: Parameters[0]) { + const defaultMarkInputRule = markInputRule(config) + + return new InputRule({ + find: config.find, + handler(props) { + const { tr } = props.state + console.log(`Inside handler!`) + const currentPath = useEditorState.getState().currentFilePath + void(async () => { + const searchResults = await getSimilarFiles(currentPath, 5) + console.log(`Search results are: `, searchResults) + + })() + + defaultMarkInputRule.handler(props) + tr.setMeta('preventAutolink', true) + }, + }) +} + +/** + * Obsidian-style linking to file rule + */ +// function linkFileInputRule(config: Parameters[0]) { +// const defaultMarkInputRule = markInputRule(config) + +// return new InputRule({ +// find: config.find, +// handler(props) { +// const { tr } = props.state + +// const matchedText = props.match[1]?.trim() +// console.log(`Filename is: ${matchedText}`) +// void(async () => { +// const absolutePath = await window.fileSystem.getAbsolutePath(matchedText) +// console.log(`Absolute path is: ${absolutePath}`) + +// props.chain() +// .focus() +// .setMark(config.type, { +// href: absolutePath, +// title: matchedText, +// }) +// .run() +// })() +// // const currentPath = useEditorState.getState().currentFilePath +// // void(async () => { +// // const searchResults = await getSimilarFiles(currentPath, 5) +// // console.log(`Search results are: `, searchResults) + +// // })() + + +// defaultMarkInputRule.handler(props) +// tr.setMeta('preventAutolink', true) +// }, +// }) +// } + +export function linkFileInputRule(config: Parameters[0]) { + return new InputRule({ + find: fileRegex, + handler: (props) => { + const { range, match } = props + + const matchedText = match[1]?.trim() // The text inside [[ ]] + if (!matchedText) return + const { from, to } = range + + // Resolve the file path (async) + void (async () => { + const absolutePath = await window.fileSystem.getAbsolutePath(matchedText) + console.log('Absolute path:', absolutePath) + + props.chain() + .focus() + .deleteRange({ from, to }) // Delete [[path]] + .insertContent(matchedText) // Insert just Untitled + .extendMarkRange(config.type.name) // Select the newly inserted text + .setMark(config.type, { // Set the link + href: absolutePath, + title: matchedText, + }) + .run() + })() + + // Block autolink if needed + props.state.tr.setMeta('preventAutolink', true) + }, + }) +} + /** * Paste rule built specifically for the `Link` extension, which ignores the auto-linked URL in * parentheses (e.g., `(https://doist.dev)`). This extension was inspired from the multiple @@ -76,6 +190,34 @@ const RichTextLink = Link.extend({ find: inputRegex, type: this.type, + // We need to use `pop()` to remove the last capture groups from the match to + // satisfy Tiptap's `markPasteRule` expectation of having the content as the last + // capture group in the match (this makes the attribute order important) + getAttributes(match) { + return { + title: match.pop()?.trim(), + href: match.pop()?.trim(), + } + }, + }), + // linkSuggestFilesInputRule({ + // find: suggestFileRegex, + // type: this.type, + + // // We need to use `pop()` to remove the last capture groups from the match to + // // satisfy Tiptap's `markPasteRule` expectation of having the content as the last + // // capture group in the match (this makes the attribute order important) + // getAttributes(match) { + // return { + // title: match.pop()?.trim(), + // href: match.pop()?.trim(), + // } + // }, + // }), + linkFileInputRule({ + find: fileRegex, + type: this.type, + // We need to use `pop()` to remove the last capture groups from the match to // satisfy Tiptap's `markPasteRule` expectation of having the content as the last // capture group in the match (this makes the attribute order important) diff --git a/src/components/Sidebars/SimilarFilesSidebar.tsx b/src/components/Sidebars/SimilarFilesSidebar.tsx index 59e5ae3af..01488a21c 100644 --- a/src/components/Sidebars/SimilarFilesSidebar.tsx +++ b/src/components/Sidebars/SimilarFilesSidebar.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react' import { DBQueryResult } from 'electron/main/vector-database/schema' import { toast } from 'react-toastify' -import removeMd from 'remove-markdown' +import { getSimilarFiles } from '@/lib/semanticService' import '../../styles/global.css' @@ -20,31 +20,13 @@ const SimilarFilesSidebarComponent: React.FC = () => { const { currentlyOpenFilePath } = useFileContext() const { openContent: openTabContent } = useContentContext() - const getChunkForInitialSearchFromFile = async (filePathForChunk: string | null) => { - // TODO: proper semantic chunking - current quick win is just to take top 500 characters - if (!filePathForChunk) { - return undefined - } - const fileContent: string = await window.fileSystem.readFile(filePathForChunk, 'utf-8') - if (!fileContent) { - return undefined - } - const sanitizedText = removeMd(fileContent.slice(0, 500)) - return sanitizedText - } - const performSearchOnChunk = async ( - sanitizedText: string, - fileToBeExcluded: string | null, - ): Promise => { + const fetchSimilarEntries = async (path: string) => { try { - const databaseFields = await window.database.getDatabaseFields() - const filterString = `${databaseFields.NOTE_PATH} != '${fileToBeExcluded}'` - setIsLoadingSimilarEntries(true) - const searchResults: DBQueryResult[] = await window.database.search(sanitizedText, 20, filterString) - setIsLoadingSimilarEntries(false) - return searchResults + const searchResults = await getSimilarFiles(path) + + setSimilarEntries(searchResults ?? []) } catch (error) { toast.error(errorToStringRendererProcess(error), { className: 'mt-5', @@ -52,53 +34,28 @@ const SimilarFilesSidebarComponent: React.FC = () => { closeOnClick: false, draggable: false, }) - return [] + } finally { + setIsLoadingSimilarEntries(false) } } useEffect(() => { - const handleNewFileOpen = async (path: string) => { - const sanitizedText = await getChunkForInitialSearchFromFile(path) - if (!sanitizedText) { - return - } - const searchResults = await performSearchOnChunk(sanitizedText, path) - - if (searchResults.length > 0) { - setSimilarEntries(searchResults) - } else { - setSimilarEntries([]) - } - } if (currentlyOpenFilePath) { - handleNewFileOpen(currentlyOpenFilePath) + fetchSimilarEntries(currentlyOpenFilePath) } }, [currentlyOpenFilePath]) const updateSimilarEntries = async () => { - const sanitizedText = await getChunkForInitialSearchFromFile(currentlyOpenFilePath) - - if (!sanitizedText) { - toast.error(`Error: Could not get chunk for search ${currentlyOpenFilePath}`) + if (!currentlyOpenFilePath) { + toast.error('No file currently open.') return } - const searchResults = await performSearchOnChunk(sanitizedText, currentlyOpenFilePath) - setSimilarEntries(searchResults) + await fetchSimilarEntries(currentlyOpenFilePath) } return ( - {/* { - setSimilarEntries([]) - const databaseFields = await window.database.getDatabaseFields() - const filterString = `${databaseFields.NOTE_PATH} != '${currentlyOpenFilePath}'` - const searchResults: DBQueryResult[] = await window.database.search(highlightData.text, 20, filterString) - setSimilarEntries(searchResults) - }} - />{' '} */} = ({ children }) => } }, [debouncedEditor, currentlyOpenFilePath, editor, currentlyChangingFilePath]) + useEffect(() => { + if (editor) { + console.log(`Setting path to: `, currentlyOpenFilePath) + useEditorState.getState().setCurrentFilePath(currentlyOpenFilePath) + } + }, [editor, currentlyOpenFilePath]) + const saveCurrentlyOpenedFile = async () => { await writeEditorContentToDisk(editor, currentlyOpenFilePath) } @@ -327,7 +334,7 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => selectedDirectory, setSelectedDirectory, } - + const contextValuesMemo: FileContextType = React.useMemo( () => ({ ...contextValues, diff --git a/src/lib/blocknote/core/BlockNoteExtensions.ts b/src/lib/blocknote/core/BlockNoteExtensions.ts index c5d320662..a8fac6510 100644 --- a/src/lib/blocknote/core/BlockNoteExtensions.ts +++ b/src/lib/blocknote/core/BlockNoteExtensions.ts @@ -27,6 +27,7 @@ import SearchAndReplace from '@/components/Editor/Search/SearchAndReplaceExtensi import TextAlignmentExtension from './extensions/TextAlignment/TextAlignmentExtension' import { BlockNoteEditor } from './BlockNoteEditor' import LocalMediaPastePlugin from './extensions/Pasting/local-media-paste-plugin' +import { RichTextLink } from '@/components/Editor/RichTextLink' /** * Get all the Tiptap extensions BlockNote is configured with by default @@ -79,7 +80,7 @@ const getBlockNoteExtensions = (opts: { Italic, Strike, Underline, - Link.configure(opts.linkExtensionOptions), + RichTextLink.configure(opts.linkExtensionOptions), // TextColorMark, // TextColorExtension, TextAlignmentExtension, diff --git a/src/lib/semanticService.tsx b/src/lib/semanticService.tsx new file mode 100644 index 000000000..0af6f5d10 --- /dev/null +++ b/src/lib/semanticService.tsx @@ -0,0 +1,32 @@ +import { DBQueryResult } from 'electron/main/vector-database/schema' +import removeMd from 'remove-markdown' + +export async function getSanitizedChunk(filePath: string | null): Promise { + if (!filePath) { + return undefined + } + const fileContent: string = await window.fileSystem.readFile(filePath, 'utf-8') + if (!fileContent) { + return undefined + } + const sanitizedText = removeMd(fileContent.slice(0, 500)) + return sanitizedText +} + +export async function getSimilarFiles(filePath: string | null, limit: number = 20): Promise { + if (!filePath) { + return [] + } + + const sanitizedText = await getSanitizedChunk(filePath) + if (!sanitizedText) { + return [] + } + + const databaseFields = await window.database.getDatabaseFields() + const filterString = `${databaseFields.NOTE_PATH} != '${filePath}'` + + const searchResults: DBQueryResult[] = await window.database.search(sanitizedText, limit, filterString) + + return searchResults +} diff --git a/src/lib/utils/editor-state.ts b/src/lib/utils/editor-state.ts new file mode 100644 index 000000000..d876802ce --- /dev/null +++ b/src/lib/utils/editor-state.ts @@ -0,0 +1,11 @@ +import { create } from 'zustand' + +type EditorStateStore = { + currentFilePath: string | null + setCurrentFilePath: (path: string | null) => void +} + +export const useEditorState = create((set) => ({ + currentFilePath: null, + setCurrentFilePath: (path) => set({ currentFilePath: path }), +})) diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 30645bf53..8632becb3 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1,3 +1,4 @@ export * from './block-utils' export { default as getNodeById } from './node-utils' export * from './entity-id-url' +export * from './editor-state' From 187dab5d701e81c1ace42fa55ca058fe97eed24a Mon Sep 17 00:00:00 2001 From: milaiwi Date: Fri, 2 May 2025 17:16:17 -0500 Subject: [PATCH 06/20] Made structural changes to editor -- currentFilePatha and semanticChaching --- src/components/Editor/RichTextLink.tsx | 157 +++++++++--------- src/contexts/FileContext.tsx | 1 + src/lib/blocknote/core/BlockNoteEditor.ts | 23 +++ src/lib/blocknote/core/BlockNoteExtensions.ts | 6 +- src/lib/semanticService.tsx | 5 + src/lib/utils/editor-state.ts | 60 +++++++ 6 files changed, 173 insertions(+), 79 deletions(-) diff --git a/src/components/Editor/RichTextLink.tsx b/src/components/Editor/RichTextLink.tsx index a9fe79f94..2de5580b6 100644 --- a/src/components/Editor/RichTextLink.tsx +++ b/src/components/Editor/RichTextLink.tsx @@ -3,7 +3,7 @@ import { Link } from '@tiptap/extension-link' import type { LinkOptions } from '@tiptap/extension-link' import { useEditorState } from '@/lib/utils' import { getSimilarFiles } from '@/lib/semanticService' - +import { BlockNoteEditor } from '@/lib/blocknote/core/BlockNoteEditor' /** * The input regex for Markdown links with title support, and multiple quotation marks (required @@ -125,7 +125,6 @@ export function linkFileInputRule(config: Parameters[0]) { if (!matchedText) return const { from, to } = range - // Resolve the file path (async) void (async () => { const absolutePath = await window.fileSystem.getAbsolutePath(matchedText) console.log('Absolute path:', absolutePath) @@ -174,82 +173,86 @@ function linkPasteRule(config: Parameters[0]) { * for converting the Markdown link syntax (i.e. `[Doist](https://doist.com)`) into links, and also * adds support for the `title` attribute. */ -const RichTextLink = Link.extend({ - inclusive: false, - addAttributes() { - return { - ...this.parent?.(), - title: { - default: null, - }, - } - }, - addInputRules() { - return [ - linkInputRule({ - find: inputRegex, - type: this.type, - - // We need to use `pop()` to remove the last capture groups from the match to - // satisfy Tiptap's `markPasteRule` expectation of having the content as the last - // capture group in the match (this makes the attribute order important) - getAttributes(match) { - return { - title: match.pop()?.trim(), - href: match.pop()?.trim(), - } - }, - }), - // linkSuggestFilesInputRule({ - // find: suggestFileRegex, - // type: this.type, - - // // We need to use `pop()` to remove the last capture groups from the match to - // // satisfy Tiptap's `markPasteRule` expectation of having the content as the last - // // capture group in the match (this makes the attribute order important) - // getAttributes(match) { - // return { - // title: match.pop()?.trim(), - // href: match.pop()?.trim(), - // } - // }, - // }), - linkFileInputRule({ - find: fileRegex, - type: this.type, - - // We need to use `pop()` to remove the last capture groups from the match to - // satisfy Tiptap's `markPasteRule` expectation of having the content as the last - // capture group in the match (this makes the attribute order important) - getAttributes(match) { - return { - title: match.pop()?.trim(), - href: match.pop()?.trim(), - } - }, - }), - ] - }, - addPasteRules() { - return [ - linkPasteRule({ - find: pasteRegex, - type: this.type, - - // We need to use `pop()` to remove the last capture groups from the match to - // satisfy Tiptap's `markInputRule` expectation of having the content as the last - // capture group in the match (this makes the attribute order important) - getAttributes(match) { - return { - title: match.pop()?.trim(), - href: match.pop()?.trim(), - } +const createLinkExtension = (bnEditor: BlockNoteEditor, linkExtensionsOpts: any) => { + const RichTextLink = Link.extend({ + inclusive: false, + addAttributes() { + return { + ...this.parent?.(), + title: { + default: null, }, - }), - ] - }, -}) + } + }, + addInputRules() { + return [ + linkInputRule({ + find: inputRegex, + type: this.type, + + // We need to use `pop()` to remove the last capture groups from the match to + // satisfy Tiptap's `markPasteRule` expectation of having the content as the last + // capture group in the match (this makes the attribute order important) + getAttributes(match) { + return { + title: match.pop()?.trim(), + href: match.pop()?.trim(), + } + }, + }), + // linkSuggestFilesInputRule({ + // find: suggestFileRegex, + // type: this.type, + + // // We need to use `pop()` to remove the last capture groups from the match to + // // satisfy Tiptap's `markPasteRule` expectation of having the content as the last + // // capture group in the match (this makes the attribute order important) + // getAttributes(match) { + // return { + // title: match.pop()?.trim(), + // href: match.pop()?.trim(), + // } + // }, + // }), + linkFileInputRule({ + find: fileRegex, + type: this.type, + + // We need to use `pop()` to remove the last capture groups from the match to + // satisfy Tiptap's `markPasteRule` expectation of having the content as the last + // capture group in the match (this makes the attribute order important) + getAttributes(match) { + return { + title: match.pop()?.trim(), + href: match.pop()?.trim(), + } + }, + }), + ] + }, + addPasteRules() { + return [ + linkPasteRule({ + find: pasteRegex, + type: this.type, + + // We need to use `pop()` to remove the last capture groups from the match to + // satisfy Tiptap's `markInputRule` expectation of having the content as the last + // capture group in the match (this makes the attribute order important) + getAttributes(match) { + return { + title: match.pop()?.trim(), + href: match.pop()?.trim(), + } + }, + }), + ] + }, + }) + + return RichTextLink +} -export { RichTextLink } +export { createLinkExtension } export type { LinkOptions as RichTextLinkOptions } diff --git a/src/contexts/FileContext.tsx b/src/contexts/FileContext.tsx index 5b5a63e3e..1c820d097 100644 --- a/src/contexts/FileContext.tsx +++ b/src/contexts/FileContext.tsx @@ -134,6 +134,7 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => setCurrentlyChangingFilePath(false) const parentDirectory = await window.path.dirname(filePath) setSelectedDirectory(parentDirectory) + editor.setCurrentFilePath(filePath) } const openOrCreateFile = async (filePath: string, optionalContentToWriteOnCreate?: string): Promise => { diff --git a/src/lib/blocknote/core/BlockNoteEditor.ts b/src/lib/blocknote/core/BlockNoteEditor.ts index 9475f4c98..a533872a9 100644 --- a/src/lib/blocknote/core/BlockNoteEditor.ts +++ b/src/lib/blocknote/core/BlockNoteEditor.ts @@ -92,6 +92,11 @@ export type BlockNoteEditorOptions = { */ blockSchema: BSchema + /** + * The absolute path to the current file the editor is displaying. + */ + currentFilePath: string + /** * When enabled, allows for collaboration between multiple users. */ @@ -142,6 +147,8 @@ export class BlockNoteEditor { public inlineEmbedOptions = [] + public currentFilePath: string | null = null + public readonly sideMenu: SideMenuProsemirrorPlugin public readonly formattingToolbar: FormattingToolbarProsemirrorPlugin @@ -736,4 +743,20 @@ export class BlockNoteEditor { public async markdownToBlocks(markdown: string): Promise[]> { return markdownToBlocks(markdown, this.schema, this._tiptapEditor.schema) } + + /** + * Sets the current file path that the editor is displaying. + * + * @param filePath The absolute path to the current file the editor is displaying. + */ + public setCurrentFilePath(filePath: string | null) { + this.currentFilePath = filePath + } + + /** + * Gets the current file path that the editor is displaying. + */ + public getCurrentFilePath() { + return this.currentFilePath + } } diff --git a/src/lib/blocknote/core/BlockNoteExtensions.ts b/src/lib/blocknote/core/BlockNoteExtensions.ts index a8fac6510..c9f193d3f 100644 --- a/src/lib/blocknote/core/BlockNoteExtensions.ts +++ b/src/lib/blocknote/core/BlockNoteExtensions.ts @@ -27,7 +27,8 @@ import SearchAndReplace from '@/components/Editor/Search/SearchAndReplaceExtensi import TextAlignmentExtension from './extensions/TextAlignment/TextAlignmentExtension' import { BlockNoteEditor } from './BlockNoteEditor' import LocalMediaPastePlugin from './extensions/Pasting/local-media-paste-plugin' -import { RichTextLink } from '@/components/Editor/RichTextLink' +// import { RichTextLink } from '@/components/Editor/RichTextLink' +import { createLinkExtension } from '@/components/Editor/RichTextLink' /** * Get all the Tiptap extensions BlockNote is configured with by default @@ -80,7 +81,8 @@ const getBlockNoteExtensions = (opts: { Italic, Strike, Underline, - RichTextLink.configure(opts.linkExtensionOptions), + // RichTextLink.configure(opts.linkExtensionOptions), + createLinkExtension(opts.editor as BlockNoteEditor, opts.linkExtensionOptions), // TextColorMark, // TextColorExtension, TextAlignmentExtension, diff --git a/src/lib/semanticService.tsx b/src/lib/semanticService.tsx index 0af6f5d10..ba03f6005 100644 --- a/src/lib/semanticService.tsx +++ b/src/lib/semanticService.tsx @@ -1,10 +1,12 @@ import { DBQueryResult } from 'electron/main/vector-database/schema' import removeMd from 'remove-markdown' +import { useSemanticCache } from '@/lib/utils' export async function getSanitizedChunk(filePath: string | null): Promise { if (!filePath) { return undefined } + const fileContent: string = await window.fileSystem.readFile(filePath, 'utf-8') if (!fileContent) { return undefined @@ -17,6 +19,8 @@ export async function getSimilarFiles(filePath: string | null, limit: number = 2 if (!filePath) { return [] } + const { getSemanticData, setSemanticData, shouldRefetch } = useSemanticCache.getState() + if (!shouldRefetch(filePath)) return getSemanticData(filePath).data // We've already fetched this recently const sanitizedText = await getSanitizedChunk(filePath) if (!sanitizedText) { @@ -28,5 +32,6 @@ export async function getSimilarFiles(filePath: string | null, limit: number = 2 const searchResults: DBQueryResult[] = await window.database.search(sanitizedText, limit, filterString) + setSemanticData(filePath, searchResults) return searchResults } diff --git a/src/lib/utils/editor-state.ts b/src/lib/utils/editor-state.ts index d876802ce..04154b99a 100644 --- a/src/lib/utils/editor-state.ts +++ b/src/lib/utils/editor-state.ts @@ -1,11 +1,71 @@ import { create } from 'zustand' +import { DBQueryResult } from 'electron/main/vector-database/schema' type EditorStateStore = { currentFilePath: string | null setCurrentFilePath: (path: string | null) => void } +type SemanticEntry = { + data: DBQueryResult[] + lastFetched: number + isStale: boolean +} + +type SemanticCacheState = { + semanticCache: Record + getSemanticData: (filePath: string) => SemanticEntry + setSemanticData: (filePath: string, data: DBQueryResult[]) => void + markStale: (filePath: string) => void + shouldRefetch: (filePath: string, thresholdMs?: number) => boolean +} + export const useEditorState = create((set) => ({ currentFilePath: null, setCurrentFilePath: (path) => set({ currentFilePath: path }), })) + +export const useSemanticCache = create((set, get) => ({ + semanticCache: {}, + + setSemanticData: (filePath: string, data: DBQueryResult[]) => { + set((state) => ({ + semanticCache: { + ...state.semanticCache, + [filePath]: { + data, + lastFetched: Date.now(), + isStale: false, + } + } + })) + }, + + getSemanticData: (filePath: string) => { + return get().semanticCache[filePath] + }, + + markStale: (filePath: string) => { + set((state) => { + const entry = state.semanticCache[filePath] + if (!entry) return {} + return { + semanticCache: { + ...state.semanticCache, + [filePath]: { + ...entry, + isStale: true, + } + } + } + }) + }, + + shouldRefetch: (filePath: string, thresholdMs = 30000) => { + const entry = get().semanticCache[filePath] + if (!entry) return true + if (entry.isStale) return true + const age = Date.now() - entry.lastFetched + return age > (thresholdMs) + }, +})) From ea0e789b67c0c77b39b70e85c0fa09724188af84 Mon Sep 17 00:00:00 2001 From: milaiwi Date: Fri, 2 May 2025 23:37:38 -0500 Subject: [PATCH 07/20] Hard coded double bracket linkage to a file with serialization and parsing. Need to extend to work for any file --- src/components/Editor/RichTextLink.tsx | 186 ++++++++++-------- src/components/Editor/editor.css | 21 +- src/contexts/FileContext.tsx | 6 +- .../formatConversions/formatConversions.ts | 1 + .../helpers/clickHandler.ts | 14 +- src/lib/utils/entity-id-url.ts | 2 +- 6 files changed, 127 insertions(+), 103 deletions(-) diff --git a/src/components/Editor/RichTextLink.tsx b/src/components/Editor/RichTextLink.tsx index 2de5580b6..a67e60256 100644 --- a/src/components/Editor/RichTextLink.tsx +++ b/src/components/Editor/RichTextLink.tsx @@ -1,10 +1,12 @@ -import { InputRule, markInputRule, markPasteRule, PasteRule } from '@tiptap/core' -import { Link } from '@tiptap/extension-link' +import { InputRule, markInputRule, markPasteRule, PasteRule, mergeAttributes } from '@tiptap/core' +import { isAllowedUri, Link } from '@tiptap/extension-link' +import { Plugin } from '@tiptap/pm/state' import type { LinkOptions } from '@tiptap/extension-link' -import { useEditorState } from '@/lib/utils' +import { useEditorState, isHypermediaScheme } from '@/lib/utils' import { getSimilarFiles } from '@/lib/semanticService' import { BlockNoteEditor } from '@/lib/blocknote/core/BlockNoteEditor' - +import clickHandler from '@/lib/tiptap-extension-link/helpers/clickHandler' +import autolink from '@/lib/tiptap-extension-link/helpers/autolink' /** * The input regex for Markdown links with title support, and multiple quotation marks (required * in case the `Typography` extension is being included). @@ -28,6 +30,14 @@ const fileRegex = /\[\[(.*?)\]\]/ */ const pasteRegex = /(?:^|\s)\[([^\]]*)?\]\((\S+)(?: ["“](.+)["”])?\)/gi +/** + * Checks if the given URL is a valid URI. This is used to prevent auto-linking of invalid URLs. + * @param url The URL to check + */ +function isValidURI(url: string) { + return isAllowedUri(url) || isHypermediaScheme(url) +} + /** * Input rule built specifically for the `Link` extension, which ignores the auto-linked URL in * parentheses (e.g., `(https://doist.dev)`). @@ -62,11 +72,9 @@ function linkSuggestFilesInputRule(config: Parameters[0]) find: config.find, handler(props) { const { tr } = props.state - console.log(`Inside handler!`) const currentPath = useEditorState.getState().currentFilePath void(async () => { const searchResults = await getSimilarFiles(currentPath, 5) - console.log(`Search results are: `, searchResults) })() @@ -76,73 +84,26 @@ function linkSuggestFilesInputRule(config: Parameters[0]) }) } -/** - * Obsidian-style linking to file rule - */ -// function linkFileInputRule(config: Parameters[0]) { -// const defaultMarkInputRule = markInputRule(config) - -// return new InputRule({ -// find: config.find, -// handler(props) { -// const { tr } = props.state - -// const matchedText = props.match[1]?.trim() -// console.log(`Filename is: ${matchedText}`) -// void(async () => { -// const absolutePath = await window.fileSystem.getAbsolutePath(matchedText) -// console.log(`Absolute path is: ${absolutePath}`) - -// props.chain() -// .focus() -// .setMark(config.type, { -// href: absolutePath, -// title: matchedText, -// }) -// .run() -// })() -// // const currentPath = useEditorState.getState().currentFilePath -// // void(async () => { -// // const searchResults = await getSimilarFiles(currentPath, 5) -// // console.log(`Search results are: `, searchResults) - -// // })() - - -// defaultMarkInputRule.handler(props) -// tr.setMeta('preventAutolink', true) -// }, -// }) -// } - -export function linkFileInputRule(config: Parameters[0]) { +export function linkFileInputRule(config: Parameters[0], bnEditor: BlockNoteEditor) { return new InputRule({ find: fileRegex, handler: (props) => { + const { tr } = props.state const { range, match } = props - - const matchedText = match[1]?.trim() // The text inside [[ ]] - if (!matchedText) return const { from, to } = range + const hardCodedFilePath = 'reor:///Users/mohamed/Documents/notes/Untitled.md' - void (async () => { - const absolutePath = await window.fileSystem.getAbsolutePath(matchedText) - console.log('Absolute path:', absolutePath) - - props.chain() - .focus() - .deleteRange({ from, to }) // Delete [[path]] - .insertContent(matchedText) // Insert just Untitled - .extendMarkRange(config.type.name) // Select the newly inserted text - .setMark(config.type, { // Set the link - href: absolutePath, - title: matchedText, - }) - .run() - })() + const mark = config.type.create({ + href: hardCodedFilePath, + title: 'Untitled', + }) + + tr.deleteRange(from, to) + tr.insertText('Untitled', from) + tr.addMark(from, from + 'Untitled'.length, mark) // Block autolink if needed - props.state.tr.setMeta('preventAutolink', true) + props.commands.focus() }, }) } @@ -173,9 +134,17 @@ function linkPasteRule(config: Parameters[0]) { * for converting the Markdown link syntax (i.e. `[Doist](https://doist.com)`) into links, and also * adds support for the `title` attribute. */ -const createLinkExtension = (bnEditor: BlockNoteEditor, linkExtensionsOpts: any) => { +const createLinkExtension = (bnEditor: BlockNoteEditor, linkExtensionsOpts: any) => { const RichTextLink = Link.extend({ inclusive: false, + + addOptions() { + return { + ...this.parent?.(), + onLinkClick: (href: string) => {}, + } + }, + addAttributes() { return { ...this.parent?.(), @@ -184,6 +153,36 @@ const createLinkExtension = (bnEditor: BlockNoteEditor, linkExtensionsOpts: any) }, } }, + + renderHTML({ HTMLAttributes }) { + return [ + 'span', + { + href: '#', + 'data-path': HTMLAttributes.href, + class: 'link' + }, + 0, + ] + }, + + parseHTML() { + // return [{ tag: 'a[href]:not([href *= "javascript:" i])' }] + return [ + { + tag: "a[href]", + getAttrs: dom => { + const href = (dom as HTMLElement).getAttribute("href") + + if (!href || !isValidURI(href)) { + return false + } + return null + } + } + ] + }, + addInputRules() { return [ linkInputRule({ @@ -200,6 +199,20 @@ const createLinkExtension = (bnEditor: BlockNoteEditor, linkExtensionsOpts: any) } }, }), + linkFileInputRule({ + find: fileRegex, + type: this.type, + + // We need to use `pop()` to remove the last capture groups from the match to + // satisfy Tiptap's `markPasteRule` expectation of having the content as the last + // capture group in the match (this makes the attribute order important) + getAttributes(match) { + return { + title: match.pop()?.trim(), + href: match.pop()?.trim(), + } + }, + }, bnEditor), // linkSuggestFilesInputRule({ // find: suggestFileRegex, // type: this.type, @@ -214,20 +227,6 @@ const createLinkExtension = (bnEditor: BlockNoteEditor, linkExtensionsOpts: any) // } // }, // }), - linkFileInputRule({ - find: fileRegex, - type: this.type, - - // We need to use `pop()` to remove the last capture groups from the match to - // satisfy Tiptap's `markPasteRule` expectation of having the content as the last - // capture group in the match (this makes the attribute order important) - getAttributes(match) { - return { - title: match.pop()?.trim(), - href: match.pop()?.trim(), - } - }, - }), ] }, addPasteRules() { @@ -248,9 +247,34 @@ const createLinkExtension = (bnEditor: BlockNoteEditor, linkExtensionsOpts: any) }), ] }, + + addProseMirrorPlugins() { + const plugins: Plugin[] = [] + + if (this.options.autolink) { + plugins.push( + autolink({ + type: this.type, + validate: (this.options as any).validate, + }), + ) + } + + if (this.options.openOnClick) { + // Opens the file path + plugins.push( + clickHandler({ + openFile: (this.options as any).onLinkClick, + type: this.type, + }) + ) + } + + return plugins + } }) - return RichTextLink + return RichTextLink.configure(linkExtensionsOpts) } export { createLinkExtension } diff --git a/src/components/Editor/editor.css b/src/components/Editor/editor.css index 0ea064e0d..0e97ebfea 100644 --- a/src/components/Editor/editor.css +++ b/src/components/Editor/editor.css @@ -29,34 +29,25 @@ } /* recommendation from Haz: https://twitter.com/diegohaz/status/1591829631811846147 */ -.link, -.hm-link { +.link { text-decoration-line: underline; text-underline-offset: 0.2em; text-decoration-skip-ink: none; } -.link:hover, -.hm-link:hover { +.link:hover { text-decoration-thickness: 3px; + cursor: pointer; } /* manually synced with tamagui colors: blue11 and blueDark11 */ -/* .ProseMirror .link { */ -/* color: var(--blue11); */ -/* } */ +.ProseMirror .link { + color: var(--blue11); +} /* .seed-app-dark .ProseMirror .link { color: hsl(210, 100%, 66.1%); } */ -/* manually sync these values with colors.ts brand5 and brandDark5 */ -.ProseMirror .hm-link { - color: var(--brand5); -} -/* .seed-app-dark .ProseMirror .hm-link { - color: hsl(184, 80%, 71%); -} */ - .ProseMirror .link-placeholder { width: 16px; height: 16px; diff --git a/src/contexts/FileContext.tsx b/src/contexts/FileContext.tsx index 1c820d097..ebe67eec4 100644 --- a/src/contexts/FileContext.tsx +++ b/src/contexts/FileContext.tsx @@ -149,6 +149,11 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => }, blockSchema: hmBlockSchema, slashMenuItems, + linkExtensionOptions: { + onLinkClick: (href: string) => { + loadFileIntoEditor(href) + }, + }, }) const [debouncedEditor] = useDebounce(editor?.topLevelBlocks, 3000) @@ -164,7 +169,6 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => useEffect(() => { if (editor) { - console.log(`Setting path to: `, currentlyOpenFilePath) useEditorState.getState().setCurrentFilePath(currentlyOpenFilePath) } }, [editor, currentlyOpenFilePath]) diff --git a/src/lib/blocknote/core/api/formatConversions/formatConversions.ts b/src/lib/blocknote/core/api/formatConversions/formatConversions.ts index ba8f4da30..6b03db73e 100644 --- a/src/lib/blocknote/core/api/formatConversions/formatConversions.ts +++ b/src/lib/blocknote/core/api/formatConversions/formatConversions.ts @@ -196,6 +196,7 @@ export async function blocksToMarkdown(blocks: Bloc // @ts-expect-error .use(remarkStringify) .process(convertBlocksToHtml(blocks)) + return tmpMarkdownString.value as string } diff --git a/src/lib/tiptap-extension-link/helpers/clickHandler.ts b/src/lib/tiptap-extension-link/helpers/clickHandler.ts index 410f91728..70fe420ed 100644 --- a/src/lib/tiptap-extension-link/helpers/clickHandler.ts +++ b/src/lib/tiptap-extension-link/helpers/clickHandler.ts @@ -5,6 +5,7 @@ import { Plugin, PluginKey } from '@tiptap/pm/state' type ClickHandlerOptions = { type: MarkType openUrl?: any + openFile?: any } function clickHandler(options: ClickHandlerOptions): Plugin { @@ -15,16 +16,19 @@ function clickHandler(options: ClickHandlerOptions): Plugin { if (event.button !== 0) { return false } - const attrs = getAttributes(view.state, options.type.name) const link = event.target as HTMLLinkElement const href = link?.href ?? attrs.href - - if (link && href) { - const newWindow = false // todo, check for meta key - options.openUrl(href, newWindow) + if (options.openFile && link && href) { // Linked to a local file, need to open it + options.openFile(href.replace('reor://', '')) return true + } else { + if (link && href) { + const newWindow = false // todo, check for meta key + options.openUrl(href, newWindow) + return true + } } return false diff --git a/src/lib/utils/entity-id-url.ts b/src/lib/utils/entity-id-url.ts index 643764053..f06898b72 100644 --- a/src/lib/utils/entity-id-url.ts +++ b/src/lib/utils/entity-id-url.ts @@ -1,5 +1,5 @@ export const HYPERMEDIA_SCHEME = 'hm' export function isHypermediaScheme(url?: string) { - return !!url?.startsWith(`${HYPERMEDIA_SCHEME}://`) + return !!url?.startsWith(`${HYPERMEDIA_SCHEME}://`) || !!url?.startsWith(`reor://`) } From 99e7611f6adf4388dcc99eb1979783b3c05bc0b9 Mon Sep 17 00:00:00 2001 From: milaiwi Date: Sat, 3 May 2025 00:23:53 -0500 Subject: [PATCH 08/20] Added dynamic linking, just need ot configure it and make it more cleanly --- src/App.tsx | 17 +++++- src/components/Editor/RichTextLink.tsx | 20 ++++--- src/lib/llm/types.ts | 7 +++ src/lib/utils/cache/fileSearchIndex.ts | 74 ++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 src/lib/utils/cache/fileSearchIndex.ts diff --git a/src/App.tsx b/src/App.tsx index a2e7ffa95..9de9119a2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,6 +9,9 @@ import IndexingProgress from './components/Common/IndexingProgress' import MainPageComponent from './components/MainPage' import InitialSetupSinglePage from './components/Settings/InitialSettingsSinglePage' import { ThemeProvider } from './contexts/ThemeContext' +import { useFileSearchIndex } from './lib/utils/cache/fileSearchIndex' +import { flattenFileInfoTree } from './lib/file' +import { FileInfo } from 'electron/main/filesystem/types' interface AppProps {} @@ -16,7 +19,6 @@ const App: React.FC = () => { const [userHasConfiguredSettingsForIndexing, setUserHasConfiguredSettingsForIndexing] = useState( undefined, ) - const [indexingProgress, setIndexingProgress] = useState(0) useEffect(() => { @@ -75,6 +77,19 @@ const App: React.FC = () => { fetchSettings() }, []) + // Cache all of the files to build a quick search index + useEffect(() => { + const hydrateIndex = async () => { + const files = await window.fileSystem.getFilesTreeForWindow() + const flat = flattenFileInfoTree(files).map((f: FileInfo) => ({ + ...f, + })) + useFileSearchIndex.getState().hydrate(flat) + console.log(`FileSearch: `, useFileSearchIndex.getState().index) + } + hydrateIndex() + }, []) + const handleAllInitialSettingsAreReady = () => { // setUserHasConfiguredSettingsForIndexing(true) window.database.indexFilesInDirectory() diff --git a/src/components/Editor/RichTextLink.tsx b/src/components/Editor/RichTextLink.tsx index a67e60256..9b5527886 100644 --- a/src/components/Editor/RichTextLink.tsx +++ b/src/components/Editor/RichTextLink.tsx @@ -7,6 +7,7 @@ import { getSimilarFiles } from '@/lib/semanticService' import { BlockNoteEditor } from '@/lib/blocknote/core/BlockNoteEditor' import clickHandler from '@/lib/tiptap-extension-link/helpers/clickHandler' import autolink from '@/lib/tiptap-extension-link/helpers/autolink' +import { useFileSearchIndex } from '@/lib/utils/cache/fileSearchIndex' /** * The input regex for Markdown links with title support, and multiple quotation marks (required * in case the `Typography` extension is being included). @@ -91,16 +92,24 @@ export function linkFileInputRule(config: Parameters[0], b const { tr } = props.state const { range, match } = props const { from, to } = range - const hardCodedFilePath = 'reor:///Users/mohamed/Documents/notes/Untitled.md' + + const markedText = match[1]?.trim() + // TODO: Standardize this to work if extension or not is given + const fileName = `${markedText}.md` + console.log('fileName', fileName) + const filePath = `reor://${useFileSearchIndex.getState().getPath(fileName)}` + console.log('filePath', filePath) + // const hardCodedFilePath = 'reor:///Users/mohamed/Documents/notes/Untitled.md' + const mark = config.type.create({ - href: hardCodedFilePath, - title: 'Untitled', + href: filePath, + title: markedText, }) tr.deleteRange(from, to) - tr.insertText('Untitled', from) - tr.addMark(from, from + 'Untitled'.length, mark) + tr.insertText(markedText, from) + tr.addMark(from, from + markedText.length, mark) // Block autolink if needed props.commands.focus() @@ -167,7 +176,6 @@ const createLinkExtension = (bnEditor: BlockNoteEditor, linkExtensionsOpts: any) }, parseHTML() { - // return [{ tag: 'a[href]:not([href *= "javascript:" i])' }] return [ { tag: "a[href]", diff --git a/src/lib/llm/types.ts b/src/lib/llm/types.ts index 4899fdd0c..6b09fbf4a 100644 --- a/src/lib/llm/types.ts +++ b/src/lib/llm/types.ts @@ -68,3 +68,10 @@ export interface AnonymizedAgentConfig { } export type LoadingState = 'idle' | 'generating' | 'waiting-for-first-token' + +export type FileMetadata = { + id: string // Unique identifier for the file + fileName: string // Name of the file + absolutePath: string // Absolute path to the file + modifiedAt: string // Last modified date of the file +} \ No newline at end of file diff --git a/src/lib/utils/cache/fileSearchIndex.ts b/src/lib/utils/cache/fileSearchIndex.ts new file mode 100644 index 000000000..716192f46 --- /dev/null +++ b/src/lib/utils/cache/fileSearchIndex.ts @@ -0,0 +1,74 @@ +import { create } from 'zustand' +// import { FileMetadata } from '@/lib/llm/types' +import { FileInfo } from 'electron/main/filesystem/types' + +type FileSearchIndexState = { + index: Map + + hydrate: (entries: FileInfo[]) => void + + // Asynchronous methods + add: (metadata: FileInfo) => Promise + rename: (oldName: string, newName: string) => Promise + move: (fileName: string, newPath: string) => Promise + remove: (fileName: string) => Promise + + getPath: (fileName: string) => string | undefined + getMetadata: (fileName: string) => FileInfo | undefined +} + +export const useFileSearchIndex = create((set, get) => ({ + index: new Map(), + + hydrate: (entries) => { + const map = new Map(entries.map((e) => [e.name, e])) + set({ index: map }) + }, + + add: async (metadata) => { + await window.fileSystem.createFile(metadata.path, '') + set((s) => { + const newMap = new Map(s.index) + newMap.set(metadata.name, metadata) + return { index: newMap } + }) + }, + + rename: async (oldName, newName) => { + const file = get().index.get(oldName) + if (!file) return + const newPath = file.path.replace(file.name, newName) + await window.fileSystem.renameFile({ oldFilePath: file.path, newFilePath: newPath }) + set((s) => { + const newMap = new Map(s.index) + newMap.delete(oldName) + newMap.set(newName, { ...file, name: newName, path: newPath }) + return { index: newMap } + }) + }, + + move: async (fileName, newPath) => { + const file = get().index.get(fileName) + if (!file) return + await window.fileSystem.renameFile({ oldFilePath: file.path, newFilePath: newPath }) + set((s) => { + const newMap = new Map(s.index) + newMap.set(fileName, { ...file, path: newPath }) + return { index: newMap } + }) + }, + + remove: async (fileName) => { + const file = get().index.get(fileName) + if (!file) return + await window.fileSystem.deleteFile(file.path) + set((s) => { + const newMap = new Map(s.index) + newMap.delete(fileName) + return { index: newMap } + }) + }, + + getPath: (name) => get().index.get(name)?.path, + getMetadata: (name) => get().index.get(name), +})) From 44d735a7df8a298672f5115b1078aad85413d9e8 Mon Sep 17 00:00:00 2001 From: milaiwi Date: Sat, 3 May 2025 14:13:34 -0500 Subject: [PATCH 09/20] Able to link between files. Changed editor structure. Fixed logic around file creation and search. --- electron/main/filesystem/filesystem.ts | 11 +++++++++-- electron/main/filesystem/ipcHandlers.ts | 26 ++++++++++++++----------- electron/preload/index.ts | 6 +++--- src/components/Editor/RichTextLink.tsx | 21 +++++++++++++------- src/contexts/FileContext.tsx | 22 ++++++++++++++------- src/lib/utils/cache/fileSearchIndex.ts | 1 - 6 files changed, 56 insertions(+), 31 deletions(-) diff --git a/electron/main/filesystem/filesystem.ts b/electron/main/filesystem/filesystem.ts index c37797b8d..8ac55da7c 100644 --- a/electron/main/filesystem/filesystem.ts +++ b/electron/main/filesystem/filesystem.ts @@ -112,7 +112,7 @@ export function GetFilesInfoListForListOfPaths(paths: string[]): FileInfo[] { return fileInfoListWithoutDuplicates } -export function createFileRecursive(filePath: string, content: string, charset?: BufferEncoding): void { +export function createFileRecursive(filePath: string, content: string, charset?: BufferEncoding): FileInfo | null { const dirname = path.dirname(filePath) if (!fs.existsSync(dirname)) { @@ -120,11 +120,18 @@ export function createFileRecursive(filePath: string, content: string, charset?: } if (fs.existsSync(filePath)) { - return + return null } const filePathWithExtension = addExtensionToFilenameIfNoExtensionPresent(filePath, markdownExtensions, '.md') fs.writeFileSync(filePathWithExtension, content, charset) + return { + name: path.basename(filePathWithExtension), + path: filePathWithExtension, + relativePath: path.relative(dirname, filePathWithExtension), + dateModified: new Date(), + dateCreated: new Date(), + } } export function updateFileListForRenderer(win: BrowserWindow, directory: string): void { diff --git a/electron/main/filesystem/ipcHandlers.ts b/electron/main/filesystem/ipcHandlers.ts index 57c2b750c..8f5b17c70 100644 --- a/electron/main/filesystem/ipcHandlers.ts +++ b/electron/main/filesystem/ipcHandlers.ts @@ -9,7 +9,7 @@ import { StoreSchema } from '../electron-store/storeConfig' import { handleFileRename, updateFileInTable } from '../vector-database/tableHelperFunctions' import { GetFilesInfoTree, createFileRecursive, isHidden, GetFilesInfoListForListOfPaths, findFileRecursive } from './filesystem' -import { FileInfoTree, WriteFileProps, RenameFileProps, FileInfoWithContent } from './types' +import { FileInfoTree, WriteFileProps, RenameFileProps, FileInfoWithContent, FileInfo } from './types' import ImageStorage from './storage/ImageStore' import VideoStorage from './storage/VideoStore' @@ -145,8 +145,11 @@ const registerFileHandlers = (store: Store, _windowsManager: Window await updateFileInTable(windowInfo.dbTableClient, filePath) }) - ipcMain.handle('create-file', async (event, filePath: string, content: string): Promise => { - createFileRecursive(filePath, content, 'utf-8') + ipcMain.handle('create-file', async (event, filePath: string, content: string): Promise => { + const fileObject = createFileRecursive(filePath, content, 'utf-8') + if (fileObject) + return fileObject + return undefined }) ipcMain.handle('create-directory', async (event, dirPath: string): Promise => { @@ -218,15 +221,16 @@ const registerFileHandlers = (store: Store, _windowsManager: Window return result.filePaths }) - ipcMain.handle('get-absolute-path', (event, fileName: string, dir: string | null = "") => { - dir = windowsManager.getVaultDirectoryForWinContents(event.sender) || dir - if (!dir) { - throw new Error('Vault directory not found.') + ipcMain.handle('get-file-info', (event, absolutePath: string, parentRelativePath: string): FileInfo => { + const fileInfo = fs.statSync(absolutePath) + return { + name: path.basename(absolutePath), + path: absolutePath, + relativePath: parentRelativePath, + dateModified: fileInfo.mtime, + dateCreated: fileInfo.birthtime, // Add the birthtime property here } - - const absolutePath = findFileRecursive(dir, fileName); - return absolutePath; - }); + }) } export default registerFileHandlers diff --git a/electron/preload/index.ts b/electron/preload/index.ts index cded841aa..ccd363a5e 100644 --- a/electron/preload/index.ts +++ b/electron/preload/index.ts @@ -9,7 +9,7 @@ import { TamaguiThemeTypes, } from 'electron/main/electron-store/storeConfig' import { SearchProps } from 'electron/main/electron-store/types' -import { FileInfoTree, FileInfoWithContent, RenameFileProps, WriteFileProps } from 'electron/main/filesystem/types' +import { FileInfo, FileInfoTree, FileInfoWithContent, RenameFileProps, WriteFileProps } from 'electron/main/filesystem/types' import { DBQueryResult } from 'electron/main/vector-database/schema' import { AgentConfig, ChatMetadata, Chat } from '@/lib/llm/types' @@ -102,13 +102,13 @@ const fileSystem = { getVideo: createIPCHandler<(fileName: string) => Promise>('get-video'), isDirectory: createIPCHandler<(filePath: string) => Promise>('is-directory'), renameFile: createIPCHandler<(renameFileProps: RenameFileProps) => Promise>('rename-file'), - createFile: createIPCHandler<(filePath: string, content: string) => Promise>('create-file'), + createFile: createIPCHandler<(filePath: string, content: string) => Promise>('create-file'), createDirectory: createIPCHandler<(dirPath: string) => Promise>('create-directory'), checkFileExists: createIPCHandler<(filePath: string) => Promise>('check-file-exists'), deleteFile: createIPCHandler<(filePath: string) => Promise>('delete-file'), getAllFilenamesInDirectory: createIPCHandler<(dirName: string) => Promise>('get-files-in-directory'), getFiles: createIPCHandler<(filePaths: string[]) => Promise>('get-files'), - getAbsolutePath: createIPCHandler<(fileName: string, dir?: string | null) => Promise>('get-absolute-path'), + getFileInfo: createIPCHandler<(absolutePath: string, parentRelativePath: string) => Promise>('get-file-info'), } const path = { diff --git a/src/components/Editor/RichTextLink.tsx b/src/components/Editor/RichTextLink.tsx index 9b5527886..b3bc0d7e9 100644 --- a/src/components/Editor/RichTextLink.tsx +++ b/src/components/Editor/RichTextLink.tsx @@ -39,6 +39,17 @@ function isValidURI(url: string) { return isAllowedUri(url) || isHypermediaScheme(url) } +/** + * Generates a random file name if the link is invalid. + */ +function generateRandom32DigitString(): string { + let result = '' + for (let i = 0; i < 32; i++) { + result += Math.floor(Math.random() * 10).toString() + } + return result +} + /** * Input rule built specifically for the `Link` extension, which ignores the auto-linked URL in * parentheses (e.g., `(https://doist.dev)`). @@ -93,14 +104,10 @@ export function linkFileInputRule(config: Parameters[0], b const { range, match } = props const { from, to } = range - const markedText = match[1]?.trim() - // TODO: Standardize this to work if extension or not is given + const markedText = match[1]?.trim() ? match[1]?.trim() : generateRandom32DigitString() const fileName = `${markedText}.md` - console.log('fileName', fileName) - const filePath = `reor://${useFileSearchIndex.getState().getPath(fileName)}` - console.log('filePath', filePath) - // const hardCodedFilePath = 'reor:///Users/mohamed/Documents/notes/Untitled.md' - + const cacheResult = useFileSearchIndex.getState().getPath(fileName) + const filePath = cacheResult ? `reor://${cacheResult}` : `reor://${fileName}` const mark = config.type.create({ href: filePath, diff --git a/src/contexts/FileContext.tsx b/src/contexts/FileContext.tsx index ebe67eec4..981ec8db4 100644 --- a/src/contexts/FileContext.tsx +++ b/src/contexts/FileContext.tsx @@ -21,6 +21,7 @@ import welcomeNote from '@/lib/welcome-note' import { useBlockNote, BlockNoteEditor } from '@/lib/blocknote' import { hmBlockSchema } from '@/components/Editor/schema' import { setGroupTypes, useEditorState } from '@/lib/utils' +import { useFileSearchIndex } from '@/lib/utils/cache/fileSearchIndex' import slashMenuItems from '../components/Editor/slash-menu-items' type FileContextType = { @@ -94,7 +95,7 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => fetchSpellCheckMode() }, [spellCheckEnabled]) - const createFileIfNotExists = async (filePath: string, optionalContent?: string): Promise => { + const createFileIfNotExists = async (filePath: string, optionalContent?: string): Promise => { const invalidChars = await getInvalidCharacterInFilePath(filePath) if (invalidChars) { const errorMessage = `Could not create note ${filePath}. Character ${invalidChars} cannot be included in note name.` @@ -108,12 +109,17 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => : await window.path.join(await window.electronStore.getVaultDirectoryForWindow(), filePathWithExtension) const fileExists = await window.fileSystem.checkFileExists(absolutePath) + let fileObject = null if (!fileExists) { - await window.fileSystem.createFile(absolutePath, optionalContent || ``) + fileObject = await window.fileSystem.createFile(absolutePath, optionalContent || ``) + if (!fileObject) + throw new Error(`Could not create file ${filePathWithExtension}`) setNeedToIndexEditorContent(true) + } else { + fileObject = await window.fileSystem.getFileInfo(absolutePath, filePathWithExtension) } - return absolutePath + return fileObject } const loadFileIntoEditor = async (filePath: string) => { @@ -124,7 +130,6 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => setNeedToIndexEditorContent(false) } const fileContent = (await window.fileSystem.readFile(filePath, 'utf-8')) ?? '' - // editor?.commands.setContent(fileContent) const blocks = await editor.markdownToBlocks(fileContent) // @ts-expect-error editor.replaceBlocks(editor.topLevelBlocks, blocks) @@ -138,8 +143,11 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => } const openOrCreateFile = async (filePath: string, optionalContentToWriteOnCreate?: string): Promise => { - const absolutePath = await createFileIfNotExists(filePath, optionalContentToWriteOnCreate) - await loadFileIntoEditor(absolutePath) + const fileObject = await createFileIfNotExists(filePath, optionalContentToWriteOnCreate) + await loadFileIntoEditor(fileObject.path) + if (!useFileSearchIndex.getState().getPath(fileObject.name)) { + useFileSearchIndex.getState().add(fileObject) + } } const editor = useBlockNote({ @@ -151,7 +159,7 @@ export const FileProvider: React.FC<{ children: ReactNode }> = ({ children }) => slashMenuItems, linkExtensionOptions: { onLinkClick: (href: string) => { - loadFileIntoEditor(href) + openOrCreateFile(href) }, }, }) diff --git a/src/lib/utils/cache/fileSearchIndex.ts b/src/lib/utils/cache/fileSearchIndex.ts index 716192f46..c6c401ff3 100644 --- a/src/lib/utils/cache/fileSearchIndex.ts +++ b/src/lib/utils/cache/fileSearchIndex.ts @@ -26,7 +26,6 @@ export const useFileSearchIndex = create((set, get) => ({ }, add: async (metadata) => { - await window.fileSystem.createFile(metadata.path, '') set((s) => { const newMap = new Map(s.index) newMap.set(metadata.name, metadata) From c1b9a317dbcdfce2ce5de4ca2a6c90900e4cb725 Mon Sep 17 00:00:00 2001 From: milaiwi Date: Sat, 3 May 2025 21:32:29 -0500 Subject: [PATCH 10/20] Working LinkToolbarPositioner but need to change content that displays --- src/components/Editor/EditorManager.tsx | 3 +- src/lib/blocknote/core/BlockNoteEditor.ts | 5 + .../extensions/EditorToolbar/EditorToolbar.ts | 190 +++++++++++++++ .../FormattingToolbarPlugin.ts | 216 ++---------------- .../LinkToolbar/LinkToolbarPlugin.ts | 56 +++++ .../LinkToolbar/LinkToolbarPositioner.tsx | 64 ++++++ src/lib/blocknote/react/index.ts | 1 + 7 files changed, 337 insertions(+), 198 deletions(-) create mode 100644 src/lib/blocknote/core/extensions/EditorToolbar/EditorToolbar.ts create mode 100644 src/lib/blocknote/core/extensions/LinkToolbar/LinkToolbarPlugin.ts create mode 100644 src/lib/blocknote/react/LinkToolbar/LinkToolbarPositioner.tsx diff --git a/src/components/Editor/EditorManager.tsx b/src/components/Editor/EditorManager.tsx index b398c11e8..a39e640d1 100644 --- a/src/components/Editor/EditorManager.tsx +++ b/src/components/Editor/EditorManager.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react' import { YStack } from 'tamagui' import InEditorBacklinkSuggestionsDisplay from './BacklinkSuggestionsDisplay' import { useFileContext } from '@/contexts/FileContext' -import { BlockNoteView, FormattingToolbarPositioner, SlashMenuPositioner, SideMenuPositioner } from '@/lib/blocknote' +import { BlockNoteView, FormattingToolbarPositioner, SlashMenuPositioner, SideMenuPositioner, LinkToolbarPositioner } from '@/lib/blocknote' import SearchBar from './Search/SearchBar' const EditorManager: React.FC = () => { @@ -53,6 +53,7 @@ const EditorManager: React.FC = () => { + )} diff --git a/src/lib/blocknote/core/BlockNoteEditor.ts b/src/lib/blocknote/core/BlockNoteEditor.ts index a533872a9..6f88c8b69 100644 --- a/src/lib/blocknote/core/BlockNoteEditor.ts +++ b/src/lib/blocknote/core/BlockNoteEditor.ts @@ -36,6 +36,7 @@ import UniqueID from './extensions/UniqueID/UniqueID' import { mergeCSSClasses } from './shared/utils' import { HMBlockSchema, hmBlockSchema } from '@/components/Editor/schema' import '@/components/Editor/editor.css' +import { LinkToolbarProsemirrorPlugin } from './extensions/LinkToolbar/LinkToolbarPlugin' export type BlockNoteEditorOptions = { // TODO: Figure out if enableBlockNoteExtensions/disableHistoryExtension are needed and document them. @@ -153,6 +154,8 @@ export class BlockNoteEditor { public readonly formattingToolbar: FormattingToolbarProsemirrorPlugin + public readonly similarFilesToolbar: LinkToolbarProsemirrorPlugin + public readonly slashMenu: SlashMenuProsemirrorPlugin public readonly hyperlinkToolbar: HyperlinkToolbarProsemirrorPlugin @@ -173,6 +176,7 @@ export class BlockNoteEditor { this.sideMenu = new SideMenuProsemirrorPlugin(this) this.formattingToolbar = new FormattingToolbarProsemirrorPlugin(this) + this.similarFilesToolbar = new LinkToolbarProsemirrorPlugin(this) this.slashMenu = new SlashMenuProsemirrorPlugin( this, newOptions.slashMenuItems || getDefaultSlashMenuItems(newOptions.blockSchema), @@ -195,6 +199,7 @@ export class BlockNoteEditor { return [ this.sideMenu.plugin, this.formattingToolbar.plugin, + this.similarFilesToolbar.plugin, this.slashMenu.plugin, this.hyperlinkToolbar.plugin, ] diff --git a/src/lib/blocknote/core/extensions/EditorToolbar/EditorToolbar.ts b/src/lib/blocknote/core/extensions/EditorToolbar/EditorToolbar.ts new file mode 100644 index 000000000..af52c863c --- /dev/null +++ b/src/lib/blocknote/core/extensions/EditorToolbar/EditorToolbar.ts @@ -0,0 +1,190 @@ +import { EditorState, Plugin, PluginKey } from "prosemirror-state"; +import { BaseUiElementCallbacks, BaseUiElementState, BlockNoteEditor, BlockSchema } from "../.."; +import { EditorView } from "prosemirror-view"; +import { isTextSelection, isNodeSelection, posToDOMRect } from "@tiptap/core"; +import EventEmitter from "../../shared/EventEmitter" + +export type EditorToolbarCallbacks = BaseUiElementCallbacks +export type EditorToolbarState = BaseUiElementState + +export class EditorToolbarView { + private editorToolbarState?: EditorToolbarState + + public updateEditorToolbar: () => void + + public preventHide = false + + public preventShow = false + + public prevWasEditable: boolean | null = null + + public shouldShow: (props: { view: EditorView; state: EditorState; from: number; to: number }) => boolean + + constructor( + private readonly editor: BlockNoteEditor, + private readonly pmView: EditorView, + updateEditorToolbar: (editorToolbarState: EditorToolbarState) => void, + shouldShow: (props: { view: EditorView; state: EditorState; from: number; to: number }) => boolean, + ) { + this.updateEditorToolbar = () => { + if (!this.editorToolbarState) { + throw new Error("Attempting to update uninitialized editor toolbar") + } + + updateEditorToolbar(this.editorToolbarState) + } + + this.shouldShow = shouldShow + + pmView.dom.addEventListener("mousedown", this.viewMousedownHandler) + pmView.dom.addEventListener("mouseup", this.viewMouseupHandler) + pmView.dom.addEventListener("dragstart", this.updateEditorToolbar) + + pmView.dom.addEventListener("focus", this.focusHandler) + pmView.dom.addEventListener("blur", this.blurHandler) + + document.addEventListener("scroll", this.scrollHandler) + } + + viewMousedownHandler = () => { + this.preventShow = true + } + + viewMouseupHandler = () => { + this.preventShow = false + setTimeout(() => this.update(this.pmView)) + } + + dragStartHandler = () => { + if (this.editorToolbarState?.show) { + this.editorToolbarState.show = false + this.updateEditorToolbar() + } + } + + focusHandler = () => { + setTimeout(() => this.update(this.pmView)) + } + + blurHandler = (event: FocusEvent) => { + if (this.preventHide) { + this.preventHide = false + return + } + + const editorWrapper = this.pmView.dom.parentElement! + + // Check if we are moving the focus to an element outside the editor + if ( + event && + event.relatedTarget && + (editorWrapper === (event.relatedTarget as Node) || editorWrapper?.contains(event.relatedTarget as Node)) + ) { + return + } + + if (this.editorToolbarState?.show) { + this.editorToolbarState.show = false + this.updateEditorToolbar() + } + } + + scrollHandler = () => { + if (this.editorToolbarState?.show) { + this.editorToolbarState.referencePos = this.getSelectionBoundingBox() + this.updateEditorToolbar + } + } + + update = (view: EditorView, oldState?: EditorState) => { + const { state, composing } = view + const { doc, selection } = state + const isSame = oldState && oldState.doc.eq(doc) && oldState.selection.eq(selection) + + if ((this.prevWasEditable === null || this.prevWasEditable === this.editor.isEditable) && (composing || isSame)) { + return + } + + this.prevWasEditable = this.editor.isEditable + + // support for CellSelections + const { ranges } = selection + const from = Math.min(...ranges.map((range) => range.$from.pos)) + const to = Math.max(...ranges.map((range) => range.$to.pos)) + + // Call child component of shouldShow + const shouldShow = this.shouldShow?.({ + view, + state, + from, + to, + }) + console.log("shouldShow", shouldShow) + + // Checks if menu should be shown/updated. + if (this.editor.isEditable && !this.preventShow && (shouldShow || this.preventHide)) { + this.editorToolbarState = { + show: true, + referencePos: this.getSelectionBoundingBox(), + } + + this.updateEditorToolbar() + + return + } + + // Checks if menu should be hidden. + if ( + this.editorToolbarState?.show && + !this.preventHide && + (!shouldShow || this.preventShow || !this.editor.isEditable) + ) { + this.editorToolbarState.show = false + this.updateEditorToolbar() + } + } + + getSelectionBoundingBox = () => { + const { state } = this.pmView + const { selection } = state + + const { ranges } = selection + const from = Math.min(...ranges.map((range) => range.$from.pos)) + const to = Math.max(...ranges.map((range) => range.$to.pos)) + + if (isNodeSelection(selection)) { + const node = this.pmView.nodeDOM(from) as HTMLElement + + if (node) { + return node.getBoundingClientRect() + } + } + + return posToDOMRect(this.pmView, from, to) + } +} + +// export const editorToolbarPluginKey = new PluginKey('EditorToolbarPlugin') + +// export class EditorToolbarProsemirrorPlugin extends EventEmitter { +// private view: EditorToolbarView | undefined + +// public readonly plugin: Plugin + +// constructor(editor: BlockNoteEditor) { +// super() +// this.plugin = new Plugin({ +// key: editorToolbarPluginKey, +// view: (editorView) => { +// this.view = new EditorToolbarView(editor, editorView, (state) => { +// this.emit("update", state) +// }) +// return this.view +// } +// }) +// } + +// public onUpdate(callback: (state: EditorToolbarState) => void) { +// this.on("update", callback) +// } +// } \ No newline at end of file diff --git a/src/lib/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts b/src/lib/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts index 5834be5ff..f0d8c2877 100644 --- a/src/lib/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +++ b/src/lib/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts @@ -1,209 +1,31 @@ -/* eslint-disable max-classes-per-file */ -import { isNodeSelection, isTextSelection, posToDOMRect } from '@tiptap/core' -import { EditorState, Plugin, PluginKey } from 'prosemirror-state' -import { EditorView } from 'prosemirror-view' -import { BaseUiElementCallbacks, BaseUiElementState, BlockNoteEditor, BlockSchema } from '../..' -import EventEmitter from '../../shared/EventEmitter' - -export type FormattingToolbarCallbacks = BaseUiElementCallbacks - -export type FormattingToolbarState = BaseUiElementState - -export class FormattingToolbarView { - private formattingToolbarState?: FormattingToolbarState - - public updateFormattingToolbar: () => void - - public preventHide = false - - public preventShow = false - - public prevWasEditable: boolean | null = null - - public static shouldShow: (props: { view: EditorView; state: EditorState; from: number; to: number }) => boolean = ({ - view, - state, - from, - to, - }) => { - const { doc, selection } = state - const { empty } = selection - - // Sometime check for `empty` is not enough. - // Doubleclick an empty paragraph returns a node size of 2. - // So we check also for an empty text size. - const isEmptyTextBlock = !doc.textBetween(from, to).length && isTextSelection(state.selection) - - return !( - !view.hasFocus() || - empty || - isEmptyTextBlock || - // Don't show menu if node selection (image, video, file, embed) - isNodeSelection(state.selection) - ) - } - +import { EditorToolbarState, EditorToolbarView } from "../EditorToolbar/EditorToolbar"; +import { Plugin, PluginKey } from "prosemirror-state"; +import { BlockNoteEditor, BlockSchema } from "../.."; +import { EditorView } from "prosemirror-view"; +import { isTextSelection, isNodeSelection } from "@tiptap/core"; +import EventEmitter from "../../shared/EventEmitter"; + +export class FormattingToolbarView extends EditorToolbarView { constructor( - private readonly editor: BlockNoteEditor, - private readonly pmView: EditorView, - updateFormattingToolbar: (formattingToolbarState: FormattingToolbarState) => void, + editor: BlockNoteEditor, + pmView: EditorView, + updateEditorToolbar: (state: EditorToolbarState) => void ) { - this.updateFormattingToolbar = () => { - if (!this.formattingToolbarState) { - throw new Error('Attempting to update uninitialized formatting toolbar') - } - - updateFormattingToolbar(this.formattingToolbarState) - } - - pmView.dom.addEventListener('mousedown', this.viewMousedownHandler) - pmView.dom.addEventListener('mouseup', this.viewMouseupHandler) - pmView.dom.addEventListener('dragstart', this.dragstartHandler) - - pmView.dom.addEventListener('focus', this.focusHandler) - pmView.dom.addEventListener('blur', this.blurHandler) - - document.addEventListener('scroll', this.scrollHandler) - } - - viewMousedownHandler = () => { - this.preventShow = true - } - - viewMouseupHandler = () => { - this.preventShow = false - setTimeout(() => this.update(this.pmView)) - } - - // For dragging the whole editor. - dragstartHandler = () => { - if (this.formattingToolbarState?.show) { - this.formattingToolbarState.show = false - this.updateFormattingToolbar() - } - } - - focusHandler = () => { - // we use `setTimeout` to make sure `selection` is already updated - setTimeout(() => this.update(this.pmView)) - } - - blurHandler = (event: FocusEvent) => { - if (this.preventHide) { - this.preventHide = false + super(editor, pmView, updateEditorToolbar, ({ view, state, from, to }) => { + const { doc, selection } = state + const { empty } = selection - return - } + const isEmptyTextBlock = !doc.textBetween(from, to).length && isTextSelection(state.selection) - const editorWrapper = this.pmView.dom.parentElement! - - // Checks if the focus is moving to an element outside the editor. If it is, - // the toolbar is hidden. - if ( - // An element is clicked. - event && - event.relatedTarget && - // Element is inside the editor. - (editorWrapper === (event.relatedTarget as Node) || editorWrapper?.contains(event.relatedTarget as Node)) - ) { - return - } - - if (this.formattingToolbarState?.show) { - this.formattingToolbarState.show = false - this.updateFormattingToolbar() - } - } - - scrollHandler = () => { - if (this.formattingToolbarState?.show) { - this.formattingToolbarState.referencePos = this.getSelectionBoundingBox() - this.updateFormattingToolbar() - } - } - - update(view: EditorView, oldState?: EditorState) { - const { state, composing } = view - const { doc, selection } = state - const isSame = oldState && oldState.doc.eq(doc) && oldState.selection.eq(selection) - - if ((this.prevWasEditable === null || this.prevWasEditable === this.editor.isEditable) && (composing || isSame)) { - return - } - - this.prevWasEditable = this.editor.isEditable - - // support for CellSelections - const { ranges } = selection - const from = Math.min(...ranges.map((range) => range.$from.pos)) - const to = Math.max(...ranges.map((range) => range.$to.pos)) - - const shouldShow = FormattingToolbarView.shouldShow?.({ - view, - state, - from, - to, + return false }) - - // Checks if menu should be shown/updated. - if (this.editor.isEditable && !this.preventShow && (shouldShow || this.preventHide)) { - this.formattingToolbarState = { - show: true, - referencePos: this.getSelectionBoundingBox(), - } - - this.updateFormattingToolbar() - - return - } - - // Checks if menu should be hidden. - if ( - this.formattingToolbarState?.show && - !this.preventHide && - (!shouldShow || this.preventShow || !this.editor.isEditable) - ) { - this.formattingToolbarState.show = false - this.updateFormattingToolbar() - } - } - - destroy() { - this.pmView.dom.removeEventListener('mousedown', this.viewMousedownHandler) - this.pmView.dom.removeEventListener('mouseup', this.viewMouseupHandler) - this.pmView.dom.removeEventListener('dragstart', this.dragstartHandler) - - this.pmView.dom.removeEventListener('focus', this.focusHandler) - this.pmView.dom.removeEventListener('blur', this.blurHandler) - - document.removeEventListener('scroll', this.scrollHandler) - } - - getSelectionBoundingBox() { - const { state } = this.pmView - const { selection } = state - - // support for CellSelections - const { ranges } = selection - const from = Math.min(...ranges.map((range) => range.$from.pos)) - const to = Math.max(...ranges.map((range) => range.$to.pos)) - - if (isNodeSelection(selection)) { - const node = this.pmView.nodeDOM(from) as HTMLElement - - if (node) { - return node.getBoundingClientRect() - } - } - - return posToDOMRect(this.pmView, from, to) } } export const formattingToolbarPluginKey = new PluginKey('FormattingToolbarPlugin') export class FormattingToolbarProsemirrorPlugin extends EventEmitter { - private view: FormattingToolbarView | undefined + private view: EditorToolbarView | undefined public readonly plugin: Plugin @@ -220,7 +42,7 @@ export class FormattingToolbarProsemirrorPlugin ext }) } - public onUpdate(callback: (state: FormattingToolbarState) => void) { + public onUpdate(callback: (state: EditorToolbarState) => void) { return this.on('update', callback) } -} +} \ No newline at end of file diff --git a/src/lib/blocknote/core/extensions/LinkToolbar/LinkToolbarPlugin.ts b/src/lib/blocknote/core/extensions/LinkToolbar/LinkToolbarPlugin.ts new file mode 100644 index 000000000..ac111773a --- /dev/null +++ b/src/lib/blocknote/core/extensions/LinkToolbar/LinkToolbarPlugin.ts @@ -0,0 +1,56 @@ +import { EditorToolbarState, EditorToolbarView } from "../EditorToolbar/EditorToolbar"; +import { Plugin, PluginKey } from "prosemirror-state"; +import { BlockNoteEditor, BlockSchema } from "../.."; +import { EditorView } from "prosemirror-view"; +import { isTextSelection,isNodeSelection } from "@tiptap/core"; +import EventEmitter from "../../shared/EventEmitter"; + +export class LinkToolbarView extends EditorToolbarView { + constructor( + editor: BlockNoteEditor, + pmView: EditorView, + updateEditorToolbar: (state: EditorToolbarState) => void + ) { + super(editor, pmView, updateEditorToolbar, ({ view, state, from, to }) => { + const { selection } = state + console.log(`Inside showState`) + if (!view.hasFocus() || !selection.empty || isNodeSelection(selection)) { + return false + } + + const $pos = selection.$from + const textBefore = $pos.parent.textBetween(0, $pos.parentOffset, undefined, '\ufffc') + console.log(`textBefore: ${textBefore}`) + // Regex to match [[ just before the cursor (and only that) + const match = /\[\[$/.exec(textBefore) + + console.log(`match: ${!!match}`) + return !!match + }) + } +} + +export const linkToolbarPluginKey = new PluginKey('LinkToolbarPlugin') + +export class LinkToolbarProsemirrorPlugin extends EventEmitter { + private view: EditorToolbarView | undefined + + public readonly plugin: Plugin + + constructor(editor: BlockNoteEditor) { + super() + this.plugin = new Plugin({ + key: linkToolbarPluginKey, + view: (editorView) => { + this.view = new LinkToolbarView(editor, editorView, (state) => { + this.emit('update', state) + }) + return this.view + }, + }) + } + + public onUpdate(callback: (state: EditorToolbarState) => void) { + return this.on('update', callback) + } +} \ No newline at end of file diff --git a/src/lib/blocknote/react/LinkToolbar/LinkToolbarPositioner.tsx b/src/lib/blocknote/react/LinkToolbar/LinkToolbarPositioner.tsx new file mode 100644 index 000000000..fd8251807 --- /dev/null +++ b/src/lib/blocknote/react/LinkToolbar/LinkToolbarPositioner.tsx @@ -0,0 +1,64 @@ +import Tippy from '@tippyjs/react' +import React, { FC, useEffect, useMemo, useRef, useState } from 'react' +import { sticky } from 'tippy.js' +import { BlockSchema, DefaultBlockSchema, BlockNoteEditor } from '@/lib/blocknote/core' +import { getSimilarFiles } from '@/lib/semanticService' + +import DefaultFormattingToolbar from '../FormattingToolbar/components/DefaultFormattingToolbar' + +export type LinkToolbarPositioner = { + editor: BlockNoteEditor +} + +// We want Tippy to call `getReferenceClientRect` whenever the reference +// DOMRect's position changes. This happens automatically on scroll, but we need +// the `sticky` plugin to make it happen in all cases. This is most evident +// when changing the text alignment using the formatting toolbar. +const tippyPlugins = [sticky] + +export const LinkToolbarPositioner = (props: { + editor: BlockNoteEditor + formattingToolbar?: FC> +}) => { + const [show, setShow] = useState(false) + + const referencePos = useRef() + + useEffect(() => { + return props.editor.similarFilesToolbar.onUpdate((state) => { + setShow(state.show) + + referencePos.current = state.referencePos + }) + }, [props.editor]) + + const getReferenceClientRect = useMemo( + () => { + if (!referencePos) { + return undefined + } + return () => referencePos.current! + }, + [referencePos.current], // eslint-disable-line + ) + + const formattingToolbarElement = useMemo(async () => { + const FormattingToolbar = props.formattingToolbar || DefaultFormattingToolbar + + return + }, [props.editor, props.formattingToolbar]) + + return ( + + ) +} diff --git a/src/lib/blocknote/react/index.ts b/src/lib/blocknote/react/index.ts index c00e07143..8c8188696 100644 --- a/src/lib/blocknote/react/index.ts +++ b/src/lib/blocknote/react/index.ts @@ -12,6 +12,7 @@ export * from './FormattingToolbar/components/FormattingToolbarPositioner' export * from './SlashMenu/ReactSlashMenuItem' export { default as DefaultSlashMenu } from './SlashMenu/components/DefaultSlashMenu' +export * from './LinkToolbar/LinkToolbarPositioner' export * from './SlashMenu/components/SlashMenuItem' export * from './SlashMenu/components/SlashMenuPositioner' export { default as getDefaultReactSlashMenuItems } from './SlashMenu/defaultReactSlashMenuItems' From 6dddc7dea13b934a2593bf4bd8d7b80a42b93049 Mon Sep 17 00:00:00 2001 From: milaiwi Date: Sun, 4 May 2025 20:41:20 -0500 Subject: [PATCH 11/20] Added caching for link similar files --- .tamagui/tamagui-components.config.cjs | 3091 +++++++++-------- .tamagui/tamagui.config.json | 105 + src/contexts/FileContext.tsx | 4 + .../LinkToolbar/LinkToolbarPlugin.ts | 10 +- .../LinkToolbar/LinkToolbarPositioner.tsx | 3 +- src/lib/semanticService.tsx | 24 +- 6 files changed, 1705 insertions(+), 1532 deletions(-) diff --git a/.tamagui/tamagui-components.config.cjs b/.tamagui/tamagui-components.config.cjs index 264fb4bba..d12b833ba 100644 --- a/.tamagui/tamagui-components.config.cjs +++ b/.tamagui/tamagui-components.config.cjs @@ -174,10 +174,10 @@ var require_cjs2 = __commonJS({ useConstant: /* @__PURE__ */ __name(() => useConstant2, "useConstant") }); module2.exports = __toCommonJS2(index_exports); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); function useConstant2(fn) { - if (typeof document > "u") return React75.useMemo(() => fn(), []); - const ref = React75.useRef(); + if (typeof document > "u") return React76.useMemo(() => fn(), []); + const ref = React76.useRef(); return ref.current || (ref.current = { v: fn() }), ref.current.v; @@ -228,9 +228,9 @@ var require_PresenceContext = __commonJS({ ResetPresence: /* @__PURE__ */ __name(() => ResetPresence2, "ResetPresence") }); module2.exports = __toCommonJS2(PresenceContext_exports); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); var import_jsx_runtime65 = require("react/jsx-runtime"); - var PresenceContext2 = React75.createContext(null); + var PresenceContext2 = React76.createContext(null); var ResetPresence2 = /* @__PURE__ */ __name((props) => /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(PresenceContext2.Provider, { value: null, children: props.children @@ -281,10 +281,10 @@ var require_usePresence = __commonJS({ usePresence: /* @__PURE__ */ __name(() => usePresence2, "usePresence") }); module2.exports = __toCommonJS2(usePresence_exports); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); var import_PresenceContext3 = require_PresenceContext(); function usePresence2() { - const context2 = React75.useContext(import_PresenceContext3.PresenceContext); + const context2 = React76.useContext(import_PresenceContext3.PresenceContext); if (!context2) return [true, null, context2]; const { id, @@ -292,11 +292,11 @@ var require_usePresence = __commonJS({ onExitComplete, register } = context2; - return React75.useEffect(() => register(id), []), !isPresent22 && onExitComplete ? [false, () => onExitComplete?.(id), context2] : [true, void 0, context2]; + return React76.useEffect(() => register(id), []), !isPresent22 && onExitComplete ? [false, () => onExitComplete?.(id), context2] : [true, void 0, context2]; } __name(usePresence2, "usePresence"); function useIsPresent2() { - return isPresent2(React75.useContext(import_PresenceContext3.PresenceContext)); + return isPresent2(React76.useContext(import_PresenceContext3.PresenceContext)); } __name(useIsPresent2, "useIsPresent"); function isPresent2(context2) { @@ -386,10 +386,10 @@ var require_PresenceChild = __commonJS({ module2.exports = __toCommonJS2(PresenceChild_exports); var import_use_constant3 = require_cjs2(); var import_use_presence2 = require_cjs3(); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); var import_react52 = require("react"); var import_jsx_runtime65 = require("react/jsx-runtime"); - var PresenceChild2 = React75.memo(({ + var PresenceChild2 = React76.memo(({ children, initial, isPresent: isPresent2, @@ -400,7 +400,7 @@ var require_PresenceChild = __commonJS({ presenceAffectsLayout, custom }) => { - const presenceChildren = (0, import_use_constant3.useConstant)(newChildrenMap2), id = (0, import_react52.useId)() || "", context2 = React75.useMemo( + const presenceChildren = (0, import_use_constant3.useConstant)(newChildrenMap2), id = (0, import_react52.useId)() || "", context2 = React76.useMemo( () => ({ id, initial, @@ -424,9 +424,9 @@ var require_PresenceChild = __commonJS({ // @ts-expect-error its ok presenceAffectsLayout ? void 0 : [isPresent2, exitVariant, enterVariant] ); - return React75.useMemo(() => { + return React76.useMemo(() => { presenceChildren.forEach((_, key) => presenceChildren.set(key, false)); - }, [isPresent2]), React75.useEffect(() => { + }, [isPresent2]), React76.useEffect(() => { !isPresent2 && !presenceChildren.size && onExitComplete?.(); }, [isPresent2]), /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_use_presence2.PresenceContext.Provider, { value: context2, @@ -1241,6 +1241,7 @@ var require_validStyleProps = __commonJS({ transition: true, textWrap: true, backdropFilter: true, + WebkitBackdropFilter: true, background: true, backgroundAttachment: true, backgroundBlendMode: true, @@ -1486,12 +1487,12 @@ var require_useGet = __commonJS({ }); module2.exports = __toCommonJS2(useGet_exports); var import_constants47 = require_cjs6(); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); function useGet5(currentValue, initialValue2, forwardToFunction) { - const curRef = React75.useRef(initialValue2 ?? currentValue); + const curRef = React76.useRef(initialValue2 ?? currentValue); return (0, import_constants47.useIsomorphicLayoutEffect)(() => { curRef.current = currentValue; - }), React75.useCallback(forwardToFunction ? (...args) => curRef.current?.apply(null, args) : () => curRef.current, []); + }), React76.useCallback(forwardToFunction ? (...args) => curRef.current?.apply(null, args) : () => curRef.current, []); } __name(useGet5, "useGet"); } @@ -1638,7 +1639,7 @@ var require_useControllableState = __commonJS({ }); module2.exports = __toCommonJS2(useControllableState_exports); var import_use_event4 = require_cjs8(); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); var import_start_transition6 = require_cjs9(); var emptyCallbackFn2 = /* @__PURE__ */ __name((_) => _(), "emptyCallbackFn"); function useControllableState2({ @@ -1649,12 +1650,12 @@ var require_useControllableState = __commonJS({ preventUpdate, transition }) { - const [state, setState] = React75.useState(prop ?? defaultProp), previous = React75.useRef(state), propWins = strategy === "prop-wins" && prop !== void 0, value = propWins ? prop : state, onChangeCb = (0, import_use_event4.useEvent)(onChange || idFn3), transitionFn = transition ? import_start_transition6.startTransition : emptyCallbackFn2; - React75.useEffect(() => { + const [state, setState] = React76.useState(prop ?? defaultProp), previous = React76.useRef(state), propWins = strategy === "prop-wins" && prop !== void 0, value = propWins ? prop : state, onChangeCb = (0, import_use_event4.useEvent)(onChange || idFn3), transitionFn = transition ? import_start_transition6.startTransition : emptyCallbackFn2; + React76.useEffect(() => { prop !== void 0 && (previous.current = prop, transitionFn(() => { setState(prop); })); - }, [prop]), React75.useEffect(() => { + }, [prop]), React76.useEffect(() => { propWins || state !== previous.current && (previous.current = state, onChangeCb(state)); }, [onChangeCb, state, propWins]); const setter = (0, import_use_event4.useEvent)((next) => { @@ -1746,14 +1747,14 @@ var require_Collapsible = __commonJS({ var import_helpers29 = require_cjs7(); var import_use_controllable_state16 = require_cjs10(); var import_web21 = require("@tamagui/core"); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); var import_jsx_runtime65 = require("react/jsx-runtime"); var COLLAPSIBLE_NAME = "Collapsible"; var { Provider: CollapsibleProvider, useStyledContext: useCollapsibleContext } = (0, import_web21.createStyledContext)(); - var _Collapsible = React75.forwardRef((props, forwardedRef) => { + var _Collapsible = React76.forwardRef((props, forwardedRef) => { const { __scopeCollapsible, open: openProp, @@ -1769,9 +1770,9 @@ var require_Collapsible = __commonJS({ return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(CollapsibleProvider, { scope: __scopeCollapsible, disabled, - contentId: React75.useId(), + contentId: React76.useId(), open, - onOpenToggle: React75.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]), + onOpenToggle: React76.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]), children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_web21.Stack, { "data-state": getState6(open), "data-disabled": disabled ? "" : void 0, @@ -1909,7 +1910,7 @@ var require_compose_refs = __commonJS({ useComposedRefs: /* @__PURE__ */ __name(() => useComposedRefs4, "useComposedRefs") }); module2.exports = __toCommonJS2(compose_refs_exports); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); function setRef2(ref, value) { typeof ref == "function" ? ref(value) : ref && (ref.current = value); } @@ -1919,7 +1920,7 @@ var require_compose_refs = __commonJS({ } __name(composeRefs2, "composeRefs"); function useComposedRefs4(...refs) { - return React75.useCallback(composeRefs2(...refs), refs); + return React76.useCallback(composeRefs2(...refs), refs); } __name(useComposedRefs4, "useComposedRefs"); } @@ -1992,14 +1993,14 @@ var require_Collection = __commonJS({ module2.exports = __toCommonJS2(Collection_exports); var import_compose_refs25 = require_cjs12(); var import_constants47 = require_cjs6(); - var import_core57 = require("@tamagui/core"); + var import_core59 = require("@tamagui/core"); var import_react52 = __toESM2(require("react")); var import_jsx_runtime65 = require("react/jsx-runtime"); function createCollection2(name) { const { Provider: CollectionProviderImpl, useStyledContext: useCollectionContext - } = (0, import_core57.createStyledContext)({ + } = (0, import_core59.createStyledContext)({ collectionRef: { current: null }, @@ -2022,7 +2023,7 @@ var require_Collection = __commonJS({ __scopeCollection, children } = props, context2 = useCollectionContext(__scopeCollection), composedRefs = (0, import_compose_refs25.useComposedRefs)(forwardedRef, context2.collectionRef); - return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_core57.Slot, { + return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_core59.Slot, { ref: composedRefs, children }); @@ -2037,7 +2038,7 @@ var require_Collection = __commonJS({ return import_react52.default.useEffect(() => (context2.itemMap.set(ref, { ref, ...itemData - }), () => void context2.itemMap.delete(ref))), /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_core57.Slot, { + }), () => void context2.itemMap.delete(ref))), /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_core59.Slot, { [ITEM_DATA_ATTR]: "", ref: composedRefs, children @@ -2118,12 +2119,12 @@ var require_getElevation = __commonJS({ getSizedElevation: /* @__PURE__ */ __name(() => getSizedElevation2, "getSizedElevation") }); module2.exports = __toCommonJS2(getElevation_exports); - var import_core57 = require("@tamagui/core"); + var import_core59 = require("@tamagui/core"); var getElevation2 = /* @__PURE__ */ __name((size4, extras) => { if (!size4) return; const { tokens - } = extras, token = tokens.size[size4], sizeNum = (0, import_core57.isVariable)(token) ? +token.val : size4; + } = extras, token = tokens.size[size4], sizeNum = (0, import_core59.isVariable)(token) ? +token.val : size4; return getSizedElevation2(sizeNum, extras); }, "getElevation"); var getSizedElevation2 = /* @__PURE__ */ __name((val, { @@ -2132,7 +2133,7 @@ var require_getElevation = __commonJS({ }) => { let num = 0; if (val === true) { - const val2 = (0, import_core57.getVariableValue)(tokens.size.true); + const val2 = (0, import_core59.getVariableValue)(tokens.size.true); typeof val2 == "number" ? num = val2 : num = 10; } else num = +val; if (num === 0) return; @@ -2144,7 +2145,7 @@ var require_getElevation = __commonJS({ height, width: 0 }, - ...import_core57.isAndroid ? { + ...import_core59.isAndroid ? { elevationAndroid: 2 * height } : {} }; @@ -2183,7 +2184,7 @@ var require_Stacks = __commonJS({ fullscreenStyle: /* @__PURE__ */ __name(() => fullscreenStyle2, "fullscreenStyle") }); module2.exports = __toCommonJS2(Stacks_exports); - var import_core57 = require("@tamagui/core"); + var import_core59 = require("@tamagui/core"); var import_getElevation3 = require_getElevation(); var fullscreenStyle2 = { position: "absolute", @@ -2208,17 +2209,17 @@ var require_Stacks = __commonJS({ }, inset: getInset2 }; - var YStack2 = (0, import_core57.styled)(import_core57.View, { + var YStack2 = (0, import_core59.styled)(import_core59.View, { flexDirection: "column", variants: variants2 }); YStack2.displayName = "YStack"; - var XStack2 = (0, import_core57.styled)(import_core57.View, { + var XStack2 = (0, import_core59.styled)(import_core59.View, { flexDirection: "row", variants: variants2 }); XStack2.displayName = "XStack"; - var ZStack2 = (0, import_core57.styled)(YStack2, { + var ZStack2 = (0, import_core59.styled)(YStack2, { position: "relative" }, { neverFlatten: true, @@ -2506,11 +2507,11 @@ var require_SizableStack = __commonJS({ SizableStack: /* @__PURE__ */ __name(() => SizableStack2, "SizableStack") }); module2.exports = __toCommonJS2(SizableStack_exports); - var import_core57 = require("@tamagui/core"); + var import_core59 = require("@tamagui/core"); var import_get_button_sized6 = require_cjs15(); var import_Stacks3 = require_Stacks(); var import_variants3 = require_variants(); - var SizableStack2 = (0, import_core57.styled)(import_Stacks3.XStack, { + var SizableStack2 = (0, import_core59.styled)(import_Stacks3.XStack, { name: "SizableStack", variants: { unstyled: { @@ -2565,7 +2566,7 @@ var require_ThemeableStack = __commonJS({ themeableVariants: /* @__PURE__ */ __name(() => themeableVariants2, "themeableVariants") }); module2.exports = __toCommonJS2(ThemeableStack_exports); - var import_core57 = require("@tamagui/core"); + var import_core59 = require("@tamagui/core"); var import_Stacks3 = require_Stacks(); var import_variants3 = require_variants(); var chromelessStyle2 = { @@ -2605,7 +2606,7 @@ var require_ThemeableStack = __commonJS({ } } }; - var ThemeableStack2 = (0, import_core57.styled)(import_Stacks3.YStack, { + var ThemeableStack2 = (0, import_core59.styled)(import_Stacks3.YStack, { variants: themeableVariants2 }); } @@ -2713,7 +2714,7 @@ var require_cjs17 = __commonJS({ }); module2.exports = __toCommonJS2(index_exports); var import_constants47 = require_cjs6(); - var import_core57 = require("@tamagui/core"); + var import_core59 = require("@tamagui/core"); var getFontSized2 = /* @__PURE__ */ __name((sizeTokenIn = "$true", { font, fontFamily, @@ -2732,7 +2733,7 @@ var require_cjs17 = __commonJS({ var cache3 = /* @__PURE__ */ new WeakMap(); function getDefaultSizeToken2(font) { if (typeof font == "object" && cache3.has(font)) return cache3.get(font); - const sizeTokens = "$true" in font.size ? font.size : (0, import_core57.getTokens)().size, sizeDefault = sizeTokens.$true, sizeDefaultSpecific = sizeDefault ? Object.keys(sizeTokens).find((x) => x !== "$true" && sizeTokens[x].val === sizeDefault.val) : null; + const sizeTokens = "$true" in font.size ? font.size : (0, import_core59.getTokens)().size, sizeDefault = sizeTokens.$true, sizeDefaultSpecific = sizeDefault ? Object.keys(sizeTokens).find((x) => x !== "$true" && sizeTokens[x].val === sizeDefault.val) : null; return !sizeDefault || !sizeDefaultSpecific ? (process.env.NODE_ENV === "development" && console.warn(`No default size is set in your tokens for the "true" key, fonts will be inconsistent. Fix this by having consistent tokens across fonts and sizes and setting a true key for your size tokens, or @@ -3137,9 +3138,9 @@ var require_useDirection = __commonJS({ useDirection: /* @__PURE__ */ __name(() => useDirection2, "useDirection") }); module2.exports = __toCommonJS2(useDirection_exports); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); var import_jsx_runtime65 = require("react/jsx-runtime"); - var DirectionContext2 = React75.createContext(void 0); + var DirectionContext2 = React76.createContext(void 0); var DirectionProvider = /* @__PURE__ */ __name((props) => { const { dir, @@ -3151,7 +3152,7 @@ var require_useDirection = __commonJS({ }); }, "DirectionProvider"); function useDirection2(localDir) { - const globalDir = React75.useContext(DirectionContext2); + const globalDir = React76.useContext(DirectionContext2); return localDir || globalDir || "ltr"; } __name(useDirection2, "useDirection"); @@ -3226,13 +3227,13 @@ var require_Accordion = __commonJS({ var import_use_controllable_state16 = require_cjs10(); var import_use_direction5 = require_cjs19(); var import_web21 = require("@tamagui/core"); - var React75 = __toESM2(require("react")); + var React76 = __toESM2(require("react")); var import_jsx_runtime65 = require("react/jsx-runtime"); var ACCORDION_NAME = "Accordion"; var ACCORDION_KEYS = ["Home", "End", "ArrowDown", "ArrowUp", "ArrowLeft", "ArrowRight"]; var [Collection2, useCollection2] = (0, import_collection2.createCollection)(ACCORDION_NAME); var ACCORDION_CONTEXT = "Accordion"; - var AccordionComponent = React75.forwardRef((props, forwardedRef) => { + var AccordionComponent = React76.forwardRef((props, forwardedRef) => { const { type, ...accordionProps } = props, singleProps = accordionProps, multipleProps = accordionProps; return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(Collection2.Provider, { __scopeCollection: props.__scopeAccordion || ACCORDION_CONTEXT, children: type === "multiple" ? /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(AccordionImplMultiple, { ...multipleProps, ref: forwardedRef }) : /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(AccordionImplSingle, { ...singleProps, ref: forwardedRef }) }); }); @@ -3254,7 +3255,7 @@ var require_Accordion = __commonJS({ Provider: AccordionCollapsibleProvider, useStyledContext: useAccordionCollapsibleContext } = (0, import_web21.createStyledContext)(); - var AccordionImplSingle = React75.forwardRef((props, forwardedRef) => { + var AccordionImplSingle = React76.forwardRef((props, forwardedRef) => { const { value: valueProp, defaultValue: defaultValue2, @@ -3274,7 +3275,7 @@ var require_Accordion = __commonJS({ scope: props.__scopeAccordion, value: value ? [value] : [], onItemOpen: setValue, - onItemClose: React75.useCallback( + onItemClose: React76.useCallback( () => collapsible && setValue(""), [setValue, collapsible] ), @@ -3289,7 +3290,7 @@ var require_Accordion = __commonJS({ } ); }); - var AccordionImplMultiple = React75.forwardRef((props, forwardedRef) => { + var AccordionImplMultiple = React76.forwardRef((props, forwardedRef) => { const { value: valueProp, defaultValue: defaultValue2, @@ -3300,10 +3301,10 @@ var require_Accordion = __commonJS({ prop: valueProp, defaultProp: defaultValue2 || [], onChange: onValueChange - }), handleItemOpen = React75.useCallback( + }), handleItemOpen = React76.useCallback( (itemValue) => setValue((prevValue = []) => [...prevValue, itemValue]), [setValue] - ), handleItemClose = React75.useCallback( + ), handleItemClose = React76.useCallback( (itemValue) => setValue((prevValue = []) => prevValue.filter((value2) => value2 !== itemValue)), [setValue] ); @@ -3319,7 +3320,7 @@ var require_Accordion = __commonJS({ ); }); var { Provider: AccordionImplProvider, useStyledContext: useAccordionContext } = (0, import_web21.createStyledContext)(); - var AccordionImpl = React75.forwardRef( + var AccordionImpl = React76.forwardRef( (props, forwardedRef) => { const { __scopeAccordion, @@ -3327,7 +3328,7 @@ var require_Accordion = __commonJS({ dir, orientation = "vertical", ...accordionProps - } = props, accordionRef = React75.useRef(null), composedRef = (0, import_compose_refs25.useComposedRefs)(accordionRef, forwardedRef), getItems = useCollection2(__scopeAccordion || ACCORDION_CONTEXT), isDirectionLTR = (0, import_use_direction5.useDirection)(dir) === "ltr", handleKeyDown = (0, import_helpers29.composeEventHandlers)( + } = props, accordionRef = React76.useRef(null), composedRef = (0, import_compose_refs25.useComposedRefs)(accordionRef, forwardedRef), getItems = useCollection2(__scopeAccordion || ACCORDION_CONTEXT), isDirectionLTR = (0, import_use_direction5.useDirection)(dir) === "ltr", handleKeyDown = (0, import_helpers29.composeEventHandlers)( props.onKeyDown, (event) => { if (!ACCORDION_KEYS.includes(event.key)) return; @@ -3390,9 +3391,9 @@ var require_Accordion = __commonJS({ ); var ITEM_NAME3 = "AccordionItem"; var { Provider: AccordionItemProvider, useStyledContext: useAccordionItemContext } = (0, import_web21.createStyledContext)(); - var AccordionItem = React75.forwardRef( + var AccordionItem = React76.forwardRef( (props, forwardedRef) => { - const { __scopeAccordion, value, ...accordionItemProps } = props, accordionContext = useAccordionContext(__scopeAccordion), valueContext = useAccordionValueContext(__scopeAccordion), triggerId = React75.useId(), open = value && valueContext.value.includes(value) || false, disabled = accordionContext.disabled || props.disabled; + const { __scopeAccordion, value, ...accordionItemProps } = props, accordionContext = useAccordionContext(__scopeAccordion), valueContext = useAccordionValueContext(__scopeAccordion), triggerId = React76.useId(), open = value && valueContext.value.includes(value) || false, disabled = accordionContext.disabled || props.disabled; return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)( AccordionItemProvider, { @@ -3421,7 +3422,7 @@ var require_Accordion = __commonJS({ ); AccordionItem.displayName = ITEM_NAME3; var HEADER_NAME = "AccordionHeader"; - var AccordionHeader = React75.forwardRef( + var AccordionHeader = React76.forwardRef( (props, forwardedRef) => { const { __scopeAccordion, ...headerProps } = props, accordionContext = useAccordionContext(__scopeAccordion), itemContext = useAccordionItemContext(__scopeAccordion); return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)( @@ -3504,7 +3505,7 @@ var require_Accordion = __commonJS({ ); }); var HeightAnimator = import_web21.View.styleable((props, ref) => { - const itemContext = useAccordionItemContext(), { children, ...rest } = props, [height, setHeight] = React75.useState(0), onLayout = (0, import_web21.useEvent)(({ nativeEvent }) => { + const itemContext = useAccordionItemContext(), { children, ...rest } = props, [height, setHeight] = React76.useState(0), onLayout = (0, import_web21.useEvent)(({ nativeEvent }) => { nativeEvent.layout.height && setHeight(nativeEvent.layout.height); }); return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_web21.View, { ref, height: itemContext.open ? height : 0, ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)( @@ -4402,10 +4403,10 @@ var require_useMergeRef = __commonJS({ Object.defineProperty(exports2, "__esModule", { value: true }); exports2.useMergeRefs = void 0; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var assignRef_1 = require_assignRef(); var useRef_1 = require_useRef(); - var useIsomorphicLayoutEffect3 = typeof window !== "undefined" ? React75.useLayoutEffect : React75.useEffect; + var useIsomorphicLayoutEffect3 = typeof window !== "undefined" ? React76.useLayoutEffect : React76.useEffect; var currentValues = /* @__PURE__ */ new WeakMap(); function useMergeRefs(refs, defaultValue2) { var callbackRef = (0, useRef_1.useCallbackRef)(defaultValue2 || null, function(newValue) { @@ -4647,7 +4648,7 @@ var require_hoc = __commonJS({ Object.defineProperty(exports2, "__esModule", { value: true }); exports2.sidecar = void 0; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var hook_1 = require_hook(); function sidecar(importer, errorComponent) { var ErrorCase = /* @__PURE__ */ __name(function() { @@ -4658,7 +4659,7 @@ var require_hoc = __commonJS({ if (error2 && errorComponent) { return ErrorCase; } - return Car ? React75.createElement(Car, tslib_1.__assign({}, props)) : null; + return Car ? React76.createElement(Car, tslib_1.__assign({}, props)) : null; }, "Sidecar"); } __name(sidecar, "sidecar"); @@ -4797,7 +4798,7 @@ var require_renderProp = __commonJS({ Object.defineProperty(exports2, "__esModule", { value: true }); exports2.renderCar = void 0; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var react_1 = require("react"); function renderCar(WrappedComponent, defaults) { function State(_a) { @@ -4812,10 +4813,10 @@ var require_renderProp = __commonJS({ }); return null; }, "SideTarget"), []); - return React75.createElement(WrappedComponent, tslib_1.__assign({}, props, { children: renderTarget })); + return React76.createElement(WrappedComponent, tslib_1.__assign({}, props, { children: renderTarget })); } __name(State, "State"); - var Children7 = React75.memo(function(_a) { + var Children7 = React76.memo(function(_a) { var stateRef = _a.stateRef, defaultState = _a.defaultState, children = _a.children; var _b = (0, react_1.useState)(defaultState.current), state = _b[0], setState = _b[1]; (0, react_1.useEffect)(function() { @@ -4826,15 +4827,15 @@ var require_renderProp = __commonJS({ return true; }); return /* @__PURE__ */ __name(function Combiner(props) { - var defaultState = React75.useRef(defaults(props)); - var ref = React75.useRef(function(state) { + var defaultState = React76.useRef(defaults(props)); + var ref = React76.useRef(function(state) { return defaultState.current = state; }); - return React75.createElement( - React75.Fragment, + return React76.createElement( + React76.Fragment, null, - React75.createElement(State, { stateRef: ref, props }), - React75.createElement(Children7, { stateRef: ref, defaultState, children: props.children }) + React76.createElement(State, { stateRef: ref, props }), + React76.createElement(Children7, { stateRef: ref, defaultState, children: props.children }) ); }, "Combiner"); } @@ -4850,7 +4851,7 @@ var require_exports = __commonJS({ Object.defineProperty(exports2, "__esModule", { value: true }); exports2.exportSidecar = void 0; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var SideCar = /* @__PURE__ */ __name(function(_a) { var sideCar = _a.sideCar, rest = tslib_1.__rest(_a, ["sideCar"]); if (!sideCar) { @@ -4860,7 +4861,7 @@ var require_exports = __commonJS({ if (!Target) { throw new Error("Sidecar medium not found"); } - return React75.createElement(Target, tslib_1.__assign({}, rest)); + return React76.createElement(Target, tslib_1.__assign({}, rest)); }, "SideCar"); SideCar.isSideCarExport = true; function exportSidecar(medium, exported) { @@ -4926,16 +4927,16 @@ var require_UI = __commonJS({ Object.defineProperty(exports2, "__esModule", { value: true }); exports2.RemoveScroll = void 0; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var constants_1 = require_constants2(); var use_callback_ref_1 = require_es52(); var medium_1 = require_medium2(); var nothing = /* @__PURE__ */ __name(function() { return; }, "nothing"); - var RemoveScroll2 = React75.forwardRef(function(props, parentRef) { - var ref = React75.useRef(null); - var _a = React75.useState({ + var RemoveScroll2 = React76.forwardRef(function(props, parentRef) { + var ref = React76.useRef(null); + var _a = React76.useState({ onScrollCapture: nothing, onWheelCapture: nothing, onTouchMoveCapture: nothing @@ -4944,11 +4945,11 @@ var require_UI = __commonJS({ var SideCar = sideCar; var containerRef = (0, use_callback_ref_1.useMergeRefs)([ref, parentRef]); var containerProps = tslib_1.__assign(tslib_1.__assign({}, rest), callbacks); - return React75.createElement( - React75.Fragment, + return React76.createElement( + React76.Fragment, null, - enabled && React75.createElement(SideCar, { sideCar: medium_1.effectCar, removeScrollBar, shards, noIsolation, inert, setCallbacks, allowPinchZoom: !!allowPinchZoom, lockRef: ref, gapMode }), - forwardProps ? React75.cloneElement(React75.Children.only(children), tslib_1.__assign(tslib_1.__assign({}, containerProps), { ref: containerRef })) : React75.createElement(Container, tslib_1.__assign({}, containerProps, { className, ref: containerRef }), children) + enabled && React76.createElement(SideCar, { sideCar: medium_1.effectCar, removeScrollBar, shards, noIsolation, inert, setCallbacks, allowPinchZoom: !!allowPinchZoom, lockRef: ref, gapMode }), + forwardProps ? React76.cloneElement(React76.Children.only(children), tslib_1.__assign(tslib_1.__assign({}, containerProps), { ref: containerRef })) : React76.createElement(Container, tslib_1.__assign({}, containerProps, { className, ref: containerRef }), children) ); }); exports2.RemoveScroll = RemoveScroll2; @@ -5050,12 +5051,12 @@ var require_hook2 = __commonJS({ Object.defineProperty(exports2, "__esModule", { value: true }); exports2.styleHookSingleton = void 0; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var singleton_1 = require_singleton(); var styleHookSingleton = /* @__PURE__ */ __name(function() { var sheet = (0, singleton_1.stylesheetSingleton)(); return function(styles, isDynamic) { - React75.useEffect(function() { + React76.useEffect(function() { sheet.add(styles); return function() { sheet.remove(); @@ -5158,7 +5159,7 @@ var require_component2 = __commonJS({ Object.defineProperty(exports2, "__esModule", { value: true }); exports2.RemoveScrollBar = exports2.useLockAttribute = exports2.lockAttribute = void 0; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var react_style_singleton_1 = require_es55(); var constants_1 = require_constants2(); var utils_1 = require_utils(); @@ -5180,7 +5181,7 @@ var require_component2 = __commonJS({ return isFinite(counter) ? counter : 0; }, "getCurrentUseCounter"); var useLockAttribute = /* @__PURE__ */ __name(function() { - React75.useEffect(function() { + React76.useEffect(function() { document.body.setAttribute(exports2.lockAttribute, (getCurrentUseCounter() + 1).toString()); return function() { var newCounter = getCurrentUseCounter() - 1; @@ -5196,10 +5197,10 @@ var require_component2 = __commonJS({ var RemoveScrollBar = /* @__PURE__ */ __name(function(_a) { var noRelative = _a.noRelative, noImportant = _a.noImportant, _b = _a.gapMode, gapMode = _b === void 0 ? "margin" : _b; (0, exports2.useLockAttribute)(); - var gap = React75.useMemo(function() { + var gap = React76.useMemo(function() { return (0, utils_1.getGapWidth)(gapMode); }, [gapMode]); - return React75.createElement(Style, { styles: getStyles(gap, !noRelative, gapMode, !noImportant ? "!important" : "") }); + return React76.createElement(Style, { styles: getStyles(gap, !noRelative, gapMode, !noImportant ? "!important" : "") }); }, "RemoveScrollBar"); exports2.RemoveScrollBar = RemoveScrollBar; } @@ -5377,7 +5378,7 @@ var require_SideEffect = __commonJS({ Object.defineProperty(exports2, "__esModule", { value: true }); exports2.RemoveScrollSideCar = exports2.getDeltaXY = exports2.getTouchXY = void 0; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var react_remove_scroll_bar_1 = require_es56(); var react_style_singleton_1 = require_es55(); var aggresiveCapture_1 = require_aggresiveCapture(); @@ -5402,16 +5403,16 @@ var require_SideEffect = __commonJS({ var idCounter = 0; var lockStack = []; function RemoveScrollSideCar(props) { - var shouldPreventQueue = React75.useRef([]); - var touchStartRef = React75.useRef([0, 0]); - var activeAxis = React75.useRef(); - var id = React75.useState(idCounter++)[0]; - var Style = React75.useState(react_style_singleton_1.styleSingleton)[0]; - var lastProps = React75.useRef(props); - React75.useEffect(function() { + var shouldPreventQueue = React76.useRef([]); + var touchStartRef = React76.useRef([0, 0]); + var activeAxis = React76.useRef(); + var id = React76.useState(idCounter++)[0]; + var Style = React76.useState(react_style_singleton_1.styleSingleton)[0]; + var lastProps = React76.useRef(props); + React76.useEffect(function() { lastProps.current = props; }, [props]); - React75.useEffect(function() { + React76.useEffect(function() { if (props.inert) { document.body.classList.add("block-interactivity-".concat(id)); var allow_1 = tslib_1.__spreadArray([props.lockRef.current], (props.shards || []).map(extractRef), true).filter(Boolean); @@ -5427,7 +5428,7 @@ var require_SideEffect = __commonJS({ } return; }, [props.inert, props.lockRef.current, props.shards]); - var shouldCancelEvent = React75.useCallback(function(event, parent) { + var shouldCancelEvent = React76.useCallback(function(event, parent) { if ("touches" in event && event.touches.length === 2 || event.type === "wheel" && event.ctrlKey) { return !lastProps.current.allowPinchZoom; } @@ -5463,7 +5464,7 @@ var require_SideEffect = __commonJS({ var cancelingAxis = activeAxis.current || currentAxis; return (0, handleScroll_1.handleScroll)(cancelingAxis, parent, event, cancelingAxis === "h" ? deltaX : deltaY, true); }, []); - var shouldPrevent = React75.useCallback(function(_event) { + var shouldPrevent = React76.useCallback(function(_event) { var event = _event; if (!lockStack.length || lockStack[lockStack.length - 1] !== Style) { return; @@ -5490,7 +5491,7 @@ var require_SideEffect = __commonJS({ } } }, []); - var shouldCancel = React75.useCallback(function(name, delta, target, should) { + var shouldCancel = React76.useCallback(function(name, delta, target, should) { var event = { name, delta, target, should, shadowParent: getOutermostShadowParent(target) }; shouldPreventQueue.current.push(event); setTimeout(function() { @@ -5499,17 +5500,17 @@ var require_SideEffect = __commonJS({ }); }, 1); }, []); - var scrollTouchStart = React75.useCallback(function(event) { + var scrollTouchStart = React76.useCallback(function(event) { touchStartRef.current = (0, exports2.getTouchXY)(event); activeAxis.current = void 0; }, []); - var scrollWheel = React75.useCallback(function(event) { + var scrollWheel = React76.useCallback(function(event) { shouldCancel(event.type, (0, exports2.getDeltaXY)(event), event.target, shouldCancelEvent(event, props.lockRef.current)); }, []); - var scrollTouchMove = React75.useCallback(function(event) { + var scrollTouchMove = React76.useCallback(function(event) { shouldCancel(event.type, (0, exports2.getTouchXY)(event), event.target, shouldCancelEvent(event, props.lockRef.current)); }, []); - React75.useEffect(function() { + React76.useEffect(function() { lockStack.push(Style); props.setCallbacks({ onScrollCapture: scrollWheel, @@ -5529,11 +5530,11 @@ var require_SideEffect = __commonJS({ }; }, []); var removeScrollBar = props.removeScrollBar, inert = props.inert; - return React75.createElement( - React75.Fragment, + return React76.createElement( + React76.Fragment, null, - inert ? React75.createElement(Style, { styles: generateStyle(id) }) : null, - removeScrollBar ? React75.createElement(react_remove_scroll_bar_1.RemoveScrollBar, { gapMode: props.gapMode }) : null + inert ? React76.createElement(Style, { styles: generateStyle(id) }) : null, + removeScrollBar ? React76.createElement(react_remove_scroll_bar_1.RemoveScrollBar, { gapMode: props.gapMode }) : null ); } __name(RemoveScrollSideCar, "RemoveScrollSideCar"); @@ -5571,11 +5572,11 @@ var require_Combination = __commonJS({ "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var React75 = tslib_1.__importStar(require("react")); + var React76 = tslib_1.__importStar(require("react")); var UI_1 = require_UI(); var sidecar_1 = tslib_1.__importDefault(require_sidecar()); - var ReactRemoveScroll = React75.forwardRef(function(props, ref) { - return React75.createElement(UI_1.RemoveScroll, tslib_1.__assign({}, props, { ref, sideCar: sidecar_1.default })); + var ReactRemoveScroll = React76.forwardRef(function(props, ref) { + return React76.createElement(UI_1.RemoveScroll, tslib_1.__assign({}, props, { ref, sideCar: sidecar_1.default })); }); ReactRemoveScroll.classNames = UI_1.RemoveScroll.classNames; exports2.default = ReactRemoveScroll; @@ -5613,8 +5614,8 @@ var require_isDisabled = __commonJS({ "use strict"; exports2.__esModule = true; exports2.default = void 0; - var isDisabled2 = /* @__PURE__ */ __name((props) => props.disabled || Array.isArray(props.accessibilityStates) && props.accessibilityStates.indexOf("disabled") > -1, "isDisabled"); - var _default = exports2.default = isDisabled2; + var isDisabled = /* @__PURE__ */ __name((props) => props.disabled || Array.isArray(props.accessibilityStates) && props.accessibilityStates.indexOf("disabled") > -1, "isDisabled"); + var _default = exports2.default = isDisabled; module2.exports = exports2.default; } }); @@ -6948,21 +6949,6 @@ var require_createPrefixer = __commonJS({ } }); -// node_modules/inline-style-prefixer/lib/plugins/backgroundClip.js -var require_backgroundClip = __commonJS({ - "node_modules/inline-style-prefixer/lib/plugins/backgroundClip.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { - value: true - }); - exports2.default = backgroundClip; - function backgroundClip() { - return null; - } - __name(backgroundClip, "backgroundClip"); - } -}); - // node_modules/css-in-js-utils/lib/assignStyle.js var require_assignStyle = __commonJS({ "node_modules/css-in-js-utils/lib/assignStyle.js"(exports2) { @@ -7427,54 +7413,6 @@ var require_crossFade = __commonJS({ } }); -// node_modules/inline-style-prefixer/lib/plugins/cursor.js -var require_cursor = __commonJS({ - "node_modules/inline-style-prefixer/lib/plugins/cursor.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { - value: true - }); - exports2.default = cursor; - var prefixes = ["-webkit-", "-moz-", ""]; - var values = { - "zoom-in": true, - "zoom-out": true, - grab: true, - grabbing: true - }; - function cursor(property, value) { - if (property === "cursor" && values.hasOwnProperty(value)) { - return prefixes.map(function(prefix) { - return prefix + value; - }); - } - } - __name(cursor, "cursor"); - } -}); - -// node_modules/inline-style-prefixer/lib/plugins/filter.js -var require_filter = __commonJS({ - "node_modules/inline-style-prefixer/lib/plugins/filter.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { - value: true - }); - exports2.default = filter; - var _cssInJsUtils = require_lib(); - var FILTER_REGEX = /filter\(/g; - var prefixes = ["-webkit-", ""]; - function filter(property, value) { - if (typeof value === "string" && !(0, _cssInJsUtils.isPrefixedValue)(value) && value.indexOf("filter(") !== -1) { - return prefixes.map(function(prefix) { - return value.replace(FILTER_REGEX, prefix + "filter("); - }); - } - } - __name(filter, "filter"); - } -}); - // node_modules/inline-style-prefixer/lib/plugins/imageSet.js var require_imageSet = __commonJS({ "node_modules/inline-style-prefixer/lib/plugins/imageSet.js"(exports2) { @@ -7684,10 +7622,7 @@ var require_static = __commonJS({ var _interopRequireDefault = require_interopRequireDefault().default; exports2.__esModule = true; exports2.default = void 0; - var _backgroundClip = _interopRequireDefault(require_backgroundClip()); var _crossFade = _interopRequireDefault(require_crossFade()); - var _cursor = _interopRequireDefault(require_cursor()); - var _filter = _interopRequireDefault(require_filter()); var _imageSet = _interopRequireDefault(require_imageSet()); var _logical = _interopRequireDefault(require_logical()); var _position = _interopRequireDefault(require_position()); @@ -7699,7 +7634,7 @@ var require_static = __commonJS({ var wms = ["Webkit", "ms"]; var wmms = ["Webkit", "Moz", "ms"]; var _default = exports2.default = { - plugins: [_backgroundClip.default, _crossFade.default, _cursor.default, _filter.default, _imageSet.default, _logical.default, _position.default, _sizing.default, _transition.default], + plugins: [_crossFade.default, _imageSet.default, _logical.default, _position.default, _sizing.default, _transition.default], prefixMap: { appearance: wmms, userSelect: wm, @@ -8497,7 +8432,7 @@ var require_preprocess = __commonJS({ "use strict"; var _interopRequireDefault = require_interopRequireDefault().default; exports2.__esModule = true; - exports2.preprocess = exports2.default = exports2.createTransformValue = exports2.createTextShadowValue = exports2.createBoxShadowValue = void 0; + exports2.preprocess = exports2.default = exports2.createTransformValue = exports2.createTransformOriginValue = exports2.createTextShadowValue = exports2.createBoxShadowValue = exports2.createBoxShadowArrayValue = void 0; var _normalizeColor = _interopRequireDefault(require_normalizeColor()); var _normalizeValueWithProperty = _interopRequireDefault(require_normalizeValueWithProperty()); var _warnOnce = require_warnOnce(); @@ -8531,6 +8466,22 @@ var require_preprocess = __commonJS({ } }, "createTextShadowValue"); exports2.createTextShadowValue = createTextShadowValue; + var mapBoxShadow = /* @__PURE__ */ __name((boxShadow) => { + if (typeof boxShadow === "string") { + return boxShadow; + } + var offsetX = (0, _normalizeValueWithProperty.default)(boxShadow.offsetX) || 0; + var offsetY = (0, _normalizeValueWithProperty.default)(boxShadow.offsetY) || 0; + var blurRadius = (0, _normalizeValueWithProperty.default)(boxShadow.blurRadius) || 0; + var spreadDistance = (0, _normalizeValueWithProperty.default)(boxShadow.spreadDistance) || 0; + var color = (0, _normalizeColor.default)(boxShadow.color) || "black"; + var position = boxShadow.inset ? "inset " : ""; + return "" + position + offsetX + " " + offsetY + " " + blurRadius + " " + spreadDistance + " " + color; + }, "mapBoxShadow"); + var createBoxShadowArrayValue = /* @__PURE__ */ __name((value) => { + return value.map(mapBoxShadow).join(", "); + }, "createBoxShadowArrayValue"); + exports2.createBoxShadowArrayValue = createBoxShadowArrayValue; var mapTransform = /* @__PURE__ */ __name((transform) => { var type = Object.keys(transform)[0]; var value = transform[type]; @@ -8545,6 +8496,10 @@ var require_preprocess = __commonJS({ return value.map(mapTransform).join(" "); }, "createTransformValue"); exports2.createTransformValue = createTransformValue; + var createTransformOriginValue = /* @__PURE__ */ __name((value) => { + return value.map((v) => (0, _normalizeValueWithProperty.default)(v)).join(" "); + }, "createTransformOriginValue"); + exports2.createTransformOriginValue = createTransformOriginValue; var PROPERTIES_STANDARD = { borderBottomEndRadius: "borderEndEndRadius", borderBottomStartRadius: "borderEndStartRadius", @@ -8582,10 +8537,8 @@ var require_preprocess = __commonJS({ if (options.shadow === true, style.shadowColor != null || style.shadowOffset != null || style.shadowOpacity != null || style.shadowRadius != null) { (0, _warnOnce.warnOnce)("shadowStyles", '"shadow*" style props are deprecated. Use "boxShadow".'); var boxShadowValue = createBoxShadowValue(style); - if (boxShadowValue != null && nextStyle.boxShadow == null) { - var boxShadow = style.boxShadow; - var value = boxShadow ? boxShadow + ", " + boxShadowValue : boxShadowValue; - nextStyle.boxShadow = value; + if (boxShadowValue != null) { + nextStyle.boxShadow = boxShadowValue; } } if (options.textShadow === true, style.textShadowColor != null || style.textShadowOffset != null || style.textShadowRadius != null) { @@ -8593,8 +8546,8 @@ var require_preprocess = __commonJS({ var textShadowValue = createTextShadowValue(style); if (textShadowValue != null && nextStyle.textShadow == null) { var textShadow = style.textShadow; - var _value = textShadow ? textShadow + ", " + textShadowValue : textShadowValue; - nextStyle.textShadow = _value; + var value = textShadow ? textShadow + ", " + textShadowValue : textShadowValue; + nextStyle.textShadow = value; } } for (var originalProp in style) { @@ -8606,28 +8559,39 @@ var require_preprocess = __commonJS({ } var originalValue = style[originalProp]; var prop = PROPERTIES_STANDARD[originalProp] || originalProp; - var _value2 = originalValue; + var _value = originalValue; if (!Object.prototype.hasOwnProperty.call(style, originalProp) || prop !== originalProp && style[prop] != null) { continue; } - if (prop === "aspectRatio" && typeof _value2 === "number") { - nextStyle[prop] = _value2.toString(); + if (prop === "aspectRatio" && typeof _value === "number") { + nextStyle[prop] = _value.toString(); + } else if (prop === "boxShadow") { + if (Array.isArray(_value)) { + _value = createBoxShadowArrayValue(_value); + } + var boxShadow = nextStyle.boxShadow; + nextStyle.boxShadow = boxShadow ? _value + ", " + boxShadow : _value; } else if (prop === "fontVariant") { - if (Array.isArray(_value2) && _value2.length > 0) { - _value2 = _value2.join(" "); + if (Array.isArray(_value) && _value.length > 0) { + _value = _value.join(" "); } - nextStyle[prop] = _value2; + nextStyle[prop] = _value; } else if (prop === "textAlignVertical") { if (style.verticalAlign == null) { - nextStyle.verticalAlign = _value2 === "center" ? "middle" : _value2; + nextStyle.verticalAlign = _value === "center" ? "middle" : _value; } } else if (prop === "transform") { - if (Array.isArray(_value2)) { - _value2 = createTransformValue(_value2); + if (Array.isArray(_value)) { + _value = createTransformValue(_value); } - nextStyle.transform = _value2; + nextStyle.transform = _value; + } else if (prop === "transformOrigin") { + if (Array.isArray(_value)) { + _value = createTransformOriginValue(_value); + } + nextStyle.transformOrigin = _value; } else { - nextStyle[prop] = _value2; + nextStyle[prop] = _value; } } return nextStyle; @@ -9483,7 +9447,7 @@ var require_createDOMProps = __commonJS({ if (!props) { props = emptyObject; } - var _props = props, ariaActiveDescendant = _props["aria-activedescendant"], accessibilityActiveDescendant = _props.accessibilityActiveDescendant, ariaAtomic = _props["aria-atomic"], accessibilityAtomic = _props.accessibilityAtomic, ariaAutoComplete = _props["aria-autocomplete"], accessibilityAutoComplete = _props.accessibilityAutoComplete, ariaBusy = _props["aria-busy"], accessibilityBusy = _props.accessibilityBusy, ariaChecked = _props["aria-checked"], accessibilityChecked = _props.accessibilityChecked, ariaColumnCount = _props["aria-colcount"], accessibilityColumnCount = _props.accessibilityColumnCount, ariaColumnIndex = _props["aria-colindex"], accessibilityColumnIndex = _props.accessibilityColumnIndex, ariaColumnSpan = _props["aria-colspan"], accessibilityColumnSpan = _props.accessibilityColumnSpan, ariaControls = _props["aria-controls"], accessibilityControls = _props.accessibilityControls, ariaCurrent = _props["aria-current"], accessibilityCurrent = _props.accessibilityCurrent, ariaDescribedBy = _props["aria-describedby"], accessibilityDescribedBy = _props.accessibilityDescribedBy, ariaDetails = _props["aria-details"], accessibilityDetails = _props.accessibilityDetails, ariaDisabled = _props["aria-disabled"], accessibilityDisabled = _props.accessibilityDisabled, ariaErrorMessage = _props["aria-errormessage"], accessibilityErrorMessage = _props.accessibilityErrorMessage, ariaExpanded = _props["aria-expanded"], accessibilityExpanded = _props.accessibilityExpanded, ariaFlowTo = _props["aria-flowto"], accessibilityFlowTo = _props.accessibilityFlowTo, ariaHasPopup = _props["aria-haspopup"], accessibilityHasPopup = _props.accessibilityHasPopup, ariaHidden = _props["aria-hidden"], accessibilityHidden = _props.accessibilityHidden, ariaInvalid = _props["aria-invalid"], accessibilityInvalid = _props.accessibilityInvalid, ariaKeyShortcuts = _props["aria-keyshortcuts"], accessibilityKeyShortcuts = _props.accessibilityKeyShortcuts, ariaLabel = _props["aria-label"], accessibilityLabel = _props.accessibilityLabel, ariaLabelledBy = _props["aria-labelledby"], accessibilityLabelledBy = _props.accessibilityLabelledBy, ariaLevel = _props["aria-level"], accessibilityLevel = _props.accessibilityLevel, ariaLive = _props["aria-live"], accessibilityLiveRegion = _props.accessibilityLiveRegion, ariaModal = _props["aria-modal"], accessibilityModal = _props.accessibilityModal, ariaMultiline = _props["aria-multiline"], accessibilityMultiline = _props.accessibilityMultiline, ariaMultiSelectable = _props["aria-multiselectable"], accessibilityMultiSelectable = _props.accessibilityMultiSelectable, ariaOrientation = _props["aria-orientation"], accessibilityOrientation = _props.accessibilityOrientation, ariaOwns = _props["aria-owns"], accessibilityOwns = _props.accessibilityOwns, ariaPlaceholder = _props["aria-placeholder"], accessibilityPlaceholder = _props.accessibilityPlaceholder, ariaPosInSet = _props["aria-posinset"], accessibilityPosInSet = _props.accessibilityPosInSet, ariaPressed = _props["aria-pressed"], accessibilityPressed = _props.accessibilityPressed, ariaReadOnly = _props["aria-readonly"], accessibilityReadOnly = _props.accessibilityReadOnly, ariaRequired = _props["aria-required"], accessibilityRequired = _props.accessibilityRequired, ariaRole = _props.role, accessibilityRole = _props.accessibilityRole, ariaRoleDescription = _props["aria-roledescription"], accessibilityRoleDescription = _props.accessibilityRoleDescription, ariaRowCount = _props["aria-rowcount"], accessibilityRowCount = _props.accessibilityRowCount, ariaRowIndex = _props["aria-rowindex"], accessibilityRowIndex = _props.accessibilityRowIndex, ariaRowSpan = _props["aria-rowspan"], accessibilityRowSpan = _props.accessibilityRowSpan, ariaSelected = _props["aria-selected"], accessibilitySelected = _props.accessibilitySelected, ariaSetSize = _props["aria-setsize"], accessibilitySetSize = _props.accessibilitySetSize, ariaSort = _props["aria-sort"], accessibilitySort = _props.accessibilitySort, ariaValueMax = _props["aria-valuemax"], accessibilityValueMax = _props.accessibilityValueMax, ariaValueMin = _props["aria-valuemin"], accessibilityValueMin = _props.accessibilityValueMin, ariaValueNow = _props["aria-valuenow"], accessibilityValueNow = _props.accessibilityValueNow, ariaValueText = _props["aria-valuetext"], accessibilityValueText = _props.accessibilityValueText, dataSet = _props.dataSet, focusable = _props.focusable, id = _props.id, nativeID = _props.nativeID, pointerEvents = _props.pointerEvents, style = _props.style, tabIndex = _props.tabIndex, testID = _props.testID, domProps = (0, _objectWithoutPropertiesLoose2.default)(_props, _excluded); + var _props = props, ariaActiveDescendant = _props["aria-activedescendant"], accessibilityActiveDescendant = _props.accessibilityActiveDescendant, ariaAtomic = _props["aria-atomic"], accessibilityAtomic = _props.accessibilityAtomic, ariaAutoComplete = _props["aria-autocomplete"], accessibilityAutoComplete = _props.accessibilityAutoComplete, ariaBusy = _props["aria-busy"], accessibilityBusy = _props.accessibilityBusy, ariaChecked = _props["aria-checked"], accessibilityChecked = _props.accessibilityChecked, ariaColumnCount = _props["aria-colcount"], accessibilityColumnCount = _props.accessibilityColumnCount, ariaColumnIndex = _props["aria-colindex"], accessibilityColumnIndex = _props.accessibilityColumnIndex, ariaColumnSpan = _props["aria-colspan"], accessibilityColumnSpan = _props.accessibilityColumnSpan, ariaControls = _props["aria-controls"], accessibilityControls = _props.accessibilityControls, ariaCurrent = _props["aria-current"], accessibilityCurrent = _props.accessibilityCurrent, ariaDescribedBy = _props["aria-describedby"], accessibilityDescribedBy = _props.accessibilityDescribedBy, ariaDetails = _props["aria-details"], accessibilityDetails = _props.accessibilityDetails, ariaDisabled = _props["aria-disabled"], accessibilityDisabled = _props.accessibilityDisabled, ariaErrorMessage = _props["aria-errormessage"], accessibilityErrorMessage = _props.accessibilityErrorMessage, ariaExpanded = _props["aria-expanded"], accessibilityExpanded = _props.accessibilityExpanded, ariaFlowTo = _props["aria-flowto"], accessibilityFlowTo = _props.accessibilityFlowTo, ariaHasPopup = _props["aria-haspopup"], accessibilityHasPopup = _props.accessibilityHasPopup, ariaHidden = _props["aria-hidden"], accessibilityHidden = _props.accessibilityHidden, ariaInvalid = _props["aria-invalid"], accessibilityInvalid = _props.accessibilityInvalid, ariaKeyShortcuts = _props["aria-keyshortcuts"], accessibilityKeyShortcuts = _props.accessibilityKeyShortcuts, ariaLabel = _props["aria-label"], accessibilityLabel = _props.accessibilityLabel, ariaLabelledBy = _props["aria-labelledby"], accessibilityLabelledBy = _props.accessibilityLabelledBy, ariaLevel = _props["aria-level"], accessibilityLevel = _props.accessibilityLevel, ariaLive = _props["aria-live"], accessibilityLiveRegion = _props.accessibilityLiveRegion, ariaModal = _props["aria-modal"], accessibilityModal = _props.accessibilityModal, ariaMultiline = _props["aria-multiline"], accessibilityMultiline = _props.accessibilityMultiline, ariaMultiSelectable = _props["aria-multiselectable"], accessibilityMultiSelectable = _props.accessibilityMultiSelectable, ariaOrientation = _props["aria-orientation"], accessibilityOrientation = _props.accessibilityOrientation, ariaOwns = _props["aria-owns"], accessibilityOwns = _props.accessibilityOwns, ariaPlaceholder = _props["aria-placeholder"], accessibilityPlaceholder = _props.accessibilityPlaceholder, ariaPosInSet = _props["aria-posinset"], accessibilityPosInSet = _props.accessibilityPosInSet, ariaPressed = _props["aria-pressed"], accessibilityPressed = _props.accessibilityPressed, ariaReadOnly = _props["aria-readonly"], accessibilityReadOnly = _props.accessibilityReadOnly, ariaRequired = _props["aria-required"], accessibilityRequired = _props.accessibilityRequired, ariaRole = _props.role, accessibilityRole = _props.accessibilityRole, ariaRoleDescription = _props["aria-roledescription"], accessibilityRoleDescription = _props.accessibilityRoleDescription, ariaRowCount = _props["aria-rowcount"], accessibilityRowCount = _props.accessibilityRowCount, ariaRowIndex = _props["aria-rowindex"], accessibilityRowIndex = _props.accessibilityRowIndex, ariaRowSpan = _props["aria-rowspan"], accessibilityRowSpan = _props.accessibilityRowSpan, ariaSelected = _props["aria-selected"], accessibilitySelected = _props.accessibilitySelected, ariaSetSize = _props["aria-setsize"], accessibilitySetSize = _props.accessibilitySetSize, ariaSort = _props["aria-sort"], accessibilitySort = _props.accessibilitySort, ariaValueMax = _props["aria-valuemax"], accessibilityValueMax = _props.accessibilityValueMax, ariaValueMin = _props["aria-valuemin"], accessibilityValueMin = _props.accessibilityValueMin, ariaValueNow = _props["aria-valuenow"], accessibilityValueNow = _props.accessibilityValueNow, ariaValueText = _props["aria-valuetext"], accessibilityValueText = _props.accessibilityValueText, dataSet = _props.dataSet, focusable2 = _props.focusable, id = _props.id, nativeID = _props.nativeID, pointerEvents = _props.pointerEvents, style = _props.style, tabIndex = _props.tabIndex, testID = _props.testID, domProps = (0, _objectWithoutPropertiesLoose2.default)(_props, _excluded); var disabled = ariaDisabled || accessibilityDisabled; var role = _AccessibilityUtil.default.propsToAriaRole(props); var _ariaActiveDescendant = ariaActiveDescendant != null ? ariaActiveDescendant : accessibilityActiveDescendant; @@ -9691,25 +9655,25 @@ var require_createDOMProps = __commonJS({ if (tabIndex === 0 || tabIndex === "0" || tabIndex === -1 || tabIndex === "-1") { domProps.tabIndex = tabIndex; } else { - if (focusable === false) { + if (focusable2 === false) { domProps.tabIndex = "-1"; } if ( // These native elements are keyboard focusable by default elementType === "a" || elementType === "button" || elementType === "input" || elementType === "select" || elementType === "textarea" ) { - if (focusable === false || accessibilityDisabled === true) { + if (focusable2 === false || accessibilityDisabled === true) { domProps.tabIndex = "-1"; } } else if ( // These roles are made keyboard focusable by default role === "button" || role === "checkbox" || role === "link" || role === "radio" || role === "textbox" || role === "switch" ) { - if (focusable !== false) { + if (focusable2 !== false) { domProps.tabIndex = "0"; } } else { - if (focusable === true) { + if (focusable2 === true) { domProps.tabIndex = "0"; } } @@ -9747,29 +9711,22 @@ var require_createDOMProps = __commonJS({ var require_interopRequireWildcard = __commonJS({ "node_modules/@babel/runtime/helpers/interopRequireWildcard.js"(exports2, module2) { var _typeof = require_typeof()["default"]; - function _getRequireWildcardCache(e) { - if ("function" != typeof WeakMap) return null; - var r = /* @__PURE__ */ new WeakMap(), t = /* @__PURE__ */ new WeakMap(); - return (_getRequireWildcardCache = /* @__PURE__ */ __name(function _getRequireWildcardCache2(e2) { - return e2 ? t : r; - }, "_getRequireWildcardCache"))(e); - } - __name(_getRequireWildcardCache, "_getRequireWildcardCache"); - function _interopRequireWildcard(e, r) { - if (!r && e && e.__esModule) return e; - if (null === e || "object" != _typeof(e) && "function" != typeof e) return { - "default": e - }; - var t = _getRequireWildcardCache(r); - if (t && t.has(e)) return t.get(e); - var n = { - __proto__: null - }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; - for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { - var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; - i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; - } - return n["default"] = e, t && t.set(e, n), n; + function _interopRequireWildcard(e, t) { + if ("function" == typeof WeakMap) var r = /* @__PURE__ */ new WeakMap(), n = /* @__PURE__ */ new WeakMap(); + return (module2.exports = _interopRequireWildcard = /* @__PURE__ */ __name(function _interopRequireWildcard2(e2, t2) { + if (!t2 && e2 && e2.__esModule) return e2; + var o, i, f = { + __proto__: null, + "default": e2 + }; + if (null === e2 || "object" != _typeof(e2) && "function" != typeof e2) return f; + if (o = t2 ? n : r) { + if (o.has(e2)) return o.get(e2); + o.set(e2, f); + } + for (var _t in e2) "default" !== _t && {}.hasOwnProperty.call(e2, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e2, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e2[_t]); + return f; + }, "_interopRequireWildcard"), module2.exports.__esModule = true, module2.exports["default"] = module2.exports)(e, t); } __name(_interopRequireWildcard, "_interopRequireWildcard"); module2.exports = _interopRequireWildcard, module2.exports.__esModule = true, module2.exports["default"] = module2.exports; @@ -9932,46 +9889,23 @@ var require_findNodeHandle = __commonJS({ "use strict"; exports2.__esModule = true; exports2.default = void 0; - var _reactDom = require("react-dom"); var findNodeHandle = /* @__PURE__ */ __name((component) => { - var node; - try { - node = (0, _reactDom.findDOMNode)(component); - } catch (e) { - } - return node; + throw new Error("findNodeHandle is not supported on web. Use the ref property on the component instead."); }, "findNodeHandle"); var _default = exports2.default = findNodeHandle; module2.exports = exports2.default; } }); -// node_modules/react-native-web/dist/cjs/exports/unmountComponentAtNode/index.js -var require_unmountComponentAtNode = __commonJS({ - "node_modules/react-native-web/dist/cjs/exports/unmountComponentAtNode/index.js"(exports2, module2) { - "use strict"; - exports2.__esModule = true; - exports2.default = void 0; - var _reactDom = require("react-dom"); - var _default = exports2.default = _reactDom.unmountComponentAtNode; - module2.exports = exports2.default; - } -}); - // node_modules/react-native-web/dist/cjs/exports/render/index.js var require_render = __commonJS({ "node_modules/react-native-web/dist/cjs/exports/render/index.js"(exports2) { "use strict"; "use client"; - var _interopRequireDefault = require_interopRequireDefault().default; exports2.__esModule = true; - exports2.default = renderLegacy; + exports2.default = render; exports2.hydrate = hydrate; - exports2.hydrateLegacy = hydrateLegacy; - exports2.render = render; - var _reactDom = require("react-dom"); var _client = require("react-dom/client"); - var _unmountComponentAtNode = _interopRequireDefault(require_unmountComponentAtNode()); var _dom = require_dom(); function hydrate(element, root) { (0, _dom.createSheet)(root); @@ -9985,26 +9919,21 @@ var require_render = __commonJS({ return reactRoot; } __name(render, "render"); - function hydrateLegacy(element, root, callback) { - (0, _dom.createSheet)(root); - (0, _reactDom.hydrate)(element, root, callback); - return { - unmount: /* @__PURE__ */ __name(function unmount() { - return (0, _unmountComponentAtNode.default)(root); - }, "unmount") - }; - } - __name(hydrateLegacy, "hydrateLegacy"); - function renderLegacy(element, root, callback) { - (0, _dom.createSheet)(root); - (0, _reactDom.render)(element, root, callback); - return { - unmount: /* @__PURE__ */ __name(function unmount() { - return (0, _unmountComponentAtNode.default)(root); - }, "unmount") - }; + } +}); + +// node_modules/react-native-web/dist/cjs/exports/unmountComponentAtNode/index.js +var require_unmountComponentAtNode = __commonJS({ + "node_modules/react-native-web/dist/cjs/exports/unmountComponentAtNode/index.js"(exports2, module2) { + "use strict"; + exports2.__esModule = true; + exports2.default = unmountComponentAtNode; + function unmountComponentAtNode(rootTag) { + rootTag.unmount(); + return true; } - __name(renderLegacy, "renderLegacy"); + __name(unmountComponentAtNode, "unmountComponentAtNode"); + module2.exports = exports2.default; } }); @@ -10736,7 +10665,7 @@ var require_mergeRefs = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = mergeRefs; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); function mergeRefs() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; @@ -10771,13 +10700,13 @@ var require_useMergeRefs = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = useMergeRefs; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _mergeRefs = _interopRequireDefault(require_mergeRefs()); function useMergeRefs() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - return React75.useMemo( + return React76.useMemo( () => (0, _mergeRefs.default)(...args), // eslint-disable-next-line [...args] @@ -10795,10 +10724,10 @@ var require_useStable = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = useStable; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var UNINITIALIZED = typeof Symbol === "function" && typeof Symbol() === "symbol" ? Symbol() : Object.freeze({}); function useStable(getInitialValue) { - var ref = React75.useRef(UNINITIALIZED); + var ref = React76.useRef(UNINITIALIZED); if (ref.current === UNINITIALIZED) { ref.current = getInitialValue(); } @@ -11714,12 +11643,12 @@ var require_useResponderEvents = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = useResponderEvents; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var ResponderSystem = _interopRequireWildcard(require_ResponderSystem()); var emptyObject = {}; var idCounter = 0; function useStable(getInitialValue) { - var ref = React75.useRef(null); + var ref = React76.useRef(null); if (ref.current == null) { ref.current = getInitialValue(); } @@ -11731,14 +11660,14 @@ var require_useResponderEvents = __commonJS({ config = emptyObject; } var id = useStable(() => idCounter++); - var isAttachedRef = React75.useRef(false); - React75.useEffect(() => { + var isAttachedRef = React76.useRef(false); + React76.useEffect(() => { ResponderSystem.attachListeners(); return () => { ResponderSystem.removeNode(id); }; }, [id]); - React75.useEffect(() => { + React76.useEffect(() => { var _config = config, onMoveShouldSetResponder = _config.onMoveShouldSetResponder, onMoveShouldSetResponderCapture = _config.onMoveShouldSetResponderCapture, onScrollShouldSetResponder = _config.onScrollShouldSetResponder, onScrollShouldSetResponderCapture = _config.onScrollShouldSetResponderCapture, onSelectionChangeShouldSetResponder = _config.onSelectionChangeShouldSetResponder, onSelectionChangeShouldSetResponderCapture = _config.onSelectionChangeShouldSetResponderCapture, onStartShouldSetResponder = _config.onStartShouldSetResponder, onStartShouldSetResponderCapture = _config.onStartShouldSetResponderCapture; var requiresResponderSystem = onMoveShouldSetResponder != null || onMoveShouldSetResponderCapture != null || onScrollShouldSetResponder != null || onScrollShouldSetResponderCapture != null || onSelectionChangeShouldSetResponder != null || onSelectionChangeShouldSetResponderCapture != null || onStartShouldSetResponder != null || onStartShouldSetResponderCapture != null; var node = hostRef.current; @@ -11750,10 +11679,10 @@ var require_useResponderEvents = __commonJS({ isAttachedRef.current = false; } }, [config, hostRef, id]); - React75.useDebugValue({ + React76.useDebugValue({ isResponder: hostRef.current === ResponderSystem.getResponderNode() }); - React75.useDebugValue(config); + React76.useDebugValue(config); } __name(useResponderEvents, "useResponderEvents"); module2.exports = exports2.default; @@ -11784,7 +11713,7 @@ var require_View = __commonJS({ exports2.__esModule = true; exports2.default = void 0; var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _createElement = _interopRequireDefault(require_createElement()); var forwardedProps = _interopRequireWildcard(require_forwardedProps()); var _pick = _interopRequireDefault(require_pick()); @@ -11804,17 +11733,17 @@ var require_View = __commonJS({ pointerEvents: true }); var pickProps = /* @__PURE__ */ __name((props) => (0, _pick.default)(props, forwardPropsList), "pickProps"); - var View11 = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var View11 = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var hrefAttrs = props.hrefAttrs, onLayout = props.onLayout, onMoveShouldSetResponder = props.onMoveShouldSetResponder, onMoveShouldSetResponderCapture = props.onMoveShouldSetResponderCapture, onResponderEnd = props.onResponderEnd, onResponderGrant = props.onResponderGrant, onResponderMove = props.onResponderMove, onResponderReject = props.onResponderReject, onResponderRelease = props.onResponderRelease, onResponderStart = props.onResponderStart, onResponderTerminate = props.onResponderTerminate, onResponderTerminationRequest = props.onResponderTerminationRequest, onScrollShouldSetResponder = props.onScrollShouldSetResponder, onScrollShouldSetResponderCapture = props.onScrollShouldSetResponderCapture, onSelectionChangeShouldSetResponder = props.onSelectionChangeShouldSetResponder, onSelectionChangeShouldSetResponderCapture = props.onSelectionChangeShouldSetResponderCapture, onStartShouldSetResponder = props.onStartShouldSetResponder, onStartShouldSetResponderCapture = props.onStartShouldSetResponderCapture, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); if (process.env.NODE_ENV !== "production") { - React75.Children.toArray(props.children).forEach((item) => { + React76.Children.toArray(props.children).forEach((item) => { if (typeof item === "string") { console.error("Unexpected text node: " + item + ". A text node cannot be a child of a ."); } }); } - var hasTextAncestor = React75.useContext(_TextAncestorContext.default); - var hostRef = React75.useRef(null); + var hasTextAncestor = React76.useContext(_TextAncestorContext.default); + var hostRef = React76.useRef(null); var _useLocaleContext = (0, _useLocale.useLocaleContext)(), contextDirection = _useLocaleContext.direction; (0, _useElementLayout.default)(hostRef, onLayout); (0, _useResponderEvents.default)(hostRef, { @@ -11867,6 +11796,7 @@ var require_View = __commonJS({ View11.displayName = "View"; var styles = _StyleSheet.default.create({ view$raw: { + alignContent: "flex-start", alignItems: "stretch", backgroundColor: "transparent", border: "0 solid black", @@ -12258,7 +12188,7 @@ var require_ScrollViewBase = __commonJS({ exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); var _useMergeRefs = _interopRequireDefault(require_useMergeRefs()); @@ -12300,14 +12230,14 @@ var require_ScrollViewBase = __commonJS({ return eventThrottle > 0 && timeSinceLastTick >= eventThrottle; } __name(shouldEmitScrollEvent, "shouldEmitScrollEvent"); - var ScrollViewBase = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var ScrollViewBase = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var onScroll = props.onScroll, onTouchMove = props.onTouchMove, onWheel = props.onWheel, _props$scrollEnabled = props.scrollEnabled, scrollEnabled = _props$scrollEnabled === void 0 ? true : _props$scrollEnabled, _props$scrollEventThr = props.scrollEventThrottle, scrollEventThrottle = _props$scrollEventThr === void 0 ? 0 : _props$scrollEventThr, showsHorizontalScrollIndicator = props.showsHorizontalScrollIndicator, showsVerticalScrollIndicator = props.showsVerticalScrollIndicator, style = props.style, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); - var scrollState = React75.useRef({ + var scrollState = React76.useRef({ isScrolling: false, scrollLastTick: 0 }); - var scrollTimeout = React75.useRef(null); - var scrollRef = React75.useRef(null); + var scrollTimeout = React76.useRef(null); + var scrollRef = React76.useRef(null); function createPreventableScrollHandler(handler) { return (e) => { if (scrollEnabled) { @@ -12358,7 +12288,7 @@ var require_ScrollViewBase = __commonJS({ } __name(handleScrollEnd, "handleScrollEnd"); var hideScrollbar = showsHorizontalScrollIndicator === false || showsVerticalScrollIndicator === false; - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, rest, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, rest, { onScroll: handleScroll, onTouchMove: createPreventableScrollHandler(onTouchMove), onWheel: createPreventableScrollHandler(onWheel), @@ -13807,8 +13737,8 @@ var require_StateSafePureComponent = __commonJS({ exports2.__esModule = true; exports2.default = void 0; var _invariant = _interopRequireDefault(require_invariant()); - var React75 = _interopRequireWildcard(require("react")); - var StateSafePureComponent = class extends React75.PureComponent { + var React76 = _interopRequireWildcard(require("react")); + var StateSafePureComponent = class extends React76.PureComponent { static { __name(this, "StateSafePureComponent"); } @@ -14046,15 +13976,15 @@ var require_VirtualizedListContext = __commonJS({ exports2.VirtualizedListContextResetter = VirtualizedListContextResetter; var _objectSpread2 = _interopRequireDefault(require_objectSpread2()); var _react = _interopRequireWildcard(require("react")); - var React75 = _react; + var React76 = _react; var __DEV__ = process.env.NODE_ENV !== "production"; - var VirtualizedListContext = exports2.VirtualizedListContext = /* @__PURE__ */ React75.createContext(null); + var VirtualizedListContext = exports2.VirtualizedListContext = /* @__PURE__ */ React76.createContext(null); if (__DEV__) { VirtualizedListContext.displayName = "VirtualizedListContext"; } function VirtualizedListContextResetter(_ref) { var children = _ref.children; - return /* @__PURE__ */ React75.createElement(VirtualizedListContext.Provider, { + return /* @__PURE__ */ React76.createElement(VirtualizedListContext.Provider, { value: null }, children); } @@ -14069,7 +13999,7 @@ var require_VirtualizedListContext = __commonJS({ registerAsNestedChild: value.registerAsNestedChild, unregisterAsNestedChild: value.unregisterAsNestedChild }), [value.getScrollMetrics, value.horizontal, value.getOutermostParentListRef, value.registerAsNestedChild, value.unregisterAsNestedChild]); - return /* @__PURE__ */ React75.createElement(VirtualizedListContext.Provider, { + return /* @__PURE__ */ React76.createElement(VirtualizedListContext.Provider, { value: context2 }, children); } @@ -14080,7 +14010,7 @@ var require_VirtualizedListContext = __commonJS({ var context2 = (0, _react.useMemo)(() => currContext == null ? null : (0, _objectSpread2.default)((0, _objectSpread2.default)({}, currContext), {}, { cellKey }), [currContext, cellKey]); - return /* @__PURE__ */ React75.createElement(VirtualizedListContext.Provider, { + return /* @__PURE__ */ React76.createElement(VirtualizedListContext.Provider, { value: context2 }, children); } @@ -14102,8 +14032,8 @@ var require_VirtualizedListCellRenderer = __commonJS({ var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _VirtualizedListContext = require_VirtualizedListContext(); var _invariant = _interopRequireDefault(require_invariant()); - var React75 = _interopRequireWildcard(require("react")); - var CellRenderer = class extends React75.Component { + var React76 = _interopRequireWildcard(require("react")); + var CellRenderer = class extends React76.Component { static { __name(this, "CellRenderer"); } @@ -14160,7 +14090,7 @@ var require_VirtualizedListCellRenderer = __commonJS({ console.warn("VirtualizedList: Both ListItemComponent and renderItem props are present. ListItemComponent will take precedence over renderItem."); } if (ListItemComponent2) { - return /* @__PURE__ */ React75.createElement(ListItemComponent2, { + return /* @__PURE__ */ React76.createElement(ListItemComponent2, { item, index: index3, separators: this._separators @@ -14178,20 +14108,20 @@ var require_VirtualizedListCellRenderer = __commonJS({ render() { var _this$props4 = this.props, CellRendererComponent = _this$props4.CellRendererComponent, ItemSeparatorComponent = _this$props4.ItemSeparatorComponent, ListItemComponent2 = _this$props4.ListItemComponent, cellKey = _this$props4.cellKey, horizontal = _this$props4.horizontal, item = _this$props4.item, index3 = _this$props4.index, inversionStyle = _this$props4.inversionStyle, onCellFocusCapture = _this$props4.onCellFocusCapture, onCellLayout = _this$props4.onCellLayout, renderItem = _this$props4.renderItem; var element = this._renderElement(renderItem, ListItemComponent2, item, index3); - var itemSeparator = /* @__PURE__ */ React75.isValidElement(ItemSeparatorComponent) ? ( + var itemSeparator = /* @__PURE__ */ React76.isValidElement(ItemSeparatorComponent) ? ( // $FlowFixMe[incompatible-type] ItemSeparatorComponent ) : ( // $FlowFixMe[incompatible-type] - ItemSeparatorComponent && /* @__PURE__ */ React75.createElement(ItemSeparatorComponent, this.state.separatorProps) + ItemSeparatorComponent && /* @__PURE__ */ React76.createElement(ItemSeparatorComponent, this.state.separatorProps) ); var cellStyle = inversionStyle ? horizontal ? [styles.rowReverse, inversionStyle] : [styles.columnReverse, inversionStyle] : horizontal ? [styles.row, inversionStyle] : inversionStyle; - var result = !CellRendererComponent ? /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({ + var result = !CellRendererComponent ? /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({ style: cellStyle, onFocusCapture: onCellFocusCapture }, onCellLayout && { onLayout: this._onLayout - }), element, itemSeparator) : /* @__PURE__ */ React75.createElement(CellRendererComponent, (0, _extends2.default)({ + }), element, itemSeparator) : /* @__PURE__ */ React76.createElement(CellRendererComponent, (0, _extends2.default)({ cellKey, index: index3, item, @@ -14200,7 +14130,7 @@ var require_VirtualizedListCellRenderer = __commonJS({ }, onCellLayout && { onLayout: this._onLayout }), element, itemSeparator); - return /* @__PURE__ */ React75.createElement(_VirtualizedListContext.VirtualizedListCellContextProvider, { + return /* @__PURE__ */ React76.createElement(_VirtualizedListContext.VirtualizedListCellContextProvider, { cellKey: this.props.cellKey }, result); } @@ -14383,7 +14313,6 @@ var require_VirtualizedList = __commonJS({ var _ScrollView = _interopRequireDefault(require_ScrollView()); var _View = _interopRequireDefault(require_View()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); - var _findNodeHandle = _interopRequireDefault(require_findNodeHandle()); var _Batchinator = _interopRequireDefault(require_Batchinator()); var _clamp = _interopRequireDefault(require_clamp2()); var _infoLog = _interopRequireDefault(require_infoLog()); @@ -14397,7 +14326,7 @@ var require_VirtualizedList = __commonJS({ var _VirtualizeUtils = require_VirtualizeUtils(); var _invariant = _interopRequireDefault(require_invariant()); var _nullthrows = _interopRequireDefault(require_nullthrows()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var __DEV__ = process.env.NODE_ENV !== "production"; var ON_EDGE_REACHED_EPSILON = 1e-3; var _usedIndexForKey = false; @@ -14662,15 +14591,15 @@ var require_VirtualizedList = __commonJS({ this._defaultRenderScrollComponent = (props) => { var onRefresh = props.onRefresh; if (this._isNestedWithSameOrientation()) { - return /* @__PURE__ */ React75.createElement(_View.default, props); + return /* @__PURE__ */ React76.createElement(_View.default, props); } else if (onRefresh) { var _props$refreshing; (0, _invariant.default)(typeof props.refreshing === "boolean", "`refreshing` prop must be set as a boolean in order to use `onRefresh`, but got `" + JSON.stringify((_props$refreshing = props.refreshing) !== null && _props$refreshing !== void 0 ? _props$refreshing : "undefined") + "`"); return ( // $FlowFixMe[prop-missing] Invalid prop usage // $FlowFixMe[incompatible-use] - /* @__PURE__ */ React75.createElement(_ScrollView.default, (0, _extends2.default)({}, props, { - refreshControl: props.refreshControl == null ? /* @__PURE__ */ React75.createElement( + /* @__PURE__ */ React76.createElement(_ScrollView.default, (0, _extends2.default)({}, props, { + refreshControl: props.refreshControl == null ? /* @__PURE__ */ React76.createElement( _RefreshControl.default, { refreshing: props.refreshing, @@ -14681,7 +14610,7 @@ var require_VirtualizedList = __commonJS({ })) ); } else { - return /* @__PURE__ */ React75.createElement(_ScrollView.default, props); + return /* @__PURE__ */ React76.createElement(_ScrollView.default, props); } }; this._onCellLayout = (e, cellKey, index3) => { @@ -15165,7 +15094,7 @@ var require_VirtualizedList = __commonJS({ stickyHeaderIndices.push(cells.length); } var shouldListenForLayout = getItemLayout == null || debug || _this._fillRateHelper.enabled(); - cells.push(/* @__PURE__ */ React75.createElement(_VirtualizedListCellRenderer.default, (0, _extends2.default)({ + cells.push(/* @__PURE__ */ React76.createElement(_VirtualizedListCellRenderer.default, (0, _extends2.default)({ CellRendererComponent, ItemSeparatorComponent: ii < end ? ItemSeparatorComponent : void 0, ListItemComponent: ListItemComponent2, @@ -15230,15 +15159,15 @@ var require_VirtualizedList = __commonJS({ if (stickyIndicesFromProps.has(0)) { stickyHeaderIndices.push(0); } - var _element = /* @__PURE__ */ React75.isValidElement(ListHeaderComponent) ? ListHeaderComponent : ( + var _element = /* @__PURE__ */ React76.isValidElement(ListHeaderComponent) ? ListHeaderComponent : ( // $FlowFixMe[not-a-component] // $FlowFixMe[incompatible-type-arg] - /* @__PURE__ */ React75.createElement(ListHeaderComponent, null) + /* @__PURE__ */ React76.createElement(ListHeaderComponent, null) ); - cells.push(/* @__PURE__ */ React75.createElement(_VirtualizedListContext.VirtualizedListCellContextProvider, { + cells.push(/* @__PURE__ */ React76.createElement(_VirtualizedListContext.VirtualizedListCellContextProvider, { cellKey: this._getCellKey() + "-header", key: "$header" - }, /* @__PURE__ */ React75.createElement( + }, /* @__PURE__ */ React76.createElement( _View.default, { onLayout: this._onLayoutHeader, @@ -15250,15 +15179,15 @@ var require_VirtualizedList = __commonJS({ } var itemCount = this.props.getItemCount(data); if (itemCount === 0 && ListEmptyComponent) { - var _element2 = /* @__PURE__ */ React75.isValidElement(ListEmptyComponent) ? ListEmptyComponent : ( + var _element2 = /* @__PURE__ */ React76.isValidElement(ListEmptyComponent) ? ListEmptyComponent : ( // $FlowFixMe[not-a-component] // $FlowFixMe[incompatible-type-arg] - /* @__PURE__ */ React75.createElement(ListEmptyComponent, null) + /* @__PURE__ */ React76.createElement(ListEmptyComponent, null) ); - cells.push(/* @__PURE__ */ React75.createElement(_VirtualizedListContext.VirtualizedListCellContextProvider, { + cells.push(/* @__PURE__ */ React76.createElement(_VirtualizedListContext.VirtualizedListCellContextProvider, { cellKey: this._getCellKey() + "-empty", key: "$empty" - }, /* @__PURE__ */ React75.cloneElement(_element2, { + }, /* @__PURE__ */ React76.cloneElement(_element2, { onLayout: /* @__PURE__ */ __name((event) => { this._onLayoutEmpty(event); if (_element2.props.onLayout) { @@ -15286,7 +15215,7 @@ var require_VirtualizedList = __commonJS({ var firstMetrics = this.__getFrameMetricsApprox(section.first, this.props); var lastMetrics = this.__getFrameMetricsApprox(last, this.props); var spacerSize = lastMetrics.offset + lastMetrics.length - firstMetrics.offset; - cells.push(/* @__PURE__ */ React75.createElement(_View.default, { + cells.push(/* @__PURE__ */ React76.createElement(_View.default, { key: "$spacer-" + section.first, style: { [spacerKey]: spacerSize @@ -15302,15 +15231,15 @@ var require_VirtualizedList = __commonJS({ } } if (ListFooterComponent) { - var _element3 = /* @__PURE__ */ React75.isValidElement(ListFooterComponent) ? ListFooterComponent : ( + var _element3 = /* @__PURE__ */ React76.isValidElement(ListFooterComponent) ? ListFooterComponent : ( // $FlowFixMe[not-a-component] // $FlowFixMe[incompatible-type-arg] - /* @__PURE__ */ React75.createElement(ListFooterComponent, null) + /* @__PURE__ */ React76.createElement(ListFooterComponent, null) ); - cells.push(/* @__PURE__ */ React75.createElement(_VirtualizedListContext.VirtualizedListCellContextProvider, { + cells.push(/* @__PURE__ */ React76.createElement(_VirtualizedListContext.VirtualizedListCellContextProvider, { cellKey: this._getFooterCellKey(), key: "$footer" - }, /* @__PURE__ */ React75.createElement( + }, /* @__PURE__ */ React76.createElement( _View.default, { onLayout: this._onLayoutFooter, @@ -15335,7 +15264,7 @@ var require_VirtualizedList = __commonJS({ style: inversionStyle ? [inversionStyle, this.props.style] : this.props.style }); this._hasMore = this.state.cellsAroundViewport.last < itemCount - 1; - var innerRet = /* @__PURE__ */ React75.createElement(_VirtualizedListContext.VirtualizedListContextProvider, { + var innerRet = /* @__PURE__ */ React76.createElement(_VirtualizedListContext.VirtualizedListContextProvider, { value: { cellKey: null, getScrollMetrics: this._getScrollMetrics, @@ -15344,12 +15273,12 @@ var require_VirtualizedList = __commonJS({ registerAsNestedChild: this._registerAsNestedChild, unregisterAsNestedChild: this._unregisterAsNestedChild } - }, /* @__PURE__ */ React75.cloneElement((this.props.renderScrollComponent || this._defaultRenderScrollComponent)(scrollProps), { + }, /* @__PURE__ */ React76.cloneElement((this.props.renderScrollComponent || this._defaultRenderScrollComponent)(scrollProps), { ref: this._captureScrollRef }, cells)); var ret = innerRet; if (this.props.debug) { - return /* @__PURE__ */ React75.createElement(_View.default, { + return /* @__PURE__ */ React76.createElement(_View.default, { style: styles.debug }, ret, this._renderDebugOverlay()); } else { @@ -15437,20 +15366,20 @@ var require_VirtualizedList = __commonJS({ var windowLen = frameLast.offset + frameLast.length - windowTop; var visTop = this._scrollMetrics.offset; var visLen = this._scrollMetrics.visibleLength; - return /* @__PURE__ */ React75.createElement(_View.default, { + return /* @__PURE__ */ React76.createElement(_View.default, { style: [styles.debugOverlayBase, styles.debugOverlay] - }, framesInLayout.map((f, ii2) => /* @__PURE__ */ React75.createElement(_View.default, { + }, framesInLayout.map((f, ii2) => /* @__PURE__ */ React76.createElement(_View.default, { key: "f" + ii2, style: [styles.debugOverlayBase, styles.debugOverlayFrame, { top: f.offset * normalize, height: f.length * normalize }] - })), /* @__PURE__ */ React75.createElement(_View.default, { + })), /* @__PURE__ */ React76.createElement(_View.default, { style: [styles.debugOverlayBase, styles.debugOverlayFrameLast, { top: windowTop * normalize, height: windowLen * normalize }] - }), /* @__PURE__ */ React75.createElement(_View.default, { + }), /* @__PURE__ */ React76.createElement(_View.default, { style: [styles.debugOverlayBase, styles.debugOverlayFrameVis, { top: visTop * normalize, height: visLen * normalize @@ -15654,7 +15583,7 @@ var require_FlatList = __commonJS({ var _deepDiffer = _interopRequireDefault(require_deepDiffer()); var _Platform = _interopRequireDefault(require_Platform()); var _invariant = _interopRequireDefault(require_invariant()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _VirtualizedList = _interopRequireDefault(require_VirtualizedList()); var _VirtualizeUtils = require_VirtualizeUtils(); var _memoizeOne = _interopRequireDefault(require_memoize_one_cjs()); @@ -15671,7 +15600,7 @@ var require_FlatList = __commonJS({ return typeof Object(data).length === "number"; } __name(isArrayLike, "isArrayLike"); - var FlatList = class extends React75.PureComponent { + var FlatList = class extends React76.PureComponent { static { __name(this, "FlatList"); } @@ -15802,7 +15731,7 @@ var require_FlatList = __commonJS({ var cols = numColumnsOrDefault(numColumns); var render = /* @__PURE__ */ __name((props) => { if (ListItemComponent2) { - return /* @__PURE__ */ React75.createElement(ListItemComponent2, props); + return /* @__PURE__ */ React76.createElement(ListItemComponent2, props); } else if (renderItem) { return renderItem(props); } else { @@ -15813,7 +15742,7 @@ var require_FlatList = __commonJS({ if (cols > 1) { var _item2 = info.item, _index = info.index; (0, _invariant.default)(Array.isArray(_item2), "Expected array of items with numColumns > 1"); - return /* @__PURE__ */ React75.createElement(_View.default, { + return /* @__PURE__ */ React76.createElement(_View.default, { style: [styles.row, columnWrapperStyle] }, _item2.map((it, kk) => { var element = render({ @@ -15822,7 +15751,7 @@ var require_FlatList = __commonJS({ index: _index * cols + kk, separators: info.separators }); - return element != null ? /* @__PURE__ */ React75.createElement(React75.Fragment, { + return element != null ? /* @__PURE__ */ React76.createElement(React76.Fragment, { key: kk }, element) : null; })); @@ -15912,7 +15841,7 @@ var require_FlatList = __commonJS({ var renderer = strictMode ? this._memoizedRenderer : this._renderer; return ( // $FlowFixMe[incompatible-exact] - `restProps` (`Props`) is inexact. - /* @__PURE__ */ React75.createElement(_VirtualizedList.default, (0, _extends2.default)({}, restProps, { + /* @__PURE__ */ React76.createElement(_VirtualizedList.default, (0, _extends2.default)({}, restProps, { getItem: this._getItem, getItemCount: this._getItemCount, keyExtractor: this._keyExtractor, @@ -17892,16 +17821,16 @@ var require_createAnimatedComponent = __commonJS({ var _useMergeRefs = _interopRequireDefault(require_useMergeRefs2()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _excluded = ["style"]; function createAnimatedComponent(Component) { - return /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + return /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var _useAnimatedProps = (0, _useAnimatedProps2.default)(props), reducedProps = _useAnimatedProps[0], callbackRef = _useAnimatedProps[1]; var ref = (0, _useMergeRefs.default)(callbackRef, forwardedRef); var passthroughAnimatedPropExplicitValues = reducedProps.passthroughAnimatedPropExplicitValues, style = reducedProps.style; var _ref = passthroughAnimatedPropExplicitValues !== null && passthroughAnimatedPropExplicitValues !== void 0 ? passthroughAnimatedPropExplicitValues : {}, passthroughStyle = _ref.style, passthroughProps = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded); var mergedStyle = [style, passthroughStyle]; - return /* @__PURE__ */ React75.createElement(Component, (0, _extends2.default)({}, reducedProps, passthroughProps, { + return /* @__PURE__ */ React76.createElement(Component, (0, _extends2.default)({}, reducedProps, passthroughProps, { style: mergedStyle, ref })); @@ -17921,10 +17850,10 @@ var require_AnimatedFlatList = __commonJS({ exports2.__esModule = true; exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _FlatList = _interopRequireDefault(require_FlatList2()); var _createAnimatedComponent = _interopRequireDefault(require_createAnimatedComponent()); - var FlatListWithEventThrottle = /* @__PURE__ */ React75.forwardRef((props, ref) => /* @__PURE__ */ React75.createElement(_FlatList.default, (0, _extends2.default)({ + var FlatListWithEventThrottle = /* @__PURE__ */ React76.forwardRef((props, ref) => /* @__PURE__ */ React76.createElement(_FlatList.default, (0, _extends2.default)({ scrollEventThrottle: 1e-4 }, props, { ref @@ -18154,7 +18083,7 @@ var require_Image = __commonJS({ var _objectSpread2 = _interopRequireDefault(require_objectSpread2()); var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _createElement = _interopRequireDefault(require_createElement()); var _AssetRegistry = require_AssetRegistry(); var _preprocess = require_preprocess(); @@ -18172,20 +18101,20 @@ var require_Image = __commonJS({ var _filterId = 0; var svgDataUriPattern = /^(data:image\/svg\+xml;utf8,)(.*)/; function createTintColorSVG(tintColor, id) { - return tintColor && id != null ? /* @__PURE__ */ React75.createElement("svg", { + return tintColor && id != null ? /* @__PURE__ */ React76.createElement("svg", { style: { position: "absolute", height: 0, visibility: "hidden", width: 0 } - }, /* @__PURE__ */ React75.createElement("defs", null, /* @__PURE__ */ React75.createElement("filter", { + }, /* @__PURE__ */ React76.createElement("defs", null, /* @__PURE__ */ React76.createElement("filter", { id: "tint-" + id, suppressHydrationWarning: true - }, /* @__PURE__ */ React75.createElement("feFlood", { + }, /* @__PURE__ */ React76.createElement("feFlood", { floodColor: "" + tintColor, key: tintColor - }), /* @__PURE__ */ React75.createElement("feComposite", { + }), /* @__PURE__ */ React76.createElement("feComposite", { in2: "SourceAlpha", operator: "in" })))) : null; @@ -18269,7 +18198,7 @@ var require_Image = __commonJS({ return uri; } __name(resolveAssetUri, "resolveAssetUri"); - var Image2 = /* @__PURE__ */ React75.forwardRef((props, ref) => { + var Image2 = /* @__PURE__ */ React76.forwardRef((props, ref) => { var _ariaLabel = props["aria-label"], accessibilityLabel = props.accessibilityLabel, blurRadius = props.blurRadius, defaultSource = props.defaultSource, draggable = props.draggable, onError = props.onError, onLayout = props.onLayout, onLoad = props.onLoad, onLoadEnd = props.onLoadEnd, onLoadStart = props.onLoadStart, pointerEvents = props.pointerEvents, source = props.source, style = props.style, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); var ariaLabel = _ariaLabel || accessibilityLabel; if (process.env.NODE_ENV !== "production") { @@ -18277,7 +18206,7 @@ var require_Image = __commonJS({ throw new Error("The component cannot contain children. If you want to render content on top of the image, consider using the component or absolute positioning."); } } - var _React$useState = React75.useState(() => { + var _React$useState = React76.useState(() => { var uri2 = resolveAssetUri(source); if (uri2 != null) { var isLoaded = _ImageLoader.default.has(uri2); @@ -18287,11 +18216,11 @@ var require_Image = __commonJS({ } return IDLE; }), state = _React$useState[0], updateState = _React$useState[1]; - var _React$useState2 = React75.useState({}), layout = _React$useState2[0], updateLayout = _React$useState2[1]; - var hasTextAncestor = React75.useContext(_TextAncestorContext.default); - var hiddenImageRef = React75.useRef(null); - var filterRef = React75.useRef(_filterId++); - var requestRef = React75.useRef(null); + var _React$useState2 = React76.useState({}), layout = _React$useState2[0], updateLayout = _React$useState2[1]; + var hasTextAncestor = React76.useContext(_TextAncestorContext.default); + var hiddenImageRef = React76.useRef(null); + var filterRef = React76.useRef(_filterId++); + var requestRef = React76.useRef(null); var shouldDisplaySource = state === LOADED || state === LOADING && defaultSource == null; var _extractNonStandardSt = extractNonStandardStyleProps(style, blurRadius, filterRef.current, props.tintColor), _resizeMode = _extractNonStandardSt[0], filter = _extractNonStandardSt[1], _tintColor = _extractNonStandardSt[2]; var resizeMode = props.resizeMode || _resizeMode || "cover"; @@ -18330,7 +18259,7 @@ var require_Image = __commonJS({ } __name(handleLayout, "handleLayout"); var uri = resolveAssetUri(source); - React75.useEffect(() => { + React76.useEffect(() => { abortPendingRequest(); if (uri != null) { updateState(LOADING); @@ -18368,7 +18297,7 @@ var require_Image = __commonJS({ __name(abortPendingRequest, "abortPendingRequest"); return abortPendingRequest; }, [uri, requestRef, updateState, onError, onLoad, onLoadEnd, onLoadStart]); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, rest, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, rest, { "aria-label": ariaLabel, onLayout: handleLayout, pointerEvents, @@ -18385,7 +18314,7 @@ var require_Image = __commonJS({ boxShadow: null } ] - }), /* @__PURE__ */ React75.createElement(_View.default, { + }), /* @__PURE__ */ React76.createElement(_View.default, { style: [styles.image, resizeModeStyles[resizeMode], { backgroundImage, filter @@ -18480,7 +18409,7 @@ var require_AnimatedImage = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _Image = _interopRequireDefault(require_Image()); var _createAnimatedComponent = _interopRequireDefault(require_createAnimatedComponent()); var _default = exports2.default = (0, _createAnimatedComponent.default)(_Image.default); @@ -18497,10 +18426,10 @@ var require_AnimatedScrollView = __commonJS({ exports2.__esModule = true; exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _ScrollView = _interopRequireDefault(require_ScrollView()); var _createAnimatedComponent = _interopRequireDefault(require_createAnimatedComponent()); - var ScrollViewWithEventThrottle = /* @__PURE__ */ React75.forwardRef((props, ref) => /* @__PURE__ */ React75.createElement(_ScrollView.default, (0, _extends2.default)({ + var ScrollViewWithEventThrottle = /* @__PURE__ */ React76.forwardRef((props, ref) => /* @__PURE__ */ React76.createElement(_ScrollView.default, (0, _extends2.default)({ scrollEventThrottle: 1e-4 }, props, { ref @@ -18526,9 +18455,9 @@ var require_VirtualizedSectionList = __commonJS({ var _VirtualizedList = _interopRequireDefault(require_VirtualizedList()); var _VirtualizeUtils = require_VirtualizeUtils(); var _invariant = _interopRequireDefault(require_invariant()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _excluded = ["ItemSeparatorComponent", "SectionSeparatorComponent", "renderItem", "renderSectionFooter", "renderSectionHeader", "sections", "stickySectionHeadersEnabled"]; - var VirtualizedSectionList = class extends React75.PureComponent { + var VirtualizedSectionList = class extends React76.PureComponent { static { __name(this, "VirtualizedSectionList"); } @@ -18590,7 +18519,7 @@ var require_VirtualizedSectionList = __commonJS({ var renderItem = info.section.renderItem || this.props.renderItem; var SeparatorComponent = this._getSeparatorComponent(index3, info, listItemCount); (0, _invariant.default)(renderItem, "no renderItem!"); - return /* @__PURE__ */ React75.createElement(ItemWithSeparator, { + return /* @__PURE__ */ React76.createElement(ItemWithSeparator, { SeparatorComponent, LeadingSeparatorComponent: infoIndex === 0 ? this.props.SectionSeparatorComponent : void 0, cellKey: info.key, @@ -18680,7 +18609,7 @@ var require_VirtualizedSectionList = __commonJS({ itemCount += this.props.getItemCount(section.data); } var renderItem = this._renderItem(itemCount); - return /* @__PURE__ */ React75.createElement(_VirtualizedList.default, (0, _extends2.default)({}, passThroughProps, { + return /* @__PURE__ */ React76.createElement(_VirtualizedList.default, (0, _extends2.default)({}, passThroughProps, { keyExtractor: this._keyExtractor, stickyHeaderIndices, renderItem, @@ -18771,23 +18700,23 @@ var require_VirtualizedSectionList = __commonJS({ }; function ItemWithSeparator(props) { var LeadingSeparatorComponent = props.LeadingSeparatorComponent, SeparatorComponent = props.SeparatorComponent, cellKey = props.cellKey, prevCellKey = props.prevCellKey, setSelfHighlightCallback = props.setSelfHighlightCallback, updateHighlightFor = props.updateHighlightFor, setSelfUpdatePropsCallback = props.setSelfUpdatePropsCallback, updatePropsFor = props.updatePropsFor, item = props.item, index3 = props.index, section = props.section, inverted = props.inverted; - var _React$useState = React75.useState(false), leadingSeparatorHiglighted = _React$useState[0], setLeadingSeparatorHighlighted = _React$useState[1]; - var _React$useState2 = React75.useState(false), separatorHighlighted = _React$useState2[0], setSeparatorHighlighted = _React$useState2[1]; - var _React$useState3 = React75.useState({ + var _React$useState = React76.useState(false), leadingSeparatorHiglighted = _React$useState[0], setLeadingSeparatorHighlighted = _React$useState[1]; + var _React$useState2 = React76.useState(false), separatorHighlighted = _React$useState2[0], setSeparatorHighlighted = _React$useState2[1]; + var _React$useState3 = React76.useState({ leadingItem: props.leadingItem, leadingSection: props.leadingSection, section: props.section, trailingItem: props.item, trailingSection: props.trailingSection }), leadingSeparatorProps = _React$useState3[0], setLeadingSeparatorProps = _React$useState3[1]; - var _React$useState4 = React75.useState({ + var _React$useState4 = React76.useState({ leadingItem: props.item, leadingSection: props.leadingSection, section: props.section, trailingItem: props.trailingItem, trailingSection: props.trailingSection }), separatorProps = _React$useState4[0], setSeparatorProps = _React$useState4[1]; - React75.useEffect(() => { + React76.useEffect(() => { setSelfHighlightCallback(cellKey, setSeparatorHighlighted); setSelfUpdatePropsCallback(cellKey, setSeparatorProps); return () => { @@ -18828,13 +18757,13 @@ var require_VirtualizedSectionList = __commonJS({ section, separators }); - var leadingSeparator = LeadingSeparatorComponent != null && /* @__PURE__ */ React75.createElement(LeadingSeparatorComponent, (0, _extends2.default)({ + var leadingSeparator = LeadingSeparatorComponent != null && /* @__PURE__ */ React76.createElement(LeadingSeparatorComponent, (0, _extends2.default)({ highlighted: leadingSeparatorHiglighted }, leadingSeparatorProps)); - var separator = SeparatorComponent != null && /* @__PURE__ */ React75.createElement(SeparatorComponent, (0, _extends2.default)({ + var separator = SeparatorComponent != null && /* @__PURE__ */ React76.createElement(SeparatorComponent, (0, _extends2.default)({ highlighted: separatorHighlighted }, separatorProps)); - return leadingSeparator || separator ? /* @__PURE__ */ React75.createElement(_View.default, null, inverted === false ? leadingSeparator : separator, element, inverted === false ? separator : leadingSeparator) : element; + return leadingSeparator || separator ? /* @__PURE__ */ React76.createElement(_View.default, null, inverted === false ? leadingSeparator : separator, element, inverted === false ? separator : leadingSeparator) : element; } __name(ItemWithSeparator, "ItemWithSeparator"); var _default = exports2.default = VirtualizedSectionList; @@ -18853,10 +18782,10 @@ var require_SectionList = __commonJS({ var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); var _Platform = _interopRequireDefault(require_Platform()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _VirtualizedSectionList = _interopRequireDefault(require_VirtualizedSectionList()); var _excluded = ["stickySectionHeadersEnabled"]; - var SectionList = class extends React75.PureComponent { + var SectionList = class extends React76.PureComponent { static { __name(this, "SectionList"); } @@ -18917,7 +18846,7 @@ var require_SectionList = __commonJS({ render() { var _this$props = this.props, _stickySectionHeadersEnabled = _this$props.stickySectionHeadersEnabled, restProps = (0, _objectWithoutPropertiesLoose2.default)(_this$props, _excluded); var stickySectionHeadersEnabled = _stickySectionHeadersEnabled !== null && _stickySectionHeadersEnabled !== void 0 ? _stickySectionHeadersEnabled : _Platform.default.OS === "ios"; - return /* @__PURE__ */ React75.createElement(_VirtualizedSectionList.default, (0, _extends2.default)({}, restProps, { + return /* @__PURE__ */ React76.createElement(_VirtualizedSectionList.default, (0, _extends2.default)({}, restProps, { stickySectionHeadersEnabled, ref: this._captureRef, getItemCount: /* @__PURE__ */ __name((items) => items.length, "getItemCount"), @@ -18953,10 +18882,10 @@ var require_AnimatedSectionList = __commonJS({ exports2.__esModule = true; exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _SectionList = _interopRequireDefault(require_SectionList2()); var _createAnimatedComponent = _interopRequireDefault(require_createAnimatedComponent()); - var SectionListWithEventThrottle = /* @__PURE__ */ React75.forwardRef((props, ref) => /* @__PURE__ */ React75.createElement(_SectionList.default, (0, _extends2.default)({ + var SectionListWithEventThrottle = /* @__PURE__ */ React76.forwardRef((props, ref) => /* @__PURE__ */ React76.createElement(_SectionList.default, (0, _extends2.default)({ scrollEventThrottle: 1e-4 }, props, { ref @@ -18977,7 +18906,7 @@ var require_Text = __commonJS({ exports2.default = void 0; var _objectSpread2 = _interopRequireDefault(require_objectSpread2()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _createElement = _interopRequireDefault(require_createElement()); var forwardedProps = _interopRequireWildcard(require_forwardedProps()); var _pick = _interopRequireDefault(require_pick()); @@ -18995,10 +18924,10 @@ var require_Text = __commonJS({ pointerEvents: true }); var pickProps = /* @__PURE__ */ __name((props) => (0, _pick.default)(props, forwardPropsList), "pickProps"); - var Text5 = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var Text5 = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var hrefAttrs = props.hrefAttrs, numberOfLines = props.numberOfLines, onClick = props.onClick, onLayout = props.onLayout, onPress = props.onPress, onMoveShouldSetResponder = props.onMoveShouldSetResponder, onMoveShouldSetResponderCapture = props.onMoveShouldSetResponderCapture, onResponderEnd = props.onResponderEnd, onResponderGrant = props.onResponderGrant, onResponderMove = props.onResponderMove, onResponderReject = props.onResponderReject, onResponderRelease = props.onResponderRelease, onResponderStart = props.onResponderStart, onResponderTerminate = props.onResponderTerminate, onResponderTerminationRequest = props.onResponderTerminationRequest, onScrollShouldSetResponder = props.onScrollShouldSetResponder, onScrollShouldSetResponderCapture = props.onScrollShouldSetResponderCapture, onSelectionChangeShouldSetResponder = props.onSelectionChangeShouldSetResponder, onSelectionChangeShouldSetResponderCapture = props.onSelectionChangeShouldSetResponderCapture, onStartShouldSetResponder = props.onStartShouldSetResponder, onStartShouldSetResponderCapture = props.onStartShouldSetResponderCapture, selectable = props.selectable, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); - var hasTextAncestor = React75.useContext(_TextAncestorContext.default); - var hostRef = React75.useRef(null); + var hasTextAncestor = React76.useContext(_TextAncestorContext.default); + var hostRef = React76.useRef(null); var _useLocaleContext = (0, _useLocale.useLocaleContext)(), contextDirection = _useLocaleContext.direction; (0, _useElementLayout.default)(hostRef, onLayout); (0, _useResponderEvents.default)(hostRef, { @@ -19019,7 +18948,7 @@ var require_Text = __commonJS({ onStartShouldSetResponder, onStartShouldSetResponderCapture }); - var handleClick = React75.useCallback((e) => { + var handleClick = React76.useCallback((e) => { if (onClick != null) { onClick(e); } else if (onPress != null) { @@ -19063,7 +18992,7 @@ var require_Text = __commonJS({ var element = (0, _createElement.default)(component, supportedProps, { writingDirection }); - return hasTextAncestor ? element : /* @__PURE__ */ React75.createElement(_TextAncestorContext.default.Provider, { + return hasTextAncestor ? element : /* @__PURE__ */ React76.createElement(_TextAncestorContext.default.Provider, { value: true }, element); }); @@ -19103,7 +19032,7 @@ var require_Text = __commonJS({ textMultiLine: { display: "-webkit-box", maxWidth: "100%", - overflow: "hidden", + overflow: "clip", textOverflow: "ellipsis", WebkitBoxOrient: "vertical" }, @@ -19130,7 +19059,7 @@ var require_AnimatedText = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _Text = _interopRequireDefault(require_Text()); var _createAnimatedComponent = _interopRequireDefault(require_createAnimatedComponent()); var _default = exports2.default = (0, _createAnimatedComponent.default)(_Text.default); @@ -19146,7 +19075,7 @@ var require_AnimatedView = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _View = _interopRequireDefault(require_View()); var _createAnimatedComponent = _interopRequireDefault(require_createAnimatedComponent()); var _default = exports2.default = (0, _createAnimatedComponent.default)(_View.default); @@ -21605,23 +21534,23 @@ var require_AppContainer = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); - var RootTagContext = /* @__PURE__ */ React75.createContext(null); - var AppContainer = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var RootTagContext = /* @__PURE__ */ React76.createContext(null); + var AppContainer = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var children = props.children, WrapperComponent = props.WrapperComponent; - var innerView = /* @__PURE__ */ React75.createElement(_View.default, { + var innerView = /* @__PURE__ */ React76.createElement(_View.default, { children, key: 1, style: styles.appContainer }); if (WrapperComponent) { - innerView = /* @__PURE__ */ React75.createElement(WrapperComponent, null, innerView); + innerView = /* @__PURE__ */ React76.createElement(WrapperComponent, null, innerView); } - return /* @__PURE__ */ React75.createElement(RootTagContext.Provider, { + return /* @__PURE__ */ React76.createElement(RootTagContext.Provider, { value: props.rootTag - }, /* @__PURE__ */ React75.createElement(_View.default, { + }, /* @__PURE__ */ React76.createElement(_View.default, { ref: forwardedRef, style: styles.appContainer }, innerView)); @@ -21654,8 +21583,8 @@ var require_renderApplication = __commonJS({ var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _react = _interopRequireDefault(require("react")); function renderApplication(RootComponent, WrapperComponent, callback, options) { - var shouldHydrate = options.hydrate, initialProps = options.initialProps, mode = options.mode, rootTag = options.rootTag; - var renderFn = shouldHydrate ? mode === "concurrent" ? _render.hydrate : _render.hydrateLegacy : mode === "concurrent" ? _render.render : _render.default; + var shouldHydrate = options.hydrate, initialProps = options.initialProps, rootTag = options.rootTag; + var renderFn = shouldHydrate ? _render.hydrate : _render.default; (0, _invariant.default)(rootTag, "Expect to have a valid rootTag, instead got ", rootTag); return renderFn(/* @__PURE__ */ _react.default.createElement(_AppContainer.default, { WrapperComponent, @@ -22725,11 +22654,11 @@ var require_ActivityIndicator = __commonJS({ exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); var _excluded = ["animating", "color", "hidesWhenStopped", "size", "style"]; - var createSvgCircle = /* @__PURE__ */ __name((style) => /* @__PURE__ */ React75.createElement("circle", { + var createSvgCircle = /* @__PURE__ */ __name((style) => /* @__PURE__ */ React76.createElement("circle", { cx: "16", cy: "16", fill: "none", @@ -22737,9 +22666,9 @@ var require_ActivityIndicator = __commonJS({ strokeWidth: "4", style }), "createSvgCircle"); - var ActivityIndicator2 = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var ActivityIndicator2 = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var _props$animating = props.animating, animating = _props$animating === void 0 ? true : _props$animating, _props$color = props.color, color = _props$color === void 0 ? "#1976D2" : _props$color, _props$hidesWhenStopp = props.hidesWhenStopped, hidesWhenStopped = _props$hidesWhenStopp === void 0 ? true : _props$hidesWhenStopp, _props$size = props.size, size4 = _props$size === void 0 ? "small" : _props$size, style = props.style, other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); - var svg = /* @__PURE__ */ React75.createElement("svg", { + var svg = /* @__PURE__ */ React76.createElement("svg", { height: "100%", viewBox: "0 0 32 32", width: "100%" @@ -22751,13 +22680,13 @@ var require_ActivityIndicator = __commonJS({ strokeDasharray: 80, strokeDashoffset: 60 })); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, other, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, other, { "aria-valuemax": 1, "aria-valuemin": 0, ref: forwardedRef, role: "progressbar", style: [styles.container, style] - }), /* @__PURE__ */ React75.createElement(_View.default, { + }), /* @__PURE__ */ React76.createElement(_View.default, { children: svg, style: [typeof size4 === "number" ? { height: size4, @@ -23236,14 +23165,14 @@ var require_TouchableOpacity = __commonJS({ var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); var _react = _interopRequireWildcard(require("react")); - var React75 = _react; + var React76 = _react; var _useMergeRefs = _interopRequireDefault(require_useMergeRefs()); var _usePressEvents = _interopRequireDefault(require_usePressEvents()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); var _excluded = ["activeOpacity", "delayPressIn", "delayPressOut", "delayLongPress", "disabled", "focusable", "onLongPress", "onPress", "onPressIn", "onPressOut", "rejectResponderTermination", "style"]; function TouchableOpacity(props, forwardedRef) { - var activeOpacity = props.activeOpacity, delayPressIn = props.delayPressIn, delayPressOut = props.delayPressOut, delayLongPress = props.delayLongPress, disabled = props.disabled, focusable = props.focusable, onLongPress = props.onLongPress, onPress = props.onPress, onPressIn = props.onPressIn, onPressOut = props.onPressOut, rejectResponderTermination = props.rejectResponderTermination, style = props.style, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); + var activeOpacity = props.activeOpacity, delayPressIn = props.delayPressIn, delayPressOut = props.delayPressOut, delayLongPress = props.delayLongPress, disabled = props.disabled, focusable2 = props.focusable, onLongPress = props.onLongPress, onPress = props.onPress, onPressIn = props.onPressIn, onPressOut = props.onPressOut, rejectResponderTermination = props.rejectResponderTermination, style = props.style, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); var hostRef = (0, _react.useRef)(null); var setRef2 = (0, _useMergeRefs.default)(forwardedRef, hostRef); var _useState = (0, _react.useState)("0s"), duration = _useState[0], setDuration = _useState[1]; @@ -23281,9 +23210,9 @@ var require_TouchableOpacity = __commonJS({ } }), [delayLongPress, delayPressIn, delayPressOut, disabled, onLongPress, onPress, onPressIn, onPressOut, rejectResponderTermination, setOpacityActive, setOpacityInactive]); var pressEventHandlers = (0, _usePressEvents.default)(hostRef, pressConfig); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, rest, pressEventHandlers, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, rest, pressEventHandlers, { accessibilityDisabled: disabled, - focusable: !disabled && focusable !== false, + focusable: !disabled && focusable2 !== false, pointerEvents: disabled ? "box-none" : void 0, ref: setRef2, style: [styles.root, !disabled && styles.actionable, style, opacityOverride != null && { @@ -23305,7 +23234,7 @@ var require_TouchableOpacity = __commonJS({ touchAction: "manipulation" } }); - var MemoedTouchableOpacity = /* @__PURE__ */ React75.memo(/* @__PURE__ */ React75.forwardRef(TouchableOpacity)); + var MemoedTouchableOpacity = /* @__PURE__ */ React76.memo(/* @__PURE__ */ React76.forwardRef(TouchableOpacity)); MemoedTouchableOpacity.displayName = "TouchableOpacity"; var _default = exports2.default = MemoedTouchableOpacity; module2.exports = exports2.default; @@ -23320,13 +23249,13 @@ var require_Button = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _TouchableOpacity = _interopRequireDefault(require_TouchableOpacity()); var _Text = _interopRequireDefault(require_Text()); - var Button = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var Button = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var accessibilityLabel = props.accessibilityLabel, color = props.color, disabled = props.disabled, onPress = props.onPress, testID = props.testID, title = props.title; - return /* @__PURE__ */ React75.createElement(_TouchableOpacity.default, { + return /* @__PURE__ */ React76.createElement(_TouchableOpacity.default, { accessibilityLabel, accessibilityRole: "button", disabled, @@ -23337,7 +23266,7 @@ var require_Button = __commonJS({ backgroundColor: color }, disabled && styles.buttonDisabled], testID - }, /* @__PURE__ */ React75.createElement(_Text.default, { + }, /* @__PURE__ */ React76.createElement(_Text.default, { style: [styles.text, disabled && styles.textDisabled] }, title)); }); @@ -23378,12 +23307,12 @@ var require_CheckBox = __commonJS({ var _objectSpread2 = _interopRequireDefault(require_objectSpread2()); var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _createElement = _interopRequireDefault(require_createElement()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); var _excluded = ["aria-readonly", "color", "disabled", "onChange", "onValueChange", "readOnly", "style", "value"]; - var CheckBox = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var CheckBox = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var ariaReadOnly = props["aria-readonly"], color = props.color, disabled = props.disabled, onChange = props.onChange, onValueChange = props.onValueChange, readOnly = props.readOnly, style = props.style, value = props.value, other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); function handleChange(event) { var value2 = event.nativeEvent.target.checked; @@ -23392,7 +23321,7 @@ var require_CheckBox = __commonJS({ onValueChange && onValueChange(value2); } __name(handleChange, "handleChange"); - var fakeControl = /* @__PURE__ */ React75.createElement(_View.default, { + var fakeControl = /* @__PURE__ */ React76.createElement(_View.default, { style: [ styles.fakeControl, value && styles.fakeControlChecked, @@ -23414,7 +23343,7 @@ var require_CheckBox = __commonJS({ style: [styles.nativeControl, styles.cursorInherit], type: "checkbox" }); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, other, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, other, { "aria-disabled": disabled, "aria-readonly": ariaReadOnly, style: [styles.root, style, disabled && styles.cursorDefault] @@ -23482,7 +23411,7 @@ var require_ImageBackground = __commonJS({ var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); var _react = _interopRequireWildcard(require("react")); - var React75 = _react; + var React76 = _react; var _Image = _interopRequireDefault(require_Image()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); @@ -23491,10 +23420,10 @@ var require_ImageBackground = __commonJS({ var ImageBackground = /* @__PURE__ */ (0, _react.forwardRef)((props, forwardedRef) => { var children = props.children, _props$style = props.style, style = _props$style === void 0 ? emptyObject : _props$style, imageStyle = props.imageStyle, imageRef = props.imageRef, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); var _StyleSheet$flatten = _StyleSheet.default.flatten(style), height = _StyleSheet$flatten.height, width = _StyleSheet$flatten.width; - return /* @__PURE__ */ React75.createElement(_View.default, { + return /* @__PURE__ */ React76.createElement(_View.default, { ref: forwardedRef, style - }, /* @__PURE__ */ React75.createElement(_Image.default, (0, _extends2.default)({}, rest, { + }, /* @__PURE__ */ React76.createElement(_Image.default, (0, _extends2.default)({}, rest, { ref: imageRef, style: [{ // Temporary Workaround: @@ -23527,10 +23456,10 @@ var require_KeyboardAvoidingView = __commonJS({ exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _View = _interopRequireDefault(require_View()); var _excluded = ["behavior", "contentContainerStyle", "keyboardVerticalOffset"]; - var KeyboardAvoidingView = class extends React75.Component { + var KeyboardAvoidingView = class extends React76.Component { static { __name(this, "KeyboardAvoidingView"); } @@ -23553,7 +23482,7 @@ var require_KeyboardAvoidingView = __commonJS({ } render() { var _this$props = this.props, behavior = _this$props.behavior, contentContainerStyle = _this$props.contentContainerStyle, keyboardVerticalOffset = _this$props.keyboardVerticalOffset, rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, _excluded); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({ + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({ onLayout: this.onLayout }, rest)); } @@ -23571,12 +23500,12 @@ var require_ModalPortal = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _canUseDom = _interopRequireDefault(require_canUseDom()); function ModalPortal(props) { var children = props.children; - var elementRef = React75.useRef(null); + var elementRef = React76.useRef(null); if (_canUseDom.default && !elementRef.current) { var element = document.createElement("div"); if (element && document.body) { @@ -23584,7 +23513,7 @@ var require_ModalPortal = __commonJS({ elementRef.current = element; } } - React75.useEffect(() => { + React76.useEffect(() => { if (_canUseDom.default) { return () => { if (document.body && elementRef.current) { @@ -23610,7 +23539,7 @@ var require_ModalAnimation = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _createElement = _interopRequireDefault(require_createElement()); var ANIMATION_DURATION = 300; @@ -23626,11 +23555,11 @@ var require_ModalAnimation = __commonJS({ __name(getAnimationStyle, "getAnimationStyle"); function ModalAnimation(props) { var animationType = props.animationType, children = props.children, onDismiss = props.onDismiss, onShow = props.onShow, visible = props.visible; - var _React$useState = React75.useState(false), isRendering = _React$useState[0], setIsRendering = _React$useState[1]; - var wasVisible = React75.useRef(false); - var wasRendering = React75.useRef(false); + var _React$useState = React76.useState(false), isRendering = _React$useState[0], setIsRendering = _React$useState[1]; + var wasVisible = React76.useRef(false); + var wasRendering = React76.useRef(false); var isAnimated = animationType && animationType !== "none"; - var animationEndCallback = React75.useCallback((e) => { + var animationEndCallback = React76.useCallback((e) => { if (e && e.currentTarget !== e.target) { return; } @@ -23642,13 +23571,13 @@ var require_ModalAnimation = __commonJS({ setIsRendering(false); } }, [onShow, visible]); - React75.useEffect(() => { + React76.useEffect(() => { if (wasRendering.current && !isRendering && onDismiss) { onDismiss(); } wasRendering.current = isRendering; }, [isRendering, onDismiss]); - React75.useEffect(() => { + React76.useEffect(() => { if (visible) { setIsRendering(true); } @@ -23749,14 +23678,14 @@ var require_ModalContent = __commonJS({ exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _View = _interopRequireDefault(require_View()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _canUseDom = _interopRequireDefault(require_canUseDom()); var _excluded = ["active", "children", "onRequestClose", "transparent"]; - var ModalContent = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var ModalContent = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var active = props.active, children = props.children, onRequestClose = props.onRequestClose, transparent = props.transparent, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); - React75.useEffect(() => { + React76.useEffect(() => { if (_canUseDom.default) { var closeOnEscape = /* @__PURE__ */ __name((e) => { if (active && e.key === "Escape") { @@ -23770,15 +23699,15 @@ var require_ModalContent = __commonJS({ return () => document.removeEventListener("keyup", closeOnEscape, false); } }, [active, onRequestClose]); - var style = React75.useMemo(() => { + var style = React76.useMemo(() => { return [styles.modal, transparent ? styles.modalTransparent : styles.modalOpaque]; }, [transparent]); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, rest, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, rest, { "aria-modal": true, ref: forwardedRef, role: active ? "dialog" : null, style - }), /* @__PURE__ */ React75.createElement(_View.default, { + }), /* @__PURE__ */ React76.createElement(_View.default, { style: styles.container }, children)); }); @@ -23814,7 +23743,7 @@ var require_ModalFocusTrap = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _View = _interopRequireDefault(require_View()); var _createElement = _interopRequireDefault(require_createElement()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); @@ -23860,12 +23789,12 @@ var require_ModalFocusTrap = __commonJS({ __name(focusLastDescendant, "focusLastDescendant"); var ModalFocusTrap = /* @__PURE__ */ __name((_ref) => { var active = _ref.active, children = _ref.children; - var trapElementRef = React75.useRef(); - var focusRef = React75.useRef({ + var trapElementRef = React76.useRef(); + var focusRef = React76.useRef({ trapFocusInProgress: false, lastFocusedElement: null }); - React75.useEffect(() => { + React76.useEffect(() => { if (_canUseDom.default) { var trapFocus = /* @__PURE__ */ __name(() => { if (trapElementRef.current == null || focusRef.current.trapFocusInProgress || !active) { @@ -23892,7 +23821,7 @@ var require_ModalFocusTrap = __commonJS({ return () => document.removeEventListener("focus", trapFocus, true); } }, [active]); - React75.useEffect(function() { + React76.useEffect(function() { if (_canUseDom.default) { var lastFocusedElementOutsideTrap = document.activeElement; return function() { @@ -23902,9 +23831,9 @@ var require_ModalFocusTrap = __commonJS({ }; } }, []); - return /* @__PURE__ */ React75.createElement(React75.Fragment, null, /* @__PURE__ */ React75.createElement(FocusBracket, null), /* @__PURE__ */ React75.createElement(_View.default, { + return /* @__PURE__ */ React76.createElement(React76.Fragment, null, /* @__PURE__ */ React76.createElement(FocusBracket, null), /* @__PURE__ */ React76.createElement(_View.default, { ref: trapElementRef - }, children), /* @__PURE__ */ React75.createElement(FocusBracket, null)); + }, children), /* @__PURE__ */ React76.createElement(FocusBracket, null)); }, "ModalFocusTrap"); var _default = exports2.default = ModalFocusTrap; var styles = _StyleSheet.default.create({ @@ -23927,7 +23856,7 @@ var require_Modal = __commonJS({ exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _ModalPortal = _interopRequireDefault(require_ModalPortal()); var _ModalAnimation = _interopRequireDefault(require_ModalAnimation()); var _ModalContent = _interopRequireDefault(require_ModalContent()); @@ -23967,33 +23896,33 @@ var require_Modal = __commonJS({ notifyActiveModalListeners(); } __name(addActiveModal, "addActiveModal"); - var Modal = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var Modal = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var animationType = props.animationType, children = props.children, onDismiss = props.onDismiss, onRequestClose = props.onRequestClose, onShow = props.onShow, transparent = props.transparent, _props$visible = props.visible, visible = _props$visible === void 0 ? true : _props$visible, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); - var modalId = React75.useMemo(() => uniqueModalIdentifier++, []); - var _React$useState = React75.useState(false), isActive = _React$useState[0], setIsActive = _React$useState[1]; - var onDismissCallback = React75.useCallback(() => { + var modalId = React76.useMemo(() => uniqueModalIdentifier++, []); + var _React$useState = React76.useState(false), isActive = _React$useState[0], setIsActive = _React$useState[1]; + var onDismissCallback = React76.useCallback(() => { removeActiveModal(modalId); if (onDismiss) { onDismiss(); } }, [modalId, onDismiss]); - var onShowCallback = React75.useCallback(() => { + var onShowCallback = React76.useCallback(() => { addActiveModal(modalId, setIsActive); if (onShow) { onShow(); } }, [modalId, onShow]); - React75.useEffect(() => { + React76.useEffect(() => { return () => removeActiveModal(modalId); }, [modalId]); - return /* @__PURE__ */ React75.createElement(_ModalPortal.default, null, /* @__PURE__ */ React75.createElement(_ModalAnimation.default, { + return /* @__PURE__ */ React76.createElement(_ModalPortal.default, null, /* @__PURE__ */ React76.createElement(_ModalAnimation.default, { animationType, onDismiss: onDismissCallback, onShow: onShowCallback, visible - }, /* @__PURE__ */ React75.createElement(_ModalFocusTrap.default, { + }, /* @__PURE__ */ React76.createElement(_ModalFocusTrap.default, { active: isActive - }, /* @__PURE__ */ React75.createElement(_ModalContent.default, (0, _extends2.default)({}, rest, { + }, /* @__PURE__ */ React76.createElement(_ModalContent.default, (0, _extends2.default)({}, rest, { active: isActive, onRequestClose, ref: forwardedRef, @@ -24041,16 +23970,16 @@ var require_Picker = __commonJS({ exports2.default = void 0; var _objectSpread2 = _interopRequireDefault(require_objectSpread2()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _createElement = _interopRequireDefault(require_createElement()); var _useMergeRefs = _interopRequireDefault(require_useMergeRefs()); var _usePlatformMethods = _interopRequireDefault(require_usePlatformMethods()); var _PickerItem = _interopRequireDefault(require_PickerItem()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _excluded = ["children", "enabled", "onValueChange", "selectedValue", "style", "testID", "itemStyle", "mode", "prompt"]; - var Picker = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var Picker = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var children = props.children, enabled = props.enabled, onValueChange = props.onValueChange, selectedValue = props.selectedValue, style = props.style, testID = props.testID, itemStyle = props.itemStyle, mode = props.mode, prompt = props.prompt, other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); - var hostRef = React75.useRef(null); + var hostRef = React76.useRef(null); function handleChange(e) { var _e$target = e.target, selectedIndex = _e$target.selectedIndex, value = _e$target.value; if (onValueChange) { @@ -24511,7 +24440,7 @@ var require_Pressable = __commonJS({ var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); var _react = _interopRequireWildcard(require("react")); - var React75 = _react; + var React76 = _react; var _useMergeRefs = _interopRequireDefault(require_useMergeRefs()); var _useHover = _interopRequireDefault(require_useHover()); var _usePressEvents = _interopRequireDefault(require_usePressEvents()); @@ -24551,7 +24480,7 @@ var require_Pressable = __commonJS({ focused, pressed }; - var blurHandler = React75.useCallback((e) => { + var blurHandler = React76.useCallback((e) => { if (e.nativeEvent.target === hostRef.current) { setFocused(false); if (onBlur != null) { @@ -24559,7 +24488,7 @@ var require_Pressable = __commonJS({ } } }, [hostRef, setFocused, onBlur]); - var focusHandler = React75.useCallback((e) => { + var focusHandler = React76.useCallback((e) => { if (e.nativeEvent.target === hostRef.current) { setFocused(true); if (onFocus != null) { @@ -24567,7 +24496,7 @@ var require_Pressable = __commonJS({ } } }, [hostRef, setFocused, onFocus]); - var contextMenuHandler = React75.useCallback((e) => { + var contextMenuHandler = React76.useCallback((e) => { if (onContextMenuPress != null) { onContextMenuPress(e); } @@ -24575,7 +24504,7 @@ var require_Pressable = __commonJS({ onContextMenu(e); } }, [onContextMenu, onContextMenuPress]); - var keyDownHandler = React75.useCallback((e) => { + var keyDownHandler = React76.useCallback((e) => { if (onKeyDownPress != null) { onKeyDownPress(e); } @@ -24589,7 +24518,7 @@ var require_Pressable = __commonJS({ } else { _tabIndex = disabled ? -1 : 0; } - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, rest, pressEventHandlers, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, rest, pressEventHandlers, { "aria-disabled": disabled, onBlur: blurHandler, onContextMenu: contextMenuHandler, @@ -24633,15 +24562,15 @@ var require_ProgressBar = __commonJS({ exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); var _excluded = ["color", "indeterminate", "progress", "trackColor", "style"]; - var ProgressBar = /* @__PURE__ */ React75.forwardRef((props, ref) => { + var ProgressBar = /* @__PURE__ */ React76.forwardRef((props, ref) => { var _props$color = props.color, color = _props$color === void 0 ? "#1976D2" : _props$color, _props$indeterminate = props.indeterminate, indeterminate = _props$indeterminate === void 0 ? false : _props$indeterminate, _props$progress = props.progress, progress = _props$progress === void 0 ? 0 : _props$progress, _props$trackColor = props.trackColor, trackColor = _props$trackColor === void 0 ? "transparent" : _props$trackColor, style = props.style, other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); var percentageProgress = progress * 100; var width = indeterminate ? "25%" : percentageProgress + "%"; - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, other, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, other, { "aria-valuemax": 100, "aria-valuemin": 0, "aria-valuenow": indeterminate ? null : percentageProgress, @@ -24650,7 +24579,7 @@ var require_ProgressBar = __commonJS({ style: [styles.track, style, { backgroundColor: trackColor }] - }), /* @__PURE__ */ React75.createElement(_View.default, { + }), /* @__PURE__ */ React76.createElement(_View.default, { style: [{ backgroundColor: color, width @@ -24700,7 +24629,7 @@ var require_SafeAreaView = __commonJS({ exports2.default = void 0; var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); var _View = _interopRequireDefault(require_View()); var _canUseDom = _interopRequireDefault(require_canUseDom()); @@ -24711,9 +24640,9 @@ var require_SafeAreaView = __commonJS({ } return "env"; }(); - var SafeAreaView = /* @__PURE__ */ React75.forwardRef((props, ref) => { + var SafeAreaView = /* @__PURE__ */ React76.forwardRef((props, ref) => { var style = props.style, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, rest, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, rest, { ref, style: [styles.root, style] })); @@ -24791,7 +24720,7 @@ var require_Switch = __commonJS({ var _objectSpread2 = _interopRequireDefault(require_objectSpread2()); var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _createElement = _interopRequireDefault(require_createElement()); var _multiplyStyleLengthValue = _interopRequireDefault(require_multiplyStyleLengthValue()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); @@ -24806,9 +24735,9 @@ var require_Switch = __commonJS({ var defaultActiveThumbColor = "#009688"; var defaultThumbColor = "#FAFAFA"; var defaultDisabledThumbColor = "#BDBDBD"; - var Switch2 = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var Switch2 = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var ariaLabel = props["aria-label"], accessibilityLabel = props.accessibilityLabel, activeThumbColor = props.activeThumbColor, activeTrackColor = props.activeTrackColor, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, onValueChange = props.onValueChange, _props$style = props.style, style = _props$style === void 0 ? emptyObject : _props$style, thumbColor = props.thumbColor, trackColor = props.trackColor, _props$value = props.value, value = _props$value === void 0 ? false : _props$value, other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); - var thumbRef = React75.useRef(null); + var thumbRef = React76.useRef(null); function handleChange(event) { if (onValueChange != null) { onValueChange(event.nativeEvent.target.checked); @@ -24902,11 +24831,11 @@ var require_Switch = __commonJS({ type: "checkbox", role: "switch" }); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, other, { + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, other, { style: rootStyle - }), /* @__PURE__ */ React75.createElement(_View.default, { + }), /* @__PURE__ */ React76.createElement(_View.default, { style: trackStyle - }), /* @__PURE__ */ React75.createElement(_View.default, { + }), /* @__PURE__ */ React76.createElement(_View.default, { ref: thumbRef, style: thumbStyle }), nativeControl); @@ -24965,7 +24894,7 @@ var require_TextInput = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = void 0; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _createElement = _interopRequireDefault(require_createElement()); var forwardedProps = _interopRequireWildcard(require_forwardedProps()); var _pick = _interopRequireDefault(require_pick()); @@ -25016,7 +24945,7 @@ var require_TextInput = __commonJS({ } __name(isEventComposing, "isEventComposing"); var focusTimeout = null; - var TextInput2 = /* @__PURE__ */ React75.forwardRef((props, forwardedRef) => { + var TextInput2 = /* @__PURE__ */ React76.forwardRef((props, forwardedRef) => { var _props$autoCapitalize = props.autoCapitalize, autoCapitalize = _props$autoCapitalize === void 0 ? "sentences" : _props$autoCapitalize, autoComplete = props.autoComplete, autoCompleteType = props.autoCompleteType, _props$autoCorrect = props.autoCorrect, autoCorrect = _props$autoCorrect === void 0 ? true : _props$autoCorrect, blurOnSubmit = props.blurOnSubmit, caretHidden = props.caretHidden, clearTextOnFocus = props.clearTextOnFocus, dir = props.dir, editable = props.editable, enterKeyHint = props.enterKeyHint, inputMode = props.inputMode, keyboardType = props.keyboardType, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, numberOfLines = props.numberOfLines, onBlur = props.onBlur, onChange = props.onChange, onChangeText = props.onChangeText, onContentSizeChange = props.onContentSizeChange, onFocus = props.onFocus, onKeyPress = props.onKeyPress, onLayout = props.onLayout, onMoveShouldSetResponder = props.onMoveShouldSetResponder, onMoveShouldSetResponderCapture = props.onMoveShouldSetResponderCapture, onResponderEnd = props.onResponderEnd, onResponderGrant = props.onResponderGrant, onResponderMove = props.onResponderMove, onResponderReject = props.onResponderReject, onResponderRelease = props.onResponderRelease, onResponderStart = props.onResponderStart, onResponderTerminate = props.onResponderTerminate, onResponderTerminationRequest = props.onResponderTerminationRequest, onScrollShouldSetResponder = props.onScrollShouldSetResponder, onScrollShouldSetResponderCapture = props.onScrollShouldSetResponderCapture, onSelectionChange = props.onSelectionChange, onSelectionChangeShouldSetResponder = props.onSelectionChangeShouldSetResponder, onSelectionChangeShouldSetResponderCapture = props.onSelectionChangeShouldSetResponderCapture, onStartShouldSetResponder = props.onStartShouldSetResponder, onStartShouldSetResponderCapture = props.onStartShouldSetResponderCapture, onSubmitEditing = props.onSubmitEditing, placeholderTextColor = props.placeholderTextColor, _props$readOnly = props.readOnly, readOnly = _props$readOnly === void 0 ? false : _props$readOnly, returnKeyType = props.returnKeyType, rows = props.rows, _props$secureTextEntr = props.secureTextEntry, secureTextEntry = _props$secureTextEntr === void 0 ? false : _props$secureTextEntr, selection = props.selection, selectTextOnFocus = props.selectTextOnFocus, showSoftInputOnFocus = props.showSoftInputOnFocus, spellCheck = props.spellCheck; var type; var _inputMode; @@ -25062,20 +24991,20 @@ var require_TextInput = __commonJS({ if (secureTextEntry) { type = "password"; } - var dimensions = React75.useRef({ + var dimensions = React76.useRef({ height: null, width: null }); - var hostRef = React75.useRef(null); - var prevSelection = React75.useRef(null); - var prevSecureTextEntry = React75.useRef(false); - React75.useEffect(() => { + var hostRef = React76.useRef(null); + var prevSelection = React76.useRef(null); + var prevSecureTextEntry = React76.useRef(false); + React76.useEffect(() => { if (hostRef.current && prevSelection.current) { setSelection(hostRef.current, prevSelection.current); } prevSecureTextEntry.current = secureTextEntry; }, [secureTextEntry]); - var handleContentSizeChange = React75.useCallback((hostNode) => { + var handleContentSizeChange = React76.useCallback((hostNode) => { if (multiline && onContentSizeChange && hostNode != null) { var newHeight = hostNode.scrollHeight; var newWidth = hostNode.scrollWidth; @@ -25093,7 +25022,7 @@ var require_TextInput = __commonJS({ } } }, [multiline, onContentSizeChange]); - var imperativeRef = React75.useMemo(() => (hostNode) => { + var imperativeRef = React76.useMemo(() => (hostNode) => { if (hostNode != null) { hostNode.clear = function() { if (hostNode != null) { @@ -26010,7 +25939,7 @@ var require_TouchableHighlight = __commonJS({ var _extends2 = _interopRequireDefault(require_extends()); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require_objectWithoutPropertiesLoose()); var _react = _interopRequireWildcard(require("react")); - var React75 = _react; + var React76 = _react; var _useMergeRefs = _interopRequireDefault(require_useMergeRefs()); var _usePressEvents = _interopRequireDefault(require_usePressEvents()); var _StyleSheet = _interopRequireDefault(require_StyleSheet()); @@ -26032,7 +25961,7 @@ var require_TouchableHighlight = __commonJS({ } __name(hasPressHandler, "hasPressHandler"); function TouchableHighlight(props, forwardedRef) { - var activeOpacity = props.activeOpacity, children = props.children, delayPressIn = props.delayPressIn, delayPressOut = props.delayPressOut, delayLongPress = props.delayLongPress, disabled = props.disabled, focusable = props.focusable, onHideUnderlay = props.onHideUnderlay, onLongPress = props.onLongPress, onPress = props.onPress, onPressIn = props.onPressIn, onPressOut = props.onPressOut, onShowUnderlay = props.onShowUnderlay, rejectResponderTermination = props.rejectResponderTermination, style = props.style, testOnly_pressed = props.testOnly_pressed, underlayColor = props.underlayColor, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); + var activeOpacity = props.activeOpacity, children = props.children, delayPressIn = props.delayPressIn, delayPressOut = props.delayPressOut, delayLongPress = props.delayLongPress, disabled = props.disabled, focusable2 = props.focusable, onHideUnderlay = props.onHideUnderlay, onLongPress = props.onLongPress, onPress = props.onPress, onPressIn = props.onPressIn, onPressOut = props.onPressOut, onShowUnderlay = props.onShowUnderlay, rejectResponderTermination = props.rejectResponderTermination, style = props.style, testOnly_pressed = props.testOnly_pressed, underlayColor = props.underlayColor, rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); var hostRef = (0, _react.useRef)(null); var setRef2 = (0, _useMergeRefs.default)(forwardedRef, hostRef); var _useState = (0, _react.useState)(testOnly_pressed === true ? createExtraStyles(activeOpacity, underlayColor) : null), extraStyles = _useState[0], setExtraStyles = _useState[1]; @@ -26078,14 +26007,14 @@ var require_TouchableHighlight = __commonJS({ } }), [delayLongPress, delayPressIn, delayPressOut, disabled, onLongPress, onPress, onPressIn, onPressOut, rejectResponderTermination, showUnderlay, hideUnderlay]); var pressEventHandlers = (0, _usePressEvents.default)(hostRef, pressConfig); - var child = React75.Children.only(children); - return /* @__PURE__ */ React75.createElement(_View.default, (0, _extends2.default)({}, rest, pressEventHandlers, { + var child = React76.Children.only(children); + return /* @__PURE__ */ React76.createElement(_View.default, (0, _extends2.default)({}, rest, pressEventHandlers, { accessibilityDisabled: disabled, - focusable: !disabled && focusable !== false, + focusable: !disabled && focusable2 !== false, pointerEvents: disabled ? "box-none" : void 0, ref: setRef2, style: [styles.root, style, !disabled && styles.actionable, extraStyles && extraStyles.underlay] - }), /* @__PURE__ */ React75.cloneElement(child, { + }), /* @__PURE__ */ React76.cloneElement(child, { style: [child.props.style, extraStyles && extraStyles.child] })); } @@ -26099,7 +26028,7 @@ var require_TouchableHighlight = __commonJS({ touchAction: "manipulation" } }); - var MemoedTouchableHighlight = /* @__PURE__ */ React75.memo(/* @__PURE__ */ React75.forwardRef(TouchableHighlight)); + var MemoedTouchableHighlight = /* @__PURE__ */ React76.memo(/* @__PURE__ */ React76.forwardRef(TouchableHighlight)); MemoedTouchableHighlight.displayName = "TouchableHighlight"; var _default = exports2.default = MemoedTouchableHighlight; module2.exports = exports2.default; @@ -26158,7 +26087,7 @@ var require_TouchableWithoutFeedback = __commonJS({ exports2.__esModule = true; exports2.default = void 0; var _react = _interopRequireWildcard(require("react")); - var React75 = _react; + var React76 = _react; var _pick = _interopRequireDefault(require_pick()); var _useMergeRefs = _interopRequireDefault(require_useMergeRefs()); var _usePressEvents = _interopRequireDefault(require_usePressEvents()); @@ -26182,7 +26111,7 @@ var require_TouchableWithoutFeedback = __commonJS({ var pickProps = /* @__PURE__ */ __name((props) => (0, _pick.default)(props, forwardPropsList), "pickProps"); function TouchableWithoutFeedback(props, forwardedRef) { (0, _warnOnce.warnOnce)("TouchableWithoutFeedback", "TouchableWithoutFeedback is deprecated. Please use Pressable."); - var delayPressIn = props.delayPressIn, delayPressOut = props.delayPressOut, delayLongPress = props.delayLongPress, disabled = props.disabled, focusable = props.focusable, onLongPress = props.onLongPress, onPress = props.onPress, onPressIn = props.onPressIn, onPressOut = props.onPressOut, rejectResponderTermination = props.rejectResponderTermination; + var delayPressIn = props.delayPressIn, delayPressOut = props.delayPressOut, delayLongPress = props.delayLongPress, disabled = props.disabled, focusable2 = props.focusable, onLongPress = props.onLongPress, onPress = props.onPress, onPressIn = props.onPressIn, onPressOut = props.onPressOut, rejectResponderTermination = props.rejectResponderTermination; var hostRef = (0, _react.useRef)(null); var pressConfig = (0, _react.useMemo)(() => ({ cancelable: !rejectResponderTermination, @@ -26196,17 +26125,17 @@ var require_TouchableWithoutFeedback = __commonJS({ onPressEnd: onPressOut }), [disabled, delayPressIn, delayPressOut, delayLongPress, onLongPress, onPress, onPressIn, onPressOut, rejectResponderTermination]); var pressEventHandlers = (0, _usePressEvents.default)(hostRef, pressConfig); - var element = React75.Children.only(props.children); + var element = React76.Children.only(props.children); var children = [element.props.children]; var supportedProps = pickProps(props); supportedProps.accessibilityDisabled = disabled; - supportedProps.focusable = !disabled && focusable !== false; + supportedProps.focusable = !disabled && focusable2 !== false; supportedProps.ref = (0, _useMergeRefs.default)(forwardedRef, hostRef, element.ref); var elementProps = Object.assign(supportedProps, pressEventHandlers); - return /* @__PURE__ */ React75.cloneElement(element, elementProps, ...children); + return /* @__PURE__ */ React76.cloneElement(element, elementProps, ...children); } __name(TouchableWithoutFeedback, "TouchableWithoutFeedback"); - var MemoedTouchableWithoutFeedback = /* @__PURE__ */ React75.memo(/* @__PURE__ */ React75.forwardRef(TouchableWithoutFeedback)); + var MemoedTouchableWithoutFeedback = /* @__PURE__ */ React76.memo(/* @__PURE__ */ React76.forwardRef(TouchableWithoutFeedback)); MemoedTouchableWithoutFeedback.displayName = "TouchableWithoutFeedback"; var _default = exports2.default = MemoedTouchableWithoutFeedback; module2.exports = exports2.default; @@ -26290,11 +26219,11 @@ var require_useColorScheme = __commonJS({ var _interopRequireWildcard = require_interopRequireWildcard().default; exports2.__esModule = true; exports2.default = useColorScheme; - var React75 = _interopRequireWildcard(require("react")); + var React76 = _interopRequireWildcard(require("react")); var _Appearance = _interopRequireDefault(require_Appearance()); function useColorScheme() { - var _React$useState = React75.useState(_Appearance.default.getColorScheme()), colorScheme = _React$useState[0], setColorScheme = _React$useState[1]; - React75.useEffect(() => { + var _React$useState = React76.useState(_Appearance.default.getColorScheme()), colorScheme = _React$useState[0], setColorScheme = _React$useState[1]; + React76.useEffect(() => { function listener(appearance) { setColorScheme(appearance.colorScheme); } @@ -26771,7 +26700,7 @@ var require_dist = __commonJS({ return acc; }, []).concat(regularTabbables); }, "sortByOrder"); - var tabbable2 = /* @__PURE__ */ __name(function tabbable3(container, options) { + var tabbable3 = /* @__PURE__ */ __name(function tabbable4(container, options) { options = options || {}; var candidates; if (options.getShadowRoot) { @@ -26786,7 +26715,7 @@ var require_dist = __commonJS({ } return sortByOrder(candidates); }, "tabbable"); - var focusable = /* @__PURE__ */ __name(function focusable2(container, options) { + var focusable2 = /* @__PURE__ */ __name(function focusable3(container, options) { options = options || {}; var candidates; if (options.getShadowRoot) { @@ -26821,11 +26750,11 @@ var require_dist = __commonJS({ } return isNodeMatchingSelectorFocusable(options, node); }, "isFocusable"); - exports2.focusable = focusable; + exports2.focusable = focusable2; exports2.getTabIndex = getTabIndex; exports2.isFocusable = isFocusable; exports2.isTabbable = isTabbable2; - exports2.tabbable = tabbable2; + exports2.tabbable = tabbable3; } }); @@ -26873,8 +26802,8 @@ __export(esm_exports, { CheckboxIndicatorFrame: () => CheckboxIndicatorFrame, CheckboxStyledContext: () => CheckboxStyledContext, Circle: () => Circle, - ComponentContext: () => import_core56.ComponentContext, - Configuration: () => import_core56.Configuration, + ComponentContext: () => import_core58.ComponentContext, + Configuration: () => import_core58.Configuration, Dialog: () => Dialog, DialogClose: () => DialogClose, DialogContent: () => DialogContent, @@ -26888,7 +26817,7 @@ __export(esm_exports, { DialogWarningProvider: () => DialogWarningProvider, EnsureFlexed: () => EnsureFlexed, Fieldset: () => Fieldset, - FontLanguage: () => import_core56.FontLanguage, + FontLanguage: () => import_core58.FontLanguage, Footer: () => Footer, Form: () => Form2, FormFrame: () => FormFrame, @@ -26983,10 +26912,10 @@ __export(esm_exports, { SliderTrackActive: () => SliderTrackActive, SliderTrackActiveFrame: () => SliderTrackActiveFrame, SliderTrackFrame: () => SliderTrackFrame, - Spacer: () => import_core56.Spacer, + Spacer: () => import_core58.Spacer, Spinner: () => Spinner, Square: () => Square, - Stack: () => import_core56.Stack, + Stack: () => import_core58.Stack, StyleObjectIdentifier: () => StyleObjectIdentifier, StyleObjectProperty: () => StyleObjectProperty, StyleObjectPseudo: () => StyleObjectPseudo, @@ -26997,12 +26926,13 @@ __export(esm_exports, { SwitchFrame: () => SwitchFrame, SwitchStyledContext: () => SwitchStyledContext, SwitchThumb: () => SwitchThumb, - Tabs: () => Tabs2, + Tabs: () => Tabs, + TabsProvider: () => TabsProvider, TamaguiProvider: () => TamaguiProvider, Text: () => Text4, TextArea: () => TextArea, TextAreaFrame: () => TextAreaFrame, - Theme: () => import_core56.Theme, + Theme: () => import_core58.Theme, ThemeableStack: () => ThemeableStack, Thumb: () => Thumb, ToggleGroup: () => ToggleGroup, @@ -27011,8 +26941,8 @@ __export(esm_exports, { TooltipSimple: () => TooltipSimple, Track: () => Track, USE_NATIVE_PORTAL: () => USE_NATIVE_PORTAL, - Unspaced: () => import_core56.Unspaced, - View: () => import_core56.View, + Unspaced: () => import_core58.Unspaced, + View: () => import_core58.View, VisuallyHidden: () => VisuallyHidden, XGroup: () => XGroup, XStack: () => XStack, @@ -27030,11 +26960,11 @@ __export(esm_exports, { createAlertDialogScope: () => createAlertDialogScope, createAvatarScope: () => createAvatarScope, createCheckbox: () => createCheckbox, - createComponent: () => import_core56.createComponent, + createComponent: () => import_core58.createComponent, createContext: () => createContext5, createContextScope: () => createContextScope, createDialogScope: () => createDialogScope, - createFont: () => import_core56.createFont, + createFont: () => import_core58.createFont, createMedia: () => createMedia, createProgressScope: () => createProgressScope, createRadioGroup: () => createRadioGroup, @@ -27044,69 +26974,70 @@ __export(esm_exports, { createSelectScope: () => createSelectScope, createSheet: () => createSheet, createSheetScope: () => createSheetScope, - createShorthands: () => import_core56.createShorthands, - createStyledContext: () => import_core56.createStyledContext, + createShorthands: () => import_core58.createShorthands, + createStyledContext: () => import_core58.createStyledContext, createSwitch: () => createSwitch, + createTabs: () => createTabs, createTamagui: () => createTamagui, - createTheme: () => import_core56.createTheme, - createTokens: () => import_core56.createTokens, - createVariable: () => import_core56.createVariable, + createTheme: () => import_core58.createTheme, + createTokens: () => import_core58.createTokens, + createVariable: () => import_core58.createVariable, debounce: () => debounce, defaultStyles: () => defaultStyles, fullscreenStyle: () => fullscreenStyle, - getCSSStylesAtomic: () => import_core56.getCSSStylesAtomic, - getConfig: () => import_core56.getConfig, + getCSSStylesAtomic: () => import_core58.getCSSStylesAtomic, + getConfig: () => import_core58.getConfig, getFontSize: () => getFontSize, getFontSizeToken: () => getFontSizeToken, getFontSizeVariable: () => getFontSizeVariable, - getMedia: () => import_core56.getMedia, + getMedia: () => import_core58.getMedia, getNativeSheet: () => getNativeSheet, getShapeSize: () => getShapeSize, - getThemes: () => import_core56.getThemes, - getToken: () => import_core56.getToken, - getTokenValue: () => import_core56.getTokenValue, - getTokens: () => import_core56.getTokens, - getVariable: () => import_core56.getVariable, - getVariableName: () => import_core56.getVariableName, - getVariableValue: () => import_core56.getVariableValue, - insertFont: () => import_core56.insertFont, - isChrome: () => import_core56.isChrome, - isClient: () => import_core56.isClient, + getThemes: () => import_core58.getThemes, + getToken: () => import_core58.getToken, + getTokenValue: () => import_core58.getTokenValue, + getTokens: () => import_core58.getTokens, + getVariable: () => import_core58.getVariable, + getVariableName: () => import_core58.getVariableName, + getVariableValue: () => import_core58.getVariableValue, + insertFont: () => import_core58.insertFont, + isChrome: () => import_core58.isChrome, + isClient: () => import_core58.isClient, isPresent: () => isPresent, - isServer: () => import_core56.isServer, + isServer: () => import_core58.isServer, isServerSide: () => isServerSide, - isTamaguiComponent: () => import_core56.isTamaguiComponent, - isTamaguiElement: () => import_core56.isTamaguiElement, - isTouchable: () => import_core56.isTouchable, - isVariable: () => import_core56.isVariable, - isWeb: () => import_core56.isWeb, - isWebTouchable: () => import_core56.isWebTouchable, - matchMedia: () => import_core56.matchMedia, - mediaObjectToString: () => import_core56.mediaObjectToString, - mediaQueryConfig: () => import_core56.mediaQueryConfig, - mediaState: () => import_core56.mediaState, + isTamaguiComponent: () => import_core58.isTamaguiComponent, + isTamaguiElement: () => import_core58.isTamaguiElement, + isTouchable: () => import_core58.isTouchable, + isVariable: () => import_core58.isVariable, + isWeb: () => import_core58.isWeb, + isWebTouchable: () => import_core58.isWebTouchable, + matchMedia: () => import_core58.matchMedia, + mediaObjectToString: () => import_core58.mediaObjectToString, + mediaQueryConfig: () => import_core58.mediaQueryConfig, + mediaState: () => import_core58.mediaState, mutateThemes: () => mutateThemes, portalListeners: () => portalListeners, prevent: () => prevent, replaceTheme: () => replaceTheme, resolveViewZIndex: () => resolveViewZIndex, - setConfig: () => import_core56.setConfig, + setConfig: () => import_core58.setConfig, setRef: () => setRef, - setupDev: () => import_core56.setupDev, + setupDev: () => import_core58.setupDev, setupNativeSheet: () => setupNativeSheet, setupPopper: () => setupPopper, - setupReactNative: () => import_core56.setupReactNative, + setupReactNative: () => import_core58.setupReactNative, shouldRenderNativePlatform: () => shouldRenderNativePlatform, simpleHash: () => simpleHash, - spacedChildren: () => import_core56.spacedChildren, + spacedChildren: () => import_core58.spacedChildren, stylePropsAll: () => stylePropsAll, stylePropsText: () => stylePropsText, stylePropsTextOnly: () => stylePropsTextOnly, stylePropsTransform: () => stylePropsTransform, stylePropsUnitless: () => stylePropsUnitless, stylePropsView: () => stylePropsView, - styled: () => import_core56.styled, - themeable: () => import_core56.themeable, + styled: () => import_core58.styled, + themeable: () => import_core58.themeable, themeableVariants: () => themeableVariants, tokenCategories: () => tokenCategories, updateTheme: () => updateTheme, @@ -27114,47 +27045,47 @@ __export(esm_exports, { useAdaptIsActive: () => useAdaptIsActive, useButton: () => useButton, useComposedRefs: () => useComposedRefs, - useConfiguration: () => import_core56.useConfiguration, + useConfiguration: () => import_core58.useConfiguration, useControllableState: () => useControllableState, useCurrentColor: () => useCurrentColor, useDebounce: () => useDebounce, useDebounceValue: () => useDebounceValue, - useDidFinishSSR: () => import_core56.useDidFinishSSR, - useEvent: () => import_core56.useEvent, + useDidFinishSSR: () => import_core58.useDidFinishSSR, + useEvent: () => import_core58.useEvent, useFloatingContext: () => useFloatingContext, useForceUpdate: () => useForceUpdate, useFormContext: () => useFormContext, - useGet: () => import_core56.useGet, + useGet: () => import_core58.useGet, useGetThemedIcon: () => useGetThemedIcon, useGroupItem: () => useGroupItem, useInputProps: () => useInputProps, useIsPresent: () => useIsPresent, - useIsTouchDevice: () => import_core56.useIsTouchDevice, - useIsomorphicLayoutEffect: () => import_core56.useIsomorphicLayoutEffect, + useIsTouchDevice: () => import_core58.useIsTouchDevice, + useIsomorphicLayoutEffect: () => import_core58.useIsomorphicLayoutEffect, useLabelContext: () => useLabelContext, useListItem: () => useListItem, - useMedia: () => import_core56.useMedia, + useMedia: () => import_core58.useMedia, usePopoverContext: () => usePopoverContext, usePopperContext: () => usePopperContext, usePortal: () => usePortal, usePresence: () => usePresence, - useProps: () => import_core56.useProps, - usePropsAndStyle: () => import_core56.usePropsAndStyle, + useProps: () => import_core58.useProps, + usePropsAndStyle: () => import_core58.usePropsAndStyle, useSelectContext: () => useSelectContext, useSelectItemParentContext: () => useSelectItemParentContext, useSheet: () => useSheet, useSheetController: () => useSheetController, useSheetOffscreenSize: () => useSheetOffscreenSize, useSheetOpenState: () => useSheetOpenState, - useStyle: () => import_core56.useStyle, + useStyle: () => import_core58.useStyle, useTabsContext: () => useTabsContext, - useTheme: () => import_core56.useTheme, - useThemeName: () => import_core56.useThemeName, + useTheme: () => import_core58.useTheme, + useThemeName: () => import_core58.useThemeName, useWindowDimensions: () => useWindowDimensions, validPseudoKeys: () => validPseudoKeys, validStyles: () => validStyles, - variableToString: () => import_core56.variableToString, - withStaticProperties: () => import_core56.withStaticProperties, + variableToString: () => import_core58.variableToString, + withStaticProperties: () => import_core58.withStaticProperties, wrapChildrenInText: () => wrapChildrenInText }); module.exports = __toCommonJS(esm_exports); @@ -27584,6 +27515,7 @@ var stylePropsView = { transition: true, textWrap: true, backdropFilter: true, + WebkitBackdropFilter: true, background: true, backgroundAttachment: true, backgroundBlendMode: true, @@ -28236,8 +28168,8 @@ var GorhomPortalItem = /* @__PURE__ */ __name((props) => { const cur = allPortalHosts.get(props.hostName), [node, setNode] = (0, import_react9.useState)(cur); return cur && node !== cur && setNode(cur), (0, import_react9.useEffect)(() => { if (!props.hostName || node) return; - const listener = /* @__PURE__ */ __name((node2) => { - setNode(node2); + const listener = /* @__PURE__ */ __name((newNode) => { + node && setNode(newNode); }, "listener"); return portalListeners[props.hostName] ||= /* @__PURE__ */ new Set(), portalListeners[props.hostName].add(listener), () => { portalListeners[props.hostName]?.delete(listener); @@ -28328,7 +28260,7 @@ var Adapt = withStaticProperties(function(props) { } = props, context2 = useAdaptContext(scope), scopeName = scope ?? context2.scopeName, enabled = useAdaptIsActiveGiven(props); useIsomorphicLayoutEffect(() => { context2?.setWhen?.(when || enabled), context2?.setPlatform?.(platform2 || null); - }, [when, platform2, context2, enabled]), useIsomorphicLayoutEffect(() => () => { + }, [when, platform2, enabled, context2.setWhen, context2.setPlatform]), useIsomorphicLayoutEffect(() => () => { context2?.setWhen?.(null), context2?.setPlatform?.(null); }, []); let output; @@ -29404,9 +29336,9 @@ var SheetImplementationCustom = import_react20.default.forwardRef(function(props const onMoveShouldSet = /* @__PURE__ */ __name((e, { dy }) => { - if (e.target === providerProps.handleRef.current || !scrollEnabled.current || !hasScrollView.current) return true; + if (e.target === providerProps.handleRef.current || !scrollEnabled.current) return true; const isScrolled = scrollBridge.y !== 0, isDraggingUp = dy < 0, isNearTop = scrollBridge.paneY - 5 <= scrollBridge.paneMinY; - return isScrolled ? (previouslyScrolling = true, false) : isNearTop && scrollEnabled.current && isDraggingUp ? false : Math.abs(dy) > 5; + return isScrolled ? (previouslyScrolling = true, false) : isNearTop && scrollEnabled.current && hasScrollView.current && isDraggingUp ? false : Math.abs(dy) > 10; }, "onMoveShouldSet"), grant = /* @__PURE__ */ __name(() => { setScrollEnabled(false), setPanning(true), stopSpring(), startY = at.current; }, "grant"); @@ -30218,10 +30150,10 @@ var DialogPortalItem = /* @__PURE__ */ __name((props) => { }); return isAdapted ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(AdaptPortalContents, { children: content - }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(GorhomPortalItem, { - hostName: context2.adaptName, + }) : context2.modal ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(GorhomPortalItem, { + hostName: context2.modal ? "root" : context2.adaptName, children: content - }); + }) : content; }, "DialogPortalItem"); var DialogPortal = /* @__PURE__ */ __name((props) => { const { @@ -30233,37 +30165,33 @@ var DialogPortal = /* @__PURE__ */ __name((props) => { isShowing && isFullyHidden && setIsFullyHidden(false); const handleExitComplete = React29.useCallback(() => { setIsFullyHidden(true); - }, []), zIndex = (0, import_core12.getExpandedShorthand)("zIndex", props); - if (context2.modal) { - const contents = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(StackZIndexContext, { - zIndex: resolveViewZIndex(zIndex), - children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(AnimatePresence, { - onExitComplete: handleExitComplete, - children: isShowing || isAdapted ? children : null - }) - }); - if (isFullyHidden && !isAdapted) return null; - const framedContents = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PortalProvider2, { - scope: __scopeDialog, - forceMount, - children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DialogPortalFrame, { - pointerEvents: isShowing ? "auto" : "none", - ...frameProps, - children: contents - }) - }); - return isWeb ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Portal, { - zIndex, - stackZIndex: 1e3, - children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PassthroughTheme, { - children: framedContents - }) - }) : isAdapted ? framedContents : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DialogPortalItem, { - __scopeDialog, + }, []), zIndex = (0, import_core12.getExpandedShorthand)("zIndex", props), contents = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(StackZIndexContext, { + zIndex: resolveViewZIndex(zIndex), + children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(AnimatePresence, { + onExitComplete: handleExitComplete, + children: isShowing || isAdapted ? children : null + }) + }); + if (isFullyHidden && !isAdapted) return null; + const framedContents = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PortalProvider2, { + scope: __scopeDialog, + forceMount, + children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DialogPortalFrame, { + pointerEvents: isShowing ? "auto" : "none", + ...frameProps, + children: contents + }) + }); + return isWeb ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Portal, { + zIndex, + stackZIndex: 1e3, + children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PassthroughTheme, { children: framedContents - }); - } - return children; + }) + }) : isAdapted ? framedContents : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DialogPortalItem, { + __scopeDialog, + children: framedContents + }); }, "DialogPortal"); var PassthroughTheme = /* @__PURE__ */ __name(({ children @@ -30430,7 +30358,7 @@ var DialogContentImpl = React29.forwardRef((props, forwardedRef) => { onFocusOutside, onInteractOutside, ref: composedRefs, - onDismiss: /* @__PURE__ */ __name(() => context2.onOpenChange(false), "onDismiss"), + onDismiss: /* @__PURE__ */ __name(() => context2?.onOpenChange?.(false), "onDismiss"), children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(FocusScope, { loop: true, enabled: context2.open, @@ -32804,15 +32732,20 @@ var flip = /* @__PURE__ */ __name(function(options) { const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; const nextPlacement = placements2[nextIndex]; if (nextPlacement) { - return { - data: { - index: nextIndex, - overflows: overflowsData - }, - reset: { - placement: nextPlacement - } - }; + var _overflowsData$; + const ignoreCrossAxisOverflow = checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false; + const hasInitialMainAxisOverflow = ((_overflowsData$ = overflowsData[0]) == null ? void 0 : _overflowsData$.overflows[0]) > 0; + if (!ignoreCrossAxisOverflow || hasInitialMainAxisOverflow) { + return { + data: { + index: nextIndex, + overflows: overflowsData + }, + reset: { + placement: nextPlacement + } + }; + } } let resetPlacement = (_overflowsData$filter = overflowsData.filter((d) => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; if (!resetPlacement) { @@ -33591,6 +33524,10 @@ function getRectRelativeToOffsetParent(element, offsetParent, strategy) { scrollTop: 0 }; const offsets = createCoords(0); + function setLeftRTLScrollbarOffset() { + offsets.x = getWindowScrollBarX(documentElement); + } + __name(setLeftRTLScrollbarOffset, "setLeftRTLScrollbarOffset"); if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { scroll = getNodeScroll(offsetParent); @@ -33600,9 +33537,12 @@ function getRectRelativeToOffsetParent(element, offsetParent, strategy) { offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } else if (documentElement) { - offsets.x = getWindowScrollBarX(documentElement); + setLeftRTLScrollbarOffset(); } } + if (isFixed && !isOffsetParentAnElement && documentElement) { + setLeftRTLScrollbarOffset(); + } const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; @@ -33759,7 +33699,7 @@ function observeMove(element, onMove) { // Handle