mirror of
https://github.com/block/buzz.git
synced 2026-10-27 12:40:30 +00:00
## Summary Pasting a link while composer text is selected now turns that text into a hyperlink instead of replacing it — the behavior people expect from every other editor. - `resolveExactLinkPaste` recognizes a clipboard payload that is exactly one supported link (bare or `<…>`-wrapped `http(s)`, or a Buzz deep link, canonicalized through the existing composer-link attribute resolver) and returns the href to apply. - The paste handler applies that href as a `link` mark over the current selection, collapses the caret to the end of the newly linked range, clears stored marks so subsequent typing isn't linked, and refocuses the editor. Edge cases handled: - **No link mark available / selection can't carry marks** — falls through to the existing replace-with-node path rather than silently dropping the paste. - **Selection contains a composer message-link chip** — keeps the old replacement behavior instead of nesting a link over a chip. - **Whitespace in the clipboard payload** — `unwrapExactHttpLink` now rejects any text containing whitespace, so multi-line or "text plus URL" pastes are not treated as an exact link. - **Empty selection (caret paste)** — unchanged. - **Idempotent re-paste** of an already-wrapped link is consumed rather than doubling up. ## Testing `desktop/src/features/messages/lib/composerMessageLinkNode.test.mjs` gains coverage for exact-link resolution (per-shape accept/reject cases, Buzz canonicalization) and for the paste handler: linking selected text, canonicalizing Buzz links over a selection, idempotent wrapped-link paste, fall-through when the selection can't carry marks, all-selection collapse, chip-containing selections, and preserved caret-paste behavior. Full pre-push gate ran green on this branch: `file-size-check`, `desktop-check`, `desktop-typecheck`, and `desktop-test` (5425 tests, 0 failures). ## Demo Pasting an `https://` URL over selected composer text turns the selected words into a hyperlink (instead of replacing them); text typed immediately after is not linked: https://github.com/user-attachments/assets/bbc93574-dd9d-4b1b-bad0-53307b6e887c --------- Signed-off-by: Matt Toohey <contact@matttoohey.com> Signed-off-by: Wes <wesbillman@users.noreply.github.com> Co-authored-by: Wes <wesbillman@users.noreply.github.com> Co-authored-by: Carl <32a2e2c9d428ee08902cab75d956da2c1d235a22d4766b0dd4138bf6e2e5db1d@buzz.block.builderlab.xyz>
110 lines
3.8 KiB
JSON
110 lines
3.8 KiB
JSON
{
|
|
"name": "buzz",
|
|
"private": true,
|
|
"version": "0.5.20",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "tsc && vite build",
|
|
"build:e2e": "tsc && vite build --mode e2e",
|
|
"typecheck": "tsc --noEmit",
|
|
"check:file-sizes": "node ./scripts/check-file-sizes.mjs",
|
|
"check:px-text": "node ./scripts/check-px-text.mjs",
|
|
"check:pubkey-truncation": "node ./scripts/check-pubkey-truncation.mjs",
|
|
"lint": "biome lint .",
|
|
"check": "biome check . && pnpm check:px-text && pnpm check:pubkey-truncation",
|
|
"format": "biome format --write .",
|
|
"test": "node --import ./test-loader.mjs --experimental-strip-types --test \"src/**/*.test.mjs\"",
|
|
"preview": "vite preview",
|
|
"tauri": "tauri",
|
|
"test:e2e": "pnpm build:e2e && playwright test",
|
|
"test:e2e:smoke": "pnpm build:e2e && playwright test --project=smoke",
|
|
"test:e2e:integration": "pnpm build:e2e && playwright test --project=integration",
|
|
"test:e2e:release-smoke": "pnpm build:e2e && playwright test --config=playwright.release-smoke.config.ts",
|
|
"test:e2e:report": "playwright show-report",
|
|
"tauri:build": "tauri build"
|
|
},
|
|
"dependencies": {
|
|
"@dnd-kit/core": "^6.3.1",
|
|
"@dnd-kit/sortable": "^10.0.0",
|
|
"@dnd-kit/utilities": "^3.2.2",
|
|
"@emoji-mart/data": "^1.2.1",
|
|
"@emoji-mart/react": "^1.1.1",
|
|
"@fontsource-variable/inter": "^5.2.8",
|
|
"@fontsource/jetbrains-mono": "^5.3.0",
|
|
"@mediapipe/tasks-vision": "^0.10.35",
|
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
"@radix-ui/react-avatar": "^1.1.11",
|
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
"@radix-ui/react-context-menu": "^2.2.16",
|
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
"@radix-ui/react-focus-scope": "^1.1.8",
|
|
"@radix-ui/react-popover": "^1.1.15",
|
|
"@radix-ui/react-separator": "^1.1.8",
|
|
"@radix-ui/react-slot": "^1.2.4",
|
|
"@radix-ui/react-switch": "^1.2.6",
|
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
"@radix-ui/react-toggle": "^1.1.10",
|
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
"@tanstack/react-query": "^5.90.21",
|
|
"@tanstack/react-router": "^1.168.10",
|
|
"@tanstack/react-virtual": "^3.14.2",
|
|
"@tauri-apps/api": "~2.11",
|
|
"@tauri-apps/plugin-notification": "^2.3.3",
|
|
"@tauri-apps/plugin-opener": "~2.5",
|
|
"@tauri-apps/plugin-process": "^2.3.1",
|
|
"@tauri-apps/plugin-updater": "^2.10.0",
|
|
"@tiptap/core": "^3.22.3",
|
|
"@tiptap/extension-link": "^3.22.3",
|
|
"@tiptap/extension-placeholder": "^3.22.3",
|
|
"@tiptap/pm": "^3.22.3",
|
|
"@tiptap/react": "^3.22.3",
|
|
"@tiptap/starter-kit": "^3.22.3",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"embla-carousel-react": "^8.6.0",
|
|
"emoji-mart": "^5.6.0",
|
|
"jdenticon": "^3.3.0",
|
|
"linkifyjs": "^4.3.2",
|
|
"lucide-react": "^1.0.0",
|
|
"mdast-util-from-markdown": "^2.0.3",
|
|
"motion": "^12.38.0",
|
|
"qrcode": "^1.5.4",
|
|
"qrcode.react": "^4.2.0",
|
|
"react": "^19.1.0",
|
|
"react-diff-view": "^3.3.2",
|
|
"react-dom": "^19.1.0",
|
|
"react-markdown": "^10.1.0",
|
|
"remark-breaks": "^4.0.0",
|
|
"remark-gfm": "^4.0.1",
|
|
"shiki": "^4.0.2",
|
|
"sonner": "^2.0.7",
|
|
"tailwind-merge": "^3.5.0",
|
|
"tiptap-markdown": "^0.9.0",
|
|
"upng-js": "^2.1.0",
|
|
"virtua": "0.49.3",
|
|
"yaml": "^2.8.3",
|
|
"zod": "^4.4.3"
|
|
},
|
|
"devDependencies": {
|
|
"@noble/hashes": "^2.0.1",
|
|
"@playwright/test": "^1.58.2",
|
|
"@tailwindcss/postcss": "^4.3.0",
|
|
"@tanstack/router-plugin": "^1.167.12",
|
|
"@tanstack/virtual-file-routes": "^1.161.7",
|
|
"@tauri-apps/cli": "~2.11.4",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/react": "^19.1.8",
|
|
"@types/react-dom": "^19.1.6",
|
|
"@vitejs/plugin-react": "^6.0.0",
|
|
"jsdom": "^27.4.0",
|
|
"nostr-tools": "^2.23.3",
|
|
"postcss": "^8.5.8",
|
|
"tailwindcss": "^4.3.0",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "~6.0.0",
|
|
"vite": "^8.0.0"
|
|
}
|
|
}
|