diff --git a/package-lock.json b/package-lock.json index f8ebbef..0ea5c2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "@dnd-kit/utilities": "^3.2.2", "@excalidraw/excalidraw": "^0.17.6", "@glideapps/glide-data-grid-cells": "^3.4.1", - "@labbs/openblock-core": "v1.0.3", - "@labbs/openblock-react": "v1.0.3", + "@labbs/openblock-core": "v1.1.0", + "@labbs/openblock-react": "v1.1.0", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-avatar": "^1.1.2", "@radix-ui/react-checkbox": "^1.3.3", @@ -46,7 +46,10 @@ "react-i18next": "^16.5.4", "react-router-dom": "^7.1.3", "tailwind-merge": "^2.6.0", - "use-debounce": "^10.0.6" + "use-debounce": "^10.0.6", + "y-prosemirror": "^1.3.7", + "y-websocket": "^3.0.0", + "yjs": "^13.6.30" }, "devDependencies": { "@eslint/js": "^9.17.0", @@ -1325,9 +1328,9 @@ } }, "node_modules/@labbs/openblock-core": { - "version": "1.0.3", - "resolved": "https://npm.pkg.github.com/download/@labbs/openblock-core/1.0.3/a093b94bdb8fff3ddd88ecec935bec7c8964da38", - "integrity": "sha512-UufYCNGKegXhJB3Hp669Js1juBX9oK8zuFzUSIutYh3qAfvGs2esYp0jeFcZwPFogX6l/ZpZAiEWIhiFy8EgDA==", + "version": "1.1.0", + "resolved": "https://npm.pkg.github.com/download/@labbs/openblock-core/1.1.0/d823a8314978f99ba98677d807fd6fb13668cc69", + "integrity": "sha512-FP8ytFhuN/fqFI+IxhEcC+MMbvn81S53VyYXVtVrOp0BU25uef0pksW/KNRIpYFq/8807HT6YREiVIyTZLE7Dw==", "license": "Apache-2.0", "dependencies": { "prosemirror-commands": "^1.6.2", @@ -1342,15 +1345,19 @@ "prosemirror-transform": "^1.10.2", "prosemirror-view": "^1.37.1", "uuid": "^11.0.5" + }, + "peerDependencies": { + "y-prosemirror": "^1.0.0", + "yjs": "^13.0.0" } }, "node_modules/@labbs/openblock-react": { - "version": "1.0.3", - "resolved": "https://npm.pkg.github.com/download/@labbs/openblock-react/1.0.3/03ca1f512d8fa7967da4a614f0914de9c31c142d", - "integrity": "sha512-Tf2xFQfD6NALoQJf8ybhdMO/cayWgrf+IKKMCyWXjK7LXzvyIvM+jrmpXCxt/byI2Z4IjUrgrY7/2rknJGUg6A==", + "version": "1.1.0", + "resolved": "https://npm.pkg.github.com/download/@labbs/openblock-react/1.1.0/1e56ea0d9f9515d0a83d38986bb2eaa3335a5c02", + "integrity": "sha512-m3UP60UdzgtA9Xsgq8b6/1pq+x3pf0zELpGLGqcKEzpcnKqWlo8rt92f0mf70kISvFzX4m7CBuBWPqiHTyQUsw==", "license": "Apache-2.0", "dependencies": { - "@labbs/openblock-core": "1.0.3" + "@labbs/openblock-core": "1.1.0" }, "peerDependencies": { "react": ">=18.0.0", @@ -6087,6 +6094,16 @@ "dev": true, "license": "ISC" }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "license": "MIT", + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -6221,6 +6238,27 @@ "node": ">= 0.8.0" } }, + "node_modules/lib0": { + "version": "0.2.117", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz", + "integrity": "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==", + "license": "MIT", + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/lightningcss": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", @@ -8427,6 +8465,71 @@ "node": ">=0.10.0" } }, + "node_modules/y-prosemirror": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.7.tgz", + "integrity": "sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.109" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "prosemirror-model": "^1.7.1", + "prosemirror-state": "^1.2.3", + "prosemirror-view": "^1.9.10", + "y-protocols": "^1.0.1", + "yjs": "^13.5.38" + } + }, + "node_modules/y-protocols": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz", + "integrity": "sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/y-websocket": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/y-websocket/-/y-websocket-3.0.0.tgz", + "integrity": "sha512-mUHy7AzkOZ834T/7piqtlA8Yk6AchqKqcrCXjKW8J1w2lPtRDjz8W5/CvXz9higKAHgKRKqpI3T33YkRFLkPtg==", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.102", + "y-protocols": "^1.0.5" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.5.6" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -8449,6 +8552,23 @@ "url": "https://github.com/sponsors/eemeli" } }, + "node_modules/yjs": { + "version": "13.6.30", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.30.tgz", + "integrity": "sha512-vv/9h42eCMC81ZHDFswuu/MKzkl/vyq1BhaNGfHyOonwlG4CJbQF4oiBBJPvfdeCt/PlVDWh7Nov9D34YY09uQ==", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.99" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index cb831fb..834b6cf 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "@dnd-kit/utilities": "^3.2.2", "@excalidraw/excalidraw": "^0.17.6", "@glideapps/glide-data-grid-cells": "^3.4.1", - "@labbs/openblock-core": "v1.0.3", - "@labbs/openblock-react": "v1.0.3", + "@labbs/openblock-core": "v1.1.0", + "@labbs/openblock-react": "v1.1.0", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-avatar": "^1.1.2", "@radix-ui/react-checkbox": "^1.3.3", @@ -43,13 +43,17 @@ "i18next-resources-to-backend": "^1.2.1", "lucide-react": "^0.468.0", "next-themes": "^0.4.4", + "prosemirror-state": "^1.4.4", "react": "^18.3.1", "react-day-picker": "^9.13.0", "react-dom": "^18.3.1", "react-i18next": "^16.5.4", "react-router-dom": "^7.1.3", "tailwind-merge": "^2.6.0", - "use-debounce": "^10.0.6" + "use-debounce": "^10.0.6", + "y-prosemirror": "^1.3.7", + "y-websocket": "^3.0.0", + "yjs": "^13.6.30" }, "devDependencies": { "@eslint/js": "^9.17.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8729c5d..ba48ffb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,11 +27,11 @@ importers: specifier: ^3.4.1 version: 3.4.1(lodash@4.17.21)(marked@4.3.0)(react-dom@18.3.1(react@18.3.1))(react-responsive-carousel@3.2.23)(react@18.3.1)(styled-components@5.3.11(@babel/core@7.28.6)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)) '@labbs/openblock-core': - specifier: v1.0.1 - version: 1.0.1 + specifier: v1.1.0 + version: 1.1.0(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30) '@labbs/openblock-react': - specifier: v1.0.1 - version: 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: v1.1.0 + version: 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30) '@radix-ui/react-alert-dialog': specifier: ^1.1.15 version: 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -104,6 +104,9 @@ importers: next-themes: specifier: ^0.4.4 version: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + prosemirror-state: + specifier: ^1.4.4 + version: 1.4.4 react: specifier: ^18.3.1 version: 18.3.1 @@ -125,6 +128,15 @@ importers: use-debounce: specifier: ^10.0.6 version: 10.1.0(react@18.3.1) + y-prosemirror: + specifier: ^1.3.7 + version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30) + y-websocket: + specifier: ^3.0.0 + version: 3.0.0(yjs@13.6.30) + yjs: + specifier: ^13.6.30 + version: 13.6.30 devDependencies: '@eslint/js': specifier: ^9.17.0 @@ -751,11 +763,19 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@labbs/openblock-core@1.0.1': - resolution: {integrity: sha512-NrhyQzHCJYbnYFcCOsPqAlBJbB/r9BxonlQlcibLOfL4uaepU3NvPE9mTmXes5VgmEgFD/5Ro1gzvjSMx3ArYw==, tarball: https://npm.pkg.github.com/download/@labbs/openblock-core/1.0.1/2e370f9a430452c3e10e3b36e09445817ecb4fa8} + '@labbs/openblock-core@1.1.0': + resolution: {integrity: sha512-FP8ytFhuN/fqFI+IxhEcC+MMbvn81S53VyYXVtVrOp0BU25uef0pksW/KNRIpYFq/8807HT6YREiVIyTZLE7Dw==, tarball: https://npm.pkg.github.com/download/@labbs/openblock-core/1.1.0/d823a8314978f99ba98677d807fd6fb13668cc69} + peerDependencies: + y-prosemirror: ^1.0.0 + yjs: ^13.0.0 + peerDependenciesMeta: + y-prosemirror: + optional: true + yjs: + optional: true - '@labbs/openblock-react@1.0.1': - resolution: {integrity: sha512-V6wsiktebus1itnLEOHPUvwPUkIxeROaZlEUmtIo1W0na6tG3oXOWAApnNCSIeTWy5HD1Pjn0yA/WNJw5Z5tOQ==, tarball: https://npm.pkg.github.com/download/@labbs/openblock-react/1.0.1/9cb9a3bf8480daa261f300e4b85f498014d862d0} + '@labbs/openblock-react@1.1.0': + resolution: {integrity: sha512-m3UP60UdzgtA9Xsgq8b6/1pq+x3pf0zELpGLGqcKEzpcnKqWlo8rt92f0mf70kISvFzX4m7CBuBWPqiHTyQUsw==, tarball: https://npm.pkg.github.com/download/@labbs/openblock-react/1.1.0/1e56ea0d9f9515d0a83d38986bb2eaa3335a5c02} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' @@ -2214,6 +2234,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -2265,6 +2288,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lib0@0.2.117: + resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} + engines: {node: '>=16'} + hasBin: true + lightningcss-android-arm64@1.30.2: resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} @@ -2976,6 +3004,28 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + y-prosemirror@1.3.7: + resolution: {integrity: sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 + + y-protocols@1.0.7: + resolution: {integrity: sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + + y-websocket@3.0.0: + resolution: {integrity: sha512-mUHy7AzkOZ834T/7piqtlA8Yk6AchqKqcrCXjKW8J1w2lPtRDjz8W5/CvXz9higKAHgKRKqpI3T33YkRFLkPtg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.5.6 + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -2984,6 +3034,10 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yjs@13.6.30: + resolution: {integrity: sha512-vv/9h42eCMC81ZHDFswuu/MKzkl/vyq1BhaNGfHyOonwlG4CJbQF4oiBBJPvfdeCt/PlVDWh7Nov9D34YY09uQ==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3458,7 +3512,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@labbs/openblock-core@1.0.1': + '@labbs/openblock-core@1.1.0(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30)': dependencies: prosemirror-commands: 1.7.1 prosemirror-dropcursor: 1.8.2 @@ -3472,12 +3526,18 @@ snapshots: prosemirror-transform: 1.11.0 prosemirror-view: 1.41.5 uuid: 11.1.0 + optionalDependencies: + y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30) + yjs: 13.6.30 - '@labbs/openblock-react@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@labbs/openblock-react@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30)': dependencies: - '@labbs/openblock-core': 1.0.1 + '@labbs/openblock-core': 1.1.0(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - y-prosemirror + - yjs '@nodelib/fs.scandir@2.1.5': dependencies: @@ -5039,6 +5099,8 @@ snapshots: isexe@2.0.0: {} + isomorphic.js@0.2.5: {} + jiti@2.6.1: {} js-tokens@4.0.0: {} @@ -5078,6 +5140,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lib0@0.2.117: + dependencies: + isomorphic.js: 0.2.5 + lightningcss-android-arm64@1.30.2: optional: true @@ -5736,10 +5802,34 @@ snapshots: word-wrap@1.2.5: {} + y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30): + dependencies: + lib0: 0.2.117 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.5 + y-protocols: 1.0.7(yjs@13.6.30) + yjs: 13.6.30 + + y-protocols@1.0.7(yjs@13.6.30): + dependencies: + lib0: 0.2.117 + yjs: 13.6.30 + + y-websocket@3.0.0(yjs@13.6.30): + dependencies: + lib0: 0.2.117 + y-protocols: 1.0.7(yjs@13.6.30) + yjs: 13.6.30 + yallist@3.1.1: {} yaml@2.8.2: {} + yjs@13.6.30: + dependencies: + lib0: 0.2.117 + yocto-queue@0.1.0: {} yocto-queue@1.2.2: {} diff --git a/src/components/database/common/view-tabs.tsx b/src/components/database/common/view-tabs.tsx index 00671aa..0a50679 100644 --- a/src/components/database/common/view-tabs.tsx +++ b/src/components/database/common/view-tabs.tsx @@ -459,7 +459,7 @@ export function ViewTabs({ const isHidden = hiddenColumnIds.has(col.id || '') return (
{ if (col.id) { isHidden ? onShowColumn(col.id) : onHideColumn(col.id) } }}> + onClick={() => { if (col.id) { if (isHidden) { onShowColumn(col.id) } else { onHideColumn(col.id) } } }}> {col.name} {isHidden ? : }
diff --git a/src/components/document/document-editor.tsx b/src/components/document/document-editor.tsx index a95e744..727a9e9 100644 --- a/src/components/document/document-editor.tsx +++ b/src/components/document/document-editor.tsx @@ -5,6 +5,8 @@ import { ContentHeader, type BreadcrumbItem } from '@/components/shared/content- import { Loader2 } from 'lucide-react' import type { PropertySchema } from '@/hooks/use-database' import type { IconValue } from '@/components/ui/icon-picker' +import type { Plugin } from 'prosemirror-state' +import type { XmlFragment } from 'yjs' // Types for document fields (from database schema) interface DocumentField { @@ -55,6 +57,10 @@ interface DocumentEditorProps { // Editor readiness isInitialized?: boolean + + // Collaboration + collaborationPlugins?: Plugin[] | null + collaborationFragment?: XmlFragment | null } export function DocumentEditor({ @@ -82,6 +88,8 @@ export function DocumentEditor({ saveError, comparisonPanel, isInitialized = true, + collaborationPlugins, + collaborationFragment, }: DocumentEditorProps) { const { t } = useTranslation('document') @@ -162,6 +170,8 @@ export function DocumentEditor({ onChange={onContentChange} editable={isEditable} fullWidth={isFullWidth} + collaborationPlugins={collaborationPlugins} + collaborationFragment={collaborationFragment} /> ) : (
diff --git a/src/components/editor/openblock-editor.tsx b/src/components/editor/openblock-editor.tsx index d05d45f..36c1b42 100644 --- a/src/components/editor/openblock-editor.tsx +++ b/src/components/editor/openblock-editor.tsx @@ -9,7 +9,10 @@ import { type Block, } from '@labbs/openblock-react' import { useTheme } from 'next-themes' +import { prosemirrorToYXmlFragment } from 'y-prosemirror' +import type { XmlFragment } from 'yjs' import { DatabaseBlock } from './database-block' +import type { Plugin } from 'prosemirror-state' // Custom blocks array - add new custom blocks here const CUSTOM_BLOCKS = [DatabaseBlock] @@ -36,6 +39,10 @@ interface OpenBlockEditorProps { onChange: (content: OpenBlockContent) => void editable?: boolean fullWidth?: boolean + /** Y.js collaboration plugins (from useCollaboration) */ + collaborationPlugins?: Plugin[] | null + /** Y.js XML fragment (from useCollaboration) */ + collaborationFragment?: XmlFragment | null } // Styles component to avoid duplication @@ -198,17 +205,11 @@ function EditorStyles() { border: 1px solid hsl(var(--border)); } - /* Side menu (drag handle) */ + /* Side menu (drag handle) - visibility controlled by JS via ob-side-menu--visible class */ .openblock-editor-wrapper .ob-side-menu { - opacity: 0; transition: opacity 150ms ease; } - .openblock-editor-wrapper .ob-block:hover .ob-side-menu, - .openblock-editor-wrapper .ob-side-menu:hover { - opacity: 1; - } - /* Table styles */ .openblock-editor-wrapper table { border-collapse: collapse; @@ -282,6 +283,68 @@ function EditorStyles() { .openblock-editor-wrapper .ProseMirror .selected { background: transparent !important; } + + /* Y.js collaboration — text selection highlight */ + .openblock-editor-wrapper .ProseMirror-yjs-selection { + border-radius: 2px; + } + + /* Cursor caret + avatar */ + .openblock-editor-wrapper .y-collab-cursor { + position: relative; + display: inline-block; + width: 2px; + height: 1.15em; + vertical-align: text-bottom; + background-color: var(--collab-color, #999); + margin: 0 1px; + pointer-events: none; + } + + .openblock-editor-wrapper .y-collab-avatar { + position: absolute; + left: 4px; + top: -1px; + width: 18px; + height: 18px; + border-radius: 50%; + background-color: var(--collab-color, #999); + color: #fff; + font-size: 10px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + pointer-events: auto; + cursor: default; + z-index: 10; + line-height: 1; + } + + /* Name tooltip on hover */ + .openblock-editor-wrapper .y-collab-avatar::after { + content: attr(data-name); + position: absolute; + top: 50%; + left: calc(100% + 6px); + transform: translateY(-50%); + background-color: var(--collab-color, #999); + color: #fff; + padding: 2px 7px; + border-radius: 4px; + font-size: 11px; + font-weight: 600; + white-space: nowrap; + line-height: 1.4; + opacity: 0; + pointer-events: none; + transition: opacity 120ms ease; + } + + .openblock-editor-wrapper .y-collab-avatar:hover::after { + opacity: 1; + } `} ) } @@ -292,11 +355,15 @@ function OpenBlockEditorInner({ onChange, editable, fullWidth, + collaborationPlugins, + collaborationFragment, }: { initialContent: Block[] | undefined onChange: (content: OpenBlockContent) => void editable: boolean fullWidth: boolean + collaborationPlugins?: Plugin[] | null + collaborationFragment?: XmlFragment | null }) { const { resolvedTheme } = useTheme() const lastContentRef = useRef(JSON.stringify(initialContent || [])) @@ -313,6 +380,32 @@ function OpenBlockEditorInner({ // Get slash menu items from custom blocks const customSlashMenuItems = useCustomSlashMenuItems(editor, CUSTOM_BLOCKS) + // Enable/disable collaboration when plugins change + const collabEnabledRef = useRef(false) + useEffect(() => { + if (!editor || editor.isDestroyed) return + + if (collaborationPlugins && collaborationPlugins.length > 0) { + if (!collabEnabledRef.current) { + // If the Y.Doc fragment is empty (new room, no persistence), + // populate it from the current ProseMirror doc BEFORE enabling collab. + // This prevents y-prosemirror's _forceRerender from wiping content + // and avoids the TextSelection RangeError on empty docs. + if (collaborationFragment && collaborationFragment.length === 0) { + prosemirrorToYXmlFragment(editor.pm.doc, collaborationFragment) + } + + editor.enableCollaboration({ plugins: collaborationPlugins }) + collabEnabledRef.current = true + } + } else { + if (collabEnabledRef.current) { + editor.disableCollaboration() + collabEnabledRef.current = false + } + } + }, [editor, collaborationPlugins, collaborationFragment]) + // Handle content changes const handleChange = useCallback(() => { if (!isInitializedRef.current || !editor || editor.isDestroyed) return @@ -395,6 +488,8 @@ export function OpenBlockEditor({ onChange, editable = true, fullWidth = false, + collaborationPlugins, + collaborationFragment, }: OpenBlockEditorProps) { const [isReady, setIsReady] = useState(false) const initialContentRef = useRef(undefined) @@ -429,6 +524,8 @@ export function OpenBlockEditor({ onChange={onChange} editable={editable} fullWidth={fullWidth} + collaborationPlugins={collaborationPlugins} + collaborationFragment={collaborationFragment} /> ) } diff --git a/src/hooks/use-collaboration.ts b/src/hooks/use-collaboration.ts new file mode 100644 index 0000000..df539fa --- /dev/null +++ b/src/hooks/use-collaboration.ts @@ -0,0 +1,173 @@ +import { useEffect, useRef, useState, useCallback } from 'react' +import * as Y from 'yjs' +import { WebsocketProvider } from 'y-websocket' +import { ySyncPlugin, yCursorPlugin, yUndoPlugin } from 'y-prosemirror' +import { useAuth } from '@/contexts/auth-context' + +// Random color for cursor +const CURSOR_COLORS = [ + '#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', + '#DDA0DD', '#98D8C8', '#F7DC6F', '#BB8FCE', '#85C1E9', +] + +function getRandomColor() { + return CURSOR_COLORS[Math.floor(Math.random() * CURSOR_COLORS.length)] +} + +export interface CollaborationState { + /** Y.js plugins to pass to editor.enableCollaboration() */ + plugins: ReturnType[] | null + /** The Y.js XML fragment used by ySyncPlugin */ + fragment: Y.XmlFragment | null + /** Whether the websocket connection is established */ + isConnected: boolean + /** Whether the initial sync from the server is complete */ + isSynced: boolean + /** Number of connected users */ + connectedUsers: number + /** List of connected users with their awareness info */ + users: CollaborationUser[] +} + +export interface CollaborationUser { + clientId: number + name: string + color: string +} + +interface UseCollaborationOptions { + /** Unique room identifier, e.g. "document:docId" or "row:databaseId:rowId" */ + roomId: string | undefined + /** WebSocket server URL */ + wsUrl?: string + /** Whether collaboration is enabled */ + enabled?: boolean +} + +function buildCursor(user: { name?: string; color?: string }): HTMLElement { + const name = user.name || 'Anonymous' + const color = user.color || '#999' + const initial = name[0].toUpperCase() + + const wrap = document.createElement('span') + wrap.className = 'y-collab-cursor' + wrap.style.setProperty('--collab-color', color) + + const avatar = document.createElement('span') + avatar.className = 'y-collab-avatar' + avatar.textContent = initial + avatar.setAttribute('data-name', name) + + wrap.appendChild(avatar) + return wrap +} + +const DEFAULT_WS_URL = import.meta.env.VITE_COLLAB_WS_URL || ( + import.meta.env.DEV ? 'ws://127.0.0.1:8080/ws/collab' : `ws://${window.location.host}/ws/collab` +) + +export function useCollaboration({ + roomId, + wsUrl = DEFAULT_WS_URL, + enabled = true, +}: UseCollaborationOptions): CollaborationState { + const { user, token } = useAuth() + const [isConnected, setIsConnected] = useState(false) + const [isSynced, setIsSynced] = useState(false) + const [users, setUsers] = useState([]) + + const ydocRef = useRef(null) + const providerRef = useRef(null) + const pluginsRef = useRef[] | null>(null) + const fragmentRef = useRef(null) + const colorRef = useRef(getRandomColor()) + + const cleanup = useCallback(() => { + providerRef.current?.disconnect() + providerRef.current?.destroy() + ydocRef.current?.destroy() + providerRef.current = null + ydocRef.current = null + pluginsRef.current = null + fragmentRef.current = null + setIsConnected(false) + setIsSynced(false) + setUsers([]) + }, []) + + useEffect(() => { + if (!enabled || !roomId) { + cleanup() + return + } + + // Create Y.js document + const ydoc = new Y.Doc() + ydocRef.current = ydoc + + // Connect to WebSocket server with auth token + const provider = new WebsocketProvider(wsUrl, roomId, ydoc, { + params: token ? { token } : {}, + }) + providerRef.current = provider + + // Set awareness (cursor info) + provider.awareness.setLocalStateField('user', { + name: user?.username || user?.email || 'Anonymous', + color: colorRef.current, + }) + + // Build y-prosemirror plugins + const fragment = ydoc.getXmlFragment('prosemirror') + fragmentRef.current = fragment + pluginsRef.current = [ + ySyncPlugin(fragment), + yCursorPlugin(provider.awareness, { cursorBuilder: buildCursor }), + yUndoPlugin(), + ] + + // Connection status + provider.on('status', ({ status }: { status: string }) => { + setIsConnected(status === 'connected') + }) + + // Sync status + provider.on('sync', (synced: boolean) => { + setIsSynced(synced) + }) + + // Awareness changes (connected users) + const updateUsers = () => { + const states = provider.awareness.getStates() + const collabUsers: CollaborationUser[] = [] + states.forEach((state, clientId) => { + if (clientId === provider.awareness.clientID) return + if (state.user) { + collabUsers.push({ + clientId, + name: state.user.name || 'Anonymous', + color: state.user.color || '#999', + }) + } + }) + setUsers(collabUsers) + } + + provider.awareness.on('change', updateUsers) + updateUsers() + + return () => { + provider.awareness.off('change', updateUsers) + cleanup() + } + }, [roomId, wsUrl, enabled, token, user?.username, user?.email, cleanup]) + + return { + plugins: isConnected ? pluginsRef.current : null, + fragment: isConnected ? fragmentRef.current : null, + isConnected, + isSynced, + connectedUsers: users.length + 1, // +1 for self + users, + } +} diff --git a/src/pages/database-document.tsx b/src/pages/database-document.tsx index deb3ab7..2da3bd2 100644 --- a/src/pages/database-document.tsx +++ b/src/pages/database-document.tsx @@ -12,6 +12,7 @@ import { useUpdateRow, type PropertySchema, } from '@/hooks/use-database' +import { useCollaboration } from '@/hooks/use-collaboration' // Content type for database document rows interface RowContent { @@ -34,6 +35,12 @@ export function DatabaseDocumentPage() { const { data: row, isLoading: isLoadingRow } = useRow(databaseId, rowId) const updateRow = useUpdateRow() + // Collaboration + const { plugins: collabPlugins, fragment: collabFragment } = useCollaboration({ + roomId: databaseId && rowId ? `row:${databaseId}:${rowId}` : undefined, + enabled: true, + }) + // Track initialization for editor - we need to track which rowId was initialized // to handle the timing issue where the component remounts before effects run const [initializedRowId, setInitializedRowId] = useState(null) @@ -257,6 +264,8 @@ export function DatabaseDocumentPage() { isFullWidth={isFullWidth} onSettingsClick={() => setIsSettingsSidebarOpen(true)} isInitialized={isInitialized} + collaborationPlugins={collabPlugins} + collaborationFragment={collabFragment} /> {/* Settings Sidebar */} diff --git a/src/pages/document.tsx b/src/pages/document.tsx index 6481c6f..d1f9a59 100644 --- a/src/pages/document.tsx +++ b/src/pages/document.tsx @@ -19,6 +19,7 @@ import { Loader2, X, RotateCcw } from 'lucide-react' import type { IconValue } from '@/components/ui/icon-picker' import { parseStoredIcon, serializeIcon } from '@/lib/utils' import type { GetDocumentResponse, Favorite, Document as ApiDocument, DocumentConfig } from '@/api/generated/model' +import { useCollaboration } from '@/hooks/use-collaboration' // The API may return GetDocumentResponse with an additional `id` field depending on the endpoint type DocumentResponse = GetDocumentResponse & { id?: string } @@ -37,6 +38,13 @@ export function DocumentPage() { const { mutate: addFavorite } = useAddFavorite() const { mutate: removeFavorite } = useRemoveFavorite() + // Collaboration + const docIdForCollab = (rawDocument as DocumentResponse)?.id ?? (rawDocument as DocumentResponse)?.document + const { plugins: collabPlugins, fragment: collabFragment } = useCollaboration({ + roomId: docIdForCollab ? `document:${docIdForCollab}` : undefined, + enabled: true, + }) + // Flag to skip state reset when slug changes due to title edit (same document) const slugChangedFromTitleEdit = useRef(false) @@ -466,6 +474,8 @@ export function DocumentPage() { saveError={saveError} comparisonPanel={comparisonPanel} isInitialized={!!initializedDocId && initializedSlug === slug} + collaborationPlugins={collabPlugins} + collaborationFragment={collabFragment} /> {/* Settings Sidebar */} diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index 9e7842f..c001a30 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/api/client.ts","./src/api/mutator.ts","./src/api/generated/actions/actions.ts","./src/api/generated/admin/admin.ts","./src/api/generated/api-keys/api-keys.ts","./src/api/generated/auth/auth.ts","./src/api/generated/database-permissions/database-permissions.ts","./src/api/generated/database-rows/database-rows.ts","./src/api/generated/database-views/database-views.ts","./src/api/generated/databases/databases.ts","./src/api/generated/document/document.ts","./src/api/generated/drawings/drawings.ts","./src/api/generated/health/health.ts","./src/api/generated/model/actionitem.ts","./src/api/generated/model/actionrunsparams.ts","./src/api/generated/model/actionstep.ts","./src/api/generated/model/actionstepconfig.ts","./src/api/generated/model/addfavoriterequest.ts","./src/api/generated/model/addfavoriteresponse.ts","./src/api/generated/model/addgroupmemberrequest.ts","./src/api/generated/model/addgroupmemberresponse.ts","./src/api/generated/model/adminaddspacegrouppermissionrequest.ts","./src/api/generated/model/adminaddspacegrouppermissionrequestrole.ts","./src/api/generated/model/adminaddspacegrouppermissionresponse.ts","./src/api/generated/model/adminaddspaceuserpermissionrequest.ts","./src/api/generated/model/adminaddspaceuserpermissionrequestrole.ts","./src/api/generated/model/adminaddspaceuserpermissionresponse.ts","./src/api/generated/model/admincreatespacerequest.ts","./src/api/generated/model/admincreatespacerequesttype.ts","./src/api/generated/model/admincreatespaceresponse.ts","./src/api/generated/model/admindeletespacerequest.ts","./src/api/generated/model/admindeletespaceresponse.ts","./src/api/generated/model/adminlistallapikeysparams.ts","./src/api/generated/model/adminlistallspacesparams.ts","./src/api/generated/model/adminlistgroupsparams.ts","./src/api/generated/model/adminlistspacepermissionsrequest.ts","./src/api/generated/model/adminlistspacepermissionsresponse.ts","./src/api/generated/model/adminlistusersparams.ts","./src/api/generated/model/adminremovespacegrouppermissionrequest.ts","./src/api/generated/model/adminremovespacegrouppermissionresponse.ts","./src/api/generated/model/adminremovespaceuserpermissionrequest.ts","./src/api/generated/model/adminremovespaceuserpermissionresponse.ts","./src/api/generated/model/adminupdatespacerequest.ts","./src/api/generated/model/adminupdatespacerequesttype.ts","./src/api/generated/model/adminupdatespaceresponse.ts","./src/api/generated/model/anyvalue.ts","./src/api/generated/model/apikeyitem.ts","./src/api/generated/model/arrayactionitem.ts","./src/api/generated/model/arrayactionstep.ts","./src/api/generated/model/arrayapikeyitem.ts","./src/api/generated/model/arrayblock.ts","./src/api/generated/model/arraycommentresponse.ts","./src/api/generated/model/arraydatabaseitem.ts","./src/api/generated/model/arraydatabasepermissionitem.ts","./src/api/generated/model/arraydeliveryitem.ts","./src/api/generated/model/arraydocument.ts","./src/api/generated/model/arraydocumentpermission.ts","./src/api/generated/model/arraydrawingitem.ts","./src/api/generated/model/arraydrawingpermission.ts","./src/api/generated/model/arrayeventinfo.ts","./src/api/generated/model/arrayfavorite.ts","./src/api/generated/model/arraygroupitem.ts","./src/api/generated/model/arrayinlinecontent.ts","./src/api/generated/model/arraymemberitem.ts","./src/api/generated/model/arraypropertyschema.ts","./src/api/generated/model/arrayreorderitem.ts","./src/api/generated/model/arrayrowitem.ts","./src/api/generated/model/arrayrunitem.ts","./src/api/generated/model/arrayscopeinfo.ts","./src/api/generated/model/arraysearchdatabaseresultitem.ts","./src/api/generated/model/arraysearchresultitem.ts","./src/api/generated/model/arraysortconfig.ts","./src/api/generated/model/arrayspace.ts","./src/api/generated/model/arrayspaceitem.ts","./src/api/generated/model/arrayspacepermission.ts","./src/api/generated/model/arrayspacepermissionitem.ts","./src/api/generated/model/arraystepinfo.ts","./src/api/generated/model/arraytrashdocument.ts","./src/api/generated/model/arraytriggerinfo.ts","./src/api/generated/model/arraytypeinfo.ts","./src/api/generated/model/arrayuserlistitem.ts","./src/api/generated/model/arrayversionitem.ts","./src/api/generated/model/arrayviewconfig.ts","./src/api/generated/model/arraywebhookitem.ts","./src/api/generated/model/availableeventsresponse.ts","./src/api/generated/model/availablescopesresponse.ts","./src/api/generated/model/availablestepsresponse.ts","./src/api/generated/model/availabletriggersresponse.ts","./src/api/generated/model/availabletypesresponse.ts","./src/api/generated/model/block.ts","./src/api/generated/model/blockprops.ts","./src/api/generated/model/bulkdeleterowsrequest.ts","./src/api/generated/model/changepasswordrequest.ts","./src/api/generated/model/changepasswordresponse.ts","./src/api/generated/model/commentresponse.ts","./src/api/generated/model/createactionrequest.ts","./src/api/generated/model/createactionrequesttriggerconfig.ts","./src/api/generated/model/createactionresponse.ts","./src/api/generated/model/createapikeyrequest.ts","./src/api/generated/model/createapikeyresponse.ts","./src/api/generated/model/createcommentrequestwithparams.ts","./src/api/generated/model/createcommentresponse.ts","./src/api/generated/model/createdatabaserequest.ts","./src/api/generated/model/createdatabaseresponse.ts","./src/api/generated/model/createdocumentrequest.ts","./src/api/generated/model/createdocumentresponse.ts","./src/api/generated/model/createdrawingrequest.ts","./src/api/generated/model/createdrawingrequestappstate.ts","./src/api/generated/model/createdrawingrequestfiles.ts","./src/api/generated/model/createdrawingresponse.ts","./src/api/generated/model/creategrouprequest.ts","./src/api/generated/model/creategrouprequestrole.ts","./src/api/generated/model/creategroupresponse.ts","./src/api/generated/model/createrowrequest.ts","./src/api/generated/model/createrowrequestcontent.ts","./src/api/generated/model/createrowrequestproperties.ts","./src/api/generated/model/createrowresponse.ts","./src/api/generated/model/createrowresponseproperties.ts","./src/api/generated/model/createspacerequest.ts","./src/api/generated/model/createspacerequesttype.ts","./src/api/generated/model/createspaceresponse.ts","./src/api/generated/model/createversionrequest.ts","./src/api/generated/model/createversionresponse.ts","./src/api/generated/model/createviewrequest.ts","./src/api/generated/model/createviewrequestfilter.ts","./src/api/generated/model/createviewrequesttype.ts","./src/api/generated/model/createviewresponse.ts","./src/api/generated/model/createviewresponsefilter.ts","./src/api/generated/model/createwebhookrequest.ts","./src/api/generated/model/createwebhookresponse.ts","./src/api/generated/model/databaseitem.ts","./src/api/generated/model/databaselistparams.ts","./src/api/generated/model/databasepermissiondeleteparams.ts","./src/api/generated/model/databasepermissionitem.ts","./src/api/generated/model/databaserowlistparams.ts","./src/api/generated/model/databasesearchparams.ts","./src/api/generated/model/deleteactionrequest.ts","./src/api/generated/model/deleteapikeyrequest.ts","./src/api/generated/model/deletecommentrequest.ts","./src/api/generated/model/deletedatabasepermissionrequest.ts","./src/api/generated/model/deletedatabasepermissionresponse.ts","./src/api/generated/model/deletedatabaserequest.ts","./src/api/generated/model/deletedocumentrequest.ts","./src/api/generated/model/deletedocumentresponse.ts","./src/api/generated/model/deletedocumentuserpermissionrequest.ts","./src/api/generated/model/deletedocumentuserpermissionresponse.ts","./src/api/generated/model/deletedrawingrequest.ts","./src/api/generated/model/deletedrawinguserpermissionrequest.ts","./src/api/generated/model/deletedrawinguserpermissionresponse.ts","./src/api/generated/model/deletegrouprequest.ts","./src/api/generated/model/deletegroupresponse.ts","./src/api/generated/model/deleterowrequest.ts","./src/api/generated/model/deletespacerequest.ts","./src/api/generated/model/deletespaceresponse.ts","./src/api/generated/model/deletespaceuserpermissionrequest.ts","./src/api/generated/model/deletespaceuserpermissionresponse.ts","./src/api/generated/model/deleteuserrequest.ts","./src/api/generated/model/deleteuserresponse.ts","./src/api/generated/model/deleteviewrequest.ts","./src/api/generated/model/deletewebhookrequest.ts","./src/api/generated/model/deliveryitem.ts","./src/api/generated/model/document.ts","./src/api/generated/model/documentconfig.ts","./src/api/generated/model/documentgetdocumentsfromspaceparams.ts","./src/api/generated/model/documentlistversionsparams.ts","./src/api/generated/model/documentmetadata.ts","./src/api/generated/model/documentpermission.ts","./src/api/generated/model/documentsearchparams.ts","./src/api/generated/model/drawingitem.ts","./src/api/generated/model/drawinglistparams.ts","./src/api/generated/model/drawingpermission.ts","./src/api/generated/model/emptyrequest.ts","./src/api/generated/model/errorresponse.ts","./src/api/generated/model/eventinfo.ts","./src/api/generated/model/favorite.ts","./src/api/generated/model/getactionrequest.ts","./src/api/generated/model/getactionresponse.ts","./src/api/generated/model/getactionresponsetriggerconfig.ts","./src/api/generated/model/getcommentsrequest.ts","./src/api/generated/model/getcommentsresponse.ts","./src/api/generated/model/getdatabaserequest.ts","./src/api/generated/model/getdatabaseresponse.ts","./src/api/generated/model/getdeliveriesrequest.ts","./src/api/generated/model/getdeliveriesresponse.ts","./src/api/generated/model/getdocumentrequest.ts","./src/api/generated/model/getdocumentresponse.ts","./src/api/generated/model/getdocumentresponsemetadata.ts","./src/api/generated/model/getdocumentsfromspacerequest.ts","./src/api/generated/model/getdocumentsfromspaceresponse.ts","./src/api/generated/model/getdrawingrequest.ts","./src/api/generated/model/getdrawingresponse.ts","./src/api/generated/model/getdrawingresponseappstate.ts","./src/api/generated/model/getdrawingresponsefiles.ts","./src/api/generated/model/getgroupmembersrequest.ts","./src/api/generated/model/getgroupmembersresponse.ts","./src/api/generated/model/getmyfavoritesresponse.ts","./src/api/generated/model/getmyspacesresponse.ts","./src/api/generated/model/getpublicdocumentrequest.ts","./src/api/generated/model/getrowrequest.ts","./src/api/generated/model/getrowresponse.ts","./src/api/generated/model/getrowresponsecontent.ts","./src/api/generated/model/getrowresponseproperties.ts","./src/api/generated/model/getrunsrequest.ts","./src/api/generated/model/getrunsresponse.ts","./src/api/generated/model/gettrashrequest.ts","./src/api/generated/model/gettrashresponse.ts","./src/api/generated/model/getversionrequest.ts","./src/api/generated/model/getversionresponse.ts","./src/api/generated/model/getwebhookrequest.ts","./src/api/generated/model/getwebhookresponse.ts","./src/api/generated/model/groupitem.ts","./src/api/generated/model/healthresponse.ts","./src/api/generated/model/index.ts","./src/api/generated/model/inlinecontent.ts","./src/api/generated/model/inlinecontentstyles.ts","./src/api/generated/model/inviteuserrequest.ts","./src/api/generated/model/inviteuserrequestrole.ts","./src/api/generated/model/inviteuserresponse.ts","./src/api/generated/model/listactionsresponse.ts","./src/api/generated/model/listallapikeysrequest.ts","./src/api/generated/model/listallapikeysresponse.ts","./src/api/generated/model/listallspacesrequest.ts","./src/api/generated/model/listallspacesresponse.ts","./src/api/generated/model/listapikeysresponse.ts","./src/api/generated/model/listdatabasepermissionsrequest.ts","./src/api/generated/model/listdatabasepermissionsresponse.ts","./src/api/generated/model/listdatabasesrequest.ts","./src/api/generated/model/listdatabasesresponse.ts","./src/api/generated/model/listdocumentpermissionsrequest.ts","./src/api/generated/model/listdocumentpermissionsresponse.ts","./src/api/generated/model/listdrawingpermissionsrequest.ts","./src/api/generated/model/listdrawingpermissionsresponse.ts","./src/api/generated/model/listdrawingsrequest.ts","./src/api/generated/model/listdrawingsresponse.ts","./src/api/generated/model/listgroupsrequest.ts","./src/api/generated/model/listgroupsresponse.ts","./src/api/generated/model/listrowsrequest.ts","./src/api/generated/model/listrowsresponse.ts","./src/api/generated/model/listspacepermissionsrequest.ts","./src/api/generated/model/listspacepermissionsresponse.ts","./src/api/generated/model/listusersrequest.ts","./src/api/generated/model/listusersresponse.ts","./src/api/generated/model/listversionsrequest.ts","./src/api/generated/model/listversionsresponse.ts","./src/api/generated/model/listwebhooksresponse.ts","./src/api/generated/model/loginrequest.ts","./src/api/generated/model/loginresponse.ts","./src/api/generated/model/logoutresponse.ts","./src/api/generated/model/memberitem.ts","./src/api/generated/model/messageresponse.ts","./src/api/generated/model/movedatabaserequest.ts","./src/api/generated/model/movedatabaseresponse.ts","./src/api/generated/model/movedocumentrequest.ts","./src/api/generated/model/movedocumentresponse.ts","./src/api/generated/model/movedrawingrequest.ts","./src/api/generated/model/movedrawingresponse.ts","./src/api/generated/model/profileresponse.ts","./src/api/generated/model/profileresponsepreferences.ts","./src/api/generated/model/propertyschema.ts","./src/api/generated/model/propertyschemaoptions.ts","./src/api/generated/model/registerrequest.ts","./src/api/generated/model/registerresponse.ts","./src/api/generated/model/removefavoriterequest.ts","./src/api/generated/model/removefavoriteresponse.ts","./src/api/generated/model/removegroupmemberrequest.ts","./src/api/generated/model/removegroupmemberresponse.ts","./src/api/generated/model/reorderdocumentsrequest.ts","./src/api/generated/model/reorderdocumentsresponse.ts","./src/api/generated/model/reorderitem.ts","./src/api/generated/model/resolvecommentrequestwithparams.ts","./src/api/generated/model/restoredocumentrequest.ts","./src/api/generated/model/restoredocumentresponse.ts","./src/api/generated/model/restoreversionrequest.ts","./src/api/generated/model/revokeapikeyrequest.ts","./src/api/generated/model/revokeapikeyresponse.ts","./src/api/generated/model/rowitem.ts","./src/api/generated/model/rowitemcontent.ts","./src/api/generated/model/rowitemproperties.ts","./src/api/generated/model/runitem.ts","./src/api/generated/model/scopeinfo.ts","./src/api/generated/model/searchdatabaseresultitem.ts","./src/api/generated/model/searchdatabasesrequest.ts","./src/api/generated/model/searchdatabasesresponse.ts","./src/api/generated/model/searchrequest.ts","./src/api/generated/model/searchresponse.ts","./src/api/generated/model/searchresultitem.ts","./src/api/generated/model/setpublicrequest.ts","./src/api/generated/model/setpublicresponse.ts","./src/api/generated/model/sortconfig.ts","./src/api/generated/model/space.ts","./src/api/generated/model/spaceitem.ts","./src/api/generated/model/spacepermission.ts","./src/api/generated/model/spacepermissionitem.ts","./src/api/generated/model/stepinfo.ts","./src/api/generated/model/time.ts","./src/api/generated/model/trashdocument.ts","./src/api/generated/model/triggerinfo.ts","./src/api/generated/model/typeinfo.ts","./src/api/generated/model/updateactionrequest.ts","./src/api/generated/model/updateactionrequesttriggerconfig.ts","./src/api/generated/model/updateapikeyrequest.ts","./src/api/generated/model/updatecommentrequestwithparams.ts","./src/api/generated/model/updatedatabaserequest.ts","./src/api/generated/model/updatedocumentrequest.ts","./src/api/generated/model/updatedocumentrequestmetadata.ts","./src/api/generated/model/updatedocumentresponse.ts","./src/api/generated/model/updatedocumentresponsemetadata.ts","./src/api/generated/model/updatedrawingrequest.ts","./src/api/generated/model/updatedrawingrequestappstate.ts","./src/api/generated/model/updatedrawingrequestfiles.ts","./src/api/generated/model/updatefavoritepositionrequest.ts","./src/api/generated/model/updatefavoritepositionresponse.ts","./src/api/generated/model/updategrouprequest.ts","./src/api/generated/model/updategrouprequestrole.ts","./src/api/generated/model/updategroupresponse.ts","./src/api/generated/model/updateprofilerequest.ts","./src/api/generated/model/updateprofilerequestpreferences.ts","./src/api/generated/model/updateprofileresponse.ts","./src/api/generated/model/updateprofileresponsepreferences.ts","./src/api/generated/model/updaterowrequest.ts","./src/api/generated/model/updaterowrequestcontent.ts","./src/api/generated/model/updaterowrequestproperties.ts","./src/api/generated/model/updatespaceorderrequest.ts","./src/api/generated/model/updatespaceorderresponse.ts","./src/api/generated/model/updatespacerequest.ts","./src/api/generated/model/updatespaceresponse.ts","./src/api/generated/model/updateuseractiverequest.ts","./src/api/generated/model/updateuseractiveresponse.ts","./src/api/generated/model/updateuserrolerequest.ts","./src/api/generated/model/updateuserrolerequestrole.ts","./src/api/generated/model/updateuserroleresponse.ts","./src/api/generated/model/updateviewrequest.ts","./src/api/generated/model/updateviewrequestfilter.ts","./src/api/generated/model/updatewebhookrequest.ts","./src/api/generated/model/upsertdatabasepermissionrequest.ts","./src/api/generated/model/upsertdatabasepermissionresponse.ts","./src/api/generated/model/upsertdocumentuserpermissionrequest.ts","./src/api/generated/model/upsertdocumentuserpermissionrequestrole.ts","./src/api/generated/model/upsertdocumentuserpermissionresponse.ts","./src/api/generated/model/upsertdrawinguserpermissionrequest.ts","./src/api/generated/model/upsertdrawinguserpermissionrequestrole.ts","./src/api/generated/model/upsertdrawinguserpermissionresponse.ts","./src/api/generated/model/upsertspaceuserpermissionrequest.ts","./src/api/generated/model/upsertspaceuserpermissionrequestrole.ts","./src/api/generated/model/upsertspaceuserpermissionresponse.ts","./src/api/generated/model/userinfo.ts","./src/api/generated/model/userlistitem.ts","./src/api/generated/model/userlistusersparams.ts","./src/api/generated/model/versionconfig.ts","./src/api/generated/model/versionitem.ts","./src/api/generated/model/viewconfig.ts","./src/api/generated/model/viewconfigfilter.ts","./src/api/generated/model/webhookdeliveriesparams.ts","./src/api/generated/model/webhookitem.ts","./src/api/generated/space/space.ts","./src/api/generated/user/user.ts","./src/api/generated/webhooks/webhooks.ts","./src/components/protected-route.tsx","./src/components/admin/apikeys-management.tsx","./src/components/admin/groups-management.tsx","./src/components/admin/spaces-management.tsx","./src/components/admin/sso-management.tsx","./src/components/admin/users-management.tsx","./src/components/database/databasetree.tsx","./src/components/database/index.ts","./src/components/database/common/add-property-modal.tsx","./src/components/database/common/add-property-popover.tsx","./src/components/database/common/conditional-format-editor.tsx","./src/components/database/common/create-database-modal.tsx","./src/components/database/common/database-header.tsx","./src/components/database/common/database-settings-sidebar.tsx","./src/components/database/common/database-toolbar.tsx","./src/components/database/common/date-format-editor.tsx","./src/components/database/common/field-editor.tsx","./src/components/database/common/filter-builder.tsx","./src/components/database/common/number-format-editor.tsx","./src/components/database/common/property-cell.tsx","./src/components/database/common/sort-builder.tsx","./src/components/database/common/view-tabs.tsx","./src/components/database/document/document-board-view.tsx","./src/components/database/document/document-edit-sidebar.tsx","./src/components/database/document/document-gallery-view.tsx","./src/components/database/document/document-list-view.tsx","./src/components/database/document/document-row-settings-sidebar.tsx","./src/components/database/document/document-table-view.tsx","./src/components/database/document/index.tsx","./src/components/document/documenttree.tsx","./src/components/document/document-editor.tsx","./src/components/document/document-settings-sidebar.tsx","./src/components/document/icon-emoji-selector.tsx","./src/components/document/move-document-modal.tsx","./src/components/document/version-history-sidebar.tsx","./src/components/drawing/drawingtree.tsx","./src/components/drawing/create-drawing-modal.tsx","./src/components/drawing/drawing-editor.tsx","./src/components/drawing/drawing-settings-sidebar.tsx","./src/components/editor/database-block.tsx","./src/components/editor/openblock-editor.tsx","./src/components/layout/main-layout.tsx","./src/components/layout/mobile-header.tsx","./src/components/layout/sidebar.tsx","./src/components/permissions/permission-manager.tsx","./src/components/settings/actions-settings.tsx","./src/components/settings/api-keys-settings.tsx","./src/components/settings/profile-settings.tsx","./src/components/settings/webhooks-settings.tsx","./src/components/shared/content-header.tsx","./src/components/shared/content-settings-sidebar.tsx","./src/components/sidebar/app-switcher-header.tsx","./src/components/sidebar/app-switcher-menu.tsx","./src/components/sidebar/command-palette.tsx","./src/components/sidebar/quick-actions.tsx","./src/components/sidebar/sidebar-item.tsx","./src/components/sidebar/space-content-docs.tsx","./src/components/sidebar/space-content-projects.tsx","./src/components/sidebar/space-item.tsx","./src/components/sidebar/spaces-list.tsx","./src/components/sidebar/user-menu.tsx","./src/components/spaces/create-space-modal.tsx","./src/components/spaces/edit-space-modal.tsx","./src/components/spaces/space-icon.tsx","./src/components/spaces/space-switcher.tsx","./src/components/ui/alert-dialog.tsx","./src/components/ui/avatar.tsx","./src/components/ui/badge.tsx","./src/components/ui/button.tsx","./src/components/ui/calendar.tsx","./src/components/ui/card.tsx","./src/components/ui/checkbox.tsx","./src/components/ui/collapsible.tsx","./src/components/ui/dialog.tsx","./src/components/ui/dropdown-menu.tsx","./src/components/ui/emoji-picker.tsx","./src/components/ui/icon-picker.tsx","./src/components/ui/input.tsx","./src/components/ui/kbd.tsx","./src/components/ui/label.tsx","./src/components/ui/popover.tsx","./src/components/ui/select.tsx","./src/components/ui/separator.tsx","./src/components/ui/sheet.tsx","./src/components/ui/switch.tsx","./src/components/ui/tabs.tsx","./src/components/ui/textarea.tsx","./src/components/ui/toaster.tsx","./src/components/ui/tooltip.tsx","./src/contexts/active-app-context.tsx","./src/contexts/auth-context.tsx","./src/contexts/command-palette-context.tsx","./src/contexts/document-expansion-context.tsx","./src/contexts/sidebar-ui-context.tsx","./src/contexts/sidebar-visibility-context.tsx","./src/contexts/space-context.tsx","./src/contexts/theme-provider.tsx","./src/contexts/ui-state-context.tsx","./src/hooks/use-actions.ts","./src/hooks/use-admin.ts","./src/hooks/use-api-keys.ts","./src/hooks/use-auto-select-space.ts","./src/hooks/use-create-content.ts","./src/hooks/use-database-permissions.ts","./src/hooks/use-database.ts","./src/hooks/use-document-permissions.ts","./src/hooks/use-documents.ts","./src/hooks/use-drawing-permissions.ts","./src/hooks/use-drawings.ts","./src/hooks/use-edge-detection.ts","./src/hooks/use-favorites.ts","./src/hooks/use-keyboard-shortcuts.ts","./src/hooks/use-media-query.ts","./src/hooks/use-reorder-documents.ts","./src/hooks/use-resizable.ts","./src/hooks/use-search.ts","./src/hooks/use-space-order.ts","./src/hooks/use-space-permissions.ts","./src/hooks/use-spaces.ts","./src/hooks/use-users.ts","./src/hooks/use-versions.ts","./src/hooks/use-webhooks.ts","./src/hooks/ui/index.ts","./src/hooks/ui/useeditablefield.ts","./src/hooks/ui/usesidebar.ts","./src/i18n/languagecontext.tsx","./src/i18n/index.ts","./src/lib/utils.ts","./src/lib/database/columntypes.ts","./src/lib/database/conditionalstyles.ts","./src/lib/database/formatters.ts","./src/lib/database/formula.ts","./src/lib/database/index.ts","./src/pages/admin.tsx","./src/pages/database-document.tsx","./src/pages/database.tsx","./src/pages/document.tsx","./src/pages/drawing.tsx","./src/pages/home.tsx","./src/pages/login.tsx","./src/pages/register.tsx","./src/pages/settings.tsx","./src/types/apps.ts"],"version":"5.6.3"} \ No newline at end of file +{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/api/client.ts","./src/api/mutator.ts","./src/api/generated/actions/actions.ts","./src/api/generated/admin/admin.ts","./src/api/generated/api-keys/api-keys.ts","./src/api/generated/auth/auth.ts","./src/api/generated/database-permissions/database-permissions.ts","./src/api/generated/database-rows/database-rows.ts","./src/api/generated/database-views/database-views.ts","./src/api/generated/databases/databases.ts","./src/api/generated/document/document.ts","./src/api/generated/drawings/drawings.ts","./src/api/generated/health/health.ts","./src/api/generated/model/actionitem.ts","./src/api/generated/model/actionrunsparams.ts","./src/api/generated/model/actionstep.ts","./src/api/generated/model/actionstepconfig.ts","./src/api/generated/model/addfavoriterequest.ts","./src/api/generated/model/addfavoriteresponse.ts","./src/api/generated/model/addgroupmemberrequest.ts","./src/api/generated/model/addgroupmemberresponse.ts","./src/api/generated/model/adminaddspacegrouppermissionrequest.ts","./src/api/generated/model/adminaddspacegrouppermissionrequestrole.ts","./src/api/generated/model/adminaddspacegrouppermissionresponse.ts","./src/api/generated/model/adminaddspaceuserpermissionrequest.ts","./src/api/generated/model/adminaddspaceuserpermissionrequestrole.ts","./src/api/generated/model/adminaddspaceuserpermissionresponse.ts","./src/api/generated/model/admincreatespacerequest.ts","./src/api/generated/model/admincreatespacerequesttype.ts","./src/api/generated/model/admincreatespaceresponse.ts","./src/api/generated/model/admindeletespacerequest.ts","./src/api/generated/model/admindeletespaceresponse.ts","./src/api/generated/model/adminlistallapikeysparams.ts","./src/api/generated/model/adminlistallspacesparams.ts","./src/api/generated/model/adminlistgroupsparams.ts","./src/api/generated/model/adminlistspacepermissionsrequest.ts","./src/api/generated/model/adminlistspacepermissionsresponse.ts","./src/api/generated/model/adminlistusersparams.ts","./src/api/generated/model/adminremovespacegrouppermissionrequest.ts","./src/api/generated/model/adminremovespacegrouppermissionresponse.ts","./src/api/generated/model/adminremovespaceuserpermissionrequest.ts","./src/api/generated/model/adminremovespaceuserpermissionresponse.ts","./src/api/generated/model/adminupdatespacerequest.ts","./src/api/generated/model/adminupdatespacerequesttype.ts","./src/api/generated/model/adminupdatespaceresponse.ts","./src/api/generated/model/anyvalue.ts","./src/api/generated/model/apikeyitem.ts","./src/api/generated/model/arrayactionitem.ts","./src/api/generated/model/arrayactionstep.ts","./src/api/generated/model/arrayapikeyitem.ts","./src/api/generated/model/arrayblock.ts","./src/api/generated/model/arraycommentresponse.ts","./src/api/generated/model/arraydatabaseitem.ts","./src/api/generated/model/arraydatabasepermissionitem.ts","./src/api/generated/model/arraydeliveryitem.ts","./src/api/generated/model/arraydocument.ts","./src/api/generated/model/arraydocumentpermission.ts","./src/api/generated/model/arraydrawingitem.ts","./src/api/generated/model/arraydrawingpermission.ts","./src/api/generated/model/arrayeventinfo.ts","./src/api/generated/model/arrayfavorite.ts","./src/api/generated/model/arraygroupitem.ts","./src/api/generated/model/arrayinlinecontent.ts","./src/api/generated/model/arraymemberitem.ts","./src/api/generated/model/arraypropertyschema.ts","./src/api/generated/model/arrayreorderitem.ts","./src/api/generated/model/arrayrowitem.ts","./src/api/generated/model/arrayrunitem.ts","./src/api/generated/model/arrayscopeinfo.ts","./src/api/generated/model/arraysearchdatabaseresultitem.ts","./src/api/generated/model/arraysearchresultitem.ts","./src/api/generated/model/arraysortconfig.ts","./src/api/generated/model/arrayspace.ts","./src/api/generated/model/arrayspaceitem.ts","./src/api/generated/model/arrayspacepermission.ts","./src/api/generated/model/arrayspacepermissionitem.ts","./src/api/generated/model/arraystepinfo.ts","./src/api/generated/model/arraytrashdocument.ts","./src/api/generated/model/arraytriggerinfo.ts","./src/api/generated/model/arraytypeinfo.ts","./src/api/generated/model/arrayuserlistitem.ts","./src/api/generated/model/arrayversionitem.ts","./src/api/generated/model/arrayviewconfig.ts","./src/api/generated/model/arraywebhookitem.ts","./src/api/generated/model/availableeventsresponse.ts","./src/api/generated/model/availablescopesresponse.ts","./src/api/generated/model/availablestepsresponse.ts","./src/api/generated/model/availabletriggersresponse.ts","./src/api/generated/model/availabletypesresponse.ts","./src/api/generated/model/block.ts","./src/api/generated/model/blockprops.ts","./src/api/generated/model/bulkdeleterowsrequest.ts","./src/api/generated/model/changepasswordrequest.ts","./src/api/generated/model/changepasswordresponse.ts","./src/api/generated/model/commentresponse.ts","./src/api/generated/model/createactionrequest.ts","./src/api/generated/model/createactionrequesttriggerconfig.ts","./src/api/generated/model/createactionresponse.ts","./src/api/generated/model/createapikeyrequest.ts","./src/api/generated/model/createapikeyresponse.ts","./src/api/generated/model/createcommentrequestwithparams.ts","./src/api/generated/model/createcommentresponse.ts","./src/api/generated/model/createdatabaserequest.ts","./src/api/generated/model/createdatabaseresponse.ts","./src/api/generated/model/createdocumentrequest.ts","./src/api/generated/model/createdocumentresponse.ts","./src/api/generated/model/createdrawingrequest.ts","./src/api/generated/model/createdrawingrequestappstate.ts","./src/api/generated/model/createdrawingrequestfiles.ts","./src/api/generated/model/createdrawingresponse.ts","./src/api/generated/model/creategrouprequest.ts","./src/api/generated/model/creategrouprequestrole.ts","./src/api/generated/model/creategroupresponse.ts","./src/api/generated/model/createrowrequest.ts","./src/api/generated/model/createrowrequestcontent.ts","./src/api/generated/model/createrowrequestproperties.ts","./src/api/generated/model/createrowresponse.ts","./src/api/generated/model/createrowresponseproperties.ts","./src/api/generated/model/createspacerequest.ts","./src/api/generated/model/createspacerequesttype.ts","./src/api/generated/model/createspaceresponse.ts","./src/api/generated/model/createversionrequest.ts","./src/api/generated/model/createversionresponse.ts","./src/api/generated/model/createviewrequest.ts","./src/api/generated/model/createviewrequestfilter.ts","./src/api/generated/model/createviewrequesttype.ts","./src/api/generated/model/createviewresponse.ts","./src/api/generated/model/createviewresponsefilter.ts","./src/api/generated/model/createwebhookrequest.ts","./src/api/generated/model/createwebhookresponse.ts","./src/api/generated/model/databaseitem.ts","./src/api/generated/model/databaselistparams.ts","./src/api/generated/model/databasepermissiondeleteparams.ts","./src/api/generated/model/databasepermissionitem.ts","./src/api/generated/model/databaserowlistparams.ts","./src/api/generated/model/databasesearchparams.ts","./src/api/generated/model/deleteactionrequest.ts","./src/api/generated/model/deleteapikeyrequest.ts","./src/api/generated/model/deletecommentrequest.ts","./src/api/generated/model/deletedatabasepermissionrequest.ts","./src/api/generated/model/deletedatabasepermissionresponse.ts","./src/api/generated/model/deletedatabaserequest.ts","./src/api/generated/model/deletedocumentrequest.ts","./src/api/generated/model/deletedocumentresponse.ts","./src/api/generated/model/deletedocumentuserpermissionrequest.ts","./src/api/generated/model/deletedocumentuserpermissionresponse.ts","./src/api/generated/model/deletedrawingrequest.ts","./src/api/generated/model/deletedrawinguserpermissionrequest.ts","./src/api/generated/model/deletedrawinguserpermissionresponse.ts","./src/api/generated/model/deletegrouprequest.ts","./src/api/generated/model/deletegroupresponse.ts","./src/api/generated/model/deleterowrequest.ts","./src/api/generated/model/deletespacerequest.ts","./src/api/generated/model/deletespaceresponse.ts","./src/api/generated/model/deletespaceuserpermissionrequest.ts","./src/api/generated/model/deletespaceuserpermissionresponse.ts","./src/api/generated/model/deleteuserrequest.ts","./src/api/generated/model/deleteuserresponse.ts","./src/api/generated/model/deleteviewrequest.ts","./src/api/generated/model/deletewebhookrequest.ts","./src/api/generated/model/deliveryitem.ts","./src/api/generated/model/document.ts","./src/api/generated/model/documentconfig.ts","./src/api/generated/model/documentgetdocumentsfromspaceparams.ts","./src/api/generated/model/documentlistversionsparams.ts","./src/api/generated/model/documentmetadata.ts","./src/api/generated/model/documentpermission.ts","./src/api/generated/model/documentsearchparams.ts","./src/api/generated/model/drawingitem.ts","./src/api/generated/model/drawinglistparams.ts","./src/api/generated/model/drawingpermission.ts","./src/api/generated/model/emptyrequest.ts","./src/api/generated/model/errorresponse.ts","./src/api/generated/model/eventinfo.ts","./src/api/generated/model/favorite.ts","./src/api/generated/model/getactionrequest.ts","./src/api/generated/model/getactionresponse.ts","./src/api/generated/model/getactionresponsetriggerconfig.ts","./src/api/generated/model/getcommentsrequest.ts","./src/api/generated/model/getcommentsresponse.ts","./src/api/generated/model/getdatabaserequest.ts","./src/api/generated/model/getdatabaseresponse.ts","./src/api/generated/model/getdeliveriesrequest.ts","./src/api/generated/model/getdeliveriesresponse.ts","./src/api/generated/model/getdocumentrequest.ts","./src/api/generated/model/getdocumentresponse.ts","./src/api/generated/model/getdocumentresponsemetadata.ts","./src/api/generated/model/getdocumentsfromspacerequest.ts","./src/api/generated/model/getdocumentsfromspaceresponse.ts","./src/api/generated/model/getdrawingrequest.ts","./src/api/generated/model/getdrawingresponse.ts","./src/api/generated/model/getdrawingresponseappstate.ts","./src/api/generated/model/getdrawingresponsefiles.ts","./src/api/generated/model/getgroupmembersrequest.ts","./src/api/generated/model/getgroupmembersresponse.ts","./src/api/generated/model/getmyfavoritesresponse.ts","./src/api/generated/model/getmyspacesresponse.ts","./src/api/generated/model/getpublicdocumentrequest.ts","./src/api/generated/model/getrowrequest.ts","./src/api/generated/model/getrowresponse.ts","./src/api/generated/model/getrowresponsecontent.ts","./src/api/generated/model/getrowresponseproperties.ts","./src/api/generated/model/getrunsrequest.ts","./src/api/generated/model/getrunsresponse.ts","./src/api/generated/model/gettrashrequest.ts","./src/api/generated/model/gettrashresponse.ts","./src/api/generated/model/getversionrequest.ts","./src/api/generated/model/getversionresponse.ts","./src/api/generated/model/getwebhookrequest.ts","./src/api/generated/model/getwebhookresponse.ts","./src/api/generated/model/groupitem.ts","./src/api/generated/model/healthresponse.ts","./src/api/generated/model/index.ts","./src/api/generated/model/inlinecontent.ts","./src/api/generated/model/inlinecontentstyles.ts","./src/api/generated/model/inviteuserrequest.ts","./src/api/generated/model/inviteuserrequestrole.ts","./src/api/generated/model/inviteuserresponse.ts","./src/api/generated/model/listactionsresponse.ts","./src/api/generated/model/listallapikeysrequest.ts","./src/api/generated/model/listallapikeysresponse.ts","./src/api/generated/model/listallspacesrequest.ts","./src/api/generated/model/listallspacesresponse.ts","./src/api/generated/model/listapikeysresponse.ts","./src/api/generated/model/listdatabasepermissionsrequest.ts","./src/api/generated/model/listdatabasepermissionsresponse.ts","./src/api/generated/model/listdatabasesrequest.ts","./src/api/generated/model/listdatabasesresponse.ts","./src/api/generated/model/listdocumentpermissionsrequest.ts","./src/api/generated/model/listdocumentpermissionsresponse.ts","./src/api/generated/model/listdrawingpermissionsrequest.ts","./src/api/generated/model/listdrawingpermissionsresponse.ts","./src/api/generated/model/listdrawingsrequest.ts","./src/api/generated/model/listdrawingsresponse.ts","./src/api/generated/model/listgroupsrequest.ts","./src/api/generated/model/listgroupsresponse.ts","./src/api/generated/model/listrowsrequest.ts","./src/api/generated/model/listrowsresponse.ts","./src/api/generated/model/listspacepermissionsrequest.ts","./src/api/generated/model/listspacepermissionsresponse.ts","./src/api/generated/model/listusersrequest.ts","./src/api/generated/model/listusersresponse.ts","./src/api/generated/model/listversionsrequest.ts","./src/api/generated/model/listversionsresponse.ts","./src/api/generated/model/listwebhooksresponse.ts","./src/api/generated/model/loginrequest.ts","./src/api/generated/model/loginresponse.ts","./src/api/generated/model/logoutresponse.ts","./src/api/generated/model/memberitem.ts","./src/api/generated/model/messageresponse.ts","./src/api/generated/model/movedatabaserequest.ts","./src/api/generated/model/movedatabaseresponse.ts","./src/api/generated/model/movedocumentrequest.ts","./src/api/generated/model/movedocumentresponse.ts","./src/api/generated/model/movedrawingrequest.ts","./src/api/generated/model/movedrawingresponse.ts","./src/api/generated/model/profileresponse.ts","./src/api/generated/model/profileresponsepreferences.ts","./src/api/generated/model/propertyschema.ts","./src/api/generated/model/propertyschemaoptions.ts","./src/api/generated/model/registerrequest.ts","./src/api/generated/model/registerresponse.ts","./src/api/generated/model/removefavoriterequest.ts","./src/api/generated/model/removefavoriteresponse.ts","./src/api/generated/model/removegroupmemberrequest.ts","./src/api/generated/model/removegroupmemberresponse.ts","./src/api/generated/model/reorderdocumentsrequest.ts","./src/api/generated/model/reorderdocumentsresponse.ts","./src/api/generated/model/reorderitem.ts","./src/api/generated/model/resolvecommentrequestwithparams.ts","./src/api/generated/model/restoredocumentrequest.ts","./src/api/generated/model/restoredocumentresponse.ts","./src/api/generated/model/restoreversionrequest.ts","./src/api/generated/model/revokeapikeyrequest.ts","./src/api/generated/model/revokeapikeyresponse.ts","./src/api/generated/model/rowitem.ts","./src/api/generated/model/rowitemcontent.ts","./src/api/generated/model/rowitemproperties.ts","./src/api/generated/model/runitem.ts","./src/api/generated/model/scopeinfo.ts","./src/api/generated/model/searchdatabaseresultitem.ts","./src/api/generated/model/searchdatabasesrequest.ts","./src/api/generated/model/searchdatabasesresponse.ts","./src/api/generated/model/searchrequest.ts","./src/api/generated/model/searchresponse.ts","./src/api/generated/model/searchresultitem.ts","./src/api/generated/model/setpublicrequest.ts","./src/api/generated/model/setpublicresponse.ts","./src/api/generated/model/sortconfig.ts","./src/api/generated/model/space.ts","./src/api/generated/model/spaceitem.ts","./src/api/generated/model/spacepermission.ts","./src/api/generated/model/spacepermissionitem.ts","./src/api/generated/model/stepinfo.ts","./src/api/generated/model/time.ts","./src/api/generated/model/trashdocument.ts","./src/api/generated/model/triggerinfo.ts","./src/api/generated/model/typeinfo.ts","./src/api/generated/model/updateactionrequest.ts","./src/api/generated/model/updateactionrequesttriggerconfig.ts","./src/api/generated/model/updateapikeyrequest.ts","./src/api/generated/model/updatecommentrequestwithparams.ts","./src/api/generated/model/updatedatabaserequest.ts","./src/api/generated/model/updatedocumentrequest.ts","./src/api/generated/model/updatedocumentrequestmetadata.ts","./src/api/generated/model/updatedocumentresponse.ts","./src/api/generated/model/updatedocumentresponsemetadata.ts","./src/api/generated/model/updatedrawingrequest.ts","./src/api/generated/model/updatedrawingrequestappstate.ts","./src/api/generated/model/updatedrawingrequestfiles.ts","./src/api/generated/model/updatefavoritepositionrequest.ts","./src/api/generated/model/updatefavoritepositionresponse.ts","./src/api/generated/model/updategrouprequest.ts","./src/api/generated/model/updategrouprequestrole.ts","./src/api/generated/model/updategroupresponse.ts","./src/api/generated/model/updateprofilerequest.ts","./src/api/generated/model/updateprofilerequestpreferences.ts","./src/api/generated/model/updateprofileresponse.ts","./src/api/generated/model/updateprofileresponsepreferences.ts","./src/api/generated/model/updaterowrequest.ts","./src/api/generated/model/updaterowrequestcontent.ts","./src/api/generated/model/updaterowrequestproperties.ts","./src/api/generated/model/updatespaceorderrequest.ts","./src/api/generated/model/updatespaceorderresponse.ts","./src/api/generated/model/updatespacerequest.ts","./src/api/generated/model/updatespaceresponse.ts","./src/api/generated/model/updateuseractiverequest.ts","./src/api/generated/model/updateuseractiveresponse.ts","./src/api/generated/model/updateuserrolerequest.ts","./src/api/generated/model/updateuserrolerequestrole.ts","./src/api/generated/model/updateuserroleresponse.ts","./src/api/generated/model/updateviewrequest.ts","./src/api/generated/model/updateviewrequestfilter.ts","./src/api/generated/model/updatewebhookrequest.ts","./src/api/generated/model/upsertdatabasepermissionrequest.ts","./src/api/generated/model/upsertdatabasepermissionresponse.ts","./src/api/generated/model/upsertdocumentuserpermissionrequest.ts","./src/api/generated/model/upsertdocumentuserpermissionrequestrole.ts","./src/api/generated/model/upsertdocumentuserpermissionresponse.ts","./src/api/generated/model/upsertdrawinguserpermissionrequest.ts","./src/api/generated/model/upsertdrawinguserpermissionrequestrole.ts","./src/api/generated/model/upsertdrawinguserpermissionresponse.ts","./src/api/generated/model/upsertspaceuserpermissionrequest.ts","./src/api/generated/model/upsertspaceuserpermissionrequestrole.ts","./src/api/generated/model/upsertspaceuserpermissionresponse.ts","./src/api/generated/model/userinfo.ts","./src/api/generated/model/userlistitem.ts","./src/api/generated/model/userlistusersparams.ts","./src/api/generated/model/versionconfig.ts","./src/api/generated/model/versionitem.ts","./src/api/generated/model/viewconfig.ts","./src/api/generated/model/viewconfigfilter.ts","./src/api/generated/model/webhookdeliveriesparams.ts","./src/api/generated/model/webhookitem.ts","./src/api/generated/space/space.ts","./src/api/generated/user/user.ts","./src/api/generated/webhooks/webhooks.ts","./src/components/protected-route.tsx","./src/components/admin/apikeys-management.tsx","./src/components/admin/groups-management.tsx","./src/components/admin/spaces-management.tsx","./src/components/admin/sso-management.tsx","./src/components/admin/users-management.tsx","./src/components/database/databasetree.tsx","./src/components/database/index.ts","./src/components/database/common/add-property-modal.tsx","./src/components/database/common/add-property-popover.tsx","./src/components/database/common/conditional-format-editor.tsx","./src/components/database/common/create-database-modal.tsx","./src/components/database/common/database-header.tsx","./src/components/database/common/database-settings-sidebar.tsx","./src/components/database/common/database-toolbar.tsx","./src/components/database/common/date-format-editor.tsx","./src/components/database/common/field-editor.tsx","./src/components/database/common/filter-builder.tsx","./src/components/database/common/number-format-editor.tsx","./src/components/database/common/property-cell.tsx","./src/components/database/common/sort-builder.tsx","./src/components/database/common/view-tabs.tsx","./src/components/database/document/document-board-view.tsx","./src/components/database/document/document-edit-sidebar.tsx","./src/components/database/document/document-gallery-view.tsx","./src/components/database/document/document-list-view.tsx","./src/components/database/document/document-row-settings-sidebar.tsx","./src/components/database/document/document-table-view.tsx","./src/components/database/document/index.tsx","./src/components/document/documenttree.tsx","./src/components/document/document-editor.tsx","./src/components/document/document-settings-sidebar.tsx","./src/components/document/icon-emoji-selector.tsx","./src/components/document/move-document-modal.tsx","./src/components/document/version-history-sidebar.tsx","./src/components/drawing/drawingtree.tsx","./src/components/drawing/create-drawing-modal.tsx","./src/components/drawing/drawing-editor.tsx","./src/components/drawing/drawing-settings-sidebar.tsx","./src/components/editor/database-block.tsx","./src/components/editor/openblock-editor.tsx","./src/components/layout/main-layout.tsx","./src/components/layout/mobile-header.tsx","./src/components/layout/sidebar.tsx","./src/components/permissions/permission-manager.tsx","./src/components/settings/actions-settings.tsx","./src/components/settings/api-keys-settings.tsx","./src/components/settings/profile-settings.tsx","./src/components/settings/webhooks-settings.tsx","./src/components/shared/content-header.tsx","./src/components/shared/content-settings-sidebar.tsx","./src/components/sidebar/app-switcher-header.tsx","./src/components/sidebar/app-switcher-menu.tsx","./src/components/sidebar/command-palette.tsx","./src/components/sidebar/quick-actions.tsx","./src/components/sidebar/sidebar-item.tsx","./src/components/sidebar/space-content-docs.tsx","./src/components/sidebar/space-content-projects.tsx","./src/components/sidebar/space-item.tsx","./src/components/sidebar/spaces-list.tsx","./src/components/sidebar/user-menu.tsx","./src/components/spaces/create-space-modal.tsx","./src/components/spaces/edit-space-modal.tsx","./src/components/spaces/space-icon.tsx","./src/components/spaces/space-switcher.tsx","./src/components/ui/alert-dialog.tsx","./src/components/ui/avatar.tsx","./src/components/ui/badge.tsx","./src/components/ui/button.tsx","./src/components/ui/calendar.tsx","./src/components/ui/card.tsx","./src/components/ui/checkbox.tsx","./src/components/ui/collapsible.tsx","./src/components/ui/dialog.tsx","./src/components/ui/dropdown-menu.tsx","./src/components/ui/emoji-picker.tsx","./src/components/ui/icon-picker.tsx","./src/components/ui/input.tsx","./src/components/ui/kbd.tsx","./src/components/ui/label.tsx","./src/components/ui/popover.tsx","./src/components/ui/select.tsx","./src/components/ui/separator.tsx","./src/components/ui/sheet.tsx","./src/components/ui/switch.tsx","./src/components/ui/tabs.tsx","./src/components/ui/textarea.tsx","./src/components/ui/toaster.tsx","./src/components/ui/tooltip.tsx","./src/contexts/active-app-context.tsx","./src/contexts/auth-context.tsx","./src/contexts/command-palette-context.tsx","./src/contexts/document-expansion-context.tsx","./src/contexts/sidebar-ui-context.tsx","./src/contexts/sidebar-visibility-context.tsx","./src/contexts/space-context.tsx","./src/contexts/theme-provider.tsx","./src/contexts/ui-state-context.tsx","./src/hooks/use-actions.ts","./src/hooks/use-admin.ts","./src/hooks/use-api-keys.ts","./src/hooks/use-auto-select-space.ts","./src/hooks/use-collaboration.ts","./src/hooks/use-create-content.ts","./src/hooks/use-database-permissions.ts","./src/hooks/use-database.ts","./src/hooks/use-document-permissions.ts","./src/hooks/use-documents.ts","./src/hooks/use-drawing-permissions.ts","./src/hooks/use-drawings.ts","./src/hooks/use-edge-detection.ts","./src/hooks/use-favorites.ts","./src/hooks/use-keyboard-shortcuts.ts","./src/hooks/use-media-query.ts","./src/hooks/use-reorder-documents.ts","./src/hooks/use-resizable.ts","./src/hooks/use-search.ts","./src/hooks/use-space-order.ts","./src/hooks/use-space-permissions.ts","./src/hooks/use-spaces.ts","./src/hooks/use-users.ts","./src/hooks/use-versions.ts","./src/hooks/use-webhooks.ts","./src/hooks/ui/index.ts","./src/hooks/ui/useeditablefield.ts","./src/hooks/ui/usesidebar.ts","./src/i18n/languagecontext.tsx","./src/i18n/index.ts","./src/lib/query-client.ts","./src/lib/utils.ts","./src/lib/database/columntypes.ts","./src/lib/database/conditionalstyles.ts","./src/lib/database/formatters.ts","./src/lib/database/formula.ts","./src/lib/database/index.ts","./src/pages/admin.tsx","./src/pages/database-document.tsx","./src/pages/database.tsx","./src/pages/document.tsx","./src/pages/drawing.tsx","./src/pages/home.tsx","./src/pages/login.tsx","./src/pages/register.tsx","./src/pages/settings.tsx","./src/types/apps.ts"],"version":"5.6.3"} \ No newline at end of file