mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-04 19:15:33 +08:00
Compare commits
45 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2bfc7e33f1 | |||
| e320240f24 | |||
| 93d93abd8a | |||
| 7fbe5173c3 | |||
| 359ed9698b | |||
| 61af6fd24e | |||
| c4fe1d47b3 | |||
| 676c5d8de6 | |||
| 30a2e5b4fb | |||
| f3b5c36cf7 | |||
| a23112c12a | |||
| 846350bbb1 | |||
| 55a5321c0c | |||
| 098f6b2c93 | |||
| 41d404f7f8 | |||
| e0308c5815 | |||
| 83e55fad1e | |||
| 8ac3257f73 | |||
| 3feea3dc6c | |||
| 8938da4c24 | |||
| bcb0e80a75 | |||
| f1605e246b | |||
| 04531508cb | |||
| 4660b41d20 | |||
| e17547e26e | |||
| 539b2e87ad | |||
| 2e1bed061e | |||
| 9a721c65b5 | |||
| d856911144 | |||
| 0d6c595adf | |||
| 9f4800ffba | |||
| d78bb3a139 | |||
| dcd303c89a | |||
| d6f79a0c71 | |||
| 315ea00390 | |||
| 0665d20d67 | |||
| f667d977b0 | |||
| a75ae38308 | |||
| 365a0a605b | |||
| 8b2a01d4cf | |||
| 638f0b466f | |||
| 081974e824 | |||
| 1ea73456ca | |||
| bce9f8cdf0 | |||
| d6ab958e15 |
@@ -542,8 +542,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
node_index: [0, 1, 2, 3, 4, 5, 6, 7]
|
node_index: [0, 1, 2, 3]
|
||||||
total_nodes: [8]
|
total_nodes: [4]
|
||||||
env:
|
env:
|
||||||
NODE_ENV: test
|
NODE_ENV: test
|
||||||
DATABASE_URL: postgresql://affine:affine@localhost:5432/affine
|
DATABASE_URL: postgresql://affine:affine@localhost:5432/affine
|
||||||
|
|||||||
Generated
+42
-95
@@ -48,7 +48,7 @@ dependencies = [
|
|||||||
"infer",
|
"infer",
|
||||||
"path-ext",
|
"path-ext",
|
||||||
"pdf-extract",
|
"pdf-extract",
|
||||||
"rand 0.9.0",
|
"rand 0.9.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"readability",
|
"readability",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -162,7 +162,7 @@ dependencies = [
|
|||||||
"napi",
|
"napi",
|
||||||
"napi-build",
|
"napi-build",
|
||||||
"napi-derive",
|
"napi-derive",
|
||||||
"rand 0.9.0",
|
"rand 0.9.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"sha3",
|
"sha3",
|
||||||
"tiktoken-rs",
|
"tiktoken-rs",
|
||||||
@@ -656,9 +656,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.19"
|
version = "1.2.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362"
|
checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"shlex",
|
"shlex",
|
||||||
]
|
]
|
||||||
@@ -774,9 +774,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.5.36"
|
version = "4.5.37"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04"
|
checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap_builder",
|
"clap_builder",
|
||||||
"clap_derive",
|
"clap_derive",
|
||||||
@@ -784,9 +784,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_builder"
|
name = "clap_builder"
|
||||||
version = "4.5.36"
|
version = "4.5.37"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5"
|
checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anstream",
|
"anstream",
|
||||||
"anstyle",
|
"anstyle",
|
||||||
@@ -1784,7 +1784,7 @@ dependencies = [
|
|||||||
"js-sys",
|
"js-sys",
|
||||||
"log",
|
"log",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
"windows-core 0.61.0",
|
"windows-core 0.57.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2110,9 +2110,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lib0"
|
name = "lib0"
|
||||||
version = "0.16.5"
|
version = "0.16.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "daf23122cb1c970b77ea6030eac5e328669415b65d2ab245c99bfb110f9d62dc"
|
checksum = "29dc19a026a0d45fc391898c6d4a6d0a5aab5ae6a826ebddc0f33572ffdae8dc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -2132,7 +2132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
|
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.48.5",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2223,7 +2223,7 @@ dependencies = [
|
|||||||
"md-5",
|
"md-5",
|
||||||
"nom 8.0.0",
|
"nom 8.0.0",
|
||||||
"nom_locate",
|
"nom_locate",
|
||||||
"rand 0.9.0",
|
"rand 0.9.1",
|
||||||
"rangemap",
|
"rangemap",
|
||||||
"sha2",
|
"sha2",
|
||||||
"stringprep",
|
"stringprep",
|
||||||
@@ -2570,11 +2570,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "objc2-core-foundation"
|
name = "objc2-core-foundation"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925"
|
checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.0",
|
"bitflags 2.9.0",
|
||||||
|
"dispatch2",
|
||||||
"objc2",
|
"objc2",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -2586,9 +2587,9 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "objc2-foundation"
|
name = "objc2-foundation"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998"
|
checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.0",
|
"bitflags 2.9.0",
|
||||||
"block2",
|
"block2",
|
||||||
@@ -3037,13 +3038,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.9.0"
|
version = "0.9.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
|
checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand_chacha 0.9.0",
|
"rand_chacha 0.9.0",
|
||||||
"rand_core 0.9.3",
|
"rand_core 0.9.3",
|
||||||
"zerocopy 0.8.24",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3110,7 +3110,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463"
|
checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"rand 0.9.0",
|
"rand 0.9.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3690,9 +3690,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx"
|
name = "sqlx"
|
||||||
version = "0.8.4"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "14e22987355fbf8cfb813a0cf8cd97b1b4ec834b94dbd759a9e8679d41fabe83"
|
checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"sqlx-core",
|
"sqlx-core",
|
||||||
"sqlx-macros",
|
"sqlx-macros",
|
||||||
@@ -3703,9 +3703,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-core"
|
name = "sqlx-core"
|
||||||
version = "0.8.4"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "55c4720d7d4cd3d5b00f61d03751c685ad09c33ae8290c8a2c11335e0604300b"
|
checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"bytes",
|
"bytes",
|
||||||
@@ -3740,9 +3740,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-macros"
|
name = "sqlx-macros"
|
||||||
version = "0.8.4"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "175147fcb75f353ac7675509bc58abb2cb291caf0fd24a3623b8f7e3eb0a754b"
|
checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -3753,9 +3753,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-macros-core"
|
name = "sqlx-macros-core"
|
||||||
version = "0.8.4"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1cde983058e53bfa75998e1982086c5efe3c370f3250bf0357e344fa3352e32b"
|
checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dotenvy",
|
"dotenvy",
|
||||||
"either",
|
"either",
|
||||||
@@ -3779,9 +3779,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-mysql"
|
name = "sqlx-mysql"
|
||||||
version = "0.8.4"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "847d2e5393a4f39e47e4f36cab419709bc2b83cbe4223c60e86e1471655be333"
|
checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
@@ -3822,9 +3822,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-postgres"
|
name = "sqlx-postgres"
|
||||||
version = "0.8.4"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cc35947a541b9e0a2e3d85da444f1c4137c13040267141b208395a0d0ca4659f"
|
checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
@@ -3860,9 +3860,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlx-sqlite"
|
name = "sqlx-sqlite"
|
||||||
version = "0.8.4"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6c48291dac4e5ed32da0927a0b981788be65674aeb62666d19873ab4289febde"
|
checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"chrono",
|
"chrono",
|
||||||
@@ -5112,23 +5112,10 @@ dependencies = [
|
|||||||
"windows-implement 0.58.0",
|
"windows-implement 0.58.0",
|
||||||
"windows-interface 0.58.0",
|
"windows-interface 0.58.0",
|
||||||
"windows-result 0.2.0",
|
"windows-result 0.2.0",
|
||||||
"windows-strings 0.1.0",
|
"windows-strings",
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-core"
|
|
||||||
version = "0.61.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
|
|
||||||
dependencies = [
|
|
||||||
"windows-implement 0.60.0",
|
|
||||||
"windows-interface 0.59.1",
|
|
||||||
"windows-link",
|
|
||||||
"windows-result 0.3.2",
|
|
||||||
"windows-strings 0.4.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-implement"
|
name = "windows-implement"
|
||||||
version = "0.57.0"
|
version = "0.57.0"
|
||||||
@@ -5151,17 +5138,6 @@ dependencies = [
|
|||||||
"syn 2.0.100",
|
"syn 2.0.100",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-implement"
|
|
||||||
version = "0.60.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 2.0.100",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-interface"
|
name = "windows-interface"
|
||||||
version = "0.57.0"
|
version = "0.57.0"
|
||||||
@@ -5184,17 +5160,6 @@ dependencies = [
|
|||||||
"syn 2.0.100",
|
"syn 2.0.100",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-interface"
|
|
||||||
version = "0.59.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 2.0.100",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-link"
|
name = "windows-link"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
@@ -5219,15 +5184,6 @@ dependencies = [
|
|||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-result"
|
|
||||||
version = "0.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
|
|
||||||
dependencies = [
|
|
||||||
"windows-link",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-strings"
|
name = "windows-strings"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@@ -5238,15 +5194,6 @@ dependencies = [
|
|||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-strings"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97"
|
|
||||||
dependencies = [
|
|
||||||
"windows-link",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.48.0"
|
version = "0.48.0"
|
||||||
@@ -5472,14 +5419,14 @@ dependencies = [
|
|||||||
"path-ext",
|
"path-ext",
|
||||||
"proptest",
|
"proptest",
|
||||||
"proptest-derive",
|
"proptest-derive",
|
||||||
"rand 0.9.0",
|
"rand 0.9.1",
|
||||||
"rand_chacha 0.9.0",
|
"rand_chacha 0.9.0",
|
||||||
"rand_distr",
|
"rand_distr",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"smol_str",
|
"smol_str",
|
||||||
"thiserror 2.0.12",
|
"thiserror 2.0.12",
|
||||||
"yrs 0.23.0",
|
"yrs 0.23.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -5505,12 +5452,12 @@ dependencies = [
|
|||||||
"phf 0.11.3",
|
"phf 0.11.3",
|
||||||
"proptest",
|
"proptest",
|
||||||
"proptest-derive",
|
"proptest-derive",
|
||||||
"rand 0.9.0",
|
"rand 0.9.1",
|
||||||
"rand_chacha 0.9.0",
|
"rand_chacha 0.9.0",
|
||||||
"regex",
|
"regex",
|
||||||
"y-octo",
|
"y-octo",
|
||||||
"y-sync",
|
"y-sync",
|
||||||
"yrs 0.23.0",
|
"yrs 0.23.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -5564,9 +5511,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yrs"
|
name = "yrs"
|
||||||
version = "0.23.0"
|
version = "0.23.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0189b51d8ab1283e7c1f1f515c610875262e629cf258bec530da5cd4aa115d59"
|
checksum = "4a7cab84724ae7f361a8c92465f5160922cbb941a499e1a8cacd103351ab9c78"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
"async-lock",
|
"async-lock",
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
"@blocksuite/affine-block-divider": "workspace:*",
|
"@blocksuite/affine-block-divider": "workspace:*",
|
||||||
"@blocksuite/affine-block-edgeless-text": "workspace:*",
|
"@blocksuite/affine-block-edgeless-text": "workspace:*",
|
||||||
"@blocksuite/affine-block-embed": "workspace:*",
|
"@blocksuite/affine-block-embed": "workspace:*",
|
||||||
|
"@blocksuite/affine-block-embed-doc": "workspace:*",
|
||||||
"@blocksuite/affine-block-frame": "workspace:*",
|
"@blocksuite/affine-block-frame": "workspace:*",
|
||||||
"@blocksuite/affine-block-image": "workspace:*",
|
"@blocksuite/affine-block-image": "workspace:*",
|
||||||
"@blocksuite/affine-block-latex": "workspace:*",
|
"@blocksuite/affine-block-latex": "workspace:*",
|
||||||
@@ -121,6 +122,9 @@
|
|||||||
"./blocks/embed": "./src/blocks/embed/index.ts",
|
"./blocks/embed": "./src/blocks/embed/index.ts",
|
||||||
"./blocks/embed/store": "./src/blocks/embed/store.ts",
|
"./blocks/embed/store": "./src/blocks/embed/store.ts",
|
||||||
"./blocks/embed/view": "./src/blocks/embed/view.ts",
|
"./blocks/embed/view": "./src/blocks/embed/view.ts",
|
||||||
|
"./blocks/embed-doc": "./src/blocks/embed-doc/index.ts",
|
||||||
|
"./blocks/embed-doc/store": "./src/blocks/embed-doc/store.ts",
|
||||||
|
"./blocks/embed-doc/view": "./src/blocks/embed-doc/view.ts",
|
||||||
"./blocks/frame": "./src/blocks/frame/index.ts",
|
"./blocks/frame": "./src/blocks/frame/index.ts",
|
||||||
"./blocks/frame/store": "./src/blocks/frame/store.ts",
|
"./blocks/frame/store": "./src/blocks/frame/store.ts",
|
||||||
"./blocks/frame/view": "./src/blocks/frame/view.ts",
|
"./blocks/frame/view": "./src/blocks/frame/view.ts",
|
||||||
@@ -139,7 +143,9 @@
|
|||||||
"./blocks/paragraph": "./src/blocks/paragraph/index.ts",
|
"./blocks/paragraph": "./src/blocks/paragraph/index.ts",
|
||||||
"./blocks/paragraph/store": "./src/blocks/paragraph/store.ts",
|
"./blocks/paragraph/store": "./src/blocks/paragraph/store.ts",
|
||||||
"./blocks/paragraph/view": "./src/blocks/paragraph/view.ts",
|
"./blocks/paragraph/view": "./src/blocks/paragraph/view.ts",
|
||||||
"./blocks/root": "./src/blocks/root.ts",
|
"./blocks/root": "./src/blocks/root/index.ts",
|
||||||
|
"./blocks/root/store": "./src/blocks/root/store.ts",
|
||||||
|
"./blocks/root/view": "./src/blocks/root/view.ts",
|
||||||
"./blocks/surface": "./src/blocks/surface/index.ts",
|
"./blocks/surface": "./src/blocks/surface/index.ts",
|
||||||
"./blocks/surface/store": "./src/blocks/surface/store.ts",
|
"./blocks/surface/store": "./src/blocks/surface/store.ts",
|
||||||
"./blocks/surface/view": "./src/blocks/surface/view.ts",
|
"./blocks/surface/view": "./src/blocks/surface/view.ts",
|
||||||
@@ -192,9 +198,12 @@
|
|||||||
"./widgets/viewport-overlay/view": "./src/widgets/viewport-overlay/view.ts",
|
"./widgets/viewport-overlay/view": "./src/widgets/viewport-overlay/view.ts",
|
||||||
"./widgets/page-dragging-area": "./src/widgets/page-dragging-area/index.ts",
|
"./widgets/page-dragging-area": "./src/widgets/page-dragging-area/index.ts",
|
||||||
"./widgets/page-dragging-area/view": "./src/widgets/page-dragging-area/view.ts",
|
"./widgets/page-dragging-area/view": "./src/widgets/page-dragging-area/view.ts",
|
||||||
"./fragments/doc-title": "./src/fragments/doc-title.ts",
|
"./fragments/doc-title": "./src/fragments/doc-title/index.ts",
|
||||||
"./fragments/frame-panel": "./src/fragments/frame-panel.ts",
|
"./fragments/doc-title/view": "./src/fragments/doc-title/view.ts",
|
||||||
"./fragments/outline": "./src/fragments/outline.ts",
|
"./fragments/frame-panel": "./src/fragments/frame-panel/index.ts",
|
||||||
|
"./fragments/frame-panel/view": "./src/fragments/frame-panel/view.ts",
|
||||||
|
"./fragments/outline": "./src/fragments/outline/index.ts",
|
||||||
|
"./fragments/outline/view": "./src/fragments/outline/view.ts",
|
||||||
"./gfx/text": "./src/gfx/text/index.ts",
|
"./gfx/text": "./src/gfx/text/index.ts",
|
||||||
"./gfx/text/store": "./src/gfx/text/store.ts",
|
"./gfx/text/store": "./src/gfx/text/store.ts",
|
||||||
"./gfx/text/view": "./src/gfx/text/view.ts",
|
"./gfx/text/view": "./src/gfx/text/view.ts",
|
||||||
@@ -275,6 +284,6 @@
|
|||||||
"version": "0.21.0",
|
"version": "0.21.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vanilla-extract/vite-plugin": "^5.0.0",
|
"@vanilla-extract/vite-plugin": "^5.0.0",
|
||||||
"vitest": "3.1.1"
|
"vitest": "3.1.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2448,6 +2448,121 @@ World!
|
|||||||
});
|
});
|
||||||
expect(target.file).toBe(markdown);
|
expect(target.file).toBe(markdown);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('callout', async () => {
|
||||||
|
const blockSnapshot: BlockSnapshot = {
|
||||||
|
type: 'block',
|
||||||
|
id: 'block:vu6SK6WJpW',
|
||||||
|
flavour: 'affine:page',
|
||||||
|
props: {
|
||||||
|
title: {
|
||||||
|
'$blocksuite:internal:text$': true,
|
||||||
|
delta: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'block:Tk4gSPocAt',
|
||||||
|
flavour: 'affine:surface',
|
||||||
|
props: {
|
||||||
|
elements: {},
|
||||||
|
},
|
||||||
|
children: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'block:WfnS5ZDCJT',
|
||||||
|
flavour: 'affine:note',
|
||||||
|
props: {
|
||||||
|
xywh: '[0,0,800,95]',
|
||||||
|
background: DefaultTheme.noteBackgrounColor,
|
||||||
|
index: 'a0',
|
||||||
|
hidden: false,
|
||||||
|
displayMode: NoteDisplayMode.DocAndEdgeless,
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'block:8hOLxad5Fv',
|
||||||
|
flavour: 'affine:callout',
|
||||||
|
props: {
|
||||||
|
emoji: '💡',
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'block:8hOLxad5Fv',
|
||||||
|
flavour: 'affine:paragraph',
|
||||||
|
props: {
|
||||||
|
type: 'text',
|
||||||
|
text: {
|
||||||
|
'$blocksuite:internal:text$': true,
|
||||||
|
delta: [{ insert: 'First callout' }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
children: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'block:8hOLxadvdv',
|
||||||
|
flavour: 'affine:callout',
|
||||||
|
props: {
|
||||||
|
emoji: '',
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'block:8hOLxad5Fv',
|
||||||
|
flavour: 'affine:paragraph',
|
||||||
|
props: {
|
||||||
|
type: 'text',
|
||||||
|
text: {
|
||||||
|
'$blocksuite:internal:text$': true,
|
||||||
|
delta: [{ insert: 'Second callout without emoji' }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
children: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'block:8hOLxbfdb',
|
||||||
|
flavour: 'affine:paragraph',
|
||||||
|
props: {
|
||||||
|
type: 'quote',
|
||||||
|
text: {
|
||||||
|
'$blocksuite:internal:text$': true,
|
||||||
|
delta: [{ insert: 'This is a regular blockquote' }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
children: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const markdown = `> \\[!💡]
|
||||||
|
>
|
||||||
|
> First callout
|
||||||
|
|
||||||
|
> \\[!]
|
||||||
|
>
|
||||||
|
> Second callout without emoji
|
||||||
|
|
||||||
|
> This is a regular blockquote
|
||||||
|
`;
|
||||||
|
|
||||||
|
const mdAdapter = new MarkdownAdapter(createJob(), provider);
|
||||||
|
const target = await mdAdapter.fromBlockSnapshot({
|
||||||
|
snapshot: blockSnapshot,
|
||||||
|
});
|
||||||
|
expect(target.file).toBe(markdown);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('markdown to snapshot', () => {
|
describe('markdown to snapshot', () => {
|
||||||
@@ -3588,7 +3703,7 @@ bbb
|
|||||||
props: {
|
props: {
|
||||||
xywh: '[0,0,800,95]',
|
xywh: '[0,0,800,95]',
|
||||||
background: {
|
background: {
|
||||||
dark: '#000000',
|
dark: '#252525',
|
||||||
light: '#ffffff',
|
light: '#ffffff',
|
||||||
},
|
},
|
||||||
index: 'a0',
|
index: 'a0',
|
||||||
@@ -4182,4 +4297,62 @@ hhh
|
|||||||
});
|
});
|
||||||
expect(nanoidReplacement(rawSliceSnapshot!)).toEqual(sliceSnapshot);
|
expect(nanoidReplacement(rawSliceSnapshot!)).toEqual(sliceSnapshot);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('callout', () => {
|
||||||
|
const calloutBlockSnapshot: BlockSnapshot = {
|
||||||
|
type: 'block',
|
||||||
|
id: 'matchesReplaceMap[0]',
|
||||||
|
flavour: 'affine:note',
|
||||||
|
props: {
|
||||||
|
xywh: '[0,0,800,95]',
|
||||||
|
background: DefaultTheme.noteBackgrounColor,
|
||||||
|
index: 'a0',
|
||||||
|
hidden: false,
|
||||||
|
displayMode: NoteDisplayMode.DocAndEdgeless,
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'matchesReplaceMap[1]',
|
||||||
|
flavour: 'affine:callout',
|
||||||
|
props: {
|
||||||
|
emoji: '💬',
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: 'matchesReplaceMap[2]',
|
||||||
|
flavour: 'affine:paragraph',
|
||||||
|
props: {
|
||||||
|
type: 'text',
|
||||||
|
text: {
|
||||||
|
'$blocksuite:internal:text$': true,
|
||||||
|
delta: [{ insert: 'This is a callout' }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
children: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
test('callout start with escape character', async () => {
|
||||||
|
const markdown = '> \\[!💬]\n> This is a callout';
|
||||||
|
const mdAdapter = new MarkdownAdapter(createJob(), provider);
|
||||||
|
const rawBlockSnapshot = await mdAdapter.toBlockSnapshot({
|
||||||
|
file: markdown,
|
||||||
|
});
|
||||||
|
expect(nanoidReplacement(rawBlockSnapshot)).toEqual(calloutBlockSnapshot);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('callout start without escape character', async () => {
|
||||||
|
const markdown = '> [!💬]\n> This is a callout';
|
||||||
|
const mdAdapter = new MarkdownAdapter(createJob(), provider);
|
||||||
|
const rawBlockSnapshot = await mdAdapter.toBlockSnapshot({
|
||||||
|
file: markdown,
|
||||||
|
});
|
||||||
|
expect(nanoidReplacement(rawBlockSnapshot)).toEqual(calloutBlockSnapshot);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
import {
|
|
||||||
HtmlInlineToDeltaAdapterExtensions,
|
|
||||||
InlineDeltaToHtmlAdapterExtensions,
|
|
||||||
InlineDeltaToMarkdownAdapterExtensions,
|
|
||||||
MarkdownInlineToDeltaAdapterExtensions,
|
|
||||||
NotionHtmlInlineToDeltaAdapterExtensions,
|
|
||||||
} from '@blocksuite/affine-inline-preset';
|
|
||||||
import {
|
|
||||||
AttachmentAdapterFactoryExtension,
|
|
||||||
HtmlAdapterFactoryExtension,
|
|
||||||
ImageAdapterFactoryExtension,
|
|
||||||
MarkdownAdapterFactoryExtension,
|
|
||||||
MixTextAdapterFactoryExtension,
|
|
||||||
NotionHtmlAdapterFactoryExtension,
|
|
||||||
NotionTextAdapterFactoryExtension,
|
|
||||||
PlainTextAdapterFactoryExtension,
|
|
||||||
} from '@blocksuite/affine-shared/adapters';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
import { defaultBlockHtmlAdapterMatchers } from './html/block-matcher';
|
|
||||||
import { defaultBlockMarkdownAdapterMatchers } from './markdown/block-matcher';
|
|
||||||
import { defaultMarkdownPreprocessors } from './markdown/preprocessor';
|
|
||||||
import { defaultBlockNotionHtmlAdapterMatchers } from './notion-html/block-matcher';
|
|
||||||
import { defaultBlockPlainTextAdapterMatchers } from './plain-text/block-matcher';
|
|
||||||
|
|
||||||
export function getAdapterFactoryExtensions(): ExtensionType[] {
|
|
||||||
return [
|
|
||||||
AttachmentAdapterFactoryExtension,
|
|
||||||
ImageAdapterFactoryExtension,
|
|
||||||
MarkdownAdapterFactoryExtension,
|
|
||||||
PlainTextAdapterFactoryExtension,
|
|
||||||
HtmlAdapterFactoryExtension,
|
|
||||||
NotionTextAdapterFactoryExtension,
|
|
||||||
NotionHtmlAdapterFactoryExtension,
|
|
||||||
MixTextAdapterFactoryExtension,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getHtmlAdapterExtensions(): ExtensionType[] {
|
|
||||||
return [
|
|
||||||
...HtmlInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockHtmlAdapterMatchers,
|
|
||||||
...InlineDeltaToHtmlAdapterExtensions,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getMarkdownAdapterExtensions(): ExtensionType[] {
|
|
||||||
return [
|
|
||||||
...MarkdownInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockMarkdownAdapterMatchers,
|
|
||||||
...InlineDeltaToMarkdownAdapterExtensions,
|
|
||||||
...defaultMarkdownPreprocessors,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getNotionHtmlAdapterExtensions(): ExtensionType[] {
|
|
||||||
return [
|
|
||||||
...NotionHtmlInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockNotionHtmlAdapterMatchers,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getPlainTextAdapterExtensions(): ExtensionType[] {
|
|
||||||
return [...defaultBlockPlainTextAdapterMatchers];
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import { BookmarkBlockHtmlAdapterExtension } from '@blocksuite/affine-block-bookmark';
|
|
||||||
import { CodeBlockHtmlAdapterExtension } from '@blocksuite/affine-block-code';
|
|
||||||
import { DatabaseBlockHtmlAdapterExtension } from '@blocksuite/affine-block-database';
|
|
||||||
import { DividerBlockHtmlAdapterExtension } from '@blocksuite/affine-block-divider';
|
|
||||||
import {
|
|
||||||
EmbedFigmaBlockHtmlAdapterExtension,
|
|
||||||
EmbedGithubBlockHtmlAdapterExtension,
|
|
||||||
EmbedIframeBlockHtmlAdapterExtension,
|
|
||||||
EmbedLinkedDocHtmlAdapterExtension,
|
|
||||||
EmbedLoomBlockHtmlAdapterExtension,
|
|
||||||
EmbedSyncedDocBlockHtmlAdapterExtension,
|
|
||||||
EmbedYoutubeBlockHtmlAdapterExtension,
|
|
||||||
} from '@blocksuite/affine-block-embed';
|
|
||||||
import { ImageBlockHtmlAdapterExtension } from '@blocksuite/affine-block-image';
|
|
||||||
import { ListBlockHtmlAdapterExtension } from '@blocksuite/affine-block-list';
|
|
||||||
import { ParagraphBlockHtmlAdapterExtension } from '@blocksuite/affine-block-paragraph';
|
|
||||||
import { RootBlockHtmlAdapterExtension } from '@blocksuite/affine-block-root';
|
|
||||||
import { TableBlockHtmlAdapterExtension } from '@blocksuite/affine-block-table';
|
|
||||||
|
|
||||||
export const defaultBlockHtmlAdapterMatchers = [
|
|
||||||
ListBlockHtmlAdapterExtension,
|
|
||||||
ParagraphBlockHtmlAdapterExtension,
|
|
||||||
CodeBlockHtmlAdapterExtension,
|
|
||||||
DividerBlockHtmlAdapterExtension,
|
|
||||||
ImageBlockHtmlAdapterExtension,
|
|
||||||
RootBlockHtmlAdapterExtension,
|
|
||||||
EmbedYoutubeBlockHtmlAdapterExtension,
|
|
||||||
EmbedFigmaBlockHtmlAdapterExtension,
|
|
||||||
EmbedLoomBlockHtmlAdapterExtension,
|
|
||||||
EmbedGithubBlockHtmlAdapterExtension,
|
|
||||||
EmbedIframeBlockHtmlAdapterExtension,
|
|
||||||
BookmarkBlockHtmlAdapterExtension,
|
|
||||||
DatabaseBlockHtmlAdapterExtension,
|
|
||||||
TableBlockHtmlAdapterExtension,
|
|
||||||
EmbedLinkedDocHtmlAdapterExtension,
|
|
||||||
EmbedSyncedDocBlockHtmlAdapterExtension,
|
|
||||||
];
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
export * from './extension.js';
|
|
||||||
export * from './html/block-matcher.js';
|
|
||||||
export * from './markdown/block-matcher.js';
|
|
||||||
export * from './markdown/preprocessor.js';
|
|
||||||
export * from './notion-html/block-matcher.js';
|
|
||||||
export * from './plain-text/block-matcher.js';
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import { AttachmentBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-attachment';
|
|
||||||
import { BookmarkBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-bookmark';
|
|
||||||
import { CodeBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-code';
|
|
||||||
import { DatabaseBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-database';
|
|
||||||
import { DividerBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-divider';
|
|
||||||
import {
|
|
||||||
EmbedFigmaMarkdownAdapterExtension,
|
|
||||||
EmbedGithubMarkdownAdapterExtension,
|
|
||||||
EmbedIframeBlockMarkdownAdapterExtension,
|
|
||||||
EmbedLinkedDocMarkdownAdapterExtension,
|
|
||||||
EmbedLoomMarkdownAdapterExtension,
|
|
||||||
EmbedSyncedDocMarkdownAdapterExtension,
|
|
||||||
EmbedYoutubeMarkdownAdapterExtension,
|
|
||||||
} from '@blocksuite/affine-block-embed';
|
|
||||||
import { ImageBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-image';
|
|
||||||
import { LatexBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-latex';
|
|
||||||
import { ListBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-list';
|
|
||||||
import { DocNoteBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-note';
|
|
||||||
import { ParagraphBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-paragraph';
|
|
||||||
import { RootBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-root';
|
|
||||||
import { TableBlockMarkdownAdapterExtension } from '@blocksuite/affine-block-table';
|
|
||||||
|
|
||||||
export const defaultBlockMarkdownAdapterMatchers = [
|
|
||||||
RootBlockMarkdownAdapterExtension,
|
|
||||||
DocNoteBlockMarkdownAdapterExtension,
|
|
||||||
EmbedFigmaMarkdownAdapterExtension,
|
|
||||||
EmbedGithubMarkdownAdapterExtension,
|
|
||||||
EmbedLinkedDocMarkdownAdapterExtension,
|
|
||||||
EmbedLoomMarkdownAdapterExtension,
|
|
||||||
EmbedSyncedDocMarkdownAdapterExtension,
|
|
||||||
EmbedYoutubeMarkdownAdapterExtension,
|
|
||||||
EmbedIframeBlockMarkdownAdapterExtension,
|
|
||||||
ListBlockMarkdownAdapterExtension,
|
|
||||||
ParagraphBlockMarkdownAdapterExtension,
|
|
||||||
BookmarkBlockMarkdownAdapterExtension,
|
|
||||||
CodeBlockMarkdownAdapterExtension,
|
|
||||||
DatabaseBlockMarkdownAdapterExtension,
|
|
||||||
TableBlockMarkdownAdapterExtension,
|
|
||||||
DividerBlockMarkdownAdapterExtension,
|
|
||||||
ImageBlockMarkdownAdapterExtension,
|
|
||||||
LatexBlockMarkdownAdapterExtension,
|
|
||||||
AttachmentBlockMarkdownAdapterExtension,
|
|
||||||
];
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import { BookmarkBlockMarkdownPreprocessorExtension } from '@blocksuite/affine-block-bookmark';
|
|
||||||
import { CodeMarkdownPreprocessorExtension } from '@blocksuite/affine-block-code';
|
|
||||||
import { LatexMarkdownPreprocessorExtension } from '@blocksuite/affine-block-latex';
|
|
||||||
|
|
||||||
export const defaultMarkdownPreprocessors = [
|
|
||||||
LatexMarkdownPreprocessorExtension,
|
|
||||||
CodeMarkdownPreprocessorExtension,
|
|
||||||
BookmarkBlockMarkdownPreprocessorExtension,
|
|
||||||
];
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
import { AttachmentBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-attachment';
|
|
||||||
import { BookmarkBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-bookmark';
|
|
||||||
import { CodeBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-code';
|
|
||||||
import { DatabaseBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-database';
|
|
||||||
import { DividerBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-divider';
|
|
||||||
import {
|
|
||||||
EmbedFigmaBlockNotionHtmlAdapterExtension,
|
|
||||||
EmbedGithubBlockNotionHtmlAdapterExtension,
|
|
||||||
EmbedLoomBlockNotionHtmlAdapterExtension,
|
|
||||||
EmbedYoutubeBlockNotionHtmlAdapterExtension,
|
|
||||||
} from '@blocksuite/affine-block-embed';
|
|
||||||
import { ImageBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-image';
|
|
||||||
import { LatexBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-latex';
|
|
||||||
import { ListBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-list';
|
|
||||||
import { ParagraphBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-paragraph';
|
|
||||||
import { RootBlockNotionHtmlAdapterExtension } from '@blocksuite/affine-block-root';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
export const defaultBlockNotionHtmlAdapterMatchers: ExtensionType[] = [
|
|
||||||
ListBlockNotionHtmlAdapterExtension,
|
|
||||||
ParagraphBlockNotionHtmlAdapterExtension,
|
|
||||||
CodeBlockNotionHtmlAdapterExtension,
|
|
||||||
DividerBlockNotionHtmlAdapterExtension,
|
|
||||||
ImageBlockNotionHtmlAdapterExtension,
|
|
||||||
RootBlockNotionHtmlAdapterExtension,
|
|
||||||
BookmarkBlockNotionHtmlAdapterExtension,
|
|
||||||
DatabaseBlockNotionHtmlAdapterExtension,
|
|
||||||
LatexBlockNotionHtmlAdapterExtension,
|
|
||||||
EmbedYoutubeBlockNotionHtmlAdapterExtension,
|
|
||||||
EmbedFigmaBlockNotionHtmlAdapterExtension,
|
|
||||||
EmbedGithubBlockNotionHtmlAdapterExtension,
|
|
||||||
EmbedLoomBlockNotionHtmlAdapterExtension,
|
|
||||||
AttachmentBlockNotionHtmlAdapterExtension,
|
|
||||||
];
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
import { BookmarkBlockPlainTextAdapterExtension } from '@blocksuite/affine-block-bookmark';
|
|
||||||
import { CodeBlockPlainTextAdapterExtension } from '@blocksuite/affine-block-code';
|
|
||||||
import { DatabaseBlockPlainTextAdapterExtension } from '@blocksuite/affine-block-database';
|
|
||||||
import { DividerBlockPlainTextAdapterExtension } from '@blocksuite/affine-block-divider';
|
|
||||||
import {
|
|
||||||
EmbedFigmaBlockPlainTextAdapterExtension,
|
|
||||||
EmbedGithubBlockPlainTextAdapterExtension,
|
|
||||||
EmbedIframeBlockPlainTextAdapterExtension,
|
|
||||||
EmbedLinkedDocBlockPlainTextAdapterExtension,
|
|
||||||
EmbedLoomBlockPlainTextAdapterExtension,
|
|
||||||
EmbedSyncedDocBlockPlainTextAdapterExtension,
|
|
||||||
EmbedYoutubeBlockPlainTextAdapterExtension,
|
|
||||||
} from '@blocksuite/affine-block-embed';
|
|
||||||
import { LatexBlockPlainTextAdapterExtension } from '@blocksuite/affine-block-latex';
|
|
||||||
import { ListBlockPlainTextAdapterExtension } from '@blocksuite/affine-block-list';
|
|
||||||
import { ParagraphBlockPlainTextAdapterExtension } from '@blocksuite/affine-block-paragraph';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
export const defaultBlockPlainTextAdapterMatchers: ExtensionType[] = [
|
|
||||||
ParagraphBlockPlainTextAdapterExtension,
|
|
||||||
ListBlockPlainTextAdapterExtension,
|
|
||||||
DividerBlockPlainTextAdapterExtension,
|
|
||||||
CodeBlockPlainTextAdapterExtension,
|
|
||||||
BookmarkBlockPlainTextAdapterExtension,
|
|
||||||
EmbedFigmaBlockPlainTextAdapterExtension,
|
|
||||||
EmbedGithubBlockPlainTextAdapterExtension,
|
|
||||||
EmbedLoomBlockPlainTextAdapterExtension,
|
|
||||||
EmbedYoutubeBlockPlainTextAdapterExtension,
|
|
||||||
EmbedLinkedDocBlockPlainTextAdapterExtension,
|
|
||||||
EmbedSyncedDocBlockPlainTextAdapterExtension,
|
|
||||||
EmbedIframeBlockPlainTextAdapterExtension,
|
|
||||||
LatexBlockPlainTextAdapterExtension,
|
|
||||||
DatabaseBlockPlainTextAdapterExtension,
|
|
||||||
];
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-block-embed-doc';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-block-embed-doc/store';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-block-embed-doc/view';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-block-root/store';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-block-root/view';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-components/citation';
|
||||||
@@ -1,92 +1,24 @@
|
|||||||
import { effects as blockAttachmentEffects } from '@blocksuite/affine-block-attachment/effects';
|
import { type effects as blockRootEffects } from '@blocksuite/affine-block-root/effects';
|
||||||
import { effects as blockBookmarkEffects } from '@blocksuite/affine-block-bookmark/effects';
|
import { type effects as componentCaptionEffects } from '@blocksuite/affine-components/caption';
|
||||||
import { effects as blockCalloutEffects } from '@blocksuite/affine-block-callout/effects';
|
import { type effects as componentColorPickerEffects } from '@blocksuite/affine-components/color-picker';
|
||||||
import { effects as blockCodeEffects } from '@blocksuite/affine-block-code/effects';
|
import { type effects as componentContextMenuEffects } from '@blocksuite/affine-components/context-menu';
|
||||||
import { effects as blockDataViewEffects } from '@blocksuite/affine-block-data-view/effects';
|
import { type effects as componentDatePickerEffects } from '@blocksuite/affine-components/date-picker';
|
||||||
import { effects as blockDatabaseEffects } from '@blocksuite/affine-block-database/effects';
|
import { type effects as componentDropIndicatorEffects } from '@blocksuite/affine-components/drop-indicator';
|
||||||
import { effects as blockDividerEffects } from '@blocksuite/affine-block-divider/effects';
|
import { type effects as componentEmbedCardModalEffects } from '@blocksuite/affine-components/embed-card-modal';
|
||||||
import { effects as blockEdgelessTextEffects } from '@blocksuite/affine-block-edgeless-text/effects';
|
import { type effects as componentHighlightDropdownMenuEffects } from '@blocksuite/affine-components/highlight-dropdown-menu';
|
||||||
import { effects as blockEmbedEffects } from '@blocksuite/affine-block-embed/effects';
|
import { type effects as componentLinkPreviewEffects } from '@blocksuite/affine-components/link-preview';
|
||||||
import { effects as blockFrameEffects } from '@blocksuite/affine-block-frame/effects';
|
import { type effects as componentLinkedDocTitleEffects } from '@blocksuite/affine-components/linked-doc-title';
|
||||||
import { effects as blockImageEffects } from '@blocksuite/affine-block-image/effects';
|
import { type effects as componentPortalEffects } from '@blocksuite/affine-components/portal';
|
||||||
import { effects as blockLatexEffects } from '@blocksuite/affine-block-latex/effects';
|
import { type effects as componentToggleButtonEffects } from '@blocksuite/affine-components/toggle-button';
|
||||||
import { effects as blockListEffects } from '@blocksuite/affine-block-list/effects';
|
import { type effects as componentToolbarEffects } from '@blocksuite/affine-components/toolbar';
|
||||||
import { effects as blockNoteEffects } from '@blocksuite/affine-block-note/effects';
|
import { type effects as componentViewDropdownMenuEffects } from '@blocksuite/affine-components/view-dropdown-menu';
|
||||||
import { effects as blockParagraphEffects } from '@blocksuite/affine-block-paragraph/effects';
|
import { type effects as richTextEffects } from '@blocksuite/affine-rich-text/effects';
|
||||||
import { effects as blockRootEffects } from '@blocksuite/affine-block-root/effects';
|
import { type effects as stdEffects } from '@blocksuite/std/effects';
|
||||||
import { effects as blockSurfaceEffects } from '@blocksuite/affine-block-surface/effects';
|
|
||||||
import { effects as blockSurfaceRefEffects } from '@blocksuite/affine-block-surface-ref/effects';
|
|
||||||
import { effects as blockTableEffects } from '@blocksuite/affine-block-table/effects';
|
|
||||||
import { BlockSelection } from '@blocksuite/affine-components/block-selection';
|
|
||||||
import { BlockZeroWidth } from '@blocksuite/affine-components/block-zero-width';
|
|
||||||
import { effects as componentCaptionEffects } from '@blocksuite/affine-components/caption';
|
|
||||||
import { effects as componentCardStyleDropdownMenuEffects } from '@blocksuite/affine-components/card-style-dropdown-menu';
|
|
||||||
import { effects as componentCitationEffects } from '@blocksuite/affine-components/citation';
|
|
||||||
import { effects as componentColorPickerEffects } from '@blocksuite/affine-components/color-picker';
|
|
||||||
import { effects as componentContextMenuEffects } from '@blocksuite/affine-components/context-menu';
|
|
||||||
import { effects as componentDatePickerEffects } from '@blocksuite/affine-components/date-picker';
|
|
||||||
import { effects as componentDropIndicatorEffects } from '@blocksuite/affine-components/drop-indicator';
|
|
||||||
import { effects as componentEdgelessLineStylesEffects } from '@blocksuite/affine-components/edgeless-line-styles-panel';
|
|
||||||
import { effects as componentEdgelessLineWidthEffects } from '@blocksuite/affine-components/edgeless-line-width-panel';
|
|
||||||
import { effects as componentEdgelessShapeColorPickerEffects } from '@blocksuite/affine-components/edgeless-shape-color-picker';
|
|
||||||
import { effects as componentEmbedCardModalEffects } from '@blocksuite/affine-components/embed-card-modal';
|
|
||||||
import { FilterableListComponent } from '@blocksuite/affine-components/filterable-list';
|
|
||||||
import { effects as componentHighlightDropdownMenuEffects } from '@blocksuite/affine-components/highlight-dropdown-menu';
|
|
||||||
import { IconButton } from '@blocksuite/affine-components/icon-button';
|
|
||||||
import { effects as componentLinkPreviewEffects } from '@blocksuite/affine-components/link-preview';
|
|
||||||
import { effects as componentLinkedDocTitleEffects } from '@blocksuite/affine-components/linked-doc-title';
|
|
||||||
import { effects as componentOpenDocDropdownMenuEffects } from '@blocksuite/affine-components/open-doc-dropdown-menu';
|
|
||||||
import { effects as componentPortalEffects } from '@blocksuite/affine-components/portal';
|
|
||||||
import { effects as componentSizeDropdownMenuEffects } from '@blocksuite/affine-components/size-dropdown-menu';
|
|
||||||
import { SmoothCorner } from '@blocksuite/affine-components/smooth-corner';
|
|
||||||
import { effects as componentToggleButtonEffects } from '@blocksuite/affine-components/toggle-button';
|
|
||||||
import { ToggleSwitch } from '@blocksuite/affine-components/toggle-switch';
|
|
||||||
import { effects as componentToolbarEffects } from '@blocksuite/affine-components/toolbar';
|
|
||||||
import { effects as componentTooltipContentWithShortcutEffects } from '@blocksuite/affine-components/tooltip-content-with-shortcut';
|
|
||||||
import { effects as componentViewDropdownMenuEffects } from '@blocksuite/affine-components/view-dropdown-menu';
|
|
||||||
import { effects as fragmentDocTitleEffects } from '@blocksuite/affine-fragment-doc-title/effects';
|
|
||||||
import { effects as fragmentFramePanelEffects } from '@blocksuite/affine-fragment-frame-panel/effects';
|
|
||||||
import { effects as fragmentOutlineEffects } from '@blocksuite/affine-fragment-outline/effects';
|
|
||||||
import { effects as inlineFootnoteEffects } from '@blocksuite/affine-inline-footnote/effects';
|
|
||||||
import { effects as inlineLatexEffects } from '@blocksuite/affine-inline-latex/effects';
|
|
||||||
import { effects as inlineLinkEffects } from '@blocksuite/affine-inline-link/effects';
|
|
||||||
import { effects as inlineMentionEffects } from '@blocksuite/affine-inline-mention';
|
|
||||||
import { effects as inlinePresetEffects } from '@blocksuite/affine-inline-preset/effects';
|
|
||||||
import { effects as inlineReferenceEffects } from '@blocksuite/affine-inline-reference/effects';
|
|
||||||
import { effects as richTextEffects } from '@blocksuite/affine-rich-text/effects';
|
|
||||||
import { effects as widgetDragHandleEffects } from '@blocksuite/affine-widget-drag-handle/effects';
|
|
||||||
import { effects as widgetEdgelessAutoConnectEffects } from '@blocksuite/affine-widget-edgeless-auto-connect/effects';
|
|
||||||
import { effects as widgetFrameTitleEffects } from '@blocksuite/affine-widget-frame-title/effects';
|
|
||||||
import { effects as widgetRemoteSelectionEffects } from '@blocksuite/affine-widget-remote-selection/effects';
|
|
||||||
import { effects as widgetScrollAnchoringEffects } from '@blocksuite/affine-widget-scroll-anchoring/effects';
|
|
||||||
import { effects as widgetSlashMenuEffects } from '@blocksuite/affine-widget-slash-menu/effects';
|
|
||||||
import { effects as widgetToolbarEffects } from '@blocksuite/affine-widget-toolbar/effects';
|
|
||||||
import { effects as dataViewEffects } from '@blocksuite/data-view/effects';
|
|
||||||
import { effects as stdEffects } from '@blocksuite/std/effects';
|
|
||||||
|
|
||||||
export declare const _GLOBAL_:
|
export declare const _GLOBAL_:
|
||||||
| typeof stdEffects
|
| typeof stdEffects
|
||||||
| typeof dataViewEffects
|
|
||||||
| typeof richTextEffects
|
| typeof richTextEffects
|
||||||
| typeof blockNoteEffects
|
|
||||||
| typeof blockAttachmentEffects
|
|
||||||
| typeof blockBookmarkEffects
|
|
||||||
| typeof blockFrameEffects
|
|
||||||
| typeof blockListEffects
|
|
||||||
| typeof blockParagraphEffects
|
|
||||||
| typeof blockEmbedEffects
|
|
||||||
| typeof blockSurfaceEffects
|
|
||||||
| typeof blockImageEffects
|
|
||||||
| typeof blockDatabaseEffects
|
|
||||||
| typeof blockSurfaceRefEffects
|
|
||||||
| typeof blockLatexEffects
|
|
||||||
| typeof blockEdgelessTextEffects
|
|
||||||
| typeof blockDividerEffects
|
|
||||||
| typeof blockDataViewEffects
|
|
||||||
| typeof blockCodeEffects
|
|
||||||
| typeof blockTableEffects
|
|
||||||
| typeof blockRootEffects
|
| typeof blockRootEffects
|
||||||
| typeof blockCalloutEffects
|
|
||||||
| typeof componentCaptionEffects
|
| typeof componentCaptionEffects
|
||||||
| typeof componentContextMenuEffects
|
| typeof componentContextMenuEffects
|
||||||
| typeof componentDatePickerEffects
|
| typeof componentDatePickerEffects
|
||||||
@@ -99,89 +31,4 @@ export declare const _GLOBAL_:
|
|||||||
| typeof componentToolbarEffects
|
| typeof componentToolbarEffects
|
||||||
| typeof componentToggleButtonEffects
|
| typeof componentToggleButtonEffects
|
||||||
| typeof componentColorPickerEffects
|
| typeof componentColorPickerEffects
|
||||||
| typeof componentViewDropdownMenuEffects
|
| typeof componentViewDropdownMenuEffects;
|
||||||
| typeof widgetScrollAnchoringEffects
|
|
||||||
| typeof widgetFrameTitleEffects
|
|
||||||
| typeof widgetRemoteSelectionEffects
|
|
||||||
| typeof widgetDragHandleEffects
|
|
||||||
| typeof widgetEdgelessAutoConnectEffects
|
|
||||||
| typeof widgetToolbarEffects
|
|
||||||
| typeof widgetSlashMenuEffects
|
|
||||||
| typeof fragmentDocTitleEffects
|
|
||||||
| typeof fragmentFramePanelEffects
|
|
||||||
| typeof fragmentOutlineEffects;
|
|
||||||
|
|
||||||
export function effects() {
|
|
||||||
stdEffects();
|
|
||||||
|
|
||||||
dataViewEffects();
|
|
||||||
richTextEffects();
|
|
||||||
|
|
||||||
inlineReferenceEffects();
|
|
||||||
inlinePresetEffects();
|
|
||||||
inlineLinkEffects();
|
|
||||||
inlineFootnoteEffects();
|
|
||||||
inlineLatexEffects();
|
|
||||||
inlineMentionEffects();
|
|
||||||
|
|
||||||
blockNoteEffects();
|
|
||||||
blockAttachmentEffects();
|
|
||||||
blockBookmarkEffects();
|
|
||||||
blockFrameEffects();
|
|
||||||
blockListEffects();
|
|
||||||
blockParagraphEffects();
|
|
||||||
blockEmbedEffects();
|
|
||||||
blockSurfaceEffects();
|
|
||||||
blockImageEffects();
|
|
||||||
blockDatabaseEffects();
|
|
||||||
blockSurfaceRefEffects();
|
|
||||||
blockLatexEffects();
|
|
||||||
blockEdgelessTextEffects();
|
|
||||||
blockDividerEffects();
|
|
||||||
blockDataViewEffects();
|
|
||||||
blockCodeEffects();
|
|
||||||
blockTableEffects();
|
|
||||||
blockRootEffects();
|
|
||||||
blockCalloutEffects();
|
|
||||||
|
|
||||||
componentCaptionEffects();
|
|
||||||
componentContextMenuEffects();
|
|
||||||
componentDatePickerEffects();
|
|
||||||
componentPortalEffects();
|
|
||||||
componentToolbarEffects();
|
|
||||||
componentDropIndicatorEffects();
|
|
||||||
componentToggleButtonEffects();
|
|
||||||
componentColorPickerEffects();
|
|
||||||
componentEmbedCardModalEffects();
|
|
||||||
componentLinkPreviewEffects();
|
|
||||||
componentLinkedDocTitleEffects();
|
|
||||||
componentCitationEffects();
|
|
||||||
componentCardStyleDropdownMenuEffects();
|
|
||||||
componentHighlightDropdownMenuEffects();
|
|
||||||
componentViewDropdownMenuEffects();
|
|
||||||
componentTooltipContentWithShortcutEffects();
|
|
||||||
componentSizeDropdownMenuEffects();
|
|
||||||
componentEdgelessLineWidthEffects();
|
|
||||||
componentEdgelessLineStylesEffects();
|
|
||||||
componentEdgelessShapeColorPickerEffects();
|
|
||||||
componentOpenDocDropdownMenuEffects();
|
|
||||||
|
|
||||||
widgetScrollAnchoringEffects();
|
|
||||||
widgetFrameTitleEffects();
|
|
||||||
widgetRemoteSelectionEffects();
|
|
||||||
widgetDragHandleEffects();
|
|
||||||
widgetEdgelessAutoConnectEffects();
|
|
||||||
widgetSlashMenuEffects();
|
|
||||||
widgetToolbarEffects();
|
|
||||||
|
|
||||||
fragmentDocTitleEffects();
|
|
||||||
fragmentFramePanelEffects();
|
|
||||||
fragmentOutlineEffects();
|
|
||||||
|
|
||||||
customElements.define('icon-button', IconButton);
|
|
||||||
customElements.define('smooth-corner', SmoothCorner);
|
|
||||||
customElements.define('toggle-switch', ToggleSwitch);
|
|
||||||
customElements.define('affine-filterable-list', FilterableListComponent);
|
|
||||||
customElements.define('block-zero-width', BlockZeroWidth);
|
|
||||||
customElements.define('affine-block-selection', BlockSelection);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
import { effects as blockRootEffects } from '@blocksuite/affine-block-root/effects';
|
|
||||||
import { effects as fragmentDocTitleEffects } from '@blocksuite/affine-fragment-doc-title/effects';
|
|
||||||
import { effects as fragmentFramePanelEffects } from '@blocksuite/affine-fragment-frame-panel/effects';
|
|
||||||
import { effects as fragmentOutlineEffects } from '@blocksuite/affine-fragment-outline/effects';
|
|
||||||
|
|
||||||
export function effects() {
|
|
||||||
blockRootEffects();
|
|
||||||
|
|
||||||
fragmentDocTitleEffects();
|
|
||||||
fragmentFramePanelEffects();
|
|
||||||
fragmentOutlineEffects();
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
import {
|
|
||||||
RootBlockHtmlAdapterExtension,
|
|
||||||
RootBlockMarkdownAdapterExtension,
|
|
||||||
RootBlockNotionHtmlAdapterExtension,
|
|
||||||
} from '@blocksuite/affine-block-root';
|
|
||||||
import {
|
|
||||||
type StoreExtensionContext,
|
|
||||||
StoreExtensionProvider,
|
|
||||||
} from '@blocksuite/affine-ext-loader';
|
|
||||||
import { RootBlockSchemaExtension } from '@blocksuite/affine-model';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
const defaultBlockHtmlAdapterMatchers = [RootBlockHtmlAdapterExtension];
|
|
||||||
|
|
||||||
const defaultBlockMarkdownAdapterMatchers = [RootBlockMarkdownAdapterExtension];
|
|
||||||
|
|
||||||
const defaultBlockNotionHtmlAdapterMatchers: ExtensionType[] = [
|
|
||||||
RootBlockNotionHtmlAdapterExtension,
|
|
||||||
];
|
|
||||||
|
|
||||||
function getHtmlAdapterExtensions(): ExtensionType[] {
|
|
||||||
return [...defaultBlockHtmlAdapterMatchers];
|
|
||||||
}
|
|
||||||
|
|
||||||
function getMarkdownAdapterExtensions(): ExtensionType[] {
|
|
||||||
return [...defaultBlockMarkdownAdapterMatchers];
|
|
||||||
}
|
|
||||||
|
|
||||||
function getNotionHtmlAdapterExtensions(): ExtensionType[] {
|
|
||||||
return [...defaultBlockNotionHtmlAdapterMatchers];
|
|
||||||
}
|
|
||||||
|
|
||||||
const MigratingStoreExtensions: ExtensionType[] = [
|
|
||||||
RootBlockSchemaExtension,
|
|
||||||
|
|
||||||
getHtmlAdapterExtensions(),
|
|
||||||
getMarkdownAdapterExtensions(),
|
|
||||||
getNotionHtmlAdapterExtensions(),
|
|
||||||
].flat();
|
|
||||||
|
|
||||||
export class MigratingStoreExtension extends StoreExtensionProvider {
|
|
||||||
override name = 'migrating';
|
|
||||||
|
|
||||||
override setup(context: StoreExtensionContext) {
|
|
||||||
super.setup(context);
|
|
||||||
context.register(MigratingStoreExtensions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
import {
|
|
||||||
type ViewExtensionContext,
|
|
||||||
ViewExtensionProvider,
|
|
||||||
} from '@blocksuite/affine-ext-loader';
|
|
||||||
|
|
||||||
import { effects } from './effects';
|
|
||||||
import {
|
|
||||||
MigratingEdgelessEditorBlockSpecs,
|
|
||||||
MigratingPageEditorBlockSpecs,
|
|
||||||
MigratingPreviewEdgelessEditorBlockSpecs,
|
|
||||||
MigratingPreviewPageEditorBlockSpecs,
|
|
||||||
} from './migrating';
|
|
||||||
|
|
||||||
export class MigratingViewExtension extends ViewExtensionProvider {
|
|
||||||
override name = 'migrating';
|
|
||||||
|
|
||||||
override effect() {
|
|
||||||
super.effect();
|
|
||||||
effects();
|
|
||||||
}
|
|
||||||
|
|
||||||
override setup(context: ViewExtensionContext) {
|
|
||||||
super.setup(context);
|
|
||||||
const scope = context.scope;
|
|
||||||
if (scope === 'preview-page') {
|
|
||||||
context.register(MigratingPreviewPageEditorBlockSpecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (scope === 'preview-edgeless') {
|
|
||||||
context.register(MigratingPreviewEdgelessEditorBlockSpecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (scope === 'page' || scope === 'mobile-page') {
|
|
||||||
context.register(MigratingPageEditorBlockSpecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (scope === 'edgeless' || scope === 'mobile-edgeless') {
|
|
||||||
context.register(MigratingEdgelessEditorBlockSpecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import {
|
|
||||||
EdgelessBuiltInSpecs,
|
|
||||||
PageRootBlockSpec,
|
|
||||||
PreviewEdgelessRootBlockSpec,
|
|
||||||
PreviewPageRootBlockSpec,
|
|
||||||
ReadOnlyClipboard,
|
|
||||||
} from '@blocksuite/affine-block-root';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
export const MigratingEdgelessEditorBlockSpecs: ExtensionType[] = [
|
|
||||||
EdgelessBuiltInSpecs,
|
|
||||||
].flat();
|
|
||||||
|
|
||||||
export const MigratingPageEditorBlockSpecs: ExtensionType[] = [
|
|
||||||
PageRootBlockSpec,
|
|
||||||
].flat();
|
|
||||||
|
|
||||||
export const MigratingPreviewEdgelessEditorBlockSpecs: ExtensionType[] = [
|
|
||||||
PreviewEdgelessRootBlockSpec,
|
|
||||||
ReadOnlyClipboard,
|
|
||||||
].flat();
|
|
||||||
|
|
||||||
export const MigratingPreviewPageEditorBlockSpecs: ExtensionType[] = [
|
|
||||||
PreviewPageRootBlockSpec,
|
|
||||||
ReadOnlyClipboard,
|
|
||||||
].flat();
|
|
||||||
@@ -7,12 +7,14 @@ import { DatabaseStoreExtension } from '@blocksuite/affine-block-database/store'
|
|||||||
import { DividerStoreExtension } from '@blocksuite/affine-block-divider/store';
|
import { DividerStoreExtension } from '@blocksuite/affine-block-divider/store';
|
||||||
import { EdgelessTextStoreExtension } from '@blocksuite/affine-block-edgeless-text/store';
|
import { EdgelessTextStoreExtension } from '@blocksuite/affine-block-edgeless-text/store';
|
||||||
import { EmbedStoreExtension } from '@blocksuite/affine-block-embed/store';
|
import { EmbedStoreExtension } from '@blocksuite/affine-block-embed/store';
|
||||||
|
import { EmbedDocStoreExtension } from '@blocksuite/affine-block-embed-doc/store';
|
||||||
import { FrameStoreExtension } from '@blocksuite/affine-block-frame/store';
|
import { FrameStoreExtension } from '@blocksuite/affine-block-frame/store';
|
||||||
import { ImageStoreExtension } from '@blocksuite/affine-block-image/store';
|
import { ImageStoreExtension } from '@blocksuite/affine-block-image/store';
|
||||||
import { LatexStoreExtension } from '@blocksuite/affine-block-latex/store';
|
import { LatexStoreExtension } from '@blocksuite/affine-block-latex/store';
|
||||||
import { ListStoreExtension } from '@blocksuite/affine-block-list/store';
|
import { ListStoreExtension } from '@blocksuite/affine-block-list/store';
|
||||||
import { NoteStoreExtension } from '@blocksuite/affine-block-note/store';
|
import { NoteStoreExtension } from '@blocksuite/affine-block-note/store';
|
||||||
import { ParagraphStoreExtension } from '@blocksuite/affine-block-paragraph/store';
|
import { ParagraphStoreExtension } from '@blocksuite/affine-block-paragraph/store';
|
||||||
|
import { RootStoreExtension } from '@blocksuite/affine-block-root/store';
|
||||||
import { SurfaceStoreExtension } from '@blocksuite/affine-block-surface/store';
|
import { SurfaceStoreExtension } from '@blocksuite/affine-block-surface/store';
|
||||||
import { SurfaceRefStoreExtension } from '@blocksuite/affine-block-surface-ref/store';
|
import { SurfaceRefStoreExtension } from '@blocksuite/affine-block-surface-ref/store';
|
||||||
import { TableStoreExtension } from '@blocksuite/affine-block-table/store';
|
import { TableStoreExtension } from '@blocksuite/affine-block-table/store';
|
||||||
@@ -29,8 +31,6 @@ import { LinkStoreExtension } from '@blocksuite/affine-inline-link/store';
|
|||||||
import { InlinePresetStoreExtension } from '@blocksuite/affine-inline-preset/store';
|
import { InlinePresetStoreExtension } from '@blocksuite/affine-inline-preset/store';
|
||||||
import { ReferenceStoreExtension } from '@blocksuite/affine-inline-reference/store';
|
import { ReferenceStoreExtension } from '@blocksuite/affine-inline-reference/store';
|
||||||
|
|
||||||
import { MigratingStoreExtension } from './migrating-store';
|
|
||||||
|
|
||||||
export function getInternalStoreExtensions() {
|
export function getInternalStoreExtensions() {
|
||||||
return [
|
return [
|
||||||
FoundationStoreExtension,
|
FoundationStoreExtension,
|
||||||
@@ -44,6 +44,7 @@ export function getInternalStoreExtensions() {
|
|||||||
DividerStoreExtension,
|
DividerStoreExtension,
|
||||||
EdgelessTextStoreExtension,
|
EdgelessTextStoreExtension,
|
||||||
EmbedStoreExtension,
|
EmbedStoreExtension,
|
||||||
|
EmbedDocStoreExtension,
|
||||||
FrameStoreExtension,
|
FrameStoreExtension,
|
||||||
ImageStoreExtension,
|
ImageStoreExtension,
|
||||||
LatexStoreExtension,
|
LatexStoreExtension,
|
||||||
@@ -53,6 +54,7 @@ export function getInternalStoreExtensions() {
|
|||||||
SurfaceRefStoreExtension,
|
SurfaceRefStoreExtension,
|
||||||
TableStoreExtension,
|
TableStoreExtension,
|
||||||
SurfaceStoreExtension,
|
SurfaceStoreExtension,
|
||||||
|
RootStoreExtension,
|
||||||
|
|
||||||
FootnoteStoreExtension,
|
FootnoteStoreExtension,
|
||||||
LinkStoreExtension,
|
LinkStoreExtension,
|
||||||
@@ -66,7 +68,5 @@ export function getInternalStoreExtensions() {
|
|||||||
ConnectorStoreExtension,
|
ConnectorStoreExtension,
|
||||||
GroupStoreExtension,
|
GroupStoreExtension,
|
||||||
TextStoreExtension,
|
TextStoreExtension,
|
||||||
|
|
||||||
MigratingStoreExtension,
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,21 @@ import { DatabaseViewExtension } from '@blocksuite/affine-block-database/view';
|
|||||||
import { DividerViewExtension } from '@blocksuite/affine-block-divider/view';
|
import { DividerViewExtension } from '@blocksuite/affine-block-divider/view';
|
||||||
import { EdgelessTextViewExtension } from '@blocksuite/affine-block-edgeless-text/view';
|
import { EdgelessTextViewExtension } from '@blocksuite/affine-block-edgeless-text/view';
|
||||||
import { EmbedViewExtension } from '@blocksuite/affine-block-embed/view';
|
import { EmbedViewExtension } from '@blocksuite/affine-block-embed/view';
|
||||||
|
import { EmbedDocViewExtension } from '@blocksuite/affine-block-embed-doc/view';
|
||||||
import { FrameViewExtension } from '@blocksuite/affine-block-frame/view';
|
import { FrameViewExtension } from '@blocksuite/affine-block-frame/view';
|
||||||
import { ImageViewExtension } from '@blocksuite/affine-block-image/view';
|
import { ImageViewExtension } from '@blocksuite/affine-block-image/view';
|
||||||
import { LatexViewExtension } from '@blocksuite/affine-block-latex/view';
|
import { LatexViewExtension } from '@blocksuite/affine-block-latex/view';
|
||||||
import { ListViewExtension } from '@blocksuite/affine-block-list/view';
|
import { ListViewExtension } from '@blocksuite/affine-block-list/view';
|
||||||
import { NoteViewExtension } from '@blocksuite/affine-block-note/view';
|
import { NoteViewExtension } from '@blocksuite/affine-block-note/view';
|
||||||
import { ParagraphViewExtension } from '@blocksuite/affine-block-paragraph/view';
|
import { ParagraphViewExtension } from '@blocksuite/affine-block-paragraph/view';
|
||||||
|
import { RootViewExtension } from '@blocksuite/affine-block-root/view';
|
||||||
import { SurfaceViewExtension } from '@blocksuite/affine-block-surface/view';
|
import { SurfaceViewExtension } from '@blocksuite/affine-block-surface/view';
|
||||||
import { SurfaceRefViewExtension } from '@blocksuite/affine-block-surface-ref/view';
|
import { SurfaceRefViewExtension } from '@blocksuite/affine-block-surface-ref/view';
|
||||||
import { TableViewExtension } from '@blocksuite/affine-block-table/view';
|
import { TableViewExtension } from '@blocksuite/affine-block-table/view';
|
||||||
import { FoundationViewExtension } from '@blocksuite/affine-foundation/view';
|
import { FoundationViewExtension } from '@blocksuite/affine-foundation/view';
|
||||||
|
import { DocTitleViewExtension } from '@blocksuite/affine-fragment-doc-title/view';
|
||||||
|
import { FramePanelViewExtension } from '@blocksuite/affine-fragment-frame-panel/view';
|
||||||
|
import { OutlineViewExtension } from '@blocksuite/affine-fragment-outline/view';
|
||||||
import { BrushViewExtension } from '@blocksuite/affine-gfx-brush/view';
|
import { BrushViewExtension } from '@blocksuite/affine-gfx-brush/view';
|
||||||
import { ConnectorViewExtension } from '@blocksuite/affine-gfx-connector/view';
|
import { ConnectorViewExtension } from '@blocksuite/affine-gfx-connector/view';
|
||||||
import { GroupViewExtension } from '@blocksuite/affine-gfx-group/view';
|
import { GroupViewExtension } from '@blocksuite/affine-gfx-group/view';
|
||||||
@@ -47,8 +52,6 @@ import { SlashMenuViewExtension } from '@blocksuite/affine-widget-slash-menu/vie
|
|||||||
import { ToolbarViewExtension } from '@blocksuite/affine-widget-toolbar/view';
|
import { ToolbarViewExtension } from '@blocksuite/affine-widget-toolbar/view';
|
||||||
import { ViewportOverlayViewExtension } from '@blocksuite/affine-widget-viewport-overlay/view';
|
import { ViewportOverlayViewExtension } from '@blocksuite/affine-widget-viewport-overlay/view';
|
||||||
|
|
||||||
import { MigratingViewExtension } from './migrating-view';
|
|
||||||
|
|
||||||
export function getInternalViewExtensions() {
|
export function getInternalViewExtensions() {
|
||||||
return [
|
return [
|
||||||
FoundationViewExtension,
|
FoundationViewExtension,
|
||||||
@@ -75,6 +78,7 @@ export function getInternalViewExtensions() {
|
|||||||
DividerViewExtension,
|
DividerViewExtension,
|
||||||
EdgelessTextViewExtension,
|
EdgelessTextViewExtension,
|
||||||
EmbedViewExtension,
|
EmbedViewExtension,
|
||||||
|
EmbedDocViewExtension,
|
||||||
FrameViewExtension,
|
FrameViewExtension,
|
||||||
ImageViewExtension,
|
ImageViewExtension,
|
||||||
LatexViewExtension,
|
LatexViewExtension,
|
||||||
@@ -84,6 +88,7 @@ export function getInternalViewExtensions() {
|
|||||||
SurfaceRefViewExtension,
|
SurfaceRefViewExtension,
|
||||||
TableViewExtension,
|
TableViewExtension,
|
||||||
SurfaceViewExtension,
|
SurfaceViewExtension,
|
||||||
|
RootViewExtension,
|
||||||
|
|
||||||
// Inline
|
// Inline
|
||||||
FootnoteViewExtension,
|
FootnoteViewExtension,
|
||||||
@@ -97,7 +102,6 @@ export function getInternalViewExtensions() {
|
|||||||
DragHandleViewExtension,
|
DragHandleViewExtension,
|
||||||
EdgelessAutoConnectViewExtension,
|
EdgelessAutoConnectViewExtension,
|
||||||
EdgelessToolbarViewExtension,
|
EdgelessToolbarViewExtension,
|
||||||
MigratingViewExtension,
|
|
||||||
FrameTitleViewExtension,
|
FrameTitleViewExtension,
|
||||||
KeyboardToolbarViewExtension,
|
KeyboardToolbarViewExtension,
|
||||||
LinkedDocViewExtension,
|
LinkedDocViewExtension,
|
||||||
@@ -108,5 +112,10 @@ export function getInternalViewExtensions() {
|
|||||||
ViewportOverlayViewExtension,
|
ViewportOverlayViewExtension,
|
||||||
EdgelessZoomToolbarViewExtension,
|
EdgelessZoomToolbarViewExtension,
|
||||||
PageDraggingAreaViewExtension,
|
PageDraggingAreaViewExtension,
|
||||||
|
|
||||||
|
// Fragment
|
||||||
|
DocTitleViewExtension,
|
||||||
|
FramePanelViewExtension,
|
||||||
|
OutlineViewExtension,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-fragment-doc-title/view';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-fragment-frame-panel/view';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-fragment-outline/view';
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
{ "path": "../blocks/divider" },
|
{ "path": "../blocks/divider" },
|
||||||
{ "path": "../blocks/edgeless-text" },
|
{ "path": "../blocks/edgeless-text" },
|
||||||
{ "path": "../blocks/embed" },
|
{ "path": "../blocks/embed" },
|
||||||
|
{ "path": "../blocks/embed-doc" },
|
||||||
{ "path": "../blocks/frame" },
|
{ "path": "../blocks/frame" },
|
||||||
{ "path": "../blocks/image" },
|
{ "path": "../blocks/image" },
|
||||||
{ "path": "../blocks/latex" },
|
{ "path": "../blocks/latex" },
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
"author": "toeverything",
|
"author": "toeverything",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@blocksuite/affine-block-embed": "workspace:*",
|
|
||||||
"@blocksuite/affine-block-surface": "workspace:*",
|
"@blocksuite/affine-block-surface": "workspace:*",
|
||||||
"@blocksuite/affine-components": "workspace:*",
|
"@blocksuite/affine-components": "workspace:*",
|
||||||
"@blocksuite/affine-ext-loader": "workspace:*",
|
"@blocksuite/affine-ext-loader": "workspace:*",
|
||||||
@@ -21,10 +20,11 @@
|
|||||||
"@blocksuite/icons": "^2.2.12",
|
"@blocksuite/icons": "^2.2.12",
|
||||||
"@blocksuite/std": "workspace:*",
|
"@blocksuite/std": "workspace:*",
|
||||||
"@blocksuite/store": "workspace:*",
|
"@blocksuite/store": "workspace:*",
|
||||||
|
"@blocksuite/sync": "workspace:*",
|
||||||
"@floating-ui/dom": "^1.6.13",
|
"@floating-ui/dom": "^1.6.13",
|
||||||
"@lit/context": "^1.1.2",
|
"@lit/context": "^1.1.2",
|
||||||
"@preact/signals-core": "^1.8.0",
|
"@preact/signals-core": "^1.8.0",
|
||||||
"@toeverything/theme": "^1.1.12",
|
"@toeverything/theme": "^1.1.14",
|
||||||
"file-type": "^20.0.0",
|
"file-type": "^20.0.0",
|
||||||
"lit": "^3.2.0",
|
"lit": "^3.2.0",
|
||||||
"minimatch": "^10.0.1",
|
"minimatch": "^10.0.1",
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import { getEmbedCardIcons } from '@blocksuite/affine-block-embed';
|
|
||||||
import {
|
import {
|
||||||
CaptionedBlockComponent,
|
CaptionedBlockComponent,
|
||||||
SelectedStyle,
|
SelectedStyle,
|
||||||
} from '@blocksuite/affine-components/caption';
|
} from '@blocksuite/affine-components/caption';
|
||||||
import { getAttachmentFileIcon } from '@blocksuite/affine-components/icons';
|
import {
|
||||||
|
getAttachmentFileIcon,
|
||||||
|
getLoadingIconWith,
|
||||||
|
} from '@blocksuite/affine-components/icons';
|
||||||
import { Peekable } from '@blocksuite/affine-components/peek';
|
import { Peekable } from '@blocksuite/affine-components/peek';
|
||||||
import { toast } from '@blocksuite/affine-components/toast';
|
import { toast } from '@blocksuite/affine-components/toast';
|
||||||
import {
|
import {
|
||||||
@@ -35,7 +37,9 @@ import { when } from 'lit/directives/when.js';
|
|||||||
import { AttachmentEmbedProvider } from './embed';
|
import { AttachmentEmbedProvider } from './embed';
|
||||||
import { styles } from './styles';
|
import { styles } from './styles';
|
||||||
import { downloadAttachmentBlob, refreshData } from './utils';
|
import { downloadAttachmentBlob, refreshData } from './utils';
|
||||||
|
|
||||||
type State = 'loading' | 'uploading' | 'warning' | 'oversize' | 'none';
|
type State = 'loading' | 'uploading' | 'warning' | 'oversize' | 'none';
|
||||||
|
|
||||||
@Peekable({
|
@Peekable({
|
||||||
enableOn: ({ model }: AttachmentBlockComponent) => {
|
enableOn: ({ model }: AttachmentBlockComponent) => {
|
||||||
return !model.doc.readonly && model.props.type.endsWith('pdf');
|
return !model.doc.readonly && model.props.type.endsWith('pdf');
|
||||||
@@ -102,7 +106,7 @@ export class AttachmentBlockComponent extends CaptionedBlockComponent<Attachment
|
|||||||
}
|
}
|
||||||
|
|
||||||
determineState = (
|
determineState = (
|
||||||
loading: boolean,
|
downloading: boolean,
|
||||||
uploading: boolean,
|
uploading: boolean,
|
||||||
overSize: boolean,
|
overSize: boolean,
|
||||||
error: boolean
|
error: boolean
|
||||||
@@ -110,7 +114,7 @@ export class AttachmentBlockComponent extends CaptionedBlockComponent<Attachment
|
|||||||
if (overSize) return 'oversize';
|
if (overSize) return 'oversize';
|
||||||
if (error) return 'warning';
|
if (error) return 'warning';
|
||||||
if (uploading) return 'uploading';
|
if (uploading) return 'uploading';
|
||||||
if (loading) return 'loading';
|
if (downloading) return 'loading';
|
||||||
return 'none';
|
return 'none';
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -295,7 +299,7 @@ export class AttachmentBlockComponent extends CaptionedBlockComponent<Attachment
|
|||||||
const cardStyle = style ?? AttachmentBlockStyles[1];
|
const cardStyle = style ?? AttachmentBlockStyles[1];
|
||||||
|
|
||||||
const theme = this.std.get(ThemeProvider).theme$.value;
|
const theme = this.std.get(ThemeProvider).theme$.value;
|
||||||
const { LoadingIcon } = getEmbedCardIcons(theme);
|
const loadingIcon = getLoadingIconWith(theme);
|
||||||
|
|
||||||
const blobState = this.blobState$.value;
|
const blobState = this.blobState$.value;
|
||||||
const {
|
const {
|
||||||
@@ -306,8 +310,8 @@ export class AttachmentBlockComponent extends CaptionedBlockComponent<Attachment
|
|||||||
} = blobState;
|
} = blobState;
|
||||||
const warning = !overSize && Boolean(errorMessage);
|
const warning = !overSize && Boolean(errorMessage);
|
||||||
const error = overSize || warning;
|
const error = overSize || warning;
|
||||||
const loading = !error && downloading;
|
const state = this.determineState(downloading, uploading, overSize, error);
|
||||||
const state = this.determineState(loading, uploading, overSize, error);
|
const loading = state === 'loading' || state === 'uploading';
|
||||||
|
|
||||||
const classInfo = {
|
const classInfo = {
|
||||||
'affine-attachment-card': true,
|
'affine-attachment-card': true,
|
||||||
@@ -317,7 +321,7 @@ export class AttachmentBlockComponent extends CaptionedBlockComponent<Attachment
|
|||||||
};
|
};
|
||||||
|
|
||||||
const icon = loading
|
const icon = loading
|
||||||
? LoadingIcon
|
? loadingIcon
|
||||||
: error
|
: error
|
||||||
? WarningIcon()
|
? WarningIcon()
|
||||||
: AttachmentIcon();
|
: AttachmentIcon();
|
||||||
|
|||||||
@@ -117,6 +117,11 @@ export const styles = css`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.affine-attachment-card.loading,
|
||||||
|
.affine-attachment-card.error {
|
||||||
|
background: ${unsafeCSSVarV2('layer/background/secondary')};
|
||||||
|
}
|
||||||
|
|
||||||
.affine-attachment-card.cubeThick {
|
.affine-attachment-card.cubeThick {
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
},
|
},
|
||||||
"include": ["./src"],
|
"include": ["./src"],
|
||||||
"references": [
|
"references": [
|
||||||
{ "path": "../embed" },
|
|
||||||
{ "path": "../surface" },
|
{ "path": "../surface" },
|
||||||
{ "path": "../../components" },
|
{ "path": "../../components" },
|
||||||
{ "path": "../../ext-loader" },
|
{ "path": "../../ext-loader" },
|
||||||
@@ -16,6 +15,7 @@
|
|||||||
{ "path": "../../widgets/slash-menu" },
|
{ "path": "../../widgets/slash-menu" },
|
||||||
{ "path": "../../../framework/global" },
|
{ "path": "../../../framework/global" },
|
||||||
{ "path": "../../../framework/std" },
|
{ "path": "../../../framework/std" },
|
||||||
{ "path": "../../../framework/store" }
|
{ "path": "../../../framework/store" },
|
||||||
|
{ "path": "../../../framework/sync" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@blocksuite/affine-block-embed": "workspace:*",
|
"@blocksuite/affine-block-embed": "workspace:*",
|
||||||
|
"@blocksuite/affine-block-embed-doc": "workspace:*",
|
||||||
"@blocksuite/affine-block-surface": "workspace:*",
|
"@blocksuite/affine-block-surface": "workspace:*",
|
||||||
"@blocksuite/affine-components": "workspace:*",
|
"@blocksuite/affine-components": "workspace:*",
|
||||||
"@blocksuite/affine-ext-loader": "workspace:*",
|
"@blocksuite/affine-ext-loader": "workspace:*",
|
||||||
@@ -23,7 +24,7 @@
|
|||||||
"@blocksuite/store": "workspace:*",
|
"@blocksuite/store": "workspace:*",
|
||||||
"@lit/context": "^1.1.2",
|
"@lit/context": "^1.1.2",
|
||||||
"@preact/signals-core": "^1.8.0",
|
"@preact/signals-core": "^1.8.0",
|
||||||
"@toeverything/theme": "^1.1.12",
|
"@toeverything/theme": "^1.1.14",
|
||||||
"lit": "^3.2.0",
|
"lit": "^3.2.0",
|
||||||
"minimatch": "^10.0.1",
|
"minimatch": "^10.0.1",
|
||||||
"rxjs": "^7.8.1",
|
"rxjs": "^7.8.1",
|
||||||
@@ -31,7 +32,7 @@
|
|||||||
"zod": "^3.23.8"
|
"zod": "^3.23.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vitest": "3.1.1"
|
"vitest": "3.1.2"
|
||||||
},
|
},
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts",
|
".": "./src/index.ts",
|
||||||
|
|||||||
@@ -140,4 +140,16 @@ Some text in between
|
|||||||
`.trim();
|
`.trim();
|
||||||
expect(footnoteUrlPreprocessor(input)).toBe(expected);
|
expect(footnoteUrlPreprocessor(input)).toBe(expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should encode partial encoded URLs in footnote definitions', () => {
|
||||||
|
const input = `
|
||||||
|
[^ref]: {"type":"url","url":"https://zh.wikipedia.org/zh-hans/%E5%B0%8F%E7%B1%B3SU7"}
|
||||||
|
[^ref2]: {"type":"url","url":"https://www.dw.com/zh/%E5%B0%8F%E7%B1%B3%E9%A6%96%E6%AC%BE%E6%B1%BD%E8%BD%A6%E5%8F%91%E5%B8%83-su7%E8%B5%B7%E4%BB%B72159%E4%B8%87%E5%85%83/a-68693432"}
|
||||||
|
`.trim();
|
||||||
|
const expected = `
|
||||||
|
[^ref]: {"type":"url","url":"https%3A%2F%2Fzh.wikipedia.org%2Fzh-hans%2F%25E5%25B0%258F%25E7%25B1%25B3SU7"}
|
||||||
|
[^ref2]: {"type":"url","url":"https%3A%2F%2Fwww.dw.com%2Fzh%2F%25E5%25B0%258F%25E7%25B1%25B3%25E9%25A6%2596%25E6%25AC%25BE%25E6%25B1%25BD%25E8%25BD%25A6%25E5%258F%2591%25E5%25B8%2583-su7%25E8%25B5%25B7%25E4%25BB%25B72159%25E4%25B8%2587%25E5%2585%2583%2Fa-68693432"}
|
||||||
|
`.trim();
|
||||||
|
expect(footnoteUrlPreprocessor(input)).toBe(expected);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -23,12 +23,17 @@ type FootnoteDefinition = {
|
|||||||
content: FootNoteReferenceParams;
|
content: FootNoteReferenceParams;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check if a URL is already encoded with encodeURIComponent
|
/**
|
||||||
function isEncoded(uri: string): boolean {
|
* Check if a URL is already encoded with encodeURIComponent to avoid markdown link parsing
|
||||||
|
* @example
|
||||||
|
* https://example.com/path%20with%20spaces should return false
|
||||||
|
* https://example.com/ should return false
|
||||||
|
* https%3A%2F%2Fexample.com%2F should return true
|
||||||
|
*/
|
||||||
|
function isFullyEncoded(uri: string): boolean {
|
||||||
try {
|
try {
|
||||||
// If decoding produces a different result than the original,
|
// Should check if the components of the URI are fully encoded
|
||||||
// then the URI contains encoded characters
|
return uri === encodeURIComponent(decodeURIComponent(uri));
|
||||||
return uri !== decodeURIComponent(uri);
|
|
||||||
} catch {
|
} catch {
|
||||||
// If decoding fails, the URI contains invalid percent-encoding
|
// If decoding fails, the URI contains invalid percent-encoding
|
||||||
return true;
|
return true;
|
||||||
@@ -194,10 +199,10 @@ class FootnoteParser {
|
|||||||
// Process URLs in footnote content
|
// Process URLs in footnote content
|
||||||
private processUrls(footnote: FootnoteDefinition): FootnoteDefinition {
|
private processUrls(footnote: FootnoteDefinition): FootnoteDefinition {
|
||||||
const content = footnote.content;
|
const content = footnote.content;
|
||||||
if (content.url && !isEncoded(content.url)) {
|
if (content.url && !isFullyEncoded(content.url)) {
|
||||||
content.url = encodeURIComponent(content.url);
|
content.url = encodeURIComponent(content.url);
|
||||||
}
|
}
|
||||||
if (content.favicon && !isEncoded(content.favicon)) {
|
if (content.favicon && !isFullyEncoded(content.favicon)) {
|
||||||
content.favicon = encodeURIComponent(content.favicon);
|
content.favicon = encodeURIComponent(content.favicon);
|
||||||
}
|
}
|
||||||
return footnote;
|
return footnote;
|
||||||
|
|||||||
@@ -2,10 +2,16 @@ import {
|
|||||||
CaptionedBlockComponent,
|
CaptionedBlockComponent,
|
||||||
SelectedStyle,
|
SelectedStyle,
|
||||||
} from '@blocksuite/affine-components/caption';
|
} from '@blocksuite/affine-components/caption';
|
||||||
import type { BookmarkBlockModel } from '@blocksuite/affine-model';
|
import type {
|
||||||
import { DocModeProvider } from '@blocksuite/affine-shared/services';
|
BookmarkBlockModel,
|
||||||
|
LinkPreviewData,
|
||||||
|
} from '@blocksuite/affine-model';
|
||||||
|
import {
|
||||||
|
DocModeProvider,
|
||||||
|
LinkPreviewerService,
|
||||||
|
} from '@blocksuite/affine-shared/services';
|
||||||
import { BlockSelection } from '@blocksuite/std';
|
import { BlockSelection } from '@blocksuite/std';
|
||||||
import { computed, type ReadonlySignal } from '@preact/signals-core';
|
import { computed, type ReadonlySignal, signal } from '@preact/signals-core';
|
||||||
import { html } from 'lit';
|
import { html } from 'lit';
|
||||||
import { property, query } from 'lit/decorators.js';
|
import { property, query } from 'lit/decorators.js';
|
||||||
import { type ClassInfo, classMap } from 'lit/directives/class-map.js';
|
import { type ClassInfo, classMap } from 'lit/directives/class-map.js';
|
||||||
@@ -28,6 +34,62 @@ export class BookmarkBlockComponent extends CaptionedBlockComponent<BookmarkBloc
|
|||||||
|
|
||||||
protected containerStyleMap!: ReturnType<typeof styleMap>;
|
protected containerStyleMap!: ReturnType<typeof styleMap>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Local link preview data
|
||||||
|
* When the doc is in readonly mode, and the link preview data are not provided (stored in the block model),
|
||||||
|
* We will use the local link preview data fetched from the link previewer service to render the block.
|
||||||
|
*/
|
||||||
|
private readonly _localLinkPreview$ = signal<LinkPreviewData>({
|
||||||
|
icon: null,
|
||||||
|
title: null,
|
||||||
|
description: null,
|
||||||
|
image: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Link preview data for actual rendering
|
||||||
|
* When the doc is not in readonly mode, and the link preview data are provided (stored in the block model),
|
||||||
|
* We will use the model props to render the block.
|
||||||
|
* Otherwise, we will use the local link preview data to render the block.
|
||||||
|
*/
|
||||||
|
linkPreview$ = computed(() => {
|
||||||
|
const modelProps = this.model.props;
|
||||||
|
const local = this._localLinkPreview$.value;
|
||||||
|
return {
|
||||||
|
icon: modelProps.icon$.value ?? local.icon ?? null,
|
||||||
|
title: modelProps.title$.value ?? local.title ?? null,
|
||||||
|
description: modelProps.description$.value ?? local.description ?? null,
|
||||||
|
image: modelProps.image$.value ?? local.image ?? null,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
private readonly _updateLocalLinkPreview = () => {
|
||||||
|
// cancel any inflight request
|
||||||
|
this._fetchAbortController?.abort();
|
||||||
|
this._fetchAbortController = new AbortController();
|
||||||
|
|
||||||
|
this.loading = true;
|
||||||
|
this.error = false;
|
||||||
|
|
||||||
|
this.std.store
|
||||||
|
.get(LinkPreviewerService)
|
||||||
|
.query(this.model.props.url, this._fetchAbortController.signal)
|
||||||
|
.then(data => {
|
||||||
|
this._localLinkPreview$.value = {
|
||||||
|
icon: data.icon ?? null,
|
||||||
|
title: data.title ?? null,
|
||||||
|
description: data.description ?? null,
|
||||||
|
image: data.image ?? null,
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
this.error = true;
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
selectBlock = () => {
|
selectBlock = () => {
|
||||||
const selectionManager = this.std.selection;
|
const selectionManager = this.std.selection;
|
||||||
const blockSelection = selectionManager.create(BlockSelection, {
|
const blockSelection = selectionManager.create(BlockSelection, {
|
||||||
@@ -57,17 +119,30 @@ export class BookmarkBlockComponent extends CaptionedBlockComponent<BookmarkBloc
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleClick = (event: MouseEvent) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
if (this.model.parent?.flavour !== 'affine:surface' && !this.doc.readonly) {
|
||||||
|
this.selectBlock();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
handleDoubleClick = (event: MouseEvent) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
this.open();
|
||||||
|
};
|
||||||
|
|
||||||
private readonly _renderCitationView = () => {
|
private readonly _renderCitationView = () => {
|
||||||
const { title, description, url, icon, footnoteIdentifier } =
|
const { url, footnoteIdentifier } = this.model.props;
|
||||||
this.model.props;
|
const { icon, title, description } = this.linkPreview$.value;
|
||||||
return html`
|
return html`
|
||||||
<affine-citation-card
|
<affine-citation-card
|
||||||
.icon=${icon}
|
.icon=${icon}
|
||||||
.citationTitle=${title || url}
|
.citationTitle=${title || url}
|
||||||
.citationContent=${description}
|
.citationContent=${description}
|
||||||
.citationIdentifier=${footnoteIdentifier}
|
.citationIdentifier=${footnoteIdentifier}
|
||||||
.onClickCallback=${this.selectBlock}
|
.onClickCallback=${this.handleClick}
|
||||||
.onDoubleClickCallback=${this.open}
|
.onDoubleClickCallback=${this.handleDoubleClick}
|
||||||
.active=${this.selected$.value}
|
.active=${this.selected$.value}
|
||||||
></affine-citation-card>
|
></affine-citation-card>
|
||||||
`;
|
`;
|
||||||
@@ -97,10 +172,17 @@ export class BookmarkBlockComponent extends CaptionedBlockComponent<BookmarkBloc
|
|||||||
|
|
||||||
this.contentEditable = 'false';
|
this.contentEditable = 'false';
|
||||||
|
|
||||||
if (!this.model.props.description && !this.model.props.title) {
|
if (
|
||||||
|
(!this.model.props.description && !this.model.props.title) ||
|
||||||
|
(!this.model.props.image && this.model.props.style === 'vertical')
|
||||||
|
) {
|
||||||
|
// When the doc is readonly, and the preview data not provided
|
||||||
|
// We should fetch the preview data and update the local link preview data
|
||||||
if (this.doc.readonly) {
|
if (this.doc.readonly) {
|
||||||
|
this._updateLocalLinkPreview();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// Otherwise, we should refresh the data to the model props
|
||||||
this.refreshData();
|
this.refreshData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
|
import { insertEmbedIframeWithUrlCommand } from '@blocksuite/affine-block-embed';
|
||||||
import {
|
import {
|
||||||
type InsertedLinkType,
|
type InsertedLinkType,
|
||||||
insertEmbedIframeWithUrlCommand,
|
|
||||||
insertEmbedLinkedDocCommand,
|
insertEmbedLinkedDocCommand,
|
||||||
type LinkableFlavour,
|
type LinkableFlavour,
|
||||||
} from '@blocksuite/affine-block-embed';
|
} from '@blocksuite/affine-block-embed-doc';
|
||||||
import { QuickSearchProvider } from '@blocksuite/affine-shared/services';
|
import { QuickSearchProvider } from '@blocksuite/affine-shared/services';
|
||||||
import type { Command } from '@blocksuite/std';
|
import type { Command } from '@blocksuite/std';
|
||||||
|
|
||||||
|
|||||||
@@ -18,20 +18,6 @@ export class BookmarkCard extends SignalWatcher(
|
|||||||
) {
|
) {
|
||||||
static override styles = styles;
|
static override styles = styles;
|
||||||
|
|
||||||
private _handleClick(event: MouseEvent) {
|
|
||||||
event.stopPropagation();
|
|
||||||
const model = this.bookmark.model;
|
|
||||||
|
|
||||||
if (model.parent?.flavour !== 'affine:surface') {
|
|
||||||
this.bookmark.selectBlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private _handleDoubleClick(event: MouseEvent) {
|
|
||||||
event.stopPropagation();
|
|
||||||
this.bookmark.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
override connectedCallback(): void {
|
override connectedCallback(): void {
|
||||||
super.connectedCallback();
|
super.connectedCallback();
|
||||||
|
|
||||||
@@ -49,8 +35,9 @@ export class BookmarkCard extends SignalWatcher(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override render() {
|
override render() {
|
||||||
const { icon, title, url, description, image, style } =
|
const { url, style } = this.bookmark.model.props;
|
||||||
this.bookmark.model.props;
|
const { icon, title, description, image } =
|
||||||
|
this.bookmark.linkPreview$.value;
|
||||||
|
|
||||||
const cardClassMap = classMap({
|
const cardClassMap = classMap({
|
||||||
loading: this.loading,
|
loading: this.loading,
|
||||||
@@ -98,8 +85,8 @@ export class BookmarkCard extends SignalWatcher(
|
|||||||
return html`
|
return html`
|
||||||
<div
|
<div
|
||||||
class="affine-bookmark-card ${cardClassMap}"
|
class="affine-bookmark-card ${cardClassMap}"
|
||||||
@click=${this._handleClick}
|
@click=${this.bookmark.handleClick}
|
||||||
@dblclick=${this._handleDoubleClick}
|
@dblclick=${this.bookmark.handleDoubleClick}
|
||||||
>
|
>
|
||||||
<div class="affine-bookmark-content">
|
<div class="affine-bookmark-content">
|
||||||
<div class="affine-bookmark-content-title">
|
<div class="affine-bookmark-content-title">
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { DefaultTool } from '@blocksuite/affine-block-surface';
|
||||||
import { toggleEmbedCardCreateModal } from '@blocksuite/affine-components/embed-card-modal';
|
import { toggleEmbedCardCreateModal } from '@blocksuite/affine-components/embed-card-modal';
|
||||||
import { BookmarkBlockSchema } from '@blocksuite/affine-model';
|
import { BookmarkBlockSchema } from '@blocksuite/affine-model';
|
||||||
import {
|
import {
|
||||||
@@ -5,6 +6,7 @@ import {
|
|||||||
SlashMenuConfigIdentifier,
|
SlashMenuConfigIdentifier,
|
||||||
} from '@blocksuite/affine-widget-slash-menu';
|
} from '@blocksuite/affine-widget-slash-menu';
|
||||||
import { LinkIcon } from '@blocksuite/icons/lit';
|
import { LinkIcon } from '@blocksuite/icons/lit';
|
||||||
|
import { GfxControllerIdentifier } from '@blocksuite/std/gfx';
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
import type { ExtensionType } from '@blocksuite/store';
|
||||||
|
|
||||||
import { LinkTooltip } from './tooltips';
|
import { LinkTooltip } from './tooltips';
|
||||||
@@ -33,7 +35,13 @@ const bookmarkSlashMenuConfig: SlashMenuConfig = {
|
|||||||
host,
|
host,
|
||||||
'Links',
|
'Links',
|
||||||
'The added link will be displayed as a card view.',
|
'The added link will be displayed as a card view.',
|
||||||
{ mode: 'page', parentModel, index }
|
{ mode: 'page', parentModel, index },
|
||||||
|
({ mode }) => {
|
||||||
|
if (mode === 'edgeless') {
|
||||||
|
const gfx = std.get(GfxControllerIdentifier);
|
||||||
|
gfx.tool.setTool(DefaultTool);
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
if (model.text?.length === 0) {
|
if (model.text?.length === 0) {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"include": ["./src"],
|
"include": ["./src"],
|
||||||
"references": [
|
"references": [
|
||||||
{ "path": "../embed" },
|
{ "path": "../embed" },
|
||||||
|
{ "path": "../embed-doc" },
|
||||||
{ "path": "../surface" },
|
{ "path": "../surface" },
|
||||||
{ "path": "../../components" },
|
{ "path": "../../components" },
|
||||||
{ "path": "../../ext-loader" },
|
{ "path": "../../ext-loader" },
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"@floating-ui/dom": "^1.6.10",
|
"@floating-ui/dom": "^1.6.10",
|
||||||
"@lit/context": "^1.1.2",
|
"@lit/context": "^1.1.2",
|
||||||
"@preact/signals-core": "^1.8.0",
|
"@preact/signals-core": "^1.8.0",
|
||||||
"@toeverything/theme": "^1.1.12",
|
"@toeverything/theme": "^1.1.14",
|
||||||
"@types/mdast": "^4.0.4",
|
"@types/mdast": "^4.0.4",
|
||||||
"emoji-mart": "^5.6.0",
|
"emoji-mart": "^5.6.0",
|
||||||
"lit": "^3.2.0",
|
"lit": "^3.2.0",
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
import { CalloutBlockSchema } from '@blocksuite/affine-model';
|
||||||
|
import {
|
||||||
|
BlockMarkdownAdapterExtension,
|
||||||
|
type BlockMarkdownAdapterMatcher,
|
||||||
|
getCalloutEmoji,
|
||||||
|
isCalloutNode,
|
||||||
|
} from '@blocksuite/affine-shared/adapters';
|
||||||
|
import { nanoid } from '@blocksuite/store';
|
||||||
|
|
||||||
|
// Currently, the callout block children can only be paragraph block or list block
|
||||||
|
// In mdast, the node types are `paragraph`, `list`, `heading`, `blockquote`
|
||||||
|
const CALLOUT_BLOCK_CHILDREN_TYPES = new Set([
|
||||||
|
'paragraph',
|
||||||
|
'list',
|
||||||
|
'heading',
|
||||||
|
'blockquote',
|
||||||
|
]);
|
||||||
|
|
||||||
|
export const calloutBlockMarkdownAdapterMatcher: BlockMarkdownAdapterMatcher = {
|
||||||
|
flavour: CalloutBlockSchema.model.flavour,
|
||||||
|
toMatch: o => isCalloutNode(o.node),
|
||||||
|
fromMatch: o => o.node.flavour === CalloutBlockSchema.model.flavour,
|
||||||
|
toBlockSnapshot: {
|
||||||
|
enter: (o, context) => {
|
||||||
|
if (!o.node.data || !isCalloutNode(o.node)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Currently, the callout block children can only be a paragraph or a list
|
||||||
|
// So we should filter out the other children
|
||||||
|
o.node.children = o.node.children.filter(child =>
|
||||||
|
CALLOUT_BLOCK_CHILDREN_TYPES.has(child.type)
|
||||||
|
);
|
||||||
|
|
||||||
|
const { walkerContext } = context;
|
||||||
|
const calloutEmoji = getCalloutEmoji(o.node);
|
||||||
|
walkerContext.openNode(
|
||||||
|
{
|
||||||
|
type: 'block',
|
||||||
|
id: nanoid(),
|
||||||
|
flavour: CalloutBlockSchema.model.flavour,
|
||||||
|
props: {
|
||||||
|
emoji: calloutEmoji,
|
||||||
|
},
|
||||||
|
children: [],
|
||||||
|
},
|
||||||
|
'children'
|
||||||
|
);
|
||||||
|
},
|
||||||
|
leave: (o, context) => {
|
||||||
|
const { walkerContext } = context;
|
||||||
|
if (isCalloutNode(o.node)) {
|
||||||
|
walkerContext.closeNode();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fromBlockSnapshot: {
|
||||||
|
enter: (o, context) => {
|
||||||
|
const emoji = o.node.props.emoji as string;
|
||||||
|
const { walkerContext } = context;
|
||||||
|
walkerContext
|
||||||
|
.openNode(
|
||||||
|
{
|
||||||
|
type: 'blockquote',
|
||||||
|
children: [],
|
||||||
|
},
|
||||||
|
'children'
|
||||||
|
)
|
||||||
|
.openNode({
|
||||||
|
type: 'paragraph',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
value: `[!${emoji}]`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
.closeNode();
|
||||||
|
},
|
||||||
|
leave: (_, context) => {
|
||||||
|
const { walkerContext } = context;
|
||||||
|
walkerContext.closeNode();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const CalloutBlockMarkdownAdapterExtension =
|
||||||
|
BlockMarkdownAdapterExtension(calloutBlockMarkdownAdapterMatcher);
|
||||||
@@ -3,6 +3,7 @@ import { BlockViewExtension, FlavourExtension } from '@blocksuite/std';
|
|||||||
import type { ExtensionType } from '@blocksuite/store';
|
import type { ExtensionType } from '@blocksuite/store';
|
||||||
import { literal } from 'lit/static-html.js';
|
import { literal } from 'lit/static-html.js';
|
||||||
|
|
||||||
|
import { CalloutBlockMarkdownAdapterExtension } from './adapters/markdown';
|
||||||
import { CalloutKeymapExtension } from './callout-keymap';
|
import { CalloutKeymapExtension } from './callout-keymap';
|
||||||
import { calloutSlashMenuConfig } from './configs/slash-menu';
|
import { calloutSlashMenuConfig } from './configs/slash-menu';
|
||||||
|
|
||||||
@@ -11,4 +12,5 @@ export const CalloutBlockSpec: ExtensionType[] = [
|
|||||||
BlockViewExtension('affine:callout', literal`affine-callout`),
|
BlockViewExtension('affine:callout', literal`affine-callout`),
|
||||||
CalloutKeymapExtension,
|
CalloutKeymapExtension,
|
||||||
SlashMenuConfigExtension('affine:callout', calloutSlashMenuConfig),
|
SlashMenuConfigExtension('affine:callout', calloutSlashMenuConfig),
|
||||||
|
CalloutBlockMarkdownAdapterExtension,
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -4,11 +4,14 @@ import {
|
|||||||
} from '@blocksuite/affine-ext-loader';
|
} from '@blocksuite/affine-ext-loader';
|
||||||
import { CalloutBlockSchemaExtension } from '@blocksuite/affine-model';
|
import { CalloutBlockSchemaExtension } from '@blocksuite/affine-model';
|
||||||
|
|
||||||
|
import { CalloutBlockMarkdownAdapterExtension } from './adapters/markdown';
|
||||||
|
|
||||||
export class CalloutStoreExtension extends StoreExtensionProvider {
|
export class CalloutStoreExtension extends StoreExtensionProvider {
|
||||||
override name = 'affine-callout-block';
|
override name = 'affine-callout-block';
|
||||||
|
|
||||||
override setup(context: StoreExtensionContext) {
|
override setup(context: StoreExtensionContext) {
|
||||||
super.setup(context);
|
super.setup(context);
|
||||||
context.register(CalloutBlockSchemaExtension);
|
context.register(CalloutBlockSchemaExtension);
|
||||||
|
context.register(CalloutBlockMarkdownAdapterExtension);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
"@floating-ui/dom": "^1.6.13",
|
"@floating-ui/dom": "^1.6.13",
|
||||||
"@lit/context": "^1.1.2",
|
"@lit/context": "^1.1.2",
|
||||||
"@preact/signals-core": "^1.8.0",
|
"@preact/signals-core": "^1.8.0",
|
||||||
"@toeverything/theme": "^1.1.12",
|
"@toeverything/theme": "^1.1.14",
|
||||||
"@types/mdast": "^4.0.4",
|
"@types/mdast": "^4.0.4",
|
||||||
"lit": "^3.2.0",
|
"lit": "^3.2.0",
|
||||||
"minimatch": "^10.0.1",
|
"minimatch": "^10.0.1",
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ export class CodeBlockViewExtension extends ViewExtensionProvider {
|
|||||||
FlavourExtension('affine:code'),
|
FlavourExtension('affine:code'),
|
||||||
CodeBlockHighlighter,
|
CodeBlockHighlighter,
|
||||||
BlockViewExtension('affine:code', literal`affine-code`),
|
BlockViewExtension('affine:code', literal`affine-code`),
|
||||||
codeToolbarWidget,
|
|
||||||
SlashMenuConfigExtension('affine:code', codeSlashMenuConfig),
|
SlashMenuConfigExtension('affine:code', codeSlashMenuConfig),
|
||||||
CodeKeymapExtension,
|
CodeKeymapExtension,
|
||||||
...getCodeClipboardExtensions(),
|
...getCodeClipboardExtensions(),
|
||||||
@@ -50,5 +49,8 @@ export class CodeBlockViewExtension extends ViewExtensionProvider {
|
|||||||
CodeBlockInlineManagerExtension,
|
CodeBlockInlineManagerExtension,
|
||||||
CodeBlockUnitSpecExtension,
|
CodeBlockUnitSpecExtension,
|
||||||
]);
|
]);
|
||||||
|
if (!this.isMobile(context.scope)) {
|
||||||
|
context.register(codeToolbarWidget);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
"@floating-ui/dom": "^1.6.13",
|
"@floating-ui/dom": "^1.6.13",
|
||||||
"@lit/context": "^1.1.2",
|
"@lit/context": "^1.1.2",
|
||||||
"@preact/signals-core": "^1.8.0",
|
"@preact/signals-core": "^1.8.0",
|
||||||
"@toeverything/theme": "^1.1.12",
|
"@toeverything/theme": "^1.1.14",
|
||||||
"@types/mdast": "^4.0.4",
|
"@types/mdast": "^4.0.4",
|
||||||
"lit": "^3.2.0",
|
"lit": "^3.2.0",
|
||||||
"minimatch": "^10.0.1",
|
"minimatch": "^10.0.1",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
"@floating-ui/dom": "^1.6.13",
|
"@floating-ui/dom": "^1.6.13",
|
||||||
"@lit/context": "^1.1.2",
|
"@lit/context": "^1.1.2",
|
||||||
"@preact/signals-core": "^1.8.0",
|
"@preact/signals-core": "^1.8.0",
|
||||||
"@toeverything/theme": "^1.1.12",
|
"@toeverything/theme": "^1.1.14",
|
||||||
"@types/mdast": "^4.0.4",
|
"@types/mdast": "^4.0.4",
|
||||||
"@vanilla-extract/css": "^1.17.0",
|
"@vanilla-extract/css": "^1.17.0",
|
||||||
"date-fns": "^4.0.0",
|
"date-fns": "^4.0.0",
|
||||||
|
|||||||
@@ -14,7 +14,19 @@ import {
|
|||||||
} from '@blocksuite/icons/lit';
|
} from '@blocksuite/icons/lit';
|
||||||
import type { BlockModel } from '@blocksuite/store';
|
import type { BlockModel } from '@blocksuite/store';
|
||||||
import type { TemplateResult } from 'lit';
|
import type { TemplateResult } from 'lit';
|
||||||
|
const icons: Record<string, TemplateResult> = {
|
||||||
|
text: TextIcon(),
|
||||||
|
quote: QuoteIcon(),
|
||||||
|
h1: Heading1Icon(),
|
||||||
|
h2: Heading2Icon(),
|
||||||
|
h3: Heading3Icon(),
|
||||||
|
h4: Heading4Icon(),
|
||||||
|
h5: Heading5Icon(),
|
||||||
|
h6: Heading6Icon(),
|
||||||
|
bulleted: BulletedListIcon(),
|
||||||
|
numbered: NumberedListIcon(),
|
||||||
|
todo: CheckBoxCheckLinearIcon(),
|
||||||
|
};
|
||||||
export const getIcon = (
|
export const getIcon = (
|
||||||
model: BlockModel & {
|
model: BlockModel & {
|
||||||
props: {
|
props: {
|
||||||
@@ -24,27 +36,10 @@ export const getIcon = (
|
|||||||
): TemplateResult => {
|
): TemplateResult => {
|
||||||
if (model.flavour === 'affine:paragraph') {
|
if (model.flavour === 'affine:paragraph') {
|
||||||
const type = model.props.type as ParagraphType;
|
const type = model.props.type as ParagraphType;
|
||||||
return (
|
return icons[type] ?? TextIcon();
|
||||||
{
|
|
||||||
text: TextIcon(),
|
|
||||||
quote: QuoteIcon(),
|
|
||||||
h1: Heading1Icon(),
|
|
||||||
h2: Heading2Icon(),
|
|
||||||
h3: Heading3Icon(),
|
|
||||||
h4: Heading4Icon(),
|
|
||||||
h5: Heading5Icon(),
|
|
||||||
h6: Heading6Icon(),
|
|
||||||
} as Record<ParagraphType, TemplateResult>
|
|
||||||
)[type];
|
|
||||||
}
|
}
|
||||||
if (model.flavour === 'affine:list') {
|
if (model.flavour === 'affine:list') {
|
||||||
return (
|
return icons[model.props.type ?? 'bulleted'] ?? BulletedListIcon();
|
||||||
{
|
|
||||||
bulleted: BulletedListIcon(),
|
|
||||||
numbered: NumberedListIcon(),
|
|
||||||
todo: CheckBoxCheckLinearIcon(),
|
|
||||||
}[model.props.type ?? 'bulleted'] ?? BulletedListIcon()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return TextIcon();
|
return TextIcon();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
import type { MenuOptions } from '@blocksuite/affine-components/context-menu';
|
|
||||||
import { type DatabaseBlockModel } from '@blocksuite/affine-model';
|
|
||||||
import { ConfigExtensionFactory } from '@blocksuite/std';
|
import { ConfigExtensionFactory } from '@blocksuite/std';
|
||||||
|
|
||||||
export interface DatabaseOptionsConfig {
|
import type { DatabaseViewExtensionOptions } from './view';
|
||||||
configure: (model: DatabaseBlockModel, options: MenuOptions) => MenuOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const DatabaseConfigExtension =
|
export const DatabaseConfigExtension =
|
||||||
ConfigExtensionFactory<DatabaseOptionsConfig>('affine:database');
|
ConfigExtensionFactory<DatabaseViewExtensionOptions>('affine:database');
|
||||||
|
|||||||
@@ -71,11 +71,15 @@ export class DatabaseBlockDataSource extends DataSourceBase {
|
|||||||
|
|
||||||
override featureFlags$: ReadonlySignal<DatabaseFlags> = computed(() => {
|
override featureFlags$: ReadonlySignal<DatabaseFlags> = computed(() => {
|
||||||
const featureFlagService = this.doc.get(FeatureFlagService);
|
const featureFlagService = this.doc.get(FeatureFlagService);
|
||||||
const flag = featureFlagService.getFlag(
|
const enableNumberFormat = featureFlagService.getFlag(
|
||||||
'enable_database_number_formatting'
|
'enable_database_number_formatting'
|
||||||
);
|
);
|
||||||
|
const enableTableVirtualScroll = featureFlagService.getFlag(
|
||||||
|
'enable_table_virtual_scroll'
|
||||||
|
);
|
||||||
return {
|
return {
|
||||||
enable_number_formatting: flag ?? false,
|
enable_number_formatting: enableNumberFormat ?? false,
|
||||||
|
enable_table_virtual_scroll: enableTableVirtualScroll ?? false,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -46,10 +46,7 @@ import { computed, signal } from '@preact/signals-core';
|
|||||||
import { css, html, nothing, unsafeCSS } from 'lit';
|
import { css, html, nothing, unsafeCSS } from 'lit';
|
||||||
|
|
||||||
import { popSideDetail } from './components/layout.js';
|
import { popSideDetail } from './components/layout.js';
|
||||||
import {
|
import { DatabaseConfigExtension } from './config.js';
|
||||||
DatabaseConfigExtension,
|
|
||||||
type DatabaseOptionsConfig,
|
|
||||||
} from './config.js';
|
|
||||||
import { HostContextKey } from './context/host-context.js';
|
import { HostContextKey } from './context/host-context.js';
|
||||||
import { DatabaseBlockDataSource } from './data-source.js';
|
import { DatabaseBlockDataSource } from './data-source.js';
|
||||||
import { BlockRenderer } from './detail-panel/block-renderer.js';
|
import { BlockRenderer } from './detail-panel/block-renderer.js';
|
||||||
@@ -57,6 +54,7 @@ import { NoteRenderer } from './detail-panel/note-renderer.js';
|
|||||||
import { DatabaseSelection } from './selection.js';
|
import { DatabaseSelection } from './selection.js';
|
||||||
import { currentViewStorage } from './utils/current-view.js';
|
import { currentViewStorage } from './utils/current-view.js';
|
||||||
import { getSingleDocIdFromText } from './utils/title-doc.js';
|
import { getSingleDocIdFromText } from './utils/title-doc.js';
|
||||||
|
import type { DatabaseViewExtensionOptions } from './view';
|
||||||
|
|
||||||
export class DatabaseBlockComponent extends CaptionedBlockComponent<DatabaseBlockModel> {
|
export class DatabaseBlockComponent extends CaptionedBlockComponent<DatabaseBlockModel> {
|
||||||
static override styles = css`
|
static override styles = css`
|
||||||
@@ -345,7 +343,7 @@ export class DatabaseBlockComponent extends CaptionedBlockComponent<DatabaseBloc
|
|||||||
return this._dataSource;
|
return this._dataSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
get optionsConfig(): DatabaseOptionsConfig {
|
get optionsConfig(): DatabaseViewExtensionOptions {
|
||||||
return {
|
return {
|
||||||
configure: (_model, options) => options,
|
configure: (_model, options) => options,
|
||||||
...this.std.getOptional(DatabaseConfigExtension.identifier),
|
...this.std.getOptional(DatabaseConfigExtension.identifier),
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import { BaseCellRenderer } from '@blocksuite/data-view';
|
|||||||
import { IS_MAC } from '@blocksuite/global/env';
|
import { IS_MAC } from '@blocksuite/global/env';
|
||||||
import { LinkedPageIcon } from '@blocksuite/icons/lit';
|
import { LinkedPageIcon } from '@blocksuite/icons/lit';
|
||||||
import type { BlockSnapshot, DeltaInsert, Text } from '@blocksuite/store';
|
import type { BlockSnapshot, DeltaInsert, Text } from '@blocksuite/store';
|
||||||
import { signal } from '@preact/signals-core';
|
import { computed, signal } from '@preact/signals-core';
|
||||||
import { property } from 'lit/decorators.js';
|
import { property } from 'lit/decorators.js';
|
||||||
import { createRef, ref } from 'lit/directives/ref.js';
|
import { createRef, ref } from 'lit/directives/ref.js';
|
||||||
import { html } from 'lit/static-html.js';
|
import { html } from 'lit/static-html.js';
|
||||||
@@ -217,17 +217,23 @@ export class HeaderAreaTextCell extends BaseCellRenderer<Text, string> {
|
|||||||
super.firstUpdated(props);
|
super.firstUpdated(props);
|
||||||
this.richText.value?.updateComplete
|
this.richText.value?.updateComplete
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.disposables.addFromEvent(
|
if (this.richText.value) {
|
||||||
this.richText.value,
|
this.disposables.addFromEvent(
|
||||||
'copy',
|
this.richText.value,
|
||||||
this._onCopy
|
'copy',
|
||||||
);
|
this._onCopy
|
||||||
this.disposables.addFromEvent(this.richText.value, 'cut', this._onCut);
|
);
|
||||||
this.disposables.addFromEvent(
|
this.disposables.addFromEvent(
|
||||||
this.richText.value,
|
this.richText.value,
|
||||||
'paste',
|
'cut',
|
||||||
this._onPaste
|
this._onCut
|
||||||
);
|
);
|
||||||
|
this.disposables.addFromEvent(
|
||||||
|
this.richText.value,
|
||||||
|
'paste',
|
||||||
|
this._onPaste
|
||||||
|
);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
}
|
}
|
||||||
@@ -261,7 +267,14 @@ export class HeaderAreaTextCell extends BaseCellRenderer<Text, string> {
|
|||||||
class="${titleRichTextStyle}"
|
class="${titleRichTextStyle}"
|
||||||
></rich-text>`;
|
></rich-text>`;
|
||||||
}
|
}
|
||||||
|
icon$ = computed(() => {
|
||||||
|
const iconColumn = this.view.mainProperties$.value.iconColumn;
|
||||||
|
if (!iconColumn) return;
|
||||||
|
|
||||||
|
const icon = this.view.cellValueGet(this.cell.rowId, iconColumn) as string;
|
||||||
|
if (!icon) return;
|
||||||
|
return icon;
|
||||||
|
});
|
||||||
renderIcon() {
|
renderIcon() {
|
||||||
if (!this.showIcon) {
|
if (!this.showIcon) {
|
||||||
return;
|
return;
|
||||||
@@ -271,10 +284,7 @@ export class HeaderAreaTextCell extends BaseCellRenderer<Text, string> {
|
|||||||
${LinkedPageIcon({})}
|
${LinkedPageIcon({})}
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
const iconColumn = this.view.mainProperties$.value.iconColumn;
|
const icon = this.icon$.value;
|
||||||
if (!iconColumn) return;
|
|
||||||
|
|
||||||
const icon = this.view.cellValueGet(this.cell.rowId, iconColumn) as string;
|
|
||||||
if (!icon) return;
|
if (!icon) return;
|
||||||
|
|
||||||
return html` <div class="${headerAreaIconStyle}">${icon}</div>`;
|
return html` <div class="${headerAreaIconStyle}">${icon}</div>`;
|
||||||
|
|||||||
@@ -1,28 +1,51 @@
|
|||||||
|
import type { MenuOptions } from '@blocksuite/affine-components/context-menu';
|
||||||
import {
|
import {
|
||||||
type ViewExtensionContext,
|
type ViewExtensionContext,
|
||||||
ViewExtensionProvider,
|
ViewExtensionProvider,
|
||||||
} from '@blocksuite/affine-ext-loader';
|
} from '@blocksuite/affine-ext-loader';
|
||||||
|
import { DatabaseBlockModel } from '@blocksuite/affine-model';
|
||||||
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
|
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
|
||||||
import { BlockViewExtension, FlavourExtension } from '@blocksuite/std';
|
import { BlockViewExtension, FlavourExtension } from '@blocksuite/std';
|
||||||
import { literal } from 'lit/static-html.js';
|
import { literal } from 'lit/static-html.js';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
import { DatabaseConfigExtension } from './config';
|
||||||
import { databaseSlashMenuConfig } from './configs/slash-menu.js';
|
import { databaseSlashMenuConfig } from './configs/slash-menu.js';
|
||||||
import { effects } from './effects';
|
import { effects } from './effects';
|
||||||
|
|
||||||
export class DatabaseViewExtension extends ViewExtensionProvider {
|
const optionsSchema = z.object({
|
||||||
|
configure: z
|
||||||
|
.function()
|
||||||
|
.args(z.instanceof(DatabaseBlockModel), z.custom<MenuOptions>())
|
||||||
|
.returns(z.custom<MenuOptions>()),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type DatabaseViewExtensionOptions = z.infer<typeof optionsSchema>;
|
||||||
|
|
||||||
|
export class DatabaseViewExtension extends ViewExtensionProvider<DatabaseViewExtensionOptions> {
|
||||||
override name = 'affine-database-block';
|
override name = 'affine-database-block';
|
||||||
|
|
||||||
|
override schema = optionsSchema;
|
||||||
|
|
||||||
override effect() {
|
override effect() {
|
||||||
super.effect();
|
super.effect();
|
||||||
effects();
|
effects();
|
||||||
}
|
}
|
||||||
|
|
||||||
override setup(context: ViewExtensionContext) {
|
override setup(
|
||||||
|
context: ViewExtensionContext,
|
||||||
|
options?: DatabaseViewExtensionOptions
|
||||||
|
) {
|
||||||
super.setup(context);
|
super.setup(context);
|
||||||
context.register([
|
context.register([
|
||||||
FlavourExtension('affine:database'),
|
FlavourExtension('affine:database'),
|
||||||
BlockViewExtension('affine:database', literal`affine-database`),
|
BlockViewExtension('affine:database', literal`affine-database`),
|
||||||
SlashMenuConfigExtension('affine:database', databaseSlashMenuConfig),
|
SlashMenuConfigExtension('affine:database', databaseSlashMenuConfig),
|
||||||
]);
|
]);
|
||||||
|
if (options) {
|
||||||
|
context.register(
|
||||||
|
DatabaseConfigExtension({ configure: options.configure })
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
"@floating-ui/dom": "^1.6.13",
|
"@floating-ui/dom": "^1.6.13",
|
||||||
"@lit/context": "^1.1.2",
|
"@lit/context": "^1.1.2",
|
||||||
"@preact/signals-core": "^1.8.0",
|
"@preact/signals-core": "^1.8.0",
|
||||||
"@toeverything/theme": "^1.1.12",
|
"@toeverything/theme": "^1.1.14",
|
||||||
"@types/mdast": "^4.0.4",
|
"@types/mdast": "^4.0.4",
|
||||||
"lit": "^3.2.0",
|
"lit": "^3.2.0",
|
||||||
"minimatch": "^10.0.1",
|
"minimatch": "^10.0.1",
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
"@floating-ui/dom": "^1.6.13",
|
"@floating-ui/dom": "^1.6.13",
|
||||||
"@lit/context": "^1.1.2",
|
"@lit/context": "^1.1.2",
|
||||||
"@preact/signals-core": "^1.8.0",
|
"@preact/signals-core": "^1.8.0",
|
||||||
"@toeverything/theme": "^1.1.12",
|
"@toeverything/theme": "^1.1.14",
|
||||||
"lit": "^3.2.0",
|
"lit": "^3.2.0",
|
||||||
"minimatch": "^10.0.1",
|
"minimatch": "^10.0.1",
|
||||||
"rxjs": "^7.8.1",
|
"rxjs": "^7.8.1",
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"name": "@blocksuite/affine-block-embed-doc",
|
||||||
|
"description": "Embed doc blocks for BlockSuite.",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc"
|
||||||
|
},
|
||||||
|
"sideEffects": false,
|
||||||
|
"keywords": [],
|
||||||
|
"author": "toeverything",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@blocksuite/affine-block-embed": "workspace:*",
|
||||||
|
"@blocksuite/affine-block-surface": "workspace:*",
|
||||||
|
"@blocksuite/affine-components": "workspace:*",
|
||||||
|
"@blocksuite/affine-ext-loader": "workspace:*",
|
||||||
|
"@blocksuite/affine-inline-reference": "workspace:*",
|
||||||
|
"@blocksuite/affine-model": "workspace:*",
|
||||||
|
"@blocksuite/affine-rich-text": "workspace:*",
|
||||||
|
"@blocksuite/affine-shared": "workspace:*",
|
||||||
|
"@blocksuite/affine-widget-slash-menu": "workspace:*",
|
||||||
|
"@blocksuite/global": "workspace:*",
|
||||||
|
"@blocksuite/icons": "^2.2.12",
|
||||||
|
"@blocksuite/std": "workspace:*",
|
||||||
|
"@blocksuite/store": "workspace:*",
|
||||||
|
"@floating-ui/dom": "^1.6.13",
|
||||||
|
"@lit/context": "^1.1.2",
|
||||||
|
"@preact/signals-core": "^1.8.0",
|
||||||
|
"@toeverything/theme": "^1.1.14",
|
||||||
|
"@types/lodash-es": "^4.17.12",
|
||||||
|
"lit": "^3.2.0",
|
||||||
|
"lodash-es": "^4.17.21",
|
||||||
|
"minimatch": "^10.0.1",
|
||||||
|
"rxjs": "^7.8.1",
|
||||||
|
"yjs": "^13.6.21",
|
||||||
|
"zod": "^3.23.8"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"vitest": "3.1.2"
|
||||||
|
},
|
||||||
|
"exports": {
|
||||||
|
".": "./src/index.ts",
|
||||||
|
"./effects": "./src/effects.ts",
|
||||||
|
"./view": "./src/view.ts",
|
||||||
|
"./store": "./src/store.ts"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src",
|
||||||
|
"dist",
|
||||||
|
"!src/__tests__",
|
||||||
|
"!dist/__tests__"
|
||||||
|
],
|
||||||
|
"version": "0.21.0"
|
||||||
|
}
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
import { getNotesFromDoc } from '@blocksuite/affine-block-embed';
|
||||||
|
import { ViewExtensionManagerIdentifier } from '@blocksuite/affine-ext-loader';
|
||||||
|
import {
|
||||||
|
ImageBlockModel,
|
||||||
|
ListBlockModel,
|
||||||
|
ParagraphBlockModel,
|
||||||
|
} from '@blocksuite/affine-model';
|
||||||
|
import { EMBED_CARD_HEIGHT } from '@blocksuite/affine-shared/consts';
|
||||||
|
import { matchModels } from '@blocksuite/affine-shared/utils';
|
||||||
|
import { BlockStdScope } from '@blocksuite/std';
|
||||||
|
import type { BlockModel, Query } from '@blocksuite/store';
|
||||||
|
import { render, type TemplateResult } from 'lit';
|
||||||
|
|
||||||
|
import type { EmbedLinkedDocBlockComponent } from '../embed-linked-doc-block';
|
||||||
|
import type { EmbedSyncedDocCard } from '../embed-synced-doc-block/components/embed-synced-doc-card';
|
||||||
|
|
||||||
|
export function renderLinkedDocInCard(
|
||||||
|
card: EmbedLinkedDocBlockComponent | EmbedSyncedDocCard
|
||||||
|
) {
|
||||||
|
const linkedDoc = card.linkedDoc;
|
||||||
|
if (!linkedDoc) {
|
||||||
|
console.error(
|
||||||
|
`Trying to load page ${card.model.props.pageId} in linked page block, but the page is not found.`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line sonarjs/no-collapsible-if
|
||||||
|
if ('bannerContainer' in card) {
|
||||||
|
if (card.editorMode === 'page') {
|
||||||
|
renderPageAsBanner(card).catch(e => {
|
||||||
|
console.error(e);
|
||||||
|
card.isError = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
renderNoteContent(card).catch(e => {
|
||||||
|
console.error(e);
|
||||||
|
card.isError = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function renderPageAsBanner(card: EmbedSyncedDocCard) {
|
||||||
|
const linkedDoc = card.linkedDoc;
|
||||||
|
if (!linkedDoc) {
|
||||||
|
console.error(
|
||||||
|
`Trying to load page ${card.model.props.pageId} in linked page block, but the page is not found.`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const notes = getNotesFromDoc(linkedDoc);
|
||||||
|
if (!notes) {
|
||||||
|
card.isBannerEmpty = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const target = notes.flatMap(note =>
|
||||||
|
note.children.filter(child => matchModels(child, [ImageBlockModel]))
|
||||||
|
)[0];
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
await renderImageAsBanner(card, target);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
card.isBannerEmpty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function renderImageAsBanner(
|
||||||
|
card: EmbedSyncedDocCard,
|
||||||
|
image: BlockModel
|
||||||
|
) {
|
||||||
|
const sourceId = (image as ImageBlockModel).props.sourceId;
|
||||||
|
if (!sourceId) return;
|
||||||
|
|
||||||
|
const storage = card.linkedDoc?.blobSync;
|
||||||
|
if (!storage) return;
|
||||||
|
|
||||||
|
const blob = await storage.get(sourceId);
|
||||||
|
if (!blob) return;
|
||||||
|
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
const $img = document.createElement('img');
|
||||||
|
$img.src = url;
|
||||||
|
await addCover(card, $img);
|
||||||
|
|
||||||
|
card.isBannerEmpty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function addCover(
|
||||||
|
card: EmbedSyncedDocCard,
|
||||||
|
cover: HTMLElement | TemplateResult<1>
|
||||||
|
) {
|
||||||
|
const coverContainer = await card.bannerContainer;
|
||||||
|
if (!coverContainer) return;
|
||||||
|
while (coverContainer.firstChild) {
|
||||||
|
coverContainer.firstChild.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cover instanceof HTMLElement) {
|
||||||
|
coverContainer.append(cover);
|
||||||
|
} else {
|
||||||
|
render(cover, coverContainer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function renderNoteContent(
|
||||||
|
card: EmbedLinkedDocBlockComponent | EmbedSyncedDocCard
|
||||||
|
) {
|
||||||
|
card.isNoteContentEmpty = true;
|
||||||
|
|
||||||
|
const doc = card.linkedDoc;
|
||||||
|
if (!doc) {
|
||||||
|
console.error(
|
||||||
|
`Trying to load page ${card.model.props.pageId} in linked page block, but the page is not found.`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const notes = getNotesFromDoc(doc);
|
||||||
|
if (!notes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const cardStyle = card.model.props.style;
|
||||||
|
const isHorizontal = cardStyle === 'horizontal';
|
||||||
|
const allowFlavours = isHorizontal ? [] : [ImageBlockModel];
|
||||||
|
|
||||||
|
const noteChildren = notes.flatMap(note =>
|
||||||
|
note.children.filter(model => {
|
||||||
|
if (matchModels(model, allowFlavours)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return filterTextModel(model);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!noteChildren.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
card.isNoteContentEmpty = false;
|
||||||
|
|
||||||
|
const noteContainer = await card.noteContainer;
|
||||||
|
|
||||||
|
if (!noteContainer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (noteContainer.firstChild) {
|
||||||
|
noteContainer.firstChild.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
const noteBlocksContainer = document.createElement('div');
|
||||||
|
noteBlocksContainer.classList.add('affine-embed-doc-content-note-blocks');
|
||||||
|
noteBlocksContainer.contentEditable = 'false';
|
||||||
|
noteContainer.append(noteBlocksContainer);
|
||||||
|
|
||||||
|
if (isHorizontal) {
|
||||||
|
// When the card is horizontal, we only render the first block
|
||||||
|
noteChildren.splice(1);
|
||||||
|
} else {
|
||||||
|
// Before rendering, we can not know the height of each block
|
||||||
|
// But we can limit the number of blocks to render simply by the height of the card
|
||||||
|
const cardHeight = EMBED_CARD_HEIGHT[cardStyle];
|
||||||
|
const minSingleBlockHeight = 20;
|
||||||
|
const maxBlockCount = Math.floor(cardHeight / minSingleBlockHeight);
|
||||||
|
if (noteChildren.length > maxBlockCount) {
|
||||||
|
noteChildren.splice(maxBlockCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const childIds = noteChildren.map(child => child.id);
|
||||||
|
const ids: string[] = [];
|
||||||
|
childIds.forEach(block => {
|
||||||
|
let parent: string | null = block;
|
||||||
|
while (parent && !ids.includes(parent)) {
|
||||||
|
ids.push(parent);
|
||||||
|
parent = doc.getParent(parent)?.id ?? null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const query: Query = {
|
||||||
|
mode: 'strict',
|
||||||
|
match: ids.map(id => ({ id, viewType: 'display' })),
|
||||||
|
};
|
||||||
|
const previewDoc = doc.doc.getStore({ query });
|
||||||
|
const std = card.host.std;
|
||||||
|
const previewSpec = std
|
||||||
|
.get(ViewExtensionManagerIdentifier)
|
||||||
|
.get('preview-page');
|
||||||
|
const previewStd = new BlockStdScope({
|
||||||
|
store: previewDoc,
|
||||||
|
extensions: previewSpec,
|
||||||
|
});
|
||||||
|
const previewTemplate = previewStd.render();
|
||||||
|
const fragment = document.createDocumentFragment();
|
||||||
|
render(previewTemplate, fragment);
|
||||||
|
noteBlocksContainer.append(fragment);
|
||||||
|
const contentEditableElements = noteBlocksContainer.querySelectorAll(
|
||||||
|
'[contenteditable="true"]'
|
||||||
|
);
|
||||||
|
contentEditableElements.forEach(element => {
|
||||||
|
(element as HTMLElement).contentEditable = 'false';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterTextModel(model: BlockModel) {
|
||||||
|
if (matchModels(model, [ParagraphBlockModel, ListBlockModel])) {
|
||||||
|
return !!model.text?.toString().length;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import { EmbedLinkedDocBlockComponent } from './embed-linked-doc-block';
|
||||||
|
import { EmbedEdgelessLinkedDocBlockComponent } from './embed-linked-doc-block/embed-edgeless-linked-doc-block';
|
||||||
|
import { EmbedSyncedDocBlockComponent } from './embed-synced-doc-block';
|
||||||
|
import { EmbedSyncedDocCard } from './embed-synced-doc-block/components/embed-synced-doc-card';
|
||||||
|
import { EmbedEdgelessSyncedDocBlockComponent } from './embed-synced-doc-block/embed-edgeless-synced-doc-block';
|
||||||
|
|
||||||
|
export function effects() {
|
||||||
|
customElements.define('affine-embed-synced-doc-card', EmbedSyncedDocCard);
|
||||||
|
|
||||||
|
customElements.define(
|
||||||
|
'affine-embed-edgeless-linked-doc-block',
|
||||||
|
EmbedEdgelessLinkedDocBlockComponent
|
||||||
|
);
|
||||||
|
customElements.define(
|
||||||
|
'affine-embed-linked-doc-block',
|
||||||
|
EmbedLinkedDocBlockComponent
|
||||||
|
);
|
||||||
|
|
||||||
|
customElements.define(
|
||||||
|
'affine-embed-edgeless-synced-doc-block',
|
||||||
|
EmbedEdgelessSyncedDocBlockComponent
|
||||||
|
);
|
||||||
|
customElements.define(
|
||||||
|
'affine-embed-synced-doc-block',
|
||||||
|
EmbedSyncedDocBlockComponent
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface HTMLElementTagNameMap {
|
||||||
|
'affine-embed-synced-doc-card': EmbedSyncedDocCard;
|
||||||
|
'affine-embed-synced-doc-block': EmbedSyncedDocBlockComponent;
|
||||||
|
'affine-embed-edgeless-synced-doc-block': EmbedEdgelessSyncedDocBlockComponent;
|
||||||
|
'affine-embed-linked-doc-block': EmbedLinkedDocBlockComponent;
|
||||||
|
'affine-embed-edgeless-linked-doc-block': EmbedEdgelessLinkedDocBlockComponent;
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-2
@@ -1,8 +1,7 @@
|
|||||||
|
import { insertEmbedCard } from '@blocksuite/affine-block-embed';
|
||||||
import type { EmbedCardStyle, ReferenceParams } from '@blocksuite/affine-model';
|
import type { EmbedCardStyle, ReferenceParams } from '@blocksuite/affine-model';
|
||||||
import type { Command } from '@blocksuite/std';
|
import type { Command } from '@blocksuite/std';
|
||||||
|
|
||||||
import { insertEmbedCard } from '../../common/insert-embed-card.js';
|
|
||||||
|
|
||||||
export type LinkableFlavour =
|
export type LinkableFlavour =
|
||||||
| 'affine:bookmark'
|
| 'affine:bookmark'
|
||||||
| 'affine:embed-linked-doc'
|
| 'affine:embed-linked-doc'
|
||||||
+1
-1
@@ -1,3 +1,4 @@
|
|||||||
|
import { toEdgelessEmbedBlock } from '@blocksuite/affine-block-embed';
|
||||||
import {
|
import {
|
||||||
EdgelessCRUDIdentifier,
|
EdgelessCRUDIdentifier,
|
||||||
reassociateConnectorsCommand,
|
reassociateConnectorsCommand,
|
||||||
@@ -13,7 +14,6 @@ import {
|
|||||||
} from '@blocksuite/affine-shared/utils';
|
} from '@blocksuite/affine-shared/utils';
|
||||||
import { Bound } from '@blocksuite/global/gfx';
|
import { Bound } from '@blocksuite/global/gfx';
|
||||||
|
|
||||||
import { toEdgelessEmbedBlock } from '../common/to-edgeless-embed-block.js';
|
|
||||||
import { EmbedLinkedDocBlockComponent } from './embed-linked-doc-block.js';
|
import { EmbedLinkedDocBlockComponent } from './embed-linked-doc-block.js';
|
||||||
|
|
||||||
export class EmbedEdgelessLinkedDocBlockComponent extends toEdgelessEmbedBlock(
|
export class EmbedEdgelessLinkedDocBlockComponent extends toEdgelessEmbedBlock(
|
||||||
+5
-5
@@ -1,3 +1,7 @@
|
|||||||
|
import {
|
||||||
|
EmbedBlockComponent,
|
||||||
|
RENDER_CARD_THROTTLE_MS,
|
||||||
|
} from '@blocksuite/affine-block-embed';
|
||||||
import { SurfaceBlockModel } from '@blocksuite/affine-block-surface';
|
import { SurfaceBlockModel } from '@blocksuite/affine-block-surface';
|
||||||
import { isPeekable, Peekable } from '@blocksuite/affine-components/peek';
|
import { isPeekable, Peekable } from '@blocksuite/affine-components/peek';
|
||||||
import { RefNodeSlotsProvider } from '@blocksuite/affine-inline-reference';
|
import { RefNodeSlotsProvider } from '@blocksuite/affine-inline-reference';
|
||||||
@@ -39,11 +43,7 @@ import { when } from 'lit/directives/when.js';
|
|||||||
import throttle from 'lodash-es/throttle';
|
import throttle from 'lodash-es/throttle';
|
||||||
import * as Y from 'yjs';
|
import * as Y from 'yjs';
|
||||||
|
|
||||||
import { EmbedBlockComponent } from '../common/embed-block-element.js';
|
import { renderLinkedDocInCard } from '../common/render-linked-doc';
|
||||||
import {
|
|
||||||
RENDER_CARD_THROTTLE_MS,
|
|
||||||
renderLinkedDocInCard,
|
|
||||||
} from '../common/render-linked-doc.js';
|
|
||||||
import { SyncedDocErrorIcon } from '../embed-synced-doc-block/styles.js';
|
import { SyncedDocErrorIcon } from '../embed-synced-doc-block/styles.js';
|
||||||
import { styles } from './styles.js';
|
import { styles } from './styles.js';
|
||||||
import { getEmbedLinkedDocIcons } from './utils.js';
|
import { getEmbedLinkedDocIcons } from './utils.js';
|
||||||
+7
-2
@@ -1,7 +1,8 @@
|
|||||||
|
import { embedNoteContentStyles } from '@blocksuite/affine-block-embed';
|
||||||
import { unsafeCSSVarV2 } from '@blocksuite/affine-shared/theme';
|
import { unsafeCSSVarV2 } from '@blocksuite/affine-shared/theme';
|
||||||
import { css, html } from 'lit';
|
import { css, html } from 'lit';
|
||||||
|
|
||||||
import { embedNoteContentStyles } from '../common/embed-note-content-styles.js';
|
unsafeCSSVarV2('layer/background/linkedDocOnEdgeless');
|
||||||
|
|
||||||
export const styles = css`
|
export const styles = css`
|
||||||
.affine-embed-linked-doc-block {
|
.affine-embed-linked-doc-block {
|
||||||
@@ -11,11 +12,15 @@ export const styles = css`
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
border: 1px solid var(--affine-background-tertiary-color);
|
border: 1px solid var(--affine-background-tertiary-color);
|
||||||
background: var(--affine-background-primary-color);
|
|
||||||
user-select: none;
|
user-select: none;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.affine-embed-linked-doc-block.in-canvas {
|
||||||
|
border: 1px solid ${unsafeCSSVarV2('layer/insideBorder/border')};
|
||||||
|
background: ${unsafeCSSVarV2('layer/background/linkedDocOnEdgeless')};
|
||||||
|
}
|
||||||
|
|
||||||
.affine-embed-linked-doc-content {
|
.affine-embed-linked-doc-content {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
+6
-6
@@ -1,8 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
DarkLoadingIcon,
|
|
||||||
EmbedEdgelessIcon,
|
EmbedEdgelessIcon,
|
||||||
EmbedPageIcon,
|
EmbedPageIcon,
|
||||||
LightLoadingIcon,
|
getLoadingIconWith,
|
||||||
ReloadIcon,
|
ReloadIcon,
|
||||||
} from '@blocksuite/affine-components/icons';
|
} from '@blocksuite/affine-components/icons';
|
||||||
import {
|
import {
|
||||||
@@ -51,10 +50,11 @@ export function getEmbedLinkedDocIcons(
|
|||||||
style: (typeof EmbedLinkedDocStyles)[number]
|
style: (typeof EmbedLinkedDocStyles)[number]
|
||||||
): EmbedCardImages {
|
): EmbedCardImages {
|
||||||
const small = style !== 'vertical';
|
const small = style !== 'vertical';
|
||||||
|
const LoadingIcon = getLoadingIconWith(theme);
|
||||||
if (editorMode === 'page') {
|
if (editorMode === 'page') {
|
||||||
if (theme === ColorScheme.Light) {
|
if (theme === ColorScheme.Light) {
|
||||||
return {
|
return {
|
||||||
LoadingIcon: LightLoadingIcon,
|
LoadingIcon,
|
||||||
ReloadIcon,
|
ReloadIcon,
|
||||||
LinkedDocIcon: EmbedPageIcon,
|
LinkedDocIcon: EmbedPageIcon,
|
||||||
LinkedDocDeletedIcon,
|
LinkedDocDeletedIcon,
|
||||||
@@ -69,7 +69,7 @@ export function getEmbedLinkedDocIcons(
|
|||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
ReloadIcon,
|
ReloadIcon,
|
||||||
LoadingIcon: DarkLoadingIcon,
|
LoadingIcon,
|
||||||
LinkedDocIcon: EmbedPageIcon,
|
LinkedDocIcon: EmbedPageIcon,
|
||||||
LinkedDocDeletedIcon,
|
LinkedDocDeletedIcon,
|
||||||
LinkedDocEmptyBanner: small
|
LinkedDocEmptyBanner: small
|
||||||
@@ -85,7 +85,7 @@ export function getEmbedLinkedDocIcons(
|
|||||||
if (theme === ColorScheme.Light) {
|
if (theme === ColorScheme.Light) {
|
||||||
return {
|
return {
|
||||||
ReloadIcon,
|
ReloadIcon,
|
||||||
LoadingIcon: LightLoadingIcon,
|
LoadingIcon,
|
||||||
LinkedDocIcon: EmbedEdgelessIcon,
|
LinkedDocIcon: EmbedEdgelessIcon,
|
||||||
LinkedDocDeletedIcon,
|
LinkedDocDeletedIcon,
|
||||||
LinkedDocEmptyBanner: small
|
LinkedDocEmptyBanner: small
|
||||||
@@ -99,7 +99,7 @@ export function getEmbedLinkedDocIcons(
|
|||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
ReloadIcon,
|
ReloadIcon,
|
||||||
LoadingIcon: DarkLoadingIcon,
|
LoadingIcon,
|
||||||
LinkedDocIcon: EmbedEdgelessIcon,
|
LinkedDocIcon: EmbedEdgelessIcon,
|
||||||
LinkedDocDeletedIcon,
|
LinkedDocDeletedIcon,
|
||||||
LinkedDocEmptyBanner: small
|
LinkedDocEmptyBanner: small
|
||||||
+2
-4
@@ -1,3 +1,4 @@
|
|||||||
|
import { RENDER_CARD_THROTTLE_MS } from '@blocksuite/affine-block-embed';
|
||||||
import { ThemeProvider } from '@blocksuite/affine-shared/services';
|
import { ThemeProvider } from '@blocksuite/affine-shared/services';
|
||||||
import { WithDisposable } from '@blocksuite/global/lit';
|
import { WithDisposable } from '@blocksuite/global/lit';
|
||||||
import {
|
import {
|
||||||
@@ -10,10 +11,7 @@ import { property, queryAsync } from 'lit/decorators.js';
|
|||||||
import { classMap } from 'lit/directives/class-map.js';
|
import { classMap } from 'lit/directives/class-map.js';
|
||||||
import throttle from 'lodash-es/throttle';
|
import throttle from 'lodash-es/throttle';
|
||||||
|
|
||||||
import {
|
import { renderLinkedDocInCard } from '../../common/render-linked-doc';
|
||||||
RENDER_CARD_THROTTLE_MS,
|
|
||||||
renderLinkedDocInCard,
|
|
||||||
} from '../../common/render-linked-doc.js';
|
|
||||||
import type { EmbedSyncedDocBlockComponent } from '../embed-synced-doc-block.js';
|
import type { EmbedSyncedDocBlockComponent } from '../embed-synced-doc-block.js';
|
||||||
import { cardStyles } from '../styles.js';
|
import { cardStyles } from '../styles.js';
|
||||||
import { getSyncedDocIcons } from '../utils.js';
|
import { getSyncedDocIcons } from '../utils.js';
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import {
|
||||||
|
EmbedSyncedDocBlockSchema,
|
||||||
|
type EmbedSyncedDocModel,
|
||||||
|
} from '@blocksuite/affine-model';
|
||||||
|
import { type BlockStdScope, ConfigExtensionFactory } from '@blocksuite/std';
|
||||||
|
import type { TemplateResult } from 'lit';
|
||||||
|
|
||||||
|
export type EmbedSyncedDocConfig = {
|
||||||
|
edgelessHeader: (context: {
|
||||||
|
model: EmbedSyncedDocModel;
|
||||||
|
std: BlockStdScope;
|
||||||
|
}) => TemplateResult;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const EmbedSyncedDocConfigExtension =
|
||||||
|
ConfigExtensionFactory<EmbedSyncedDocConfig>(
|
||||||
|
EmbedSyncedDocBlockSchema.model.flavour
|
||||||
|
);
|
||||||
-1
@@ -289,7 +289,6 @@ const builtinToolbarConfig = {
|
|||||||
|
|
||||||
const builtinSurfaceToolbarConfig = {
|
const builtinSurfaceToolbarConfig = {
|
||||||
actions: [
|
actions: [
|
||||||
// TODO(@L-Sun): remove this after impl header toolbar for embed-edgeless-synced-doc
|
|
||||||
openDocActionGroup,
|
openDocActionGroup,
|
||||||
conversionsActionGroup,
|
conversionsActionGroup,
|
||||||
{
|
{
|
||||||
+40
-16
@@ -1,3 +1,4 @@
|
|||||||
|
import { toEdgelessEmbedBlock } from '@blocksuite/affine-block-embed';
|
||||||
import {
|
import {
|
||||||
EdgelessCRUDIdentifier,
|
EdgelessCRUDIdentifier,
|
||||||
reassociateConnectorsCommand,
|
reassociateConnectorsCommand,
|
||||||
@@ -12,19 +13,27 @@ import {
|
|||||||
ThemeProvider,
|
ThemeProvider,
|
||||||
} from '@blocksuite/affine-shared/services';
|
} from '@blocksuite/affine-shared/services';
|
||||||
import { Bound } from '@blocksuite/global/gfx';
|
import { Bound } from '@blocksuite/global/gfx';
|
||||||
import { BlockStdScope } from '@blocksuite/std';
|
import { type BlockComponent, BlockStdScope } from '@blocksuite/std';
|
||||||
import { html, nothing } from 'lit';
|
import { html, nothing } from 'lit';
|
||||||
|
import { query, queryAsync } from 'lit/decorators.js';
|
||||||
import { choose } from 'lit/directives/choose.js';
|
import { choose } from 'lit/directives/choose.js';
|
||||||
import { classMap } from 'lit/directives/class-map.js';
|
import { classMap } from 'lit/directives/class-map.js';
|
||||||
import { guard } from 'lit/directives/guard.js';
|
import { guard } from 'lit/directives/guard.js';
|
||||||
import { styleMap } from 'lit/directives/style-map.js';
|
import { styleMap } from 'lit/directives/style-map.js';
|
||||||
|
import { when } from 'lit/directives/when.js';
|
||||||
|
|
||||||
import { toEdgelessEmbedBlock } from '../common/to-edgeless-embed-block.js';
|
import { EmbedSyncedDocConfigExtension } from './configs';
|
||||||
import { EmbedSyncedDocBlockComponent } from './embed-synced-doc-block.js';
|
import { EmbedSyncedDocBlockComponent } from './embed-synced-doc-block';
|
||||||
|
|
||||||
export class EmbedEdgelessSyncedDocBlockComponent extends toEdgelessEmbedBlock(
|
export class EmbedEdgelessSyncedDocBlockComponent extends toEdgelessEmbedBlock(
|
||||||
EmbedSyncedDocBlockComponent
|
EmbedSyncedDocBlockComponent
|
||||||
) {
|
) {
|
||||||
|
@query('.affine-embed-synced-doc-edgeless-header-wrapper')
|
||||||
|
accessor headerWrapper: HTMLDivElement | null = null;
|
||||||
|
|
||||||
|
@queryAsync('affine-preview-root')
|
||||||
|
accessor contentElement!: Promise<BlockComponent | null>;
|
||||||
|
|
||||||
protected override _renderSyncedView = () => {
|
protected override _renderSyncedView = () => {
|
||||||
const { syncedDoc, editorMode } = this;
|
const { syncedDoc, editorMode } = this;
|
||||||
|
|
||||||
@@ -89,6 +98,14 @@ export class EmbedEdgelessSyncedDocBlockComponent extends toEdgelessEmbedBlock(
|
|||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const header =
|
||||||
|
this.std
|
||||||
|
.getOptional(EmbedSyncedDocConfigExtension.identifier)
|
||||||
|
?.edgelessHeader({
|
||||||
|
model: this.model,
|
||||||
|
std: this.std,
|
||||||
|
}) ?? nothing;
|
||||||
|
|
||||||
return this.renderEmbed(
|
return this.renderEmbed(
|
||||||
() => html`
|
() => html`
|
||||||
<div
|
<div
|
||||||
@@ -103,18 +120,25 @@ export class EmbedEdgelessSyncedDocBlockComponent extends toEdgelessEmbedBlock(
|
|||||||
style=${containerStyleMap}
|
style=${containerStyleMap}
|
||||||
?data-scale=${scale}
|
?data-scale=${scale}
|
||||||
>
|
>
|
||||||
<div class="affine-embed-synced-doc-editor">
|
<div class="affine-embed-synced-doc-edgeless-header-wrapper">
|
||||||
${this.isPageMode && this._isEmptySyncedDoc
|
${header}
|
||||||
? html`
|
|
||||||
<div class="affine-embed-synced-doc-editor-empty">
|
|
||||||
<span>
|
|
||||||
This is a linked doc, you can add content here.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
: guard([editorMode, syncedDoc], renderEditor)}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="affine-embed-synced-doc-editor-overlay"></div>
|
${when(
|
||||||
|
!this.model.isFolded,
|
||||||
|
() =>
|
||||||
|
html`<div class="affine-embed-synced-doc-editor">
|
||||||
|
${this.isPageMode && this._isEmptySyncedDoc
|
||||||
|
? html`
|
||||||
|
<div class="affine-embed-synced-doc-editor-empty">
|
||||||
|
<span>
|
||||||
|
This is a linked doc, you can add content here.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
: guard([editorMode, syncedDoc], renderEditor)}
|
||||||
|
</div>
|
||||||
|
<div class="affine-embed-synced-doc-editor-overlay"></div>`
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
);
|
);
|
||||||
@@ -156,8 +180,8 @@ export class EmbedEdgelessSyncedDocBlockComponent extends toEdgelessEmbedBlock(
|
|||||||
};
|
};
|
||||||
|
|
||||||
override renderGfxBlock() {
|
override renderGfxBlock() {
|
||||||
const { style, xywh } = this.model.props;
|
const { style, xywh$ } = this.model.props;
|
||||||
const bound = Bound.deserialize(xywh);
|
const bound = Bound.deserialize(xywh$.value);
|
||||||
|
|
||||||
this.embedContainerStyle.width = `${bound.w}px`;
|
this.embedContainerStyle.width = `${bound.w}px`;
|
||||||
this.embedContainerStyle.height = `${bound.h}px`;
|
this.embedContainerStyle.height = `${bound.h}px`;
|
||||||
+4
-2
@@ -1,3 +1,7 @@
|
|||||||
|
import {
|
||||||
|
EmbedBlockComponent,
|
||||||
|
isEmptyDoc,
|
||||||
|
} from '@blocksuite/affine-block-embed';
|
||||||
import { Peekable } from '@blocksuite/affine-components/peek';
|
import { Peekable } from '@blocksuite/affine-components/peek';
|
||||||
import { ViewExtensionManagerIdentifier } from '@blocksuite/affine-ext-loader';
|
import { ViewExtensionManagerIdentifier } from '@blocksuite/affine-ext-loader';
|
||||||
import {
|
import {
|
||||||
@@ -40,8 +44,6 @@ import { guard } from 'lit/directives/guard.js';
|
|||||||
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
|
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
|
||||||
import * as Y from 'yjs';
|
import * as Y from 'yjs';
|
||||||
|
|
||||||
import { EmbedBlockComponent } from '../common/embed-block-element.js';
|
|
||||||
import { isEmptyDoc } from '../common/render-linked-doc.js';
|
|
||||||
import type { EmbedSyncedDocCard } from './components/embed-synced-doc-card.js';
|
import type { EmbedSyncedDocCard } from './components/embed-synced-doc-card.js';
|
||||||
import { blockStyles } from './styles.js';
|
import { blockStyles } from './styles.js';
|
||||||
|
|
||||||
+2
@@ -5,6 +5,7 @@ import { literal } from 'lit/static-html.js';
|
|||||||
|
|
||||||
import { EmbedSyncedDocBlockAdapterExtensions } from './adapters/extension';
|
import { EmbedSyncedDocBlockAdapterExtensions } from './adapters/extension';
|
||||||
import { createBuiltinToolbarConfigExtension } from './configs/toolbar';
|
import { createBuiltinToolbarConfigExtension } from './configs/toolbar';
|
||||||
|
import { HeightInitializationExtension } from './init-height-extension';
|
||||||
|
|
||||||
const flavour = EmbedSyncedDocBlockSchema.model.flavour;
|
const flavour = EmbedSyncedDocBlockSchema.model.flavour;
|
||||||
|
|
||||||
@@ -27,4 +28,5 @@ export const EmbedSyncedDocViewExtensions: ExtensionType[] = [
|
|||||||
: literal`affine-embed-synced-doc-block`;
|
: literal`affine-embed-synced-doc-block`;
|
||||||
}),
|
}),
|
||||||
createBuiltinToolbarConfigExtension(flavour),
|
createBuiltinToolbarConfigExtension(flavour),
|
||||||
|
HeightInitializationExtension,
|
||||||
].flat();
|
].flat();
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
export * from './adapters';
|
||||||
|
export * from './configs';
|
||||||
|
export * from './edgeless-clipboard-config';
|
||||||
|
export * from './embed-synced-doc-block';
|
||||||
|
export * from './embed-synced-doc-spec';
|
||||||
|
export { SYNCED_MIN_HEIGHT, SYNCED_MIN_WIDTH } from '@blocksuite/affine-model';
|
||||||
+78
@@ -0,0 +1,78 @@
|
|||||||
|
import {
|
||||||
|
EmbedSyncedDocBlockSchema,
|
||||||
|
SYNCED_DEFAULT_MAX_HEIGHT,
|
||||||
|
SYNCED_MIN_HEIGHT,
|
||||||
|
} from '@blocksuite/affine-model';
|
||||||
|
import { DisposableGroup } from '@blocksuite/global/disposable';
|
||||||
|
import { clamp } from '@blocksuite/global/gfx';
|
||||||
|
import { LifeCycleWatcher } from '@blocksuite/std';
|
||||||
|
|
||||||
|
import { EmbedEdgelessSyncedDocBlockComponent } from './embed-edgeless-synced-doc-block';
|
||||||
|
|
||||||
|
export class HeightInitializationExtension extends LifeCycleWatcher {
|
||||||
|
static override key = 'embed-synced-doc-block-height-initialization';
|
||||||
|
|
||||||
|
override mounted() {
|
||||||
|
super.mounted();
|
||||||
|
|
||||||
|
this._disposables.add(
|
||||||
|
this.std.store.slots.blockUpdated.subscribe(payload => {
|
||||||
|
if (
|
||||||
|
payload.type === 'add' &&
|
||||||
|
payload.isLocal &&
|
||||||
|
payload.flavour === EmbedSyncedDocBlockSchema.model.flavour &&
|
||||||
|
payload.model.parent?.flavour === 'affine:surface'
|
||||||
|
) {
|
||||||
|
this._initQueue.add(payload.id);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
this._disposables.add(
|
||||||
|
this.std.view.viewUpdated.subscribe(payload => {
|
||||||
|
if (
|
||||||
|
payload.type === 'block' &&
|
||||||
|
payload.method === 'add' &&
|
||||||
|
this._initQueue.has(payload.id)
|
||||||
|
) {
|
||||||
|
this._initQueue.delete(payload.id);
|
||||||
|
if (!(payload.view instanceof EmbedEdgelessSyncedDocBlockComponent)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const block = payload.view;
|
||||||
|
|
||||||
|
block.contentElement
|
||||||
|
.then(contentEl => {
|
||||||
|
if (!contentEl) return;
|
||||||
|
|
||||||
|
const resizeObserver = new ResizeObserver(() => {
|
||||||
|
const headerHeight =
|
||||||
|
block.headerWrapper?.getBoundingClientRect().height ?? 0;
|
||||||
|
const contentHeight = contentEl.getBoundingClientRect().height;
|
||||||
|
|
||||||
|
const { x, y, w } = block.model.elementBound;
|
||||||
|
const h = clamp(
|
||||||
|
(headerHeight + contentHeight) / block.gfx.viewport.zoom,
|
||||||
|
SYNCED_MIN_HEIGHT,
|
||||||
|
SYNCED_DEFAULT_MAX_HEIGHT
|
||||||
|
);
|
||||||
|
block.model.xywh$.value = `[${x},${y},${w},${h}]`;
|
||||||
|
|
||||||
|
resizeObserver.unobserve(contentEl);
|
||||||
|
});
|
||||||
|
resizeObserver.observe(contentEl);
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
override unmounted(): void {
|
||||||
|
this._disposables.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly _initQueue = new Set<string>();
|
||||||
|
|
||||||
|
private readonly _disposables = new DisposableGroup();
|
||||||
|
}
|
||||||
+11
-10
@@ -1,11 +1,10 @@
|
|||||||
|
import { embedNoteContentStyles } from '@blocksuite/affine-block-embed';
|
||||||
import {
|
import {
|
||||||
EMBED_CARD_HEIGHT,
|
EMBED_CARD_HEIGHT,
|
||||||
EMBED_CARD_WIDTH,
|
EMBED_CARD_WIDTH,
|
||||||
} from '@blocksuite/affine-shared/consts';
|
} from '@blocksuite/affine-shared/consts';
|
||||||
import { cssVarV2 } from '@toeverything/theme/v2';
|
import { unsafeCSSVarV2 } from '@blocksuite/affine-shared/theme';
|
||||||
import { css, html, unsafeCSS } from 'lit';
|
import { css, html } from 'lit';
|
||||||
|
|
||||||
import { embedNoteContentStyles } from '../common/embed-note-content-styles.js';
|
|
||||||
|
|
||||||
export const blockStyles = css`
|
export const blockStyles = css`
|
||||||
affine-embed-synced-doc-block {
|
affine-embed-synced-doc-block {
|
||||||
@@ -101,7 +100,7 @@ export const blockStyles = css`
|
|||||||
}
|
}
|
||||||
.affine-embed-synced-doc-icon {
|
.affine-embed-synced-doc-icon {
|
||||||
line-height: 0;
|
line-height: 0;
|
||||||
color: ${unsafeCSS(cssVarV2.icon.primary)};
|
color: ${unsafeCSSVarV2('icon/primary')};
|
||||||
}
|
}
|
||||||
.affine-embed-synced-doc-title {
|
.affine-embed-synced-doc-title {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
@@ -151,8 +150,8 @@ export const blockStyles = css`
|
|||||||
}
|
}
|
||||||
|
|
||||||
.affine-embed-synced-doc-container.surface {
|
.affine-embed-synced-doc-container.surface {
|
||||||
border-color: var(--affine-border-color);
|
border-color: ${unsafeCSSVarV2('layer/insideBorder/border')};
|
||||||
background: var(--affine-background-primary-color);
|
background: ${unsafeCSSVarV2('layer/background/linkedDocOnEdgeless')};
|
||||||
|
|
||||||
affine-preview-root {
|
affine-preview-root {
|
||||||
padding: 0 24px;
|
padding: 0 24px;
|
||||||
@@ -476,9 +475,6 @@ export const cardStyles = css`
|
|||||||
width: ${EMBED_CARD_WIDTH.vertical}px;
|
width: ${EMBED_CARD_WIDTH.vertical}px;
|
||||||
height: ${EMBED_CARD_HEIGHT.vertical}px;
|
height: ${EMBED_CARD_HEIGHT.vertical}px;
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
margin-top: calc(
|
|
||||||
(${EMBED_CARD_HEIGHT.syncedDoc}px - ${EMBED_CARD_HEIGHT.vertical}px) / 2
|
|
||||||
);
|
|
||||||
|
|
||||||
.affine-embed-synced-doc-card-content {
|
.affine-embed-synced-doc-card-content {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -533,6 +529,11 @@ export const cardStyles = css`
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.affine-embed-synced-doc-edgeless-header-wrapper {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2; // Make sure the header is above the overlay
|
||||||
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const SyncedDocErrorIcon = html`<svg
|
export const SyncedDocErrorIcon = html`<svg
|
||||||
+4
-4
@@ -1,8 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
DarkLoadingIcon,
|
|
||||||
EmbedEdgelessIcon,
|
EmbedEdgelessIcon,
|
||||||
EmbedPageIcon,
|
EmbedPageIcon,
|
||||||
LightLoadingIcon,
|
getLoadingIconWith,
|
||||||
ReloadIcon,
|
ReloadIcon,
|
||||||
} from '@blocksuite/affine-components/icons';
|
} from '@blocksuite/affine-components/icons';
|
||||||
import { ColorScheme } from '@blocksuite/affine-model';
|
import { ColorScheme } from '@blocksuite/affine-model';
|
||||||
@@ -34,9 +33,10 @@ export function getSyncedDocIcons(
|
|||||||
theme: ColorScheme,
|
theme: ColorScheme,
|
||||||
editorMode: 'page' | 'edgeless'
|
editorMode: 'page' | 'edgeless'
|
||||||
): SyncedCardImages {
|
): SyncedCardImages {
|
||||||
|
const LoadingIcon = getLoadingIconWith(theme);
|
||||||
if (theme === ColorScheme.Light) {
|
if (theme === ColorScheme.Light) {
|
||||||
return {
|
return {
|
||||||
LoadingIcon: LightLoadingIcon,
|
LoadingIcon,
|
||||||
SyncedDocIcon: editorMode === 'page' ? EmbedPageIcon : EmbedEdgelessIcon,
|
SyncedDocIcon: editorMode === 'page' ? EmbedPageIcon : EmbedEdgelessIcon,
|
||||||
SyncedDocErrorIcon,
|
SyncedDocErrorIcon,
|
||||||
SyncedDocDeletedIcon,
|
SyncedDocDeletedIcon,
|
||||||
@@ -47,7 +47,7 @@ export function getSyncedDocIcons(
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
LoadingIcon: DarkLoadingIcon,
|
LoadingIcon,
|
||||||
SyncedDocIcon: editorMode === 'page' ? EmbedPageIcon : EmbedEdgelessIcon,
|
SyncedDocIcon: editorMode === 'page' ? EmbedPageIcon : EmbedEdgelessIcon,
|
||||||
SyncedDocErrorIcon,
|
SyncedDocErrorIcon,
|
||||||
SyncedDocDeletedIcon,
|
SyncedDocDeletedIcon,
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export * from './embed-linked-doc-block';
|
||||||
|
export * from './embed-synced-doc-block';
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import {
|
||||||
|
type StoreExtensionContext,
|
||||||
|
StoreExtensionProvider,
|
||||||
|
} from '@blocksuite/affine-ext-loader';
|
||||||
|
import {
|
||||||
|
EmbedLinkedDocBlockSchemaExtension,
|
||||||
|
EmbedSyncedDocBlockSchemaExtension,
|
||||||
|
} from '@blocksuite/affine-model';
|
||||||
|
|
||||||
|
import { EmbedLinkedDocBlockAdapterExtensions } from './embed-linked-doc-block/adapters/extension';
|
||||||
|
import { EmbedSyncedDocBlockAdapterExtensions } from './embed-synced-doc-block/adapters/extension';
|
||||||
|
|
||||||
|
export class EmbedDocStoreExtension extends StoreExtensionProvider {
|
||||||
|
override name = 'affine-embed-doc-block';
|
||||||
|
|
||||||
|
override setup(context: StoreExtensionContext) {
|
||||||
|
super.setup(context);
|
||||||
|
context.register([
|
||||||
|
EmbedSyncedDocBlockSchemaExtension,
|
||||||
|
EmbedLinkedDocBlockSchemaExtension,
|
||||||
|
]);
|
||||||
|
context.register(EmbedLinkedDocBlockAdapterExtensions);
|
||||||
|
context.register(EmbedSyncedDocBlockAdapterExtensions);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import {
|
||||||
|
type ViewExtensionContext,
|
||||||
|
ViewExtensionProvider,
|
||||||
|
} from '@blocksuite/affine-ext-loader';
|
||||||
|
|
||||||
|
import { effects } from './effects';
|
||||||
|
import {
|
||||||
|
EdgelessClipboardEmbedLinkedDocConfig,
|
||||||
|
EmbedLinkedDocViewExtensions,
|
||||||
|
} from './embed-linked-doc-block';
|
||||||
|
import {
|
||||||
|
EdgelessClipboardEmbedSyncedDocConfig,
|
||||||
|
EmbedSyncedDocViewExtensions,
|
||||||
|
} from './embed-synced-doc-block';
|
||||||
|
|
||||||
|
export class EmbedDocViewExtension extends ViewExtensionProvider {
|
||||||
|
override name = 'affine-embed-doc-block';
|
||||||
|
|
||||||
|
override effect(): void {
|
||||||
|
super.effect();
|
||||||
|
effects();
|
||||||
|
}
|
||||||
|
|
||||||
|
override setup(context: ViewExtensionContext) {
|
||||||
|
super.setup(context);
|
||||||
|
context.register(EmbedLinkedDocViewExtensions);
|
||||||
|
context.register(EmbedSyncedDocViewExtensions);
|
||||||
|
const isEdgeless = this.isEdgeless(context.scope);
|
||||||
|
if (isEdgeless) {
|
||||||
|
context.register([
|
||||||
|
EdgelessClipboardEmbedLinkedDocConfig,
|
||||||
|
EdgelessClipboardEmbedSyncedDocConfig,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"rootDir": "./src",
|
||||||
|
"outDir": "./dist",
|
||||||
|
"tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"
|
||||||
|
},
|
||||||
|
"include": ["./src"],
|
||||||
|
"references": [
|
||||||
|
{ "path": "../embed" },
|
||||||
|
{ "path": "../surface" },
|
||||||
|
{ "path": "../../components" },
|
||||||
|
{ "path": "../../ext-loader" },
|
||||||
|
{ "path": "../../inlines/reference" },
|
||||||
|
{ "path": "../../model" },
|
||||||
|
{ "path": "../../rich-text" },
|
||||||
|
{ "path": "../../shared" },
|
||||||
|
{ "path": "../../widgets/slash-menu" },
|
||||||
|
{ "path": "../../../framework/global" },
|
||||||
|
{ "path": "../../../framework/std" },
|
||||||
|
{ "path": "../../../framework/store" }
|
||||||
|
]
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user