diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54cc4d8b0..67bb95997 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ blocknote │ ├── editor - The main React application │ ├── engine - The live-code execution engine │ ├── packager - Tool to bundle TypeCell notebook apps (WIP) -│ └── parsers - Helpers to convert to / from TypeCell notebooks +│ └── parsers - Helpers to convert to / from TypeCell ├── patches - patch-package patches └── test-util - Server and data for unit tests ``` diff --git a/README.md b/README.md index c7a1ab548..f3a844be0 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ typecell │ ├── editor - The main React application │ ├── engine - The live-code execution engine │ ├── packager - Tool to bundle TypeCell notebook apps (WIP) -│ └── parsers - Helpers to convert to / from TypeCell notebooks +│ └── parsers - Helpers to convert to / from TypeCell documents ├── patches - patch-package patches └── test-util - Server and data for unit tests ``` diff --git a/package-lock.json b/package-lock.json index 0467fd008..c6da8a666 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,9 +71,9 @@ } }, "node_modules/@atlaskit/analytics-next": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@atlaskit/analytics-next/-/analytics-next-9.1.3.tgz", - "integrity": "sha512-+PkNWStlbo7utGdplIgMV+Hi+/uPLiBIpzEzwfUeXyfHc31D9seyzrWktedEHokVPoBDwb9T3cBxjOyiAdj5rg==", + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@atlaskit/analytics-next/-/analytics-next-9.1.4.tgz", + "integrity": "sha512-UnoIlIQOOa4esHomlKPIBQs/5f4VFATIib97hADjGt5wAccmR080wJ63P0Ch1aHkbV6+AtSQfIefJnIYz6XXpQ==", "dependencies": { "@atlaskit/analytics-next-stable-react-context": "1.0.1", "@babel/runtime": "^7.0.0", @@ -96,9 +96,9 @@ } }, "node_modules/@atlaskit/atlassian-navigation": { - "version": "2.6.17", - "resolved": "https://registry.npmjs.org/@atlaskit/atlassian-navigation/-/atlassian-navigation-2.6.17.tgz", - "integrity": "sha512-qMej1rNtu4DjySCxGrPAKyHS6Zt3LZVZQNpBFDp+7z2qxmch+VUIFeaBs8wabxiPheh2wRHg9hmp24MvP44ipw==", + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/@atlaskit/atlassian-navigation/-/atlassian-navigation-2.6.18.tgz", + "integrity": "sha512-dRkmG0yEA8xSiuC082SCJ6HbH3E3iqPpKJtXpGpV+7BK076svwv44TUZF5eD/CRDL1+OSHFSNS6SBOfaGEfotA==", "dependencies": { "@atlaskit/analytics-namespaced-context": "^6.7.0", "@atlaskit/button": "^16.8.0", @@ -109,7 +109,7 @@ "@atlaskit/popup": "^1.9.0", "@atlaskit/primitives": "^1.0.6", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@atlaskit/tooltip": "^17.8.0", "@atlaskit/width-detector": "^4.1.0", "@babel/runtime": "^7.0.0", @@ -122,14 +122,14 @@ } }, "node_modules/@atlaskit/avatar": { - "version": "21.3.7", - "resolved": "https://registry.npmjs.org/@atlaskit/avatar/-/avatar-21.3.7.tgz", - "integrity": "sha512-ELi0zld8AKO0czdWw/PUm+l6CCCBXO3wnc7n06T8zAW/zKlZK5ZSLKUw5hofsbVXTxKlN4Sb8S6Jdm87ZF8snQ==", + "version": "21.3.8", + "resolved": "https://registry.npmjs.org/@atlaskit/avatar/-/avatar-21.3.8.tgz", + "integrity": "sha512-36uwHwH4KSoKH5/1y8W4TtOvYSNhsuG2n9AXfDxGaYZFfC9OpWK6mNE/HLr5gsnDNX/R0daYPqjHuluWFsLaqg==", "dependencies": { "@atlaskit/analytics-next": "^9.1.0", "@atlaskit/icon": "^21.12.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.11.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "@emotion/serialize": "^1.1.0" @@ -178,9 +178,9 @@ } }, "node_modules/@atlaskit/button": { - "version": "16.8.5", - "resolved": "https://registry.npmjs.org/@atlaskit/button/-/button-16.8.5.tgz", - "integrity": "sha512-Su0F8SH1C9gbRCQDKqpKdk1wqNn3rEcAsp3VgQokFpZRhwd8yGCWSS19j39DT0AQcx9ho8fVomsGRqmW5yi1cQ==", + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@atlaskit/button/-/button-16.9.1.tgz", + "integrity": "sha512-r7t3VZUqQ8ULXRBrmqJ5ts+vPznbe5tVtEKq0gTLehmC+tuNAG4QWfyFsEcviwWILL/tW8FCEoM40KsOYNonFw==", "dependencies": { "@atlaskit/analytics-next": "^9.1.0", "@atlaskit/ds-lib": "^2.2.0", @@ -189,7 +189,8 @@ "@atlaskit/platform-feature-flags": "^0.2.0", "@atlaskit/spinner": "^15.5.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", + "@atlaskit/visually-hidden": "^1.2.4", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -220,9 +221,9 @@ } }, "node_modules/@atlaskit/dropdown-menu": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@atlaskit/dropdown-menu/-/dropdown-menu-11.11.3.tgz", - "integrity": "sha512-YHVFgx7TETug5RPUoB5dsW7VYt5UIn7c6tBT6cEDEc+0S3spCH+NSK4bomfwlyA+8FD5zcq9xmSsMkuWDq3QIQ==", + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@atlaskit/dropdown-menu/-/dropdown-menu-11.11.6.tgz", + "integrity": "sha512-xREIGU6qriWX50oSdr2LXUvVbo3D1Zlg7xUd6U8JrgJQV14kQo94CJi0zTy9F5ZX97zu6PkvCLsyO96t1EY/kQ==", "dependencies": { "@atlaskit/button": "^16.8.0", "@atlaskit/codemod-utils": "^4.2.0", @@ -234,7 +235,7 @@ "@atlaskit/primitives": "^1.0.6", "@atlaskit/spinner": "^15.5.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@atlaskit/visually-hidden": "^1.2.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", @@ -246,11 +247,11 @@ } }, "node_modules/@atlaskit/ds-explorations": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@atlaskit/ds-explorations/-/ds-explorations-2.2.8.tgz", - "integrity": "sha512-KF9NpkapyPvVv2DA70ures668Iy9ID3ByOTXbZrW+BOfdsCRa1PCQI0R/l9HZjfoz/kFNC9pQsk+A1btkRj1JQ==", + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@atlaskit/ds-explorations/-/ds-explorations-2.2.9.tgz", + "integrity": "sha512-uqe21CAhOQRyVE/Iy7j71Cc+ZP5gNWyHCmnlOTUeLsszjts9pffX7/d+uriesWl4fYKbg0GjUut1GGpl/De+Pw==", "dependencies": { - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "tiny-invariant": "^1.2.0" @@ -271,6 +272,22 @@ "react": "^16.8.0" } }, + "node_modules/@atlaskit/empty-state": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@atlaskit/empty-state/-/empty-state-7.6.3.tgz", + "integrity": "sha512-DP6g/pGbS797nZKH4RLfs1aN9vtT/fDhRBYNfe2JLjs3sogKS91IcVgBovhgZgLdNEqpcBzA4bIJwzF6s9mkIw==", + "dependencies": { + "@atlaskit/button": "^16.9.0", + "@atlaskit/spinner": "^15.5.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", + "@babel/runtime": "^7.0.0", + "@emotion/react": "^11.7.1" + }, + "peerDependencies": { + "react": "^16.8.0" + } + }, "node_modules/@atlaskit/flag": { "version": "15.2.16", "resolved": "https://registry.npmjs.org/@atlaskit/flag/-/flag-15.2.16.tgz", @@ -296,11 +313,11 @@ } }, "node_modules/@atlaskit/focus-ring": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@atlaskit/focus-ring/-/focus-ring-1.3.4.tgz", - "integrity": "sha512-QS4EWeNgJ9bqC/KfJuJu0Z+HIvN9OkSwX3mdik7vcg4D2jOiCnX8OfOC7rG+jCxxplNXoAEaaPh3s7CK3eCOLQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@atlaskit/focus-ring/-/focus-ring-1.3.5.tgz", + "integrity": "sha512-x/5aftmQCO768r94GskhJotuXc+wm/Ba4MBUh+S/7980GKpvr4XXnWtUWm4l52J2v5+DE4oQNe5jewDQW0KVAg==", "dependencies": { - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -309,13 +326,13 @@ } }, "node_modules/@atlaskit/form": { - "version": "8.11.10", - "resolved": "https://registry.npmjs.org/@atlaskit/form/-/form-8.11.10.tgz", - "integrity": "sha512-3Kb0Gz7L7nZ98iGlYILhTBjYZ0pMUOnApcPTTxAw/b79Wp83FZd/9o+cZoSijtdW4lKhd3Ra2dAH+YFgmx4Chg==", + "version": "8.11.12", + "resolved": "https://registry.npmjs.org/@atlaskit/form/-/form-8.11.12.tgz", + "integrity": "sha512-jvj9aBarNXR7w6Gi+J4oVqRgKHOlv0NADlCfvvOK/oVdyEFJUSJUcJimOzLJ1nftUa2znaScYVJ8K7Hfy8yhdw==", "dependencies": { "@atlaskit/icon": "^21.12.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "final-form": "^4.20.1", @@ -342,12 +359,12 @@ } }, "node_modules/@atlaskit/icon": { - "version": "21.12.6", - "resolved": "https://registry.npmjs.org/@atlaskit/icon/-/icon-21.12.6.tgz", - "integrity": "sha512-Dgl7d1Jl8uOaLu+gEZuobUR+NrQz3R0qnMxIWGlvUURr0p2R0jZFXDHRj9TJH1rRHIGa7tDhOm9qK7E0kSU4HA==", + "version": "21.12.7", + "resolved": "https://registry.npmjs.org/@atlaskit/icon/-/icon-21.12.7.tgz", + "integrity": "sha512-aJ/wsmLMVIcYxyF7P9vOZohv1XQ9HSvYELxjuzThToZ/zy/4SdRDOc7Zjm/MLmtCOqcLRne3f68mM9s3/a5dqg==", "dependencies": { "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.11.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -383,15 +400,15 @@ } }, "node_modules/@atlaskit/inline-message": { - "version": "11.5.3", - "resolved": "https://registry.npmjs.org/@atlaskit/inline-message/-/inline-message-11.5.3.tgz", - "integrity": "sha512-J3vf02lH3kA13sWORFzcPd6ibR2+HSJl1Mb3LQvfuWB2YnDjLdi0BLDLtMWgwiUkybxLwnYPUTZ5OeLiFLp+wA==", + "version": "11.5.4", + "resolved": "https://registry.npmjs.org/@atlaskit/inline-message/-/inline-message-11.5.4.tgz", + "integrity": "sha512-CWsc2wwZb1Lmp2XPuQDfuhC9Q3IftmvXSAfyzkshkkE8wHtFzFw0MhH9wcuXSgxs39eW7GfNUCQSO/GqCJ1l1w==", "dependencies": { - "@atlaskit/button": "^16.8.0", + "@atlaskit/button": "^16.9.0", "@atlaskit/icon": "^21.12.0", "@atlaskit/inline-dialog": "^13.6.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.11.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -442,17 +459,17 @@ } }, "node_modules/@atlaskit/menu": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@atlaskit/menu/-/menu-1.9.7.tgz", - "integrity": "sha512-raPvXCcirMDHUB2pxZYYnl4WIPHIbsY4SMZbyTt5Xo+k/OzbhXATj1OLVgA7LiaBC8CCsYQdrDV9EURiH/CsXw==", + "version": "1.9.8", + "resolved": "https://registry.npmjs.org/@atlaskit/menu/-/menu-1.9.8.tgz", + "integrity": "sha512-xRRX3LL361w9dQReVf2yUsP/KihiypDRuoHS40Y2kpdWOiV5T36EXTuy8fVhTTjZkGEz5oPrpvfw9B3vSuArAg==", "dependencies": { "@atlaskit/ds-explorations": "^2.2.0", "@atlaskit/ds-lib": "^2.2.0", "@atlaskit/focus-ring": "^1.3.0", "@atlaskit/platform-feature-flags": "^0.2.0", - "@atlaskit/primitives": "^1.0.6", + "@atlaskit/primitives": "^1.2.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -462,9 +479,9 @@ } }, "node_modules/@atlaskit/modal-dialog": { - "version": "12.6.5", - "resolved": "https://registry.npmjs.org/@atlaskit/modal-dialog/-/modal-dialog-12.6.5.tgz", - "integrity": "sha512-iVTjRPCfX8KjyJaFf/2bhpx/2DtlOlYxl7l0xiseQG1WejgJSQPmfYG9UFhygPCplw90km6yrZkExccmqYsQGA==", + "version": "12.6.6", + "resolved": "https://registry.npmjs.org/@atlaskit/modal-dialog/-/modal-dialog-12.6.6.tgz", + "integrity": "sha512-9TGwOdGZh/7fZRIBsfiLZLeJnfDQWSdDMkFGX5Nwq0J4NO3thxzPMFnITt4roq95IiuS56SMecUp97iUousFyw==", "dependencies": { "@atlaskit/analytics-next": "^9.1.0", "@atlaskit/blanket": "^12.4.0", @@ -474,9 +491,9 @@ "@atlaskit/icon": "^21.12.0", "@atlaskit/motion": "^1.4.0", "@atlaskit/portal": "^4.3.0", - "@atlaskit/primitives": "^1.0.2", + "@atlaskit/primitives": "^1.2.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1", @@ -549,9 +566,9 @@ } }, "node_modules/@atlaskit/popper": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-5.5.3.tgz", - "integrity": "sha512-ox1VlG06FQNN4CC6TMQhd82NxFHtKMO900Pey6KWPbCuyxVFssIV/T5ysbbnz2j/69VxACOd5bpXCT3rie7Z3g==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-5.5.4.tgz", + "integrity": "sha512-ALMgyXhMntmJOHdiXb/Y3SoLJ8JneMuTlnkC1UClm2nNvn4WmFfZ+ak8Z1yecLdk2HJ5Z6PgcDsPZ34QmKjhCQ==", "dependencies": { "@atlaskit/in-product-testing": "^0.2.0", "@babel/runtime": "^7.0.0", @@ -563,16 +580,16 @@ } }, "node_modules/@atlaskit/popup": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@atlaskit/popup/-/popup-1.9.1.tgz", - "integrity": "sha512-eYG0r8NeWVM3XqE5Ob3MyIpCuVyMyG/+JbkJYWI3FzhKpqtwwhEZ3L677W14sTCox7StoZwIu8e8b1y1h4wqaw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@atlaskit/popup/-/popup-1.9.2.tgz", + "integrity": "sha512-ddkmKO4yAEtOeTKp26HYczRETlHyRV/g3eNs5hGzS8RVc2VBOjQDcte+kU9KVtcphNTjRo2x89Shd4vAgD2CKA==", "dependencies": { "@atlaskit/ds-lib": "^2.2.0", "@atlaskit/platform-feature-flags": "^0.2.0", "@atlaskit/popper": "^5.5.0", "@atlaskit/portal": "^4.3.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1", @@ -584,9 +601,9 @@ } }, "node_modules/@atlaskit/portal": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@atlaskit/portal/-/portal-4.3.4.tgz", - "integrity": "sha512-FfOLJbl3zJ8J/CqhqBW2sWMXj5zg0t6sm3wdXXejt98IhaN0Enaobg3BKV72LTOi5ZGJfPNVLbRZuaxBEYQTDw==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@atlaskit/portal/-/portal-4.3.5.tgz", + "integrity": "sha512-G1PzMhqNnAqnl/hMYhahaqLPEg4BAkAls4BQNzOtc7BXWdo1QGTGO7vG6vVK5UZU931xRDgcfn0NMqN8IkP+Bg==", "dependencies": { "@atlaskit/theme": "^12.5.0", "@babel/runtime": "^7.0.0" @@ -597,12 +614,11 @@ } }, "node_modules/@atlaskit/primitives": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@atlaskit/primitives/-/primitives-1.0.9.tgz", - "integrity": "sha512-+KU1MTgHW+DPyf+DLtjTfbSDiL6Dhj5GmRlNHVUZGCSvjGjokrh/I52pwlsiVXc84Xtmu0Aju2a9kGvcEyKTPw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@atlaskit/primitives/-/primitives-1.2.1.tgz", + "integrity": "sha512-WU+i5uSJTLsCq/6qbGZRFdWvnkm5Lslx25ng/ypimH6ysozhqmjZeq14Jkn9zyrD0gI8XjUeY+F2H7sLo0VP1g==", "dependencies": { - "@atlaskit/focus-ring": "^1.3.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "@emotion/serialize": "^1.1.0", @@ -632,16 +648,16 @@ } }, "node_modules/@atlaskit/select": { - "version": "16.5.7", - "resolved": "https://registry.npmjs.org/@atlaskit/select/-/select-16.5.7.tgz", - "integrity": "sha512-iEdBWccwsuGRAl7QeU4S94vwMubrlxpc3gM834uVrvxXSNtGBWAMRWJvrtdIAuEQ6py7NTujNLcRA2gHtQPTdA==", + "version": "16.5.9", + "resolved": "https://registry.npmjs.org/@atlaskit/select/-/select-16.5.9.tgz", + "integrity": "sha512-5Suq6dFdglcEf9zaEJ+pMlBWiEwG+O8TnEZ77xBV7Jy3PVEzdIG++AMzanfP3P00osOmCiaENmDM7O426tmZ0g==", "dependencies": { "@atlaskit/analytics-next": "^9.1.0", "@atlaskit/icon": "^21.12.0", "@atlaskit/platform-feature-flags": "^0.2.0", "@atlaskit/spinner": "^15.5.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.11.0", + "@atlaskit/tokens": "^1.14.0", "@atlaskit/visually-hidden": "^1.2.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", @@ -677,14 +693,14 @@ } }, "node_modules/@atlaskit/textarea": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/@atlaskit/textarea/-/textarea-4.7.4.tgz", - "integrity": "sha512-G42NDB63+JmicoBJHxMrUJ53ZXG/h3DxcwJ+Sg81Zn4hI4KzIcQb+9Yoyj29hPAuF5f5GfA8h/UkCF7kmrBaIg==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/@atlaskit/textarea/-/textarea-4.7.6.tgz", + "integrity": "sha512-y1agp6ngQ+/rgmzCQS8PsoawmWzpRBHWqcXr1xteC4c5gvis37Cl7lXxNViD32Us/OPZxjBUyiI4VdXsiLesCg==", "dependencies": { "@atlaskit/analytics-next": "^9.1.0", "@atlaskit/platform-feature-flags": "^0.2.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.11.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -693,14 +709,14 @@ } }, "node_modules/@atlaskit/textfield": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@atlaskit/textfield/-/textfield-5.6.3.tgz", - "integrity": "sha512-YJojMzTjwxESAaHpbzB0y3jQJZvxEz99X2I453Zd7R6ym9+MsTI67BUAyKj24Q1sEeaYSrs6frAO3wlw/MQpTg==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@atlaskit/textfield/-/textfield-5.6.4.tgz", + "integrity": "sha512-8VVpjyQOq8DHWgt9YFlnzNsd566a/YdjAwBxyFINDChAze6a1MxRp/7Evos48StTBfVs+X/uLctc56d7xKUFHA==", "dependencies": { "@atlaskit/analytics-next": "^9.1.0", "@atlaskit/platform-feature-flags": "^0.2.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.11.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -709,13 +725,13 @@ } }, "node_modules/@atlaskit/theme": { - "version": "12.5.5", - "resolved": "https://registry.npmjs.org/@atlaskit/theme/-/theme-12.5.5.tgz", - "integrity": "sha512-VbZTKDme4OYEvzC1m4kgqhPLW2NC/H6fd03JI/xFktIbYtA1SRq3fdj8Rbr6xbD7IujxaZoS54hPyJ/0VSr6dQ==", + "version": "12.5.6", + "resolved": "https://registry.npmjs.org/@atlaskit/theme/-/theme-12.5.6.tgz", + "integrity": "sha512-GyQZ+rh2bbXmFhBCy8jZly/Q5m9KamFjy8qU8IM9u45ROQErNAqSPTITzrPVcSLgOQDRsp8o2ZsR4vOFGmOpCQ==", "dependencies": { "@atlaskit/codemod-utils": "^4.2.0", "@atlaskit/ds-lib": "^2.2.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0" }, "peerDependencies": { @@ -723,9 +739,9 @@ } }, "node_modules/@atlaskit/tokens": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-1.14.0.tgz", - "integrity": "sha512-npbkR0LQv05IVWiAHN/ylGH1ySP4C7TkFreGUy2KYGJTRhoxXFb6AJIJ9ehOS0Kpp2fAU4dwoOG9zfgEss+nLQ==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-1.14.2.tgz", + "integrity": "sha512-2bfgwn4yOPb4Lfj+HbuNGLLPlnpAtGbVogJadKlTqnm7zVfT4ypQQ+g/MUZaW1bDMzsoc14tdgbfIye6Gfy17Q==", "dependencies": { "@atlaskit/ds-lib": "^2.2.0", "@atlaskit/platform-feature-flags": "^0.2.0", @@ -739,9 +755,9 @@ } }, "node_modules/@atlaskit/tooltip": { - "version": "17.8.4", - "resolved": "https://registry.npmjs.org/@atlaskit/tooltip/-/tooltip-17.8.4.tgz", - "integrity": "sha512-7wPxNNVNHdNu1oVs4plHP5xG6GIWw7PCrEHd3qU+3D7iyClmRHFtCh338EguCUYxfzXq8p89+nwjRWzMemaHEA==", + "version": "17.8.5", + "resolved": "https://registry.npmjs.org/@atlaskit/tooltip/-/tooltip-17.8.5.tgz", + "integrity": "sha512-EO/wRakDvjC+jrPsB8OmAxzGcDuMxOK5cWpYpE1vwlBmE+24ozjiK5ahCx5uH48GnEQYJ43zgYYeizHP5iyu1g==", "dependencies": { "@atlaskit/analytics-next": "^9.1.0", "@atlaskit/ds-lib": "^2.2.0", @@ -749,7 +765,7 @@ "@atlaskit/popper": "^5.5.0", "@atlaskit/portal": "^4.3.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.11.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1", @@ -786,9 +802,9 @@ } }, "node_modules/@atlaskit/user-picker": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@atlaskit/user-picker/-/user-picker-10.5.0.tgz", - "integrity": "sha512-VjZ8tPuLoY8pMeHXwqt1rHBoOPbn+OviDuRub8kuvxpQuvUR5CmXzhrKibeQExOGBBQ8jJ4PJRD3Ray6jMa/eQ==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/@atlaskit/user-picker/-/user-picker-10.5.1.tgz", + "integrity": "sha512-drkNju4JmQC0p+jftrO1rNCS83FuL0MleQ5b27djqL9QQZ73IrGcxNjVWFovc/jheU8f+CBtbjbnTRyZOER6tQ==", "dependencies": { "@atlaskit/analytics-next": "^9.1.0", "@atlaskit/avatar": "^21.3.0", @@ -799,7 +815,7 @@ "@atlaskit/select": "^16.5.0", "@atlaskit/spinner": "^15.5.0", "@atlaskit/theme": "^12.5.0", - "@atlaskit/tokens": "^1.13.0", + "@atlaskit/tokens": "^1.14.0", "@atlaskit/tooltip": "^17.8.0", "@atlaskit/ufo": "^0.2.0", "@babel/runtime": "^7.0.0", @@ -827,9 +843,9 @@ } }, "node_modules/@atlaskit/width-detector": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@atlaskit/width-detector/-/width-detector-4.1.2.tgz", - "integrity": "sha512-6RhpD39hsi7ntDmzKKOIFbUbMZK2mnBEnUMIqATOALEkKUZRSke2Ok3g7BXXAeq/fGZKBBBUOQqP2gf9voBwGQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@atlaskit/width-detector/-/width-detector-4.1.3.tgz", + "integrity": "sha512-H2grr9auuDsqJyqsLY47dxyBVbce0zIA7YJsP6jMhkMAjSZkTlCAA8Xo86n5ByHkzcBtTR9T08VL7Bjs/TFeRg==", "dependencies": { "@babel/runtime": "^7.0.0", "raf-schd": "^4.0.3" @@ -839,11 +855,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -859,21 +876,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -889,9 +906,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz", - "integrity": "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.10.tgz", + "integrity": "sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -902,7 +919,7 @@ "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": ">=7.11.0", + "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, @@ -916,11 +933,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -942,21 +959,21 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", - "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", @@ -967,15 +984,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", - "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -1217,40 +1231,40 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", - "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -1258,9 +1272,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1317,16 +1331,16 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz", - "integrity": "sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz", + "integrity": "sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.6", + "@babel/helper-create-class-features-plugin": "^7.22.10", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/plugin-syntax-decorators": "^7.22.5" + "@babel/plugin-syntax-decorators": "^7.22.10" }, "engines": { "node": ">=6.9.0" @@ -1418,22 +1432,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -1474,9 +1472,9 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", - "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", + "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1745,14 +1743,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", - "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", + "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1795,9 +1793,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", - "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1882,9 +1880,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", - "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2267,9 +2265,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", - "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", + "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2443,13 +2441,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", - "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.1" + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -2474,16 +2472,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz", + "integrity": "sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", "semver": "^6.3.1" }, "engines": { @@ -2570,13 +2568,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", - "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz", + "integrity": "sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-create-class-features-plugin": "^7.22.10", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5" }, @@ -2588,9 +2586,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", - "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2651,13 +2649,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", + "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", @@ -2682,15 +2680,15 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-generator-functions": "^7.22.10", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", "@babel/plugin-transform-class-properties": "^7.22.5", "@babel/plugin-transform-class-static-block": "^7.22.5", "@babel/plugin-transform-classes": "^7.22.6", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", "@babel/plugin-transform-dynamic-import": "^7.22.5", @@ -2713,27 +2711,27 @@ "@babel/plugin-transform-object-rest-spread": "^7.22.5", "@babel/plugin-transform-object-super": "^7.22.5", "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-optional-chaining": "^7.22.10", "@babel/plugin-transform-parameters": "^7.22.5", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.5", "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", "@babel/plugin-transform-shorthand-properties": "^7.22.5", "@babel/plugin-transform-spread": "^7.22.5", "@babel/plugin-transform-sticky-regex": "^7.22.5", "@babel/plugin-transform-template-literals": "^7.22.5", "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", "@babel/plugin-transform-unicode-property-regex": "^7.22.5", "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.10", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2757,14 +2755,12 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, @@ -2818,23 +2814,23 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs2": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.22.6.tgz", - "integrity": "sha512-GTJVRjzQIHUBwRzuWxPII87XoWxXzILBJrQh5gqIV6q6m231Y0BBA9NKta5FV5Lbl8z5gS3+m6YSoKJp0KQJ4g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.22.10.tgz", + "integrity": "sha512-GKgzyeqm8fCoPt14SBTYFGwSTY+LCRoJb+sJPJLRfUhyFD0206ZZEPyUyQhZdbEyFKDtRvvfjbAhk3t5EUw1og==", "dependencies": { "core-js": "^2.6.12", - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -2861,18 +2857,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2881,9 +2877,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -2900,9 +2896,9 @@ "dev": true }, "node_modules/@blocknote/core": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.8.5.tgz", - "integrity": "sha512-TJjExtHYMLWCX8MH6DTnxykEus4I3QyxfhwXWcH98Xk4kzVWDs3HXOOBIldZfyBzOPya9Ggnwwd2NNrfCLtSzg==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.9.2.tgz", + "integrity": "sha512-yjkJ4BhQiaZ5U3c9F1bTTuozOAIdSL3upMINcxN90hS3rpSgf0ypJRKCF/N1GBHL+wt2hy1c7edzA5/IuvYOjA==", "dependencies": { "@emotion/cache": "^11.10.5", "@emotion/serialize": "^1.1.1", @@ -2953,11 +2949,11 @@ } }, "node_modules/@blocknote/react": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@blocknote/react/-/react-0.8.5.tgz", - "integrity": "sha512-X+MET50+V3K4LIIUT8XXjAOF9ga8KQsGZf/FYX/v5uQzzCochZzBaBdk8uUVPvrZmHPB0/AweVp+Ja0lV6xQIw==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@blocknote/react/-/react-0.9.2.tgz", + "integrity": "sha512-C2pmRMcog/MKsVsAx80IowZaZQS0BKQWM8JR3sstRezJonau5/ixY4BiMI4ko0Pmr45LxIyAgQSEFL7bqoemUg==", "dependencies": { - "@blocknote/core": "^0.8.5", + "@blocknote/core": "^0.9.2", "@emotion/react": "^11.10.5", "@mantine/core": "^5.6.1", "@mantine/hooks": "^5.6.1", @@ -2968,7 +2964,8 @@ "lodash": "^4.17.21", "react": "^18.2.0", "react-icons": "^4.3.1", - "tippy.js": "^6.3.7" + "tippy.js": "^6.3.7", + "use-prefers-color-scheme": "^1.1.3" }, "peerDependencies": { "react": "^18", @@ -3455,9 +3452,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -3478,9 +3475,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3505,9 +3502,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3531,12 +3528,12 @@ } }, "node_modules/@floating-ui/react": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz", - "integrity": "sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.25.1.tgz", + "integrity": "sha512-lxuWxfSgDJwOeZK07PIDjTSlH0CY6LRDKo6eI0H7TnctP+5IAn0n8+npNveM0L2wNIVdAr0S8RvvoHfhzPbBAQ==", "dependencies": { - "@floating-ui/react-dom": "^1.3.0", - "aria-hidden": "^1.1.3", + "@floating-ui/react-dom": "^2.0.1", + "@floating-ui/utils": "^0.1.1", "tabbable": "^6.0.1" }, "peerDependencies": { @@ -3545,11 +3542,11 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz", - "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", + "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", "dependencies": { - "@floating-ui/dom": "^1.2.1" + "@floating-ui/dom": "^1.3.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -3648,9 +3645,9 @@ } }, "node_modules/@hocuspocus/common": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-2.3.1.tgz", - "integrity": "sha512-OUPj5NUBnrcaCLAotMD1O5QRu48kJYCYGz/ZzobTqLbs6PtfrmfQfrB0hAzU3GYxPPEWvBrL3sRivrUvpyb48w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-2.4.0.tgz", + "integrity": "sha512-+hI7f/LaeIM0FE+iANVLfqDneXjhD2AXmIj6WBzpUFO+IGLjrk8F46eQAsmv9l9Ts347G6CbhTMhLFJdEkGcww==", "dependencies": { "lib0": "^0.2.47" } @@ -3802,9 +3799,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { "node": ">=6.0.0" } @@ -3823,19 +3820,14 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, "node_modules/@lifeomic/attempt": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@lifeomic/attempt/-/attempt-3.0.3.tgz", @@ -3858,6 +3850,32 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@mantine/core/node_modules/@floating-ui/react": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz", + "integrity": "sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==", + "dependencies": { + "@floating-ui/react-dom": "^1.3.0", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@mantine/core/node_modules/@floating-ui/react-dom": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz", + "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==", + "dependencies": { + "@floating-ui/dom": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@mantine/core/node_modules/@mantine/utils": { "version": "5.10.5", "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-5.10.5.tgz", @@ -3894,9 +3912,9 @@ "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" }, "node_modules/@mantine/utils": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.17.tgz", - "integrity": "sha512-U6SWV/asYE6NhiHx4ltmVZdQR3HwGVqJxVulhOylMcV1tX/P1LMQUCbGV2Oe4O9jbX4/YW5B/CBb4BbEhENQFQ==", + "version": "6.0.19", + "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.19.tgz", + "integrity": "sha512-duvtnaW1gDR2gnvUqnWhl6DMW7sN0HEWqS8Z/BbwaMi75U+Xp17Q72R9JtiIrxQbzsq+KvH9L9B/pxMVwbLirg==", "peerDependencies": { "react": ">=16.8.0" } @@ -3968,13 +3986,13 @@ } }, "node_modules/@playwright/experimental-ct-core": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.36.2.tgz", - "integrity": "sha512-IH8I0kWmQziYWbnbkch+i0e/xbk3rc0z3UGM5si32VRSOo95Vx86kBwgN1jh61ZyNY9bGFjQSYMKgD2CTL7Xmg==", + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.37.1.tgz", + "integrity": "sha512-3OmhDzrIAcVQlyVHmyaVtzcht/OUEH47uvwPh/rQmz/CrvB6zHMxH/7dIo6SCswMbCFkACepbqGmTW4HjW+yeQ==", "dev": true, "dependencies": { - "@playwright/test": "1.36.2", - "playwright-core": "1.36.2", + "@playwright/test": "1.37.1", + "playwright-core": "1.37.1", "vite": "^4.3.9" }, "bin": { @@ -3985,12 +4003,12 @@ } }, "node_modules/@playwright/experimental-ct-react": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.36.2.tgz", - "integrity": "sha512-l52Yayrr84brBQow4Cx4BGTk6nFpZjWAN75a9gAMN89wumR5C6PGRIp9dpNaUs9decWcKS43VF7g9FpJH63BPg==", + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.37.1.tgz", + "integrity": "sha512-Uhw2sBdMPltkENPuNiuxjwkyjv4mpkPB3lVbUjTpK2lJtE7lVunj454OVa3v0wrHlavkAUK1e8OOFdkT860WWQ==", "dev": true, "dependencies": { - "@playwright/experimental-ct-core": "1.36.2", + "@playwright/experimental-ct-core": "1.37.1", "@vitejs/plugin-react": "^4.0.0" }, "bin": { @@ -4001,13 +4019,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.2.tgz", - "integrity": "sha512-2rVZeyPRjxfPH6J0oGJqE8YxiM1IBRyM8hyrXYK7eSiAqmbNhxwcLa7dZ7fy9Kj26V7FYia5fh9XJRq4Dqme+g==", + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", + "integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.36.2" + "playwright-core": "1.37.1" }, "bin": { "playwright": "cli.js" @@ -4219,11 +4237,11 @@ } }, "node_modules/@remix-run/router": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", - "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", + "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, "node_modules/@rollup/plugin-inject": { @@ -4261,9 +4279,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.3.tgz", + "integrity": "sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -4283,9 +4301,9 @@ } }, "node_modules/@rushstack/eslint-patch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", - "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz", + "integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==", "dev": true }, "node_modules/@sinclair/typebox": { @@ -4339,9 +4357,9 @@ } }, "node_modules/@supabase/gotrue-js": { - "version": "2.46.1", - "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.46.1.tgz", - "integrity": "sha512-tebFX3XvPqEJKHOVgkXTN20g9iUhLx6tebIYQvTggYTrqOT2af8oTpSBdgYzbwJ291G6P6CSpR6KY0cT9ade5A==", + "version": "2.47.0", + "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.47.0.tgz", + "integrity": "sha512-3e34/vsKH/DoSZCpB85UZpFWSJ2p4GRUUlqgAgeTPagPlx4xS+Nc5v7g7ic7vp3gK0J5PsYVCn9Qu2JQUp4vXg==", "dependencies": { "cross-fetch": "^3.1.5" } @@ -4355,9 +4373,9 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.7.2.tgz", - "integrity": "sha512-GK80JpRq8l6Qll85erICypAfQCied8tdlXfsDN14W844HqXCSOisk8AaE01DAwGJanieaoN5fuqhzA2yKxDvEQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.8.0.tgz", + "integrity": "sha512-R6leDIC92NgjyG2/tCRJ42rWN7+fZY6ulTEE+c00tcnghn6cX4IYUlnTNMtrdfYC2JYNOTyM+rWj63Wdhr7Zig==", "dependencies": { "cross-fetch": "^3.1.5" } @@ -4397,13 +4415,13 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.31.0.tgz", - "integrity": "sha512-W9/4s+KnSUX67wJKBn/3yLq+ieycnMzVjK3nNTLX5Wko3ypNT/081l2iFYrf+nsLQ1CiT4mA92I3dxCy6CmxTg==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.32.0.tgz", + "integrity": "sha512-1ShFhuOI5Du7604nlCelBsRD61daXk2O0qwjumoz35bqrYThnSPPtpJqZOHw6Mg6o7mLjIInYLh/DBlh8UvzRg==", "dependencies": { "@supabase/functions-js": "^2.1.0", "@supabase/gotrue-js": "^2.46.1", - "@supabase/postgrest-js": "^1.7.0", + "@supabase/postgrest-js": "^1.8.0", "@supabase/realtime-js": "^2.7.3", "@supabase/storage-js": "^2.5.1", "cross-fetch": "^3.1.5" @@ -4441,9 +4459,9 @@ } }, "node_modules/@tiptap/core": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.4.tgz", - "integrity": "sha512-2YOMjRqoBGEP4YGgYpuPuBBJHMeqKOhLnS0WVwjVP84zOmMgZ7A8M6ILC9Xr7Q/qHZCvyBGWOSsI7+3HsEzzYQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.6.tgz", + "integrity": "sha512-gm8n1oiBhSP6CDhalmmWwLD7yzIUqJJ246/t8rY3o+HJ/I+p0rqCx0mPvMiwcIBmYX8tUCVz7mb9aSFUu/umOQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4453,9 +4471,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.0.4.tgz", - "integrity": "sha512-CWSQy1uWkVsen8HUsqhm+oEIxJrCiCENABUbhaVcJL/MqhnP4Trrh1B6O00Yfoc0XToPRRibDaHMFs4A3MSO0g==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.1.6.tgz", + "integrity": "sha512-gZDVuhYdceBQ/xGGY1X7lmkgNrDHFuFYBFRWMK0pLe9YBlQtJPc6+hiOmCtRtGmbQADDnvMmSU2a0+8bckmbCw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4465,9 +4483,9 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.4.tgz", - "integrity": "sha512-+cRZwj0YINNNDElSAiX1pvY2K98S2j9MQW2dXV5oLqsJhqGPZsKxVo8I1u7ZtqUla3QE1V18RYPAzVgTiMRkBg==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.6.tgz", + "integrity": "sha512-13YDJB19xbDL/SZaPs8NvUAA+w5MIWugP8ByKQeIlL8vlcbiJjqoT77YP6v300DtFyVrnLo/iMJh9RMB4NOnwg==", "dependencies": { "tippy.js": "^6.3.7" }, @@ -4481,9 +4499,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.0.4.tgz", - "integrity": "sha512-HuwJSJkipZf4hkns9witv1CABNIPiB9C8lgAQXK4xJKcoUQChcnljEL+PQ2NqeEeMTEeV3nG3A/0QafH0pgTgg==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.1.6.tgz", + "integrity": "sha512-vFWE74Aipt0kbmWyya+9zvsAgVusbbHx8g3Zqm8iKDt95BY3MWGurCZ3F5uoVuPuWD9VSrbNs4/T6oKbVKc9Ow==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4493,9 +4511,9 @@ } }, "node_modules/@tiptap/extension-collaboration": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.0.4.tgz", - "integrity": "sha512-Z853jHGKPSYiG5LDYpwTgeMGNYHmbrd9dBueazo+e1xnNyjDaPxkrZMbjdVAsliMns3Omk9oLZLd28JWB4naEQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.1.6.tgz", + "integrity": "sha512-U8S9SMC/iRdQcwPTRoVDUY1Gq6IHgAbiJIVMC5XkD4RWXdfhQ9C0bSyWvbyh1n8bcBAB3R9BYvH5wboCvhnPUg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4507,9 +4525,9 @@ } }, "node_modules/@tiptap/extension-collaboration-cursor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.0.4.tgz", - "integrity": "sha512-kXNkvlwIcdNhtnYpHiwu2tlczDpTCV3Rm41VHSjlWhaWQnfBr1M7kNOJ96Ui6dnlUdgQZKQSvDQQopjdU3jqzQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.1.6.tgz", + "integrity": "sha512-K5muh1wcRQJ+/ni1AYemAMJFkVhqXvV3qX+XUnhmN2k1X51pMbeMmaNYX8S9zJstVVN2Em/A7eLhkWoy0WoQZw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4520,9 +4538,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.4.tgz", - "integrity": "sha512-1OmKBv/E+nJo2vsosvu8KwFiBB+gZM1pY61qc7JbwEKHSYAxUFHfvLkIA0IQ53Z0DHMrFSKgWmHEcbnqtGevCA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.6.tgz", + "integrity": "sha512-+nk4XtCp2+lVf1pzwonaOdIolE9AI3HPAtUO7sthHYLDIm1JEQT2GS3+MVDGHdFKxEGUkB5DEcNLtr/xLTQjZQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4533,9 +4551,9 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.4.tgz", - "integrity": "sha512-0YRE738k+kNKuSHhAb3jj9ZQ7Kda78RYRr+cX2jrQVueIMKebPIY07eBt6JcKmob9V9vcNn9qLtBfmygfcPUQg==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.6.tgz", + "integrity": "sha512-Xy4esdjsZlgNxMbBC6+wLoiTfqaqFjuFquqcYEPqzgBizYa15Ww6wIx5+h2K+hzyJkSPI7ZX/rPjKXML8lNteQ==", "dependencies": { "tippy.js": "^6.3.7" }, @@ -4549,9 +4567,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.4.tgz", - "integrity": "sha512-VxmKfBQjSSu1mNvHlydA4dJW/zawGKyqmnryiFNcUV9s+/HWLR5i9SiUl4wJM/B8sG8cQxClne5/LrCAeGNYuA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.6.tgz", + "integrity": "sha512-5AH6Je1B6JpZkMBslXw/UglMpxVwL8AXqX5xWKP2OSsKVYcL00jApq709FxfYhyqui/SukUVusKKQFstTNqIGA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4562,9 +4580,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.0.4.tgz", - "integrity": "sha512-4j8BZa6diuoRytWoIc7j25EYWWut5TZDLbb+OVURdkHnsF8B8zeNTo55W40CdwSaSyTtXtxbTIldV80ShQarGQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.1.6.tgz", + "integrity": "sha512-znFYceEFbrgxhHZF+/wNQlAn3MWG9/VRqQAFxPGne0csewibKZRwZbeSYZQ16x1vSAlAQsKhIaAst/na/2H8LA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4574,9 +4592,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.0.4.tgz", - "integrity": "sha512-3GAUszn1xZx3vniHMiX9BSKmfvb5QOb0oSLXInN+hx80CgJDIHqIFuhx2dyV9I/HWpa0cTxaLWj64kfDzb1JVg==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.1.6.tgz", + "integrity": "sha512-ltHz9cW3bWi7Z3m960F5eLPAqZDBNOpUP31t9YdKqhyxA16eygryj1USVeus9DX5OBoW79I8EecFAuRo3Rymlw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4587,9 +4605,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.4.tgz", - "integrity": "sha512-OMx2ImQseKbSUjPbbRCuYGOJshxYedh9giWAqwgWWokhYkH4nGxXn5m7+Laj+1wLre4bnWgHWVY4wMGniEj3aw==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.6.tgz", + "integrity": "sha512-1epXM+4DRlhos+Awj4sHApceO2O26tuqyrZot0Mm+mF0yuCGy3B5fefAgUcxBu/oRuywfDl8cwCzN2E/d8KXtA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4600,9 +4618,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.0.4.tgz", - "integrity": "sha512-C/6+qs4Jh8xERRP0wcOopA1+emK8MOkBE4RQx5NbPnT2iCpERP0GlmHBFQIjaYPctZgKFHxsCfRnneS5Xe76+A==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.1.6.tgz", + "integrity": "sha512-o41hil+x2yqFciOiJPx67FnguJ4/aEMU8MotmXekFGHM+I0wFOd4lA5t7HqFU5Si0Z7gyTb/N0wLUbAnbyk/Aw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4612,9 +4630,9 @@ } }, "node_modules/@tiptap/extension-link": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.0.4.tgz", - "integrity": "sha512-CliImI1hmC+J6wHxqgz9P4wMjoNSSgm3fnNHsx5z0Bn6JRA4Evh2E3KZAdMaE8xCTx89rKxMYNbamZf4VLSoqQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.1.6.tgz", + "integrity": "sha512-at4tUpb8P2mMqc3jGMsggoKrt2mMWX0uNvoFYpKpnptQvsweCXSV5xi60o1C5kL7f0v/FYvEk4QaQBJmG5DmRg==", "dependencies": { "linkifyjs": "^4.1.0" }, @@ -4628,9 +4646,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.0.4.tgz", - "integrity": "sha512-nDxpopi9WigVqpfi8nU3B0fWYB14EMvKIkutNZo8wJvKGTZufNI8hw66wupIx/jZH1gFxEa5dHerw6aSYuWjgQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.1.6.tgz", + "integrity": "sha512-k0QSIaJPVgTn9+X2580JFCjV2RCH1Fo+gPodABDnjunfoUVSjuq0rlILEtTuha3evlS6kDKiz7lk7pIoCo36Cw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4640,9 +4658,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.0.4.tgz", - "integrity": "sha512-Men7LK6N/Dh3/G4/z2Z9WkDHM2Gxx1XyxYix2ZMf5CnqY37SeDNUnGDqit65pdIN3Y/TQnOZTkKSBilSAtXfJA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.1.6.tgz", + "integrity": "sha512-LX7X2ohKEE0nUyWecSGxBcuzLxXTIbPmUnbkZvqYiWTaE02r3TxzkJMO0iuTnbygceC1TtiAfKwGgth0b9tMCQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4652,9 +4670,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.4.tgz", - "integrity": "sha512-i8/VFlVZh7TkAI49KKX5JmC0tM8RGwyg5zUpozxYbLdCOv07AkJt+E1fLJty9mqH4Y5HJMNnyNxsuZ9Ol/ySRA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.1.6.tgz", + "integrity": "sha512-CqV0N6ngoXZFeJGlQ86FSZJ/0k7+BN3S6aSUcb5DRAKsSEv/Ga1LvSG24sHy+dwjTuj3EtRPJSVZTFcSB17ZSA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4664,9 +4682,9 @@ } }, "node_modules/@tiptap/extension-underline": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.0.4.tgz", - "integrity": "sha512-Hvhy3iV5dWs0SFTww6sIzyQSSgVzcQuiozhDs11iP+gvFjK7ejg86KZ8wAVvyCi9K3bOMhohsw1Q2b8JSnIxcg==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.1.6.tgz", + "integrity": "sha512-3yBCTzqYsmUfffhDJ+8MFyRy0nUcv9dffPt0bnmXsOqUIG4rMFIGrGY/hspzX6dw9Pn4htA4lBQCB64LT+GTqw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4676,9 +4694,9 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.0.4.tgz", - "integrity": "sha512-DNgxntpEaiW7ciW0BTNTL0TFqAreZTrAROWakI4XaYRAyi5H9NfZW8jmwGwMBkoZ1KB3pfy+jT/Bisy4okEQGQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.6.tgz", + "integrity": "sha512-JkFlZp2z6Se2Ttnabi4lkP2yLNMH/eebO7ScYL1kXvwNLgELC/I3fwQVmnYA0E8pqJ5KQXOSl14NaB1mVPJqlg==", "dependencies": { "prosemirror-changeset": "^2.2.0", "prosemirror-collab": "^1.3.0", @@ -4702,18 +4720,15 @@ "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" } }, "node_modules/@tiptap/react": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.0.4.tgz", - "integrity": "sha512-NcrZL4Tu3+1Xfj/us5AOD7+kJhwYo2XViOB2iRRnfwS80PUtiLWDis6o3ngMGot/jBWzaMn4gofXnMWHtFdIAw==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.1.6.tgz", + "integrity": "sha512-HEsoFlcE61gQz9TllEtBa+5d909MA/ersbxGYOUWIY2HhH5lvNIUvyJ3pdzMkK/4cSniMsDDqobFexsGyTAsrw==", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.0.4", - "@tiptap/extension-floating-menu": "^2.0.4" + "@tiptap/extension-bubble-menu": "^2.1.6", + "@tiptap/extension-floating-menu": "^2.1.6" }, "funding": { "type": "github", @@ -4865,9 +4880,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.196", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", - "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==", + "version": "4.14.197", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", + "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==", "dev": true }, "node_modules/@types/markdown-it": { @@ -4908,9 +4923,9 @@ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, "node_modules/@types/node": { - "version": "20.4.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.7.tgz", - "integrity": "sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==" + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" }, "node_modules/@types/object.omit": { "version": "3.0.0", @@ -4949,9 +4964,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz", - "integrity": "sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==", + "version": "18.2.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz", + "integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5925,6 +5940,15 @@ "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==" }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6336,9 +6360,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001519", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", - "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", "dev": true, "funding": [ { @@ -6683,9 +6707,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", - "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", + "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6693,12 +6717,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", - "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", + "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", "dev": true, "dependencies": { - "browserslist": "^4.21.9" + "browserslist": "^4.21.10" }, "funding": { "type": "opencollective", @@ -7138,9 +7162,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.485", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.485.tgz", - "integrity": "sha512-1ndQ5IBNEnFirPwvyud69GHL+31FkE09gH/CJ6m3KCbkx3i0EVOrjwz4UNxRmN9H8OVHbC6vMRZGN1yCvjSs9w==", + "version": "1.4.496", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz", + "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", "dev": true }, "node_modules/emoji-regex": { @@ -7244,6 +7268,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.13.tgz", + "integrity": "sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.3", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" + } + }, "node_modules/es-module-shims": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.4.3.tgz", @@ -7415,15 +7461,15 @@ } }, "node_modules/eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -7434,7 +7480,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -7497,14 +7543,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -7561,9 +7607,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", - "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, "dependencies": { "array-includes": "^3.1.6", @@ -7575,13 +7621,12 @@ "eslint-import-resolver-node": "^0.3.7", "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.12.1", + "is-core-module": "^2.13.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.6", "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.3", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -7613,23 +7658,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", - "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.12.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-jest": { "version": "25.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", @@ -7685,15 +7713,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz", - "integrity": "sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -7755,9 +7784,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz", - "integrity": "sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.58.0" @@ -7787,9 +7816,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7848,9 +7877,9 @@ "dev": true }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -8144,14 +8173,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/filebridge-client": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/filebridge-client/-/filebridge-client-0.1.5.tgz", - "integrity": "sha512-M+RUw+7mufI8IQ+cgiWAmXYmm4kGdABLKHdVgdv0gkNwCc3SNzqbY7d91NMemN9jeCZa0+xLzH/tEfuzEQo65A==", - "dependencies": { - "vscode-lib": "^0.1.2" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -8165,12 +8186,15 @@ } }, "node_modules/final-form": { - "version": "4.20.9", - "resolved": "https://registry.npmjs.org/final-form/-/final-form-4.20.9.tgz", - "integrity": "sha512-shA1X/7v8RmukWMNRHx0l7+Bm41hOivY78IvOiBrPVHjyWFIyqqIEMCz7yTVRc9Ea+EU4WkZ5r4MH6whSo5taw==", + "version": "4.20.10", + "resolved": "https://registry.npmjs.org/final-form/-/final-form-4.20.10.tgz", + "integrity": "sha512-TL48Pi1oNHeMOHrKv1bCJUrWZDcD3DIG6AGYVNOnyZPr7Bd/pStN0pL+lfzF5BNoj/FclaoiaLenk4XUIFVYng==", "dependencies": { "@babel/runtime": "^7.10.0" }, + "engines": { + "node": ">=8" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/final-form" @@ -9158,6 +9182,21 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -9213,9 +9252,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dependencies": { "has": "^1.0.3" }, @@ -9272,6 +9311,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -9320,6 +9371,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -9425,6 +9485,15 @@ "resolved": "https://registry.npmjs.org/is-retina/-/is-retina-1.0.3.tgz", "integrity": "sha512-/tCmbIETZwCd8uHWO+GvbRa7jxwHFHdfetHfiwoP0aN9UDf3prUJMtKn7iBFYipYhqY1bSTjur8hC/Dakt8eyw==" }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -9507,6 +9576,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -9518,6 +9596,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -9638,6 +9729,19 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", + "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "has-tostringtag": "^1.0.0", + "reflect.getprototypeof": "^1.0.3" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10043,9 +10147,9 @@ } }, "node_modules/lib0": { - "version": "0.2.78", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.78.tgz", - "integrity": "sha512-SV2nU43/6eaYnGH3l0lg2wg1ziB/TH3sAd2E8quXPGwrqo+aX98SNT2ZKucpUr5B8A52jD7ZMjAl+r87Fa/bLQ==", + "version": "0.2.82", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.82.tgz", + "integrity": "sha512-sZJeggxq56weXHnBc37dXNnYKGPvdR75zKxGHNc8gLE+ldKCbc4whk0JY2cV17lxuBFtvRd4dIsSh6Cfz7slUw==", "dependencies": { "isomorphic.js": "^0.2.4" }, @@ -11572,9 +11676,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -12431,13 +12535,13 @@ } }, "node_modules/playwright": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.36.2.tgz", - "integrity": "sha512-4Fmlq3KWsl85Bl4InJw1NC21aeQV0iSZuFvTDcy1F8zVmXmgQRe89GxF8zMSRt/KIS+2tUolak7EXVl9aC+JdA==", + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.37.1.tgz", + "integrity": "sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "playwright-core": "1.36.2" + "playwright-core": "1.37.1" }, "bin": { "playwright": "cli.js" @@ -12447,9 +12551,9 @@ } }, "node_modules/playwright-core": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.2.tgz", - "integrity": "sha512-sQYZt31dwkqxOrP7xy2ggDfEzUxM1lodjhsQ3NMMv5uGTRDsLxU0e4xf4wwMkF2gplIxf17QMBCodSFgm6bFVQ==", + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", + "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -12565,9 +12669,9 @@ } }, "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", "dev": true, "funding": [ { @@ -12830,9 +12934,9 @@ } }, "node_modules/prosemirror-menu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.2.tgz", - "integrity": "sha512-437HIWTq4F9cTX+kPfqZWWm+luJm95Aut/mLUy+9OMrOml0bmWDS26ceC6SNfb2/S94et1sZ186vLO7pDHzxSw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.3.tgz", + "integrity": "sha512-13H9+XvdJiUt2vQVMqCveFbc7YfEKR3g70pUwuQdQLwuvNfVGTzMHr1y5dwdY5vOBQbzhmjgnWUnclKzMdnlJA==", "dependencies": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", @@ -13237,29 +13341,29 @@ } }, "node_modules/react-router": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz", - "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", + "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", "dependencies": { - "@remix-run/router": "1.7.2" + "@remix-run/router": "1.8.0" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz", - "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", + "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", "dependencies": { - "@remix-run/router": "1.7.2", - "react-router": "6.14.2" + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8", @@ -13391,6 +13495,26 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", + "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -13410,14 +13534,14 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -13495,9 +13619,9 @@ } }, "node_modules/rehype-parse": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.4.tgz", - "integrity": "sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.5.tgz", + "integrity": "sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==", "dependencies": { "@types/hast": "^2.0.0", "hast-util-from-parse5": "^7.0.0", @@ -13530,9 +13654,9 @@ } }, "node_modules/rehype-stringify": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", - "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz", + "integrity": "sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==", "dependencies": { "@types/hast": "^2.0.0", "hast-util-to-html": "^8.0.0", @@ -13617,11 +13741,11 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -13706,9 +13830,9 @@ } }, "node_modules/rollup": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.2.tgz", - "integrity": "sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -14014,6 +14138,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -14021,9 +14153,9 @@ "dev": true }, "node_modules/std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.0.tgz", + "integrity": "sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==", "dev": true }, "node_modules/stdin-discarder": { @@ -14239,9 +14371,9 @@ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/supabase": { - "version": "1.82.6", - "resolved": "https://registry.npmjs.org/supabase/-/supabase-1.82.6.tgz", - "integrity": "sha512-WpXFScfNodp7TGiJsCp70uEKu7kahvh/OkugjIyy6gVUMDPmXxQsvvg2doJfDIfzFL7b3osSccWmqfJ0h5Vy6g==", + "version": "1.86.2", + "resolved": "https://registry.npmjs.org/supabase/-/supabase-1.86.2.tgz", + "integrity": "sha512-8tgQYTRxoo+XVnQPSsbEYeb7Ag8GSqvFTDdO/KiegIsBOiN5y4UV+s2G9/BJMdiAU+wyGmSStmy29X+yRHwS5g==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -14563,9 +14695,9 @@ } }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -15064,6 +15196,18 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/use-prefers-color-scheme": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-prefers-color-scheme/-/use-prefers-color-scheme-1.1.3.tgz", + "integrity": "sha512-ZRgDfb5BFLum/Sud4SpZ+d1YcV+lRbsupw0qQ/rGy5kGrpE3KMUQgEQOKiQQSa4Wslex46n5fKFO+9FGMTosUQ==", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, "node_modules/use-sidecar": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", @@ -15220,14 +15364,14 @@ } }, "node_modules/vite": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.8.tgz", - "integrity": "sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", "dev": true, "dependencies": { "esbuild": "^0.18.10", - "postcss": "^8.4.26", - "rollup": "^3.25.2" + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -15538,6 +15682,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -15932,6 +16117,7 @@ "@atlaskit/button": "^16.8.2", "@atlaskit/css-reset": "^6.5.3", "@atlaskit/dropdown-menu": "^11.10.5", + "@atlaskit/empty-state": "^7.6.3", "@atlaskit/flag": "^15.2.15", "@atlaskit/form": "^8.11.8", "@atlaskit/inline-message": "^11.5.3", @@ -15946,20 +16132,20 @@ "@atlaskit/textfield": "^5.6.3", "@atlaskit/tree": "^8.8.5", "@atlaskit/user-picker": "^10.4.0", + "@blocknote/core": "^0.9.2", "@emotion/react": "^11.4.0", "@hocuspocus/provider": "2.1.0", "@supabase/auth-ui-react": "^0.4.2", "@supabase/auth-ui-shared": "^0.1.6", "@supabase/supabase-js": "^2.26.0", "@syncedstore/yjs-reactive-bindings": "^0.5.1", - "@tippyjs/react": "^4.2.6", + "@tiptap/core": "^2.0.4", "@typecell-org/engine": "^0.0.3", "@typecell-org/frame": "^0.0.3", "@typecell-org/parsers": "^0.0.3", "@typecell-org/shared": "^0.0.3", "@typecell-org/util": "^0.0.3", "classnames": "^2.3.1", - "filebridge-client": "^0.1.5", "fractional-indexing": "^2.0.0", "lodash": "^4.17.21", "mobx": "^6.2.0", @@ -15974,6 +16160,7 @@ "react-icons": "^4.6.0", "react-intl-next": "npm:react-intl@^5.18.1", "react-router-dom": "^6.10.0", + "speakingurl": "^14.0.1", "tippy.js": "^6.3.1", "vscode-lib": "^0.1.2", "web-vitals": "^1.0.1", @@ -16007,9 +16194,9 @@ } }, "packages/editor/node_modules/@types/node": { - "version": "16.18.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.39.tgz", - "integrity": "sha512-8q9ZexmdYYyc5/cfujaXb4YOucpQxAV4RMG0himLyDUOEr8Mr79VrqsFI+cQ2M2h89YIuy95lbxuYjxT4Hk4kQ==", + "version": "16.18.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.41.tgz", + "integrity": "sha512-YZJjn+Aaw0xihnpdImxI22jqGbp0DCgTFKRycygjGx/Y27NnWFJa5FJ7P+MRT3u07dogEeMVh70pWpbIQollTA==", "dev": true }, "packages/engine": { @@ -16170,8 +16357,9 @@ "name": "@typecell-org/frame", "version": "0.0.3", "dependencies": { - "@blocknote/core": "^0.8.5", - "@blocknote/react": "^0.8.5", + "@blocknote/core": "^0.9.2", + "@blocknote/react": "^0.9.2", + "@floating-ui/react": "^0.25.1", "@syncedstore/yjs-reactive-bindings": "^0.5.1", "@tiptap/core": "^2.0.4", "@tiptap/react": "^2.0.4", diff --git a/package.json b/package.json index 8d819d4c7..afd615f62 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "lint": "npm run lint --workspaces", "watch": "npm run build && npm run --parallel watch", "start": "npm run start-react", - "start-filebridge": "npx filebridge packages/editor/public/_docs", "start-react": "npm run start --workspace=packages/editor", "start:preview": "npm run preview --workspace=packages/editor", "start:server": "npm run dev --workspace=packages/server", diff --git a/packages/editor/copy-docs.mjs b/packages/editor/copy-docs.mjs index e3f7e0428..9d2a3fcaa 100644 --- a/packages/editor/copy-docs.mjs +++ b/packages/editor/copy-docs.mjs @@ -2,4 +2,13 @@ import glob from "glob"; import * as path from "path"; const files = glob.sync("**/*.md", { cwd: path.join("public", "_docs") }); -console.log(JSON.stringify(files)); +console.log( + JSON.stringify( + { + title: "Docs", + items: files, + }, + undefined, + 2 + ) +); diff --git a/packages/editor/index.html b/packages/editor/index.html index b73fc693f..62e6589f1 100644 --- a/packages/editor/index.html +++ b/packages/editor/index.html @@ -16,7 +16,7 @@ user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ --> - TypeCell Notebooks + TypeCell
diff --git a/packages/editor/package.json b/packages/editor/package.json index 15e4a570b..3b4f3a536 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -10,6 +10,7 @@ "@atlaskit/button": "^16.8.2", "@atlaskit/css-reset": "^6.5.3", "@atlaskit/dropdown-menu": "^11.10.5", + "@atlaskit/empty-state": "^7.6.3", "@atlaskit/flag": "^15.2.15", "@atlaskit/form": "^8.11.8", "@atlaskit/inline-message": "^11.5.3", @@ -24,19 +25,20 @@ "@atlaskit/textfield": "^5.6.3", "@atlaskit/tree": "^8.8.5", "@atlaskit/user-picker": "^10.4.0", + "@tiptap/core": "^2.0.4", + "@blocknote/core": "^0.9.2", "@emotion/react": "^11.4.0", "@supabase/auth-ui-react": "^0.4.2", "@supabase/auth-ui-shared": "^0.1.6", "@supabase/supabase-js": "^2.26.0", "@syncedstore/yjs-reactive-bindings": "^0.5.1", - "@tippyjs/react": "^4.2.6", "@typecell-org/util": "^0.0.3", "@typecell-org/shared": "^0.0.3", "@typecell-org/engine": "^0.0.3", "@typecell-org/parsers": "^0.0.3", "@typecell-org/frame": "^0.0.3", + "speakingurl": "^14.0.1", "classnames": "^2.3.1", - "filebridge-client": "^0.1.5", "fractional-indexing": "^2.0.0", "lodash": "^4.17.21", "mobx": "^6.2.0", diff --git a/packages/editor/public/_docs/README.md b/packages/editor/public/_docs/README.md index e69de29bb..a89e1bbbe 100644 --- a/packages/editor/public/_docs/README.md +++ b/packages/editor/public/_docs/README.md @@ -0,0 +1,32 @@ +# Welcome to TypeCell + +Hi there 👋 ! Welcome to the community preview of TypeCell, an experimental _live notebook programming_ environment for the web. + +This guide should help you to get started, and learn more about the ins & outs. + +## Tutorial + +Complete the tutorial to get familiar with TypeCell: + +» [Interactive introduction](/docs/interactive-introduction.md) + +## Reference manual + +We've written about the main functionality of TypeCell in the [manual](/docs/manual): + +- [Notebooks and cells](/docs/manual/1.%20Notebooks%20and%20cells.md) +- [TypeScript and exports](/docs/manual/2.%20TypeScript%20and%20exports.md) +- [Reactive variables](/docs/manual/3.%20Reactive%20variables.md) +- [Working with user input](/docs/manual/4.%20Inputs.md) +- [Imports & NPM](/docs/manual/5.%20Imports%20and%20NPM.md) +- [Collaboration](/docs/manual/6.%20Collaboration.md) + +## Demos + +Another good way to learn is to check out some notebooks from our community: + +» [View demo notebooks](/docs/demos.md) + +# Feedback ❤️ + +As always, we'd love to hear your thoughts and see your experiments, so [come and say hi on Discord](https://discord.gg/TcJ9TRC3SV) or [Matrix](https://matrix.to/#/#typecell-space:matrix.org) as well. diff --git a/packages/editor/public/_docs/index.json b/packages/editor/public/_docs/index.json index 2a2f01efb..cf80d999b 100644 --- a/packages/editor/public/_docs/index.json +++ b/packages/editor/public/_docs/index.json @@ -1 +1,14 @@ -["demos.md","interactive-introduction.md","manual/1. Notebooks and cells.md","manual/2. TypeScript and exports.md","manual/3. Reactive variables.md","manual/4. Inputs.md","manual/5. Imports and NPM.md","manual/6. Collaboration.md","README.md"] +{ + "title": "Docs", + "items": [ + "demos.md", + "interactive-introduction.md", + "manual/1. Notebooks and cells.md", + "manual/2. TypeScript and exports.md", + "manual/3. Reactive variables.md", + "manual/4. Inputs.md", + "manual/5. Imports and NPM.md", + "manual/6. Collaboration.md", + "README.md" + ] +} diff --git a/packages/editor/public/_docs/interactive-introduction.md b/packages/editor/public/_docs/interactive-introduction.md index d57b78833..6d8b278e5 100644 --- a/packages/editor/public/_docs/interactive-introduction.md +++ b/packages/editor/public/_docs/interactive-introduction.md @@ -1,9 +1,9 @@ -# Introduction to TypeCell Notebooks +# Introduction to TypeCell -Welcome to TypeCell Notebooks. A notebook is a live, interactive programming environment for Javascript / Typescript +Welcome to TypeCell. A TypeCell document is a live, interactive programming environment for Javascript / Typescript running in your browser. -In this introduction, we will go through the basics of using TypeCell Notebooks. +In this introduction, we will go through the basics of using TypeCell. ## Cats @@ -11,7 +11,6 @@ Let's say you're like my grandma, and you have a lot of cats. Our story will be ### Step 1: give your cat a name! - ```typescript export let cat = { name: "", @@ -51,7 +50,6 @@ export default message; ### Step 2: Friends - ```typescript export default (
I feel like our cat needs a friend. Let's call him {$.friend.name}.
@@ -63,7 +61,6 @@ Uh oh, what's this? I forgot to add a cell defining our friend. Can you do it fo A cell is a container for code & output. To add one, click on the + above or below another cell. You can do it wherever you like. - ```typescript // @default-collapsed @@ -86,14 +83,13 @@ to access across cells! Exported variables are also displayed below the cell. Code cells automatically run when: -* You change the code of a cell -* Any of the reactive variables the cell references (from `$`) are changed +- You change the code of a cell +- Any of the reactive variables the cell references (from `$`) are changed ## Feeding neighbors Our cats have some neighbors. Let's involve them in the story too! - ```typescript export let neighbors = [ $.cat, @@ -114,7 +110,6 @@ export let neighbors = [ Now, if you're like my grandma, you're feeding the entire neighborhood by yourself, but you don't yet know if our friend prefers dry/wet food or how many cans they eat per week. - ```typescript // @default-collapsed @@ -136,7 +131,6 @@ export default ( Alright, once you've completed steps 1 - 3, let's see how much food you need to prepare. We do this in the cell below: - ```typescript // Repeats a character a number of times and returns the string. export function repeat(char: string, times: number) { @@ -191,7 +185,6 @@ JSX is part of React, and makes it easy to create type-safe HTML elements. In Ty Next, we'll create some user input fields to indicate how much food we have prepared. The built-in TypeCell Input library makes this easy: - ```typescript export let dryFoodPrepared = typecell.Input( , @@ -221,7 +214,6 @@ export default ( Now, let's also create some cells to calculate whether we have prepared enough food: - ```typescript // @default-collapsed @@ -310,7 +302,7 @@ export default ( These are just 2 of the many input types that TypeCell supports. To see the other choices, make sure to try the TypeCell inputs tutorial. -*Tip: expand the 3 cells above to see how they work.* +_Tip: expand the 3 cells above to see how they work._ ## Final notes @@ -321,6 +313,6 @@ There are a lot more features to discover, for example, did you know you can import any NPM package you like, or even compose different notebooks? Try creating your own notebook to give it a try, or have a look at the other examples. -**Have fun using TypeCell Notebooks!** +**Have fun using TypeCell!** This tutorial is inspired by [pluto.jl](https://github.com/fonsp/Pluto.jl), thanks Fons & Nicholas! diff --git a/packages/editor/public/_docs/manual/1. Notebooks and cells.md b/packages/editor/public/_docs/manual/1. Notebooks and cells.md index a8fc8e1da..8f4bebddf 100644 --- a/packages/editor/public/_docs/manual/1. Notebooks and cells.md +++ b/packages/editor/public/_docs/manual/1. Notebooks and cells.md @@ -1,7 +1,7 @@ # Notebooks and Cells -The page you're looking at is called a *notebook*. -It's basically an interactive document that mixes *code* and *text* (documentation). +The page you're looking at is called a _notebook_. +It's basically an interactive document that mixes _code_ and _text_ (documentation). ## Creating and reordering cells @@ -24,24 +24,24 @@ Useful for writing text / documentation. Markdown cells are collapsed by default Use CSS to easily style the output of other cells (those written in Markdown or TypeScript). - ```css .redText { color: red; } - ``` -
This text is red, styled by the CSS cell above.
+```typescript +export default ( +
This text is red, styled by the CSS cell above.
+); +```` ### TypeScript / JavaScript - ```typescript export let message = "This is a TypeScript cell"; - ``` -TypeScript cells execute automatically as you type.Try editing the`message` above. +TypeScript cells execute automatically as you type. Try editing the `message` above. You've learned the basics! Continue to learn more about writing code using TypeScript cells. diff --git a/packages/editor/public/_docs/manual/2. TypeScript and exports.md b/packages/editor/public/_docs/manual/2. TypeScript and exports.md index f27b02b89..9de5f037b 100644 --- a/packages/editor/public/_docs/manual/2. TypeScript and exports.md +++ b/packages/editor/public/_docs/manual/2. TypeScript and exports.md @@ -1,6 +1,6 @@ # TypeScript and exports -TypeScript cells are the main way to write code in TypeCell Notebooks. +TypeScript cells are the main way to write code in TypeCell. You'll get all the benefits of the [Monaco Editor](https://microsoft.github.io/monaco-editor/) while writing code, the same editor that powers VS Code! @@ -11,27 +11,23 @@ This allows you to quickly write and test code, but still get hints about possib In the example below, you'll notice that we get an error because we assign a `number` to a `string` variable, but the code still executes regardless. - ```typescript export let message = "hello"; message = 4; - ``` ## Exports -You can export variables from your code, and they'll show up as *output* of the cell. Above, we've exported a single `message` variable. +You can export variables from your code, and they'll show up as _output_ of the cell. Above, we've exported a single `message` variable. You can also export multiple variables from a cell, and the _inspector_ will help you to view the output: - ```typescript export let firstVariable = "Hello world"; export let vehicle = { color: "red", wheels: 4, }; - ``` ### DOM Elements @@ -42,12 +38,11 @@ You can create and export DOM Elements to display them directly: export let element = document.createElement("button"); element.innerText = "This is a button. Click me!"; element.onclick = () => window.alert("Hello!"); - ``` ### React / JSX -Think direct DOM manipulation is a little too old school for you? TypeCell supports React & JSX to make your life easier: +Think direct DOM manipulation is a little too old school for you? TypeCell supports React & JSX to make your life easier: ```typescript export let reactElement = ( @@ -55,7 +50,6 @@ export let reactElement = ( This is a React Button ); - ``` ## The `default` export @@ -68,11 +62,10 @@ The following cell exports 2 variables, but only one is displayed in the output: export let myNum = 42; export default
The number is: {myNum}
; - ``` Now you might ask; what's the use of exporting `myNum` if you don't see it in the output? This is because exported variables can be reused across cells and notebooks; one of most powerful features of TypeCell! -Continue to learn more about exported variables and Reactivity. \ No newline at end of file +Continue to learn more about exported variables and Reactivity. diff --git a/packages/editor/public/_docs/manual/3. Reactive variables.md b/packages/editor/public/_docs/manual/3. Reactive variables.md index e69de29bb..3209a3184 100644 --- a/packages/editor/public/_docs/manual/3. Reactive variables.md +++ b/packages/editor/public/_docs/manual/3. Reactive variables.md @@ -0,0 +1,30 @@ +# Reactive variables + +This is where things get interesting! Your code can reference variables exported by other cells. + +Code cells in TypeCell (re)evaluate when: + +- The code of the cell changes (i.e.: you're editing the code) +- A variable the cell depends upon updates + +## The `$` variable + +Exports of cells are available under the `$` variable. Have a look at the example below, and change the `name` variable to your own name. Notice how the greeting in the cell below updates automatically. + +```typescript +export let name = "Anonymous coder"; +``` + +```typescript +export let greeting = ( +
+ Hello, {$.name}! +
+); +``` + +Tip: type `$.` in a TypeScript cell, and the editor (Intellisense) will display a list of all exported variables you can reference. + +## Interactive Tutorial + +The Reactive model of TypeCell is quite powerful. If you haven't already, follow the [interactive introduction](/docs/interactive-introduction.md) or have a look at the [demos](/docs/demos.md) to get some hands-on experience. diff --git a/packages/editor/public/_docs/manual/5. Imports and NPM.md b/packages/editor/public/_docs/manual/5. Imports and NPM.md index e69de29bb..3be44edc8 100644 --- a/packages/editor/public/_docs/manual/5. Imports and NPM.md +++ b/packages/editor/public/_docs/manual/5. Imports and NPM.md @@ -0,0 +1,54 @@ +# Imports & NPM + +TypeCell supports importing code from NPM, or from other TypeCell documents. + +## Importing other notebooks + +You can split your code into multiple notebooks. +This is a great way to create reusable components that you can use across notebooks, or even share with the community. + +`import * as myNotebook from "!@username/notebook";` + +See this example, where we import a message from an external notebook [`@yousef/demo-message`](https://www.typecell.org/@yousef/demo-message). + +```typescript +import * as myNotebook from "!@yousef/demo-message"; + +export default myNotebook.message; +``` + +**TypeCell documents are designed to be as "live" as possible**: when you change the code of your imported notebook, +the notebook that imports the code will update live, as-you-type. + +## NPM + +In TypeCell, you can also use any library from [NPM](https://www.npmjs.com/). Simply import the library in a TypeScript cell, and we'll try to resolve it (including TypeScript types) automatically. + +### Example + +Let's use the [canvas-confetti](https://www.npmjs.com/package/canvas-confetti) library to make it rain confetti! + +```typescript +import { create } from "canvas-confetti"; + +export const canvas = document.createElement("canvas"); +canvas.width = 200; +canvas.height = 100; + +const myConfetti = create(canvas); + +// Drop some confetty every 500ms +setInterval(() => myConfetti({ particleCount: 70, origin: { y: 0 } }), 500); +``` + +### Compatibility + +Libraries are loaded in your browser via [Skypack](https://www.skypack.dev/). +Skypack support is best for modern libraries with ESM support, but not all NPM libraries are compatible. + +NPM imports are work in progress. Can't get a library to work? Let us know on [Discord](https://discord.gg/TcJ9TRC3SV) or [Matrix](https://matrix.to/#/#typecell-space:matrix.org)! + +#### TypeScript + +When available, TypeCell tries to automatically resolve types for your library. +Some libraries don't ship with TypeScript types. In this case, an error might appear, but the library can still work. diff --git a/packages/editor/public/index.html b/packages/editor/public/index.html index a67e6d946..27c000f08 100644 --- a/packages/editor/public/index.html +++ b/packages/editor/public/index.html @@ -43,7 +43,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - TypeCell Notebooks + TypeCell diff --git a/packages/editor/src/app/documentRenderers/DocumentView.tsx b/packages/editor/src/app/documentRenderers/DocumentView.tsx index 01fcba6db..3f8fea4ed 100644 --- a/packages/editor/src/app/documentRenderers/DocumentView.tsx +++ b/packages/editor/src/app/documentRenderers/DocumentView.tsx @@ -14,7 +14,6 @@ import styles from "./DocumentView.module.css"; import ProfileResource from "../../store/ProfileResource"; import { SessionStore } from "../../store/local/SessionStore"; import { DocumentMenu } from "../main/components/documentMenu/DocumentMenu"; -import { MenuBar } from "../main/components/menuBar/MenuBar"; import ProfileRenderer from "./profile/ProfileRenderer"; import ProjectContainer from "./project/ProjectContainer"; @@ -94,10 +93,9 @@ const DocumentView = observer((props: Props) => { return (
{!props.hideDocumentMenu && ( - -
- {/* TODO */} -
+ )} = observer((props) => { - return
Hello {props.profile.title}
; + return ( +
+

Hello {props.profile.title}

+

Workspaces

+
+ ); }); export default ProfileRenderer; diff --git a/packages/editor/src/app/documentRenderers/project/ProjectContainer.tsx b/packages/editor/src/app/documentRenderers/project/ProjectContainer.tsx index 008d3b622..ba13bb159 100644 --- a/packages/editor/src/app/documentRenderers/project/ProjectContainer.tsx +++ b/packages/editor/src/app/documentRenderers/project/ProjectContainer.tsx @@ -15,7 +15,11 @@ import ProjectResource from "../../../store/ProjectResource"; import { SessionStore } from "../../../store/local/SessionStore"; import { ChildReference } from "@typecell-org/shared"; +import { uri } from "vscode-lib"; +import { HttpsIdentifier } from "../../../identifiers/HttpsIdentifier"; +import { TypeCellIdentifier } from "../../../identifiers/TypeCellIdentifier"; import styles from "./ProjectContainer.module.css"; +import FolderView from "./directoryNavigation/FolderView"; import SidebarTree from "./directoryNavigation/SidebarTree"; type Props = { @@ -71,7 +75,7 @@ function docToTreeItem( id: doc.id, identifier: doc.identifier, allChildren: children.map((c) => c.target), - title: doc.type === "!notebook" ? doc.doc.title : "", + title: doc.type === "!richtext" ? doc.doc.title : doc.title, }, }; @@ -141,13 +145,6 @@ const ProjectContainer = observer((props: Props) => { navigate({ pathname: "/" + path, }); - - // ret.doc.cellList.addCell(0, "markdown", "# " + obj.title); - // ret.doc.cellList.addCell( - // 1, - // "typescript", - // `export let message = "Hello World"` - // ); }; const onClick = (identifier: Identifier) => { @@ -158,104 +155,113 @@ const ProjectContainer = observer((props: Props) => { }); }; - // let defaultFile = files.find((f) => f === "README.md"); - // let defaultFileContent = <>; - // if (defaultFile) { - // // TODO: cleanup? - // // Directory listing with a default file - // let idTemp = parseIdentifier(props.project.identifier.uri.toString()); - // idTemp.subPath = defaultFile; - // let documentIdentifier = parseIdentifier( - // idTemp.fullUriOfSubPath()!.toString() - // ); - // defaultFileContent = ( - // - // ); - // } - if (props.isNested) { + // nested, no sidebar return (
- {/* */} + { + let path = identifiersToPath([ + props.project.identifier, + item.data.identifier, + ]); + + if (item.data.identifier instanceof HttpsIdentifier) { + // TODO: hardcoded fix for docs + path = identifiersToPath([ + new HttpsIdentifier( + uri.URI.parse("http://" + window.location.host + "/_docs/") + ), + // props.project.identifier, + item.data.identifier, + ]); + } + navigate({ + pathname: "/" + path, + }); + }} + tree={tree} + />
{/* {defaultFileContent} */}
); - } else { - const userIsOwner = [ - ...(props.sessionStore.profile?.workspaces.values() || []), - ].includes(props.project.identifier.toString()); - return ( -
- - console.log("onExpand", state) - } - onLeftSidebarCollapse={(state: LeftSidebarState) => - console.log("onCollapse", state) - }> - - - console.log("onResizeStart", state) - } - onResizeEnd={(state: LeftSidebarState) => - console.log("onResizeEnd", state) - } - onFlyoutExpand={() => console.log("onFlyoutExpand")} - onFlyoutCollapse={() => console.log("onFlyoutCollapse")} - // overrides={{ - // ResizeButton: { - // render: (Component, props) => ( - - // // - // - // // - // ), - // }, - // }} - > -
- -
-
- {/*
+ } + const userIsOwner = [ + ...(props.sessionStore.profile?.workspaces.values() || []), + ].includes(props.project.identifier.toString()); + + const enableAddPages = props.project.identifier instanceof TypeCellIdentifier; + + return ( +
+ + console.log("onExpand", state) + } + onLeftSidebarCollapse={(state: LeftSidebarState) => + console.log("onCollapse", state) + }> + + + console.log("onResizeStart", state) + } + onResizeEnd={(state: LeftSidebarState) => + console.log("onResizeEnd", state) + } + onFlyoutExpand={() => console.log("onFlyoutExpand")} + onFlyoutCollapse={() => console.log("onFlyoutCollapse")} + // overrides={{ + // ResizeButton: { + // render: (Component, props) => ( + + // // + // + // // + // ), + // }, + // }} + > +
+ +
+
+ {/*
*/} - {/* {defaultFileContent} */} -
- {props.children} - {/* + {props.children} + + {/* */} -
-
-
-
- ); - } +
+
+
+
+ ); }); export default ProjectContainer; diff --git a/packages/editor/src/app/documentRenderers/project/ProjectRenderer.tsx b/packages/editor/src/app/documentRenderers/project/ProjectRenderer.tsx index b81045fb5..d25de2001 100644 --- a/packages/editor/src/app/documentRenderers/project/ProjectRenderer.tsx +++ b/packages/editor/src/app/documentRenderers/project/ProjectRenderer.tsx @@ -1,11 +1,15 @@ +import { ChildReference, IndexFileReference } from "@typecell-org/shared"; import { observer } from "mobx-react-lite"; import React from "react"; +import { parseIdentifier } from "../../../identifiers"; import { Identifier } from "../../../identifiers/Identifier"; import ProjectResource from "../../../store/ProjectResource"; import { SessionStore } from "../../../store/local/SessionStore"; import DocumentView from "../DocumentView"; import ProjectContainer from "./ProjectContainer"; +import EmptyState from "@atlaskit/empty-state"; + type Props = { project: ProjectResource; isNested?: boolean; @@ -13,57 +17,31 @@ type Props = { sessionStore: SessionStore; }; -// const NestedDocument = (props: { parent: Identifier }) => { -// const params = useParams(); -// const sub = params["*"] as string; - -// // const newIdStr = path.join(props.parent.toString(), "/:/", sub); -// const documentIdentifier = getIdentifierFromPath(sub, [props.parent]); -// // parseIdentifier(newIdStr).fullUriOfSubPath()!.toString() -// // ); -// // return
{sub}
; -// return ; +// const RootDirectory = () => { +// return
hello
; +// // const defaultDoc = (useOutletContext() as any)?.defaultFileContent as any; +// // return defaultDoc || <>; // }; -const RootDirectory = () => { - return
hello
; - // const defaultDoc = (useOutletContext() as any)?.defaultFileContent as any; - // return defaultDoc || <>; -}; - -// const Debug = (props: { children: any }) => { -// const params = useParams(); -// return ( -//
-//
params: {JSON.stringify(params)}
-// {props.children} -//
-// ); -// }; const ProjectRenderer: React.FC = observer((props) => { - // const fileSet = useRef(new ObservableSet()); - // const identifier = props.project.identifier; - // const path = useLocation(); - // const subPath = (useParams() as any).subPath; - // if (subPath) { - // throw new Error("unexpected"); - // } + let [childId, ...remainingIds] = props.subIdentifiers; + + if (!childId) { + const indexFile = props.project.getRefs(IndexFileReference); + if (indexFile.length) { + childId = parseIdentifier(indexFile[0].target); + remainingIds = []; + } + } + + if (!childId) { + const children = props.project.getRefs(ChildReference); + if (children.length) { + childId = parseIdentifier(children[0].target); + remainingIds = []; + } + } - // const identifiers = pathToIdentifiers(path.pathname.substring(1)); - // const idPath = getPathFromIdentifier(identifier); - // let matchedPath: string; - // let sep = ":/"; - // if (typeof idPath === "string") { - // matchedPath = idPath; - // } else { - // if (path.pathname.substring(1).startsWith(idPath.shorthand)) { - // matchedPath = idPath.shorthand; - // sep = "/"; - // } else { - // matchedPath = idPath.path; - // } - // } - const [childId, ...remainingIds] = props.subIdentifiers; return ( = observer((props) => { sessionStore={props.sessionStore} /> ) : ( - +
+ Request access} + // secondaryAction={} + // tertiaryAction={} + /> +
)}
- // - // }> - // } /> - // } /> - // - // ); }); diff --git a/packages/editor/src/app/documentRenderers/project/directoryNavigation/FolderView.tsx b/packages/editor/src/app/documentRenderers/project/directoryNavigation/FolderView.tsx index 5b2778952..9ed4c49cf 100644 --- a/packages/editor/src/app/documentRenderers/project/directoryNavigation/FolderView.tsx +++ b/packages/editor/src/app/documentRenderers/project/directoryNavigation/FolderView.tsx @@ -1,42 +1,80 @@ import Button from "@atlaskit/button"; +import { TreeData, TreeItem } from "@atlaskit/tree"; import { observer } from "mobx-react-lite"; -import React from "react"; +import { useEffect, useRef } from "react"; import { AiFillFolder } from "react-icons/ai"; import { VscFile } from "react-icons/vsc"; +import { DocConnection } from "../../../../store/DocConnection"; +import { SessionStore } from "../../../../store/local/SessionStore"; import styles from "./FolderView.module.css"; -import { TreeNode } from "./treeNodeUtil"; +// import { TreeNode } from "./treeNodeUtil"; export const ItemView = (props: { - file: TreeNode; - onClick: (item: string) => void; + file: TreeItem; + onClick: (item: TreeItem) => void; }) => { const onClick = () => { - props.onClick(props.file.fileName); + props.onClick(props.file); }; return ( ); }; export const FolderView = observer( - (props: { tree: TreeNode[]; onClick: (item: string) => void }) => { + (props: { + tree: TreeData; + sessionStore: SessionStore; + onClick: (item: TreeItem) => void; + }) => { + const { sessionStore, tree } = props; + const cache = useRef(new Map()); + + useEffect(() => { + const itemsToLoad = new Set(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + tree.items[tree.rootId].data.allChildren.forEach((child: any) => { + itemsToLoad.add(child as string); + }); + + // clear items from cache if not in itemsToLoad + for (const [key, item] of cache.current.entries()) { + if (!itemsToLoad.has(key)) { + item.dispose(); + cache.current.delete(key); + } + } + + // load items + for (const key of itemsToLoad) { + if (!cache.current.has(key)) { + const item = DocConnection.load(key, sessionStore); + cache.current.set(key, item); + } + } + }, [tree, sessionStore]); + return (
- {props.tree.map((file) => ( - + {props.tree.items[props.tree.rootId].children.map((file) => ( + ))}
); diff --git a/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.tsx b/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.tsx index 309e15184..1c0444f87 100644 --- a/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.tsx +++ b/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.tsx @@ -25,7 +25,7 @@ import styles from "./SidebarTree.module.css"; const RenderItem = ( onClick: (item: Identifier) => void, - onAddChild: (parentId: string) => void + onAddChild: ((parentId: string) => void) | false ) => ({ item, onExpand, onCollapse, provided, depth }: RenderItemParams) => { // const doc = DocConnection.get(item.data.identifier)?.tryDoc; @@ -50,6 +50,9 @@ const RenderItem = }; const onAddClick = (e: React.MouseEvent) => { + if (!onAddChild) { + throw new Error("unexpected"); + } e.stopPropagation(); onExpand(item.id); onAddChild(item.data.identifier); @@ -84,11 +87,13 @@ const RenderItem = title="" /> )} - + {onAddChild && ( + + )} } iconBefore={ @@ -131,8 +136,9 @@ export const SidebarTree = observer( (props: { tree: TreeData; onClick: (item: Identifier) => void; - onAddNewPage: (parent?: string) => Promise; + onAddNewPage: ((parent?: string) => Promise) | false; enableAddRootPage: boolean; + enableDrag: boolean; sessionStore: SessionStore; }) => { const { sessionStore, tree } = props; @@ -248,6 +254,8 @@ export const SidebarTree = observer( // }); }; + const onAddNewPage = props.onAddNewPage; + return ( <> {}} onDragEnd={onDragEnd} offsetPerLevel={17} - isDragEnabled + isDragEnabled={props.enableDrag} isNestingEnabled /> - {props.enableAddRootPage && ( + {props.enableAddRootPage && onAddNewPage && ( diff --git a/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeDataUtil.ts b/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeDataUtil.ts deleted file mode 100644 index 243a2f81c..000000000 --- a/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeDataUtil.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { TreeData } from "@atlaskit/tree"; -import { TreeNode } from "./treeNodeUtil"; - -/** - * Convert a TreeNode[] tree to Atlaskit TreeData format - */ -export function treeToTreeData(tree: TreeNode[]) { - // tree.sort(sortTreeItems); - const ret: TreeData = { - rootId: "root", - items: { - root: { - id: "root", - children: tree.map((t) => t.fileName), - hasChildren: true, - isExpanded: true, - isChildrenLoading: false, - data: { - title: "root", - }, - }, - }, - }; - - function processTree(parent: string, tree: TreeNode[]) { - for (const child of tree) { - // child.children.sort(sortTreeItems); - const fullName = parent + child.fileName; - ret.items[fullName] = { - id: fullName, - children: child.children.map((t) => fullName + "/" + t.fileName), - hasChildren: child.children.length ? true : false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: child.fileName, - path: fullName, - }, - }; - processTree(fullName + "/", child.children); - } - } - processTree("", tree); - // console.log(ret); - return ret; -} - -/* -Example atlaskit treedata: - -export const tree: TreeData = { - rootId: "1", - items: { - "1": { - id: "1", - children: ["1-1", "1-2"], - hasChildren: true, - isExpanded: true, - isChildrenLoading: false, - data: { - title: "root", - }, - }, - "1-1": { - id: "1-1", - children: ["1-1-1", "1-1-2"], - hasChildren: true, - isExpanded: true, - isChildrenLoading: false, - data: { - title: "First parent", - }, - }, - "1-2": { - id: "1-2", - children: ["1-2-1", "1-2-2"], - hasChildren: true, - isExpanded: true, - isChildrenLoading: false, - data: { - title: "Second parent", - }, - }, - "1-1-1": { - id: "1-1-1", - children: [], - hasChildren: false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: "Child one", - }, - }, - "1-1-2": { - id: "1-1-2", - children: [], - hasChildren: false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: "Child two", - }, - }, - "1-2-1": { - id: "1-2-1", - children: [], - hasChildren: false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: "Child three", - }, - }, - "1-2-2": { - id: "1-2-2", - children: [], - hasChildren: false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: "Child four", - }, - }, - }, -};*/ diff --git a/packages/editor/src/app/main/Main.module.css b/packages/editor/src/app/main/Main.module.css index 31401a83e..52d5daeab 100644 --- a/packages/editor/src/app/main/Main.module.css +++ b/packages/editor/src/app/main/Main.module.css @@ -22,26 +22,38 @@ rgba(0, 255, 255, 0) 400px, rgba(255, 255, 255, 1) 700px ), - radial-gradient(circle at 15% 35%, #dbe4ff, rgba(255, 255, 255, 0) 25%), + radial-gradient(circle at 15% 35%, #4caf7e33, rgba(255, 255, 255, 0) 25%), radial-gradient(circle at 85% 20%, #e3fafc, rgba(255, 255, 255, 0) 25%), white; background-repeat: no-repeat; } -.main.homepage > header { +.main.homepage > header[role="banner"] { + /* background: white !important; */ + transition: 0.2s ease !important; + transition-property: background-color, backdrop-filter !important; + backdrop-filter: blur(6px) !important; + background-color: #fffc !important; + + position: fixed; + width: 100%; + z-index: 100000; +} + +.main.homepage.top > header[role="banner"] { background: none !important; } .main.ai header div { - display:none; + display: none; } .main.ai nav div { - display:none; + display: none; } .main.ai nav span { - display:none; + display: none; } .main { @@ -51,7 +63,7 @@ align-items: stretch; } .main > header { - z-index: 10000000; + /* z-index: 10000000; */ /* border-bottom: 1px solid rgb(239, 241, 244); */ /* border-bottom: linear-gradient( 90deg, @@ -59,6 +71,7 @@ rgba(255, 255, 255, 0.7) 50%, rgba(255, 255, 255, 1) 100% ); */ + z-index: 10000; } /* Page wrapper styles */ diff --git a/packages/editor/src/app/main/Main.tsx b/packages/editor/src/app/main/Main.tsx index 62adf5db8..24a7629d8 100644 --- a/packages/editor/src/app/main/Main.tsx +++ b/packages/editor/src/app/main/Main.tsx @@ -1,4 +1,6 @@ +import classNames from "classnames"; import { observer } from "mobx-react-lite"; +import { useCallback, useEffect, useState } from "react"; import { DndProvider } from "react-dnd"; import { HTML5Backend } from "react-dnd-html5-backend"; import { Outlet, useLocation } from "react-router-dom"; @@ -11,28 +13,41 @@ const Main = observer((props: { sessionStore: SessionStore }) => { const location = useLocation(); // const navigate = useNavigate(); + const [top, setTop] = useState(true); + + const controlNavbar = useCallback(() => { + if (typeof window !== "undefined") { + if (window.scrollY > 0) { + setTop(false); + } else { + setTop(true); + } + } + }, []); + + useEffect(() => { + if (typeof window !== "undefined") { + window.addEventListener("scroll", controlNavbar); + + // cleanup function + return () => { + window.removeEventListener("scroll", controlNavbar); + }; + } + }, [controlNavbar]); + return (
+ className={classNames( + styles.main, + top && styles.top, + (location.pathname === "/" || location.pathname === "/ai") && + styles.homepage, + location.pathname === "/ai" && styles.ai + )}> - {/* {props.sessionStore.loggedInUserId && ( - CloseNewPageDialog(navigate)} - isOpen={IsNewPageDialogOpen(location)} - /> - )} */}
); diff --git a/packages/editor/src/app/main/components/Navigation.tsx b/packages/editor/src/app/main/components/Navigation.tsx index d92b11222..e2f563d8d 100644 --- a/packages/editor/src/app/main/components/Navigation.tsx +++ b/packages/editor/src/app/main/components/Navigation.tsx @@ -16,7 +16,7 @@ const ProductHome = () => { return ( <> - Alpha preview + {/* beta */}
); diff --git a/packages/editor/src/app/main/components/ProfilePopup.tsx b/packages/editor/src/app/main/components/ProfilePopup.tsx index 9dd9ae558..8a73cb825 100644 --- a/packages/editor/src/app/main/components/ProfilePopup.tsx +++ b/packages/editor/src/app/main/components/ProfilePopup.tsx @@ -5,11 +5,13 @@ import DropdownMenu, { } from "@atlaskit/dropdown-menu"; import { observer } from "mobx-react-lite"; import Avatar from "react-avatar"; +import { useNavigate } from "react-router-dom"; import { SessionStore } from "../../../store/local/SessionStore"; +import { toProfilePage } from "../../routes/routes"; export const ProfilePopup = observer( (props: { sessionStore: SessionStore }) => { - // const navigate = useNavigate(); + const navigate = useNavigate(); /* TODO: props.authStore.user!.firebase.photoURL! */ return ( @@ -42,8 +44,13 @@ export const ProfilePopup = observer( {/* @${props.authStore.user?.username} */} - Profile - Account settings + { + navigate(toProfilePage("@" + props.sessionStore.loggedInUserId)); + }}> + Profile + + {/* Account settings */} Sign out diff --git a/packages/editor/src/app/main/components/documentMenu/Breadcrumb.tsx b/packages/editor/src/app/main/components/documentMenu/Breadcrumb.tsx index d7c97fb92..c64855aa5 100644 --- a/packages/editor/src/app/main/components/documentMenu/Breadcrumb.tsx +++ b/packages/editor/src/app/main/components/documentMenu/Breadcrumb.tsx @@ -21,12 +21,13 @@ function getTitleForIdentifier( if (doc) { switch (doc.tryDoc?.type) { case "!project": - // TODO - return "public workspace"; + return doc.tryDoc.title || "Untitled"; + // return "public workspace"; case "!profile": // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return doc.tryDoc!.getSpecificType(ProfileResource).title; case "!notebook": + case "!richtext": case "!document": // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return doc.tryDoc!.doc.title || "Untitled"; diff --git a/packages/editor/src/app/main/components/documentMenu/DocumentMenu.tsx b/packages/editor/src/app/main/components/documentMenu/DocumentMenu.tsx index f6a98e19f..a00b1d71a 100644 --- a/packages/editor/src/app/main/components/documentMenu/DocumentMenu.tsx +++ b/packages/editor/src/app/main/components/documentMenu/DocumentMenu.tsx @@ -18,7 +18,9 @@ import { } from "../../../routes/routes"; import { MenuBar } from "../menuBar/MenuBar"; +import { HttpsIdentifier } from "../../../../identifiers/HttpsIdentifier"; import { TypeCellIdentifier } from "../../../../identifiers/TypeCellIdentifier"; +import ProjectResource from "../../../../store/ProjectResource"; import { SupabaseSessionStore } from "../../../supabase-auth/SupabaseSessionStore"; import SupabasePermissionsDialog from "../../../supabase-auth/routes/permissions/PermissionsDialog"; import { Breadcrumb } from "./Breadcrumb"; @@ -27,7 +29,7 @@ import { ForkAlert } from "./ForkAlert"; import { ShareButton } from "./ShareButton"; type Props = { - document: DocumentResource; + document: DocumentResource | ProjectResource; sessionStore: SessionStore; }; @@ -36,6 +38,9 @@ function userCanEditPermissions( sessionStore: SessionStore, identifier: Identifier ) { + if (identifier instanceof HttpsIdentifier) { + return false; + } if (identifier && identifier instanceof MatrixIdentifier) { return sessionStore.loggedInUserId === identifier.owner; } @@ -56,30 +61,33 @@ export const DocumentMenu: React.FC = observer((props) => { const location = useLocation(); const navigate = useNavigate(); - let permissionsArea: React.ReactElement; - if ( - props.document.identifier instanceof TypeCellIdentifier && - sessionStore instanceof SupabaseSessionStore - ) { - permissionsArea = ( - ClosePermissionsDialog(navigate)} - isOpen={IsPermissionsDialogOpen(location)} - identifier={props.document.identifier} - sessionStore={sessionStore} - /> - ); - } else { - throw new Error("unexpected types"); + let permissionsArea: React.ReactElement = <>; + if (canEditPermissions) { + if ( + props.document.identifier instanceof TypeCellIdentifier && + sessionStore instanceof SupabaseSessionStore + ) { + permissionsArea = ( + ClosePermissionsDialog(navigate)} + isOpen={IsPermissionsDialogOpen(location)} + identifier={props.document.identifier} + sessionStore={sessionStore} + /> + ); + } else { + throw new Error("unexpected types"); + } } return ( - {props.document.needsFork && ( - - )} + {props.document.needsFork && + props.document instanceof DocumentResource && ( + + )}
)} placement="bottom-end"> - openAsMarkdown(props.document.doc)}> - Export as markdown - + {props.document instanceof DocumentResource && ( + openAsMarkdown(props.document.doc)}> + Export as markdown + + )} {canEditPermissions && ( OpenPermissionsDialog(navigate)}> Permissions diff --git a/packages/editor/src/app/main/components/startscreen/StartScreen.module.css b/packages/editor/src/app/main/components/startscreen/StartScreen.module.css index a62097fc6..78ebe7546 100644 --- a/packages/editor/src/app/main/components/startscreen/StartScreen.module.css +++ b/packages/editor/src/app/main/components/startscreen/StartScreen.module.css @@ -74,7 +74,8 @@ } .perks { - max-width: 1200px; + font-size: 16px; + max-width: var(--content-max-width); margin: 0 auto; /* padding: 4em 0; */ /* position: relative; */ @@ -85,7 +86,7 @@ flex: 0 0 auto; gap: 20px; grid-auto-rows: min-content; - grid-template-columns: repeat(3, minmax(200px, 1fr)); + grid-template-columns: repeat(4, minmax(200px, 1fr)); grid-template-rows: repeat(2, min-content); justify-content: center; } @@ -103,19 +104,25 @@ flex: 0 0 auto; place-self: start; text-align: left; - padding: 40px; - box-shadow: rgb(0 0 0 / 25%) 0px 10px 30px -20px; + padding: 30px; + box-shadow: rgb(0 0 0 / 25%) 0px 1px 3px -2px; + border-radius: 20px; border: 1px solid rgba(0, 0, 0, 0.08); width: 100%; height: 100%; position: relative; + transition: box-shadow 0.16s ease; +} + +.perks .perk:hover { + box-shadow: rgb(0 0 0 / 25%) 0px 10px 30px -20px; } .perk h3 { font-weight: 600; margin: 0.5em 0; - font-size: 1.8em; + font-size: 1.3em; } .perks .perk .icon { @@ -187,8 +194,8 @@ } form { -margin: 0; -display: contents; + margin: 0; + display: contents; } button { @@ -325,3 +332,232 @@ button { padding: 3em 1em; } } + +:root { + --content-max-width: 1480px; +} + +.header { + position: relative; + display: flex; + gap: 84px; + width: var(--content-max-width); + max-width: 100%; + margin: 0 auto 52px; + padding: 0 52px; + padding-top: 226px; +} + +@media (max-width: 1280px) { + .header { + gap: 64px; + padding-right: 32px; + } +} +@media (max-width: 1024px) { + .header { + flex-direction: column; + align-items: center; + padding-top: 150px; + } +} +@media (max-width: 500px) { + .header { + padding: 0 12px; + } +} + +.headerContent { + flex: 1.2; + position: relative; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: 32px; +} + +@media (max-width: 1024px) { + .headerContent { + align-items: center; + } +} + +.headerMedia { + display: flex; + flex-direction: column; + /* transform: translateY(-80px); */ + max-width: 696px; + width: 100%; +} + +@media (max-width: 1460px) { + .headerMedia { + width: 44%; + } +} +@media (max-width: 1280px) { + .headerMedia { + width: 48%; + } +} +@media (max-width: 1024px) { + .headerMedia { + width: 100%; + transform: translateY(0); + } +} + +@media only screen and (hover: none) and (pointer: coarse) { + .headerMedia { + display: none; /* disable on mobile */ + } +} + +.header .icon { + width: 160px; + height: 160px; + /* color: var(--sb-foreground-highlight); */ + /* -webkit-mask-image: $icon-mask; + mask-image: $icon-mask; + + @media (prefers-contrast: more) { + display: none; + } + + @media (min-width: $bp-medium) { + width: 200px; + height: 200px; + } */ +} + +.header h1 { + margin-bottom: 0; + font-family: Gilroy, var(--vp-font-family-base); + line-height: 1.2; + font-weight: 400; + margin-top: -25px; + font-size: 76px; + letter-spacing: -2px; + line-height: 1; + color: #000; + :root.dark & { + color: #fff; + } + + strong { + font-weight: 600; + } +} + +@media (max-width: 1400px) { + .header h1 { + font-size: 68px; + } +} +@media (max-width: 1280px) { + .header h1 { + font-size: 60px; + } +} +@media (max-width: 1024px) { + .header h1 { + text-align: center; + } +} +@media (max-width: 960px) { + .header h1 { + font-size: 40px; + } +} + +.header p { + max-width: 600px; + margin: 0.75em 0 1.5em; + font-size: 18px; + font-weight: 500; + line-height: 1.6; +} + +@media (max-width: 1280px) { + .header p { + font-size: 16px; + } +} +@media (max-width: 1024px) { + .header p { + margin-bottom: 12px; + text-align: center; + } +} +@media (max-width: 960px) { + .header p { + font-size: 16px; + } +} + +.ctaButtons { + --vp-c-text-light-1: rgba(60, 60, 67); + --vp-c-text-light-2: rgba(60, 60, 67, 0.75); + --vp-c-text-light-3: rgba(60, 60, 67, 0.33); + --vp-c-text-1: var(--vp-c-text-light-1); + --vp-c-text-2: var(--vp-c-text-light-2); + --vp-c-text-3: var(--vp-c-text-light-3); + --vp-c-brand: hsl(200 80% 38%); + --vp-c-brand-light: hsl(195 85% 42%); + --vp-c-brand-lighter: hsl(190 90% 48%); + display: flex; + gap: 16px; + width: 100%; +} + +@media (max-width: 1024px) { + .ctaButtons { + justify-content: center; + } +} + +.ctaButtons a { + --border-thickness: 1px; + display: flex; + align-items: center; + justify-content: center; + height: 72px; + width: min(100%, 300px); + padding: 4px 8px; + border-radius: 38px; + line-height: 1.4; + font-size: 15px; + font-weight: 700; + color: var(--vp-c-text-1); + --border-thickness: 2px; + box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.1), + inset 0 0 0 var(--border-thickness) var(--vp-c-text-1); + backdrop-filter: blur(4px); + transition: 0.16s ease; + transition-property: background-color, border-color, box-shadow, color, + transform; +} + +.ctaButtons a:hover { + --border-thickness: 1px; + background-color: #fff; + box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.1), + inset 0 0 0 var(--border-thickness) var(--vp-c-brand-lighter), + 0 0 24px -10px var(--vp-c-brand-lighter); + transform: translateY(-2px); + text-decoration: none; + color: var(--vp-c-text-1); +} +.ctaButtons a.simple { + width: min(100%, 200px); + text-underline-offset: 2px; + box-shadow: none !important; + text-decoration: underline; + background-color: transparent !important; + backdrop-filter: none; +} + +.ctaButtons a.simple:hover { + color: var(--vp-c-brand); +} diff --git a/packages/editor/src/app/main/components/startscreen/StartScreen.tsx b/packages/editor/src/app/main/components/startscreen/StartScreen.tsx index 19daa26c8..dc30e45f7 100644 --- a/packages/editor/src/app/main/components/startscreen/StartScreen.tsx +++ b/packages/editor/src/app/main/components/startscreen/StartScreen.tsx @@ -43,17 +43,38 @@ export const StartScreen = observer((props: { sessionStore: SessionStore }) => { return ( <> +
+
+

+ Interactive documents. Reimagined. +
+

+ {/* */} +

+ TypeCell is a fresh take on what documents and software can look + like. Think Notion + Jupyter Notebooks. Open Source. +

+
+ Try interactive tutorial + + Create new notebook + + {/* Create your workspace (beta) */} + {/* */} +
+
+
+
+ TypeCell Demo +
+
+
-
- {/*
- - Star - -
*/} + {/*

Create & share live interactive notebooks

@@ -80,7 +101,7 @@ export const StartScreen = observer((props: { sessionStore: SessionStore }) => { TypeCell Demo
-
+
*/}
diff --git a/packages/editor/src/app/routes/URLUpdater.tsx b/packages/editor/src/app/routes/URLUpdater.tsx new file mode 100644 index 000000000..ebd5b8d59 --- /dev/null +++ b/packages/editor/src/app/routes/URLUpdater.tsx @@ -0,0 +1,49 @@ +import { observer } from "mobx-react-lite"; +import { useEffect } from "react"; +import { Identifier } from "../../identifiers/Identifier"; +import { TypeCellIdentifier } from "../../identifiers/TypeCellIdentifier"; +import { DocConnection } from "../../store/DocConnection"; +import { SessionStore } from "../../store/local/SessionStore"; +import { slug } from "../../util/slug"; + +// This updates the url in the address bar based on the document title +// The ideal solution would probably be closer integrated to routing / identifiers, +// but this works for now +export const URLUpdater = observer( + (props: { identifiers: Identifier[]; sessionStore: SessionStore }) => { + const lastIdentifier = props.identifiers[props.identifiers.length - 1]; + const connection = DocConnection.get(lastIdentifier, props.sessionStore); + + let title: string | undefined; + let titleSet = false; + if ( + lastIdentifier instanceof TypeCellIdentifier && + connection?.tryDoc?.type === "!richtext" + ) { + title = connection.tryDoc.doc.title; + titleSet = true; + } + + useEffect(() => { + if (!titleSet) { + return; + } + if (!(lastIdentifier instanceof TypeCellIdentifier)) { + throw new Error("not expected"); + } + + const slugged = slug(title || ""); + const newPath = slugged.length + ? "/" + slugged + "~" + lastIdentifier.documentId + : "/" + lastIdentifier.documentId; + const url = window.location.href.replace( + new RegExp("/([^/]*~)?" + lastIdentifier.documentId), + newPath + ); + // console.log("title change", title, url); + window.history.replaceState(window.history.state, "", url); + }, [title, lastIdentifier, titleSet]); + + return null; + } +); diff --git a/packages/editor/src/app/routes/document.tsx b/packages/editor/src/app/routes/document.tsx index d1eea4102..dc1a0d9b4 100644 --- a/packages/editor/src/app/routes/document.tsx +++ b/packages/editor/src/app/routes/document.tsx @@ -5,6 +5,7 @@ import { SessionStore } from "../../store/local/SessionStore"; import DocumentView from "../documentRenderers/DocumentView"; import { SupabaseSessionStore } from "../supabase-auth/SupabaseSessionStore"; import { RouteContext } from "./RouteContext"; +import { URLUpdater } from "./URLUpdater"; import { OwnerAliasRoute } from "./ownerAlias"; export const DocumentRoute = observer( @@ -28,12 +29,17 @@ export const DocumentRoute = observer( if (!owner || owner.length < 2 || !owner.startsWith("@")) { const identifiers = tryPathToIdentifiers(location.pathname.substring(1)); if (identifiers !== "invalid-identifier") { + const [id, ...subs] = identifiers; return ( + diff --git a/packages/editor/src/app/routes/ownerAlias.tsx b/packages/editor/src/app/routes/ownerAlias.tsx index 78e36789d..dc499359f 100644 --- a/packages/editor/src/app/routes/ownerAlias.tsx +++ b/packages/editor/src/app/routes/ownerAlias.tsx @@ -14,6 +14,7 @@ import { SessionStore } from "../../store/local/SessionStore"; import DocumentView from "../documentRenderers/DocumentView"; import { SupabaseSessionStore } from "../supabase-auth/SupabaseSessionStore"; import { RouteContext } from "./RouteContext"; +import { URLUpdater } from "./URLUpdater"; type Props = { owner: string; @@ -203,10 +204,12 @@ export const OwnerAliasRoute = observer( ); } - const [id, ...subs] = pathToIdentifiers(location.pathname.substring(1)); + const identifiers = pathToIdentifiers(location.pathname.substring(1)); + const [id, ...subs] = identifiers; return ( + = { - // docs: "http:" + window.location.hostname + "/_docs/", + docs: window.location.protocol + window.location.host + "/_docs/", // docs: "fs:localhost:3001", - docs: "http:localhost/_docs/", + // docs: "http:localhost/_docs/", }; private readonly reverseShortHands = Object.entries(this.shortHands).reduce( @@ -211,9 +210,13 @@ export function getIdentifierWithAppendedPath( pathToAppend: string ): Identifier { const uri = identifier.uri.with({ - path: path.join(identifier.uri.path || "/", pathToAppend), + path: path.join( + identifier.uri.path || "/", + encodeURIComponent(pathToAppend) + ), }); - return new FileIdentifier(uri); + + return parseUriIdentifier(uri); } /** @@ -227,6 +230,10 @@ export function parseFullIdentifierString( const parsedUri = uri.URI.parse(identifierString); + return parseUriIdentifier(parsedUri); +} + +function parseUriIdentifier(parsedUri: uri.URI) { const identifierType = registeredIdentifiers.get(parsedUri.scheme); if (!identifierType) { throw new Error("identifier not found"); diff --git a/packages/editor/src/integrations/markdown/import.ts b/packages/editor/src/integrations/markdown/import.ts index 0b893c6b5..8bb881496 100644 --- a/packages/editor/src/integrations/markdown/import.ts +++ b/packages/editor/src/integrations/markdown/import.ts @@ -1,6 +1,12 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { + BlockNoteEditor, + createTipTapBlock, + defaultBlockSchema, +} from "@blocknote/core"; +import { mergeAttributes } from "@tiptap/core"; import * as parsers from "@typecell-org/parsers"; import { uniqueId } from "@typecell-org/util"; - import * as Y from "yjs"; export function markdownToXmlFragment( @@ -31,12 +37,42 @@ export function markdownToXmlFragment( return fragment; } -export function markdownToYDoc(markdown: string, title?: string) { +export async function markdownToYDoc(markdown: string, title?: string) { const newDoc = new Y.Doc(); - newDoc.getMap("meta").set("type", "!notebook"); + newDoc.getMap("meta").set("type", "!richtext"); const xml = newDoc.getXmlFragment("doc"); - markdownToXmlFragment(markdown, xml); + + const editor = new BlockNoteEditor({ + blockSchema: { + ...defaultBlockSchema, + codeblock: { + propSchema: { + language: { + type: "string", + default: "typescript", + }, + }, + node: MonacoBlockContent, + }, + }, + collaboration: { + fragment: xml, + provider: undefined as any, + user: undefined as any, + }, + initialContent: [ + { + id: "sdfsdf", + type: "paragraph", + }, + ], + }); + + const blocks = await editor.markdownToBlocks(markdown); + editor.replaceBlocks(editor.topLevelBlocks, blocks); + + // markdownToXmlFragment(markdown, xml); if (title) { newDoc.getMap("meta").set("title", title); @@ -44,5 +80,50 @@ export function markdownToYDoc(markdown: string, title?: string) { // newDoc.getText("title").insert(0, title); } + // debugger; return newDoc; } + +// hacky +export const MonacoBlockContent = createTipTapBlock({ + name: "codeblock", + content: "inline*", + editable: true, + selectable: true, + whitespace: "pre", + code: true, + + addAttributes() { + return { + language: { + default: "typescript", + parseHTML: (element) => element.getAttribute("data-language"), + renderHTML: (attributes) => { + return { + "data-language": attributes.language, + }; + }, + }, + }; + }, + + parseHTML() { + return [ + { + tag: "code", + priority: 200, + node: "codeblock", + }, + ]; + }, + + renderHTML({ HTMLAttributes }) { + return [ + "code", + mergeAttributes(HTMLAttributes, { + // class: styles.blockContent, + "data-content-type": this.name, + }), + ]; + }, +}); diff --git a/packages/editor/src/store/DocumentResource.ts b/packages/editor/src/store/DocumentResource.ts index 4f36a65ec..177940f14 100644 --- a/packages/editor/src/store/DocumentResource.ts +++ b/packages/editor/src/store/DocumentResource.ts @@ -28,7 +28,14 @@ export class DocumentResource extends BaseResource { return baseTitle; } - return "TODO"; + // navigate to block (via blockgroup / blockcontainer) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const firstBlock = (this.data.firstChild as any)?.firstChild?.firstChild; + if (firstBlock?.nodeName === "heading") { + return firstBlock.firstChild?.toString(); + } + + return undefined; // let cell = this.cells[0]; // if (!cell || cell.language !== "markdown") { // return undefined; diff --git a/packages/editor/src/store/yjs-sync/DocumentCoordinator.ts b/packages/editor/src/store/yjs-sync/DocumentCoordinator.ts index d8cdde355..02980e8ef 100644 --- a/packages/editor/src/store/yjs-sync/DocumentCoordinator.ts +++ b/packages/editor/src/store/yjs-sync/DocumentCoordinator.ts @@ -120,6 +120,37 @@ export class DocumentCoordinator extends lifecycle.Disposable { return ret; } + // hacky fix for docs / httpidentifier + public async clearIfNotChanged(identifier: Identifier) { + const idStr = identifier.toString(); + if (!this.indexedDBProvider.synced) { + throw new Error("not initialized"); + } + + // console.log("Coordinator load debug", idStr, this.userId); + if (this.loadedDocuments.has(idStr)) { + // we expect loadDocument only to be called once per document + throw new Error("loadDocument: document already loaded"); + } + + const meta = this.documents.get(idStr); + + if (!meta) { + return "not-found"; + } + + if (meta.needs_save_since) { + return "changed"; + } + + const doc = await this.loadDocument(identifier, new Y.Doc()); + if (doc === "not-found") { + throw new Error("unexpected: doc not found"); + } + await this.deleteLocal(identifier); + doc.ydoc.destroy(); + } + /** * Load a local document if we have it in local storage * Otherwise return "not-found" diff --git a/packages/editor/src/store/yjs-sync/SyncManager.ts b/packages/editor/src/store/yjs-sync/SyncManager.ts index aa9cdfa39..288510e97 100644 --- a/packages/editor/src/store/yjs-sync/SyncManager.ts +++ b/packages/editor/src/store/yjs-sync/SyncManager.ts @@ -17,7 +17,6 @@ import { MatrixIdentifier } from "../../identifiers/MatrixIdentifier"; import { TypeCellIdentifier } from "../../identifiers/TypeCellIdentifier"; import { LocalDoc } from "./DocumentCoordinator"; import FetchRemote from "./remote/FetchRemote"; -import { FilebridgeRemote } from "./remote/FilebridgeRemote"; // import { MatrixRemote } from "./remote/MatrixRemote"; import { makeYDocObservable } from "@syncedstore/yjs-reactive-bindings"; @@ -131,12 +130,21 @@ export class SyncManager extends lifecycle.Disposable { } get canWrite(): boolean { + if ( + this.remote instanceof FetchRemote && + this.state.status === "syncing" && + this.state.localDoc.meta.needs_save_since + ) { + // hacky fix for docs / httpidentifier + return false; + } return this.remote.canWrite; } private remoteForIdentifier(identifier: Identifier): Remote { if (identifier instanceof FileIdentifier) { - return new FilebridgeRemote(this.ydoc, identifier); + throw new Error("not implemented anymore"); + // return new FilebridgeRemote(this.ydoc, identifier); } else if (identifier instanceof GithubIdentifier) { throw new Error("not implemented anymore"); // return new GithubRemote(this.ydoc, identifier); @@ -245,6 +253,13 @@ export class SyncManager extends lifecycle.Disposable { if (!this.sessionStore.documentCoordinator) { throw new Error("logged out while loading"); } + + if (this.identifier instanceof HttpsIdentifier) { + await this.sessionStore.documentCoordinator.clearIfNotChanged( + this.identifier + ); + } + const doc = this.sessionStore.documentCoordinator.loadDocument( this.identifier, this.ydoc @@ -258,14 +273,18 @@ export class SyncManager extends lifecycle.Disposable { // TODO: catch when doc didn't exist locally await doc.idbProvider.whenSynced; - // console.log("done synced", doc.ydoc.toJSON()); + runInAction(() => { this.state = { status: "syncing", localDoc: doc, }; }); - return this.startSyncing(); + + // hacky fix for docs / httpidentifier + if (!(this.identifier instanceof HttpsIdentifier)) { + return this.startSyncing(); + } } } diff --git a/packages/editor/src/store/yjs-sync/remote/FetchRemote.ts b/packages/editor/src/store/yjs-sync/remote/FetchRemote.ts index 57556aaea..b5555b770 100644 --- a/packages/editor/src/store/yjs-sync/remote/FetchRemote.ts +++ b/packages/editor/src/store/yjs-sync/remote/FetchRemote.ts @@ -1,7 +1,7 @@ import { makeObservable, observable, runInAction } from "mobx"; import { path, strings } from "vscode-lib"; -import { ChildReference } from "@typecell-org/shared"; +import { ChildReference, IndexFileReference } from "@typecell-org/shared"; import _ from "lodash"; import * as Y from "yjs"; import { filesToTreeNodes } from "../../../app/documentRenderers/project/directoryNavigation/treeNodeUtil"; @@ -11,6 +11,30 @@ import { markdownToYDoc } from "../../../integrations/markdown/import"; import ProjectResource from "../../ProjectResource"; import { Remote } from "./Remote"; +type IndexFile = { + title: string; + items: string[]; +}; + +// function isEmptyDoc(doc: Y.Doc) { +// return areDocsEqual(doc, new Y.Doc()); +// } + +// // NOTE: only changes in doc xml fragment are checked +// function areFragmentsEqual(fragment1: Y.XmlFragment, fragment2: Y.XmlFragment) { +// return _.eq( +// (fragment1.toJSON() as string).replaceAll(/block-id=".*"/g, ""), +// (fragment2.toJSON() as string).replaceAll(/block-id=".*"/g, "") +// ); +// } + +// function areDocsEqual(doc1: Y.Doc, doc2: Y.Doc) { +// return areFragmentsEqual( +// doc1.getXmlFragment("doc"), +// doc2.getXmlFragment("doc") +// ); +// } + export default class FetchRemote extends Remote { private disposed = false; protected id = "fetch"; @@ -54,38 +78,45 @@ export default class FetchRemote extends Remote { } } - private async getNewYDocFromDir(objects: string[]) { + private async getNewYDocFromDir(indexFile: IndexFile) { const newDoc = new Y.Doc(); newDoc.getMap("meta").set("type", "!project"); + newDoc.getMap("meta").set("title", indexFile.title); const project = new ProjectResource(newDoc, this.identifier); // TODO const tree = filesToTreeNodes( - objects.map((object) => ({ fileName: object })) + indexFile.items.map((object) => ({ fileName: object })) ); tree.forEach((node) => { const id = getIdentifierWithAppendedPath(this.identifier, node.fileName); - project.addRef(ChildReference, id, undefined, false); + + if (node.fileName === "README.md") { + project.addRef(IndexFileReference, id, undefined, false); + } }); return newDoc; } private fetchIndex = _.memoize(async (path: string) => { - return (await (await fetch(path)).json()) as string[]; + return (await (await fetch(path)).json()) as IndexFile; }); private async getNewYDocFromFetch() { if (this.identifier.uri.path.endsWith(".json")) { - const json = await this.fetchIndex(this.identifier.uri.toString()); + const json = await this.fetchIndex(this.identifier.uri.toString(true)); return this.getNewYDocFromDir(json); } else if (this.identifier.uri.path.endsWith(".md")) { const contents = await ( - await fetch(this.identifier.uri.toString()) + await fetch(this.identifier.uri.toString(true)) ).text(); - return markdownToYDoc(contents, path.basename(this.identifier.uri.path)); + return markdownToYDoc( + contents, + decodeURIComponent(path.basename(this.identifier.uri.path)) + ); } else { // TODO: this is hacky. We should use json from parent route instead. Revise routing? @@ -94,14 +125,19 @@ export default class FetchRemote extends Remote { .split("/"); const index = this.identifier.uri.with({ path: root + "/index.json" }); - let json = await this.fetchIndex(index.toString()); + const json = await this.fetchIndex(index.toString()); - const prefix = remainders.join("/") + "/"; - json = json.filter((path) => path.startsWith(prefix)); - json = json.map((path) => path.substring(prefix.length)); - if (!json.length) { + let prefix = remainders.join("/"); // + "/"; + if (prefix) { + prefix = prefix + "/"; + json.title = path.basename(this.identifier.uri.path); + } + let items = json.items.filter((path) => path.startsWith(prefix)); + items = items.map((path) => path.substring(prefix.length)); + if (!items.length) { return "not-found" as const; } + json.items = items; return this.getNewYDocFromDir(json); } } @@ -122,6 +158,7 @@ export default class FetchRemote extends Remote { runInAction(() => { this.status = "loaded"; const update = Y.encodeStateAsUpdateV2(docData); + Y.applyUpdateV2(this._ydoc, update, this); }); this._ydoc.on("update", this.documentUpdateListener); diff --git a/packages/editor/src/store/yjs-sync/remote/FilebridgeRemote.ts b/packages/editor/src/store/yjs-sync/remote/FilebridgeRemote.ts deleted file mode 100644 index 4e9ddc80c..000000000 --- a/packages/editor/src/store/yjs-sync/remote/FilebridgeRemote.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { readFile, saveFile, Watcher } from "filebridge-client"; -import * as _ from "lodash"; -import { makeObservable, observable, runInAction } from "mobx"; -import { path, strings } from "vscode-lib"; -import * as Y from "yjs"; -import { filesToTreeNodes } from "../../../app/documentRenderers/project/directoryNavigation/treeNodeUtil"; -import { FileIdentifier } from "../../../identifiers/FileIdentifier"; -import { getIdentifierWithAppendedPath } from "../../../identifiers/paths/identifierPathHelpers"; -import { xmlFragmentToMarkdown } from "../../../integrations/markdown/export"; -import { markdownToXmlFragment } from "../../../integrations/markdown/import"; -import ProjectResource from "../../ProjectResource"; - -import { ChildReference } from "@typecell-org/shared"; -import { Remote } from "./Remote"; - -// function isEmptyDoc(doc: Y.Doc) { -// return areDocsEqual(doc, new Y.Doc()); -// } - -// NOTE: only changes in doc xml fragment are checked -function areFragmentsEqual(fragment1: Y.XmlFragment, fragment2: Y.XmlFragment) { - return _.eq( - (fragment1.toJSON() as string).replaceAll(/block-id=".*"/g, ""), - (fragment2.toJSON() as string).replaceAll(/block-id=".*"/g, "") - ); -} - -// function areDocsEqual(doc1: Y.Doc, doc2: Y.Doc) { -// return areFragmentsEqual( -// doc1.getXmlFragment("doc"), -// doc2.getXmlFragment("doc") -// ); -// } - -/** - * Given an identifier, manages local + remote syncing of a Y.Doc - */ -export class FilebridgeRemote extends Remote { - private disposed = false; - protected id = "filebridge"; - public canCreate = false; - private watcher: Watcher | undefined; - - public canWrite = true; - - public get awareness() { - return undefined; - } - - public constructor( - _ydoc: Y.Doc, - private readonly identifier: FileIdentifier - ) { - super(_ydoc); - makeObservable(this, { - canWrite: observable.ref, - }); - } - - private documentsByPath = new Set(); - - private async updateYDocFromDir() { - const pathWithTrailingSlash = this.identifier.path - ? strings.trim(this.identifier.path, "/") + "/" - : ""; - - this._ydoc.getMap("meta").set("type", "!project"); - if (this.identifier.path) { - this._ydoc - .getMap("meta") - .set("title", path.basename(this.identifier.path)); - } - const project = new ProjectResource(this._ydoc, this.identifier); // TODO - - this.watcher = this._register( - new Watcher(pathWithTrailingSlash + "**/*.md") - ); - this._register( - this.watcher.onWatchEvent(async (e) => { - let path = e.path; - if (pathWithTrailingSlash && !path.startsWith(pathWithTrailingSlash)) { - throw new Error("file returned with invalid path"); - } - path = path.substring(pathWithTrailingSlash.length); - - const oldDocs = [...this.documentsByPath]; - const oldTree = filesToTreeNodes( - Array.from(oldDocs).map((p) => ({ fileName: p })) - ); - - if (e.event === "add") { - // project.addRef(ChildReference); - this.documentsByPath.add(path); - } else if (e.event === "unlink") { - this.documentsByPath.delete(path); - const id = getIdentifierWithAppendedPath(this.identifier, path); - // TODO: check if this works - project.removeRef(ChildReference, id); - } - - const tree = filesToTreeNodes( - Array.from(this.documentsByPath).map((p) => ({ fileName: p })) - ); - - oldTree.forEach((node) => { - if (!tree.find((n) => n.fileName === node.fileName)) { - const id = getIdentifierWithAppendedPath( - this.identifier, - node.fileName - ); - project.removeRef(ChildReference, id); - } - }); - - tree.forEach((node) => { - const id = getIdentifierWithAppendedPath( - this.identifier, - node.fileName - ); - - project.addRef(ChildReference, id, undefined, false); - }); - }) - ); - } - - private async updateYDocFromId() { - const ret = await readFile( - fetch, - this.identifier.uri.path, - "http://" + this.identifier.uri.authority - ); - if (this.disposed) { - return; - } - if (ret.type === "file") { - this._ydoc.on("update", this.documentUpdateListener); - this._register({ - dispose: () => this._ydoc.off("update", this.documentUpdateListener), - }); - await this.updateYDocFromContents( - ret.contents, - path.basename(this.identifier.uri.path) - ); - await this.updateYDocFromFile(); - } else { - await this.updateYDocFromDir(); - } - runInAction(() => { - this.status = "loaded"; - }); - } - - private async updateYDocFromContents(contents: string, title?: string) { - this._ydoc.getMap("meta").set("type", "!notebook"); - this._ydoc.getMap("meta").set("title", title); - const newXml = markdownToXmlFragment(contents, undefined); - - const fragment = this._ydoc.getXmlFragment("doc"); - - if (!areFragmentsEqual(fragment, newXml)) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const update = Y.encodeStateAsUpdateV2(newXml.doc!); - Y.applyUpdateV2(this._ydoc, update, this); - } - } - - private async updateYDocFromFile() { - this.watcher = this._register( - new Watcher(this.identifier.path, "ws://" + this.identifier.uri.authority) - ); - - this._register( - this.watcher.onWatchEvent(async (event) => { - if (event.event !== "change") { - // TODO: support onlink - return; - } - const file = await readFile( - fetch, - this.identifier.path, - "http://" + this.identifier.uri.authority - ); - - if (file.type !== "file") { - throw new Error("unexpected"); - } - await this.updateYDocFromContents(file.contents); - }) - ); - } - - private getFileFromYDoc(doc: Y.Doc) { - // const contents = await readFile(this.identifier.path); - // const nbData = markdownToNotebook(contents); - if (doc.getMap("meta").get("type") !== "!notebook") { - throw new Error("invalid type"); - } - - const xml = doc.getXmlFragment("doc"); - - return xmlFragmentToMarkdown(xml); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private documentUpdateListener = async (update: any, origin: any) => { - if (origin === this) { - // these are updates that came in from this provider - return; - } - if (origin?.provider) { - // remote update - return; - } - await saveFile( - fetch, - this.identifier.path, - this.getFileFromYDoc(this._ydoc), - "http://" + this.identifier.uri.authority - ); - }; - - public startSyncing(): Promise { - return this.initialize(); - } - - public async initialize() { - try { - await this.updateYDocFromId(); - } catch (e) { - console.error(e); - runInAction(() => { - this.status = "not-found"; - }); - } - } - - public dispose() { - this.disposed = true; - super.dispose(); - } -} diff --git a/packages/editor/src/styles/index.css b/packages/editor/src/styles/index.css index 8b18ad2ed..3a44c6c11 100644 --- a/packages/editor/src/styles/index.css +++ b/packages/editor/src/styles/index.css @@ -63,11 +63,6 @@ body, overflow-y: auto; } -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", - monospace; -} - h1, h2, h3, @@ -98,191 +93,13 @@ h6 { background: white; } -.cellList-item { - padding-left: 100px; - /* border:1px solid black; */ - margin: 10px; - position: relative; -} - -.cellList-add-single { - position: absolute; - left: 50%; - top: 50%; -} - -.cellList-add { - color: #ccc; -} - -.cellList-add:hover { - color: black; -} - -.notebookCell-sideIcon { - /* margin-top: 10px; */ - margin-top: 5px; - margin-right: 5px; - z-index: 10; - cursor: pointer; -} - -.notebookCell-content { - border-radius: 4px; - box-shadow: rgb(235, 236, 240) 0px 0px 0px 1.2px; - width: 100%; -} - -.slate-typecell.collapsed .notebookCell-content { - box-shadow: none; -} - -.notebookCell-codeContainer { - position: relative; - padding-left: 10px; - background: #f4f5f7; - width: 100%; /* todo: fix when making window smaller */ - min-height: 40px; /* so toolbar fits */ -} - -.inlineCell, -.inlineCell .output { - display: inline; - padding: 0; -} - -.inlineCell-codeContainer { - position: absolute; - width: 450px; - left: calc(50% - 225px); - top: 15px; - z-index: 1000; -} - -.inlineCell-codeContainer > .code { - border-radius: 4px; - box-shadow: rgb(235, 236, 240) 0px 0px 0px 1.2px; -} - -.inlineCell-codeContainer > .arrow { - display: block; - margin: 0 auto; - margin-bottom: -4px; - color: rgb(235, 236, 240); -} - -.fullCell-codeContainer { - padding-left: 10px; - background: #f4f5f7; - height: 100%; - width: 100%; /* todo: fix when making window smaller */ -} - -.fullCell { - /* position:relative; */ - display: contents; -} - -.fullCell > :first-child { - position: relative; -} - -.outputWrapper { - display: inline-block; -} -.fullCell.inspectingHover > :first-child::before { - /* background: #ccc; */ - content: ""; - width: 100%; - height: 100%; - position: absolute; - background: rgba(187, 222, 251, 0.68); - z-index: 1000; - pointer-events: none; -} - -.output { - /* padding: 10px; */ - /* because it contains inline-block outputWrapper */ - line-height: 0; -} - -.slate-typecell.collapsed .output { - padding: 0; - padding-top: 5px; -} - -.output > * { - line-height: normal; -} - -.draggableWindow { - top: 0; - position: absolute; - z-index: 1000; -} - -.window { - border-radius: 4px; - box-shadow: rgb(235, 236, 240) 0px 0px 0px 1.2px; - background: white; -} - -.windowContent { - overflow: hidden; -} - -.windowTitle { - padding: 4px; - - border-bottom: 1px solid rgb(235, 236, 240); - text-align: center; - /* background: #ffffff; */ - /* background-image: -webkit-linear-gradient(top, rgb(250, 250, 250) 0px, rgb(246, 246, 246) 100%); */ - -webkit-user-select: none; - user-select: none; - cursor: default; - font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, - sans-serif; - font-size: 13px; - letter-spacing: 0px; - color: rgb(100, 100, 100); -} - -/* .field { - transform: - scale(0.75) - rotateY(-30deg) - rotateX(45deg) - translateZ(4.5rem); - transform-origin: 50% 100%; - transform-style: preserve-3d; - box-shadow: 1rem 1rem 2rem rgba(0,0,0,0.25); - transition: 0.6s ease transform; -} -.field:hover { - transform: scale(1); -} -.field::before { - transform: translateZ(4rem); -} -.field::before:hover { - transform: translateZ(0); -} -.field::after { - transform: translateZ(-4rem); -} -.field::after:hover { - transform: translateZ(-1px); -} */ - -.hint::before { +/* .hint::before { display: inline-block; position: absolute; content: attr(data-hint); -} +} */ -.hint, +/* .hint, .placeholder { pointer-events: none; display: inline-block; @@ -294,198 +111,8 @@ h6 { font-style: italic; font-weight: normal; text-decoration: none; -} - -.cellList { - width: 100%; - position: relative; -} -/* styles below based on pluto */ -.cellList { - padding-top: 20px; - padding-bottom: 4rem; - padding-left: 6px; - padding-right: 6px; - align-content: center; - width: 100%; - flex: 1 1 0%; - overflow-y: auto; -} - -.cellList > div { - margin: 0 auto; - max-width: calc(731px); -} - -.cellList-item { - margin: 0; - padding: 0; - display: block; - min-height: calc(25px); - margin-top: 17px; - position: relative; -} - -/* .shoulder > button, */ -.cellList-item > button { - position: absolute; - margin: 0px; - padding: 1px; - opacity: 50%; - border: none; - background: none; - cursor: pointer; - /* color: hsl(204, 86%, 35%); */ - color: black; - font-family: "Segoe UI Emoji", "Roboto Mono", monospace; - font-size: 0.75rem; - z-index: 3; - /* CodeMirror is 2 */ -} - -.shoulder { - position: absolute; - /* top: 0px; */ - /* bottom: 0px; */ - left: -2000px; - width: 2000px; - cursor: move; - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: flex-start; - /* Add an invisible border around the shoulder, to make it easier to click on. (The are between two cells is divided in two, each half belongs to the closest pluto-cell.) */ - top: calc(0px - 0.5 * 17px); - bottom: calc(0px - 0.5 * 17px); - border-top: calc(0.5 * 17px) solid rgba(0, 0, 0, 0); - border-bottom: calc(0.5 * 17px) solid rgba(0, 0, 0, 0); -} - -.shoulder:hover { - background: rgba(0, 0, 0, 0.05); - background-clip: padding-box; -} - -/* .shoulder > button { - flex: 0 0 auto; - position: sticky; - top: 0px; - margin-top: 4px; - margin-right: 5px; - padding: 0px 1px; } */ -pluto-cell:focus-within > .shoulder > button { - /* we use padding instead of 4px extra margin to move the eye to the left so that the hitbox becomes grows - you want to be able to double click the button */ - padding-right: 4px; -} - -/* pluto-cell.code_folded.inline-output > .shoulder > button { - margin-top: 3px; -} */ - -pluto-cell > button > span, -pluto-input > button > span { - pointer-events: none; -} - -@media screen and (any-pointer: fine) { - .cellList-item > button, - .shoulder > button, - .cellList-item > pluto-runarea { - opacity: 0; - /* to make it feel smooth: */ - transition: opacity 0.25s ease-in-out; - } - .cellList-item .notebookCell-sideIcon { - opacity: 0.5; - transition: opacity 0.25s ease-in-out; - } - .cellList-item.hover > button, - .cellList-item.hover > .shoulder > button { - opacity: 0.25; - transition: opacity 0.25s ease-in-out; - } - .cellList-item .notebookCell-sideIcon:hover, - .cellList-item > button:hover, - .cellList-item > .shoulder > button:hover { - opacity: 1; - /* to make it feel snappy: */ - transition: opacity 0.05s ease-in-out; - } -} - -@media screen and (any-pointer: coarse) { - .cellList-item > button, - .cellList-item > pluto-runarea { - opacity: 0; - /* to make it feel smooth: */ - transition: opacity 0.25s ease-in-out; - } - .cellList-item .notebookCell-sideIcon { - opacity: 0.5; - } - .cellList-item:focus-within > button, - .cellList-item:focus-within > .shoulder > button { - opacity: 0.25; - } - .cellList-item > button:focus-within, - .cellList-item > .shoulder > button:focus-within { - opacity: 1; - /* to make it feel snappy: */ - transition: opacity 0.05s ease-in-out; - } -} - -.cellList-item > button > span::after, -.shoulder > button > span::after { - display: block; - content: " " !important; - background-size: 17px 17px; - height: 17px; - width: 17px; -} - -.cellList-item > button.add_cell { - left: -12px; -} - -.cellList-item > button.add_cell.before { - margin-top: calc(-19px - 0.5 * (17px - 19px)) !important; -} - -.cellList-item > button.add_cell.after { - bottom: 1px; - margin-bottom: calc(-20px - 0.5 * (17px - 19px)); -} - -.cellList-item > button.add_cell > span::after { - /* background-image: url(https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.0.0/src/svg/add-circle-outline.svg); */ - background-image: url(../assets/add-outline.svg); -} - -.cellList-item .notebookCell-sideIcon { - /* margin-top: 10px; */ - margin-top: 0; - margin-right: 0; - position: absolute; - left: -20px; - top: 5px; - z-index: 10; -} - -.notebookCell.markdown.collapsed .notebookCell-content { - box-shadow: none; -} - -.notebookCell.markdown.collapsed .notebookCell-sideIcon { - visibility: hidden; -} - -.cellList-item.hover .notebookCell.markdown.collapsed .notebookCell-sideIcon { - visibility: visible; -} - /* // https://github.com/react-dnd/react-dnd/issues/832#issuecomment-442071628 // TODO: should only be set when dragging */ diff --git a/packages/editor/src/util/slug.ts b/packages/editor/src/util/slug.ts index 1dbb5bc38..7a98aebda 100644 --- a/packages/editor/src/util/slug.ts +++ b/packages/editor/src/util/slug.ts @@ -2,8 +2,8 @@ import speakingurl from "speakingurl"; export function slug(str: string) { return speakingurl(str, { - custom: { - "@": "@", // TODO: necesary? - }, + // custom: { + // "@": "@", // TODO: necesary? + // }, }); } diff --git a/packages/frame/package.json b/packages/frame/package.json index e96724d13..2c94c610f 100644 --- a/packages/frame/package.json +++ b/packages/frame/package.json @@ -3,13 +3,14 @@ "version": "0.0.3", "private": true, "dependencies": { - "@blocknote/core": "^0.8.5", - "@blocknote/react": "^0.8.5", + "@blocknote/core": "^0.9.2", + "@blocknote/react": "^0.9.2", "@typecell-org/util": "^0.0.3", "@typecell-org/shared": "^0.0.3", "@typecell-org/engine": "^0.0.3", "@tiptap/core": "^2.0.4", "@tiptap/react": "^2.0.4", + "@floating-ui/react": "^0.25.1", "@syncedstore/yjs-reactive-bindings": "^0.5.1", "lz-string": "^1.4.4", "markdown-it": "^12.0.2", diff --git a/packages/frame/src/Frame.tsx b/packages/frame/src/Frame.tsx index 935ebf530..17c68f814 100644 --- a/packages/frame/src/Frame.tsx +++ b/packages/frame/src/Frame.tsx @@ -207,6 +207,7 @@ export const Frame: React.FC = observer((props) => { const newEngine = new ReactiveEngine( resolver.resolveImport ); + const newExecutionHost: ExecutionHost = new LocalExecutionHost( props.documentIdString, newCompiler, @@ -249,13 +250,15 @@ export const Frame: React.FC = observer((props) => { // }, [document.awareness, props.userColor, props.userName]); const editor = useBlockNote({ - editorDOMAttributes: { - class: styles.editor, - "data-test": "editor", + domAttributes: { + editor: { + class: styles.editor, + "data-test": "editor", + }, }, blockSchema: { ...defaultBlockSchema, - monaco: { + codeblock: { propSchema: { language: { type: "string", @@ -271,7 +274,7 @@ export const Frame: React.FC = observer((props) => { name: "Code block", execute: (editor) => insertOrUpdateBlock(editor, { - type: "monaco", + type: "codeblock", }), aliases: ["code"], }, diff --git a/packages/frame/src/LanguageSelector.module.css b/packages/frame/src/LanguageSelector.module.css new file mode 100644 index 000000000..2cc4397a6 --- /dev/null +++ b/packages/frame/src/LanguageSelector.module.css @@ -0,0 +1,54 @@ +.languageSelector { + position: absolute; + z-index: 10; + bottom: 3px; + right: 0; + + display: inline-block; + border: none; + margin: 0; + text-decoration: none; + color: rgb(66, 82, 110); + background-color: transparent; + font-family: "Roboto Mono", monospace; + font-size: 0.8rem; + cursor: pointer; + text-align: center; + -webkit-appearance: none; + -moz-appearance: none; +} + +.languageOptions { + background-color: rgb(255, 255, 255); + box-shadow: 0 4px 8px -2px rgb(9 30 66 / 25%), 0 0 1px rgb(9 30 66 / 31%); + /* padding: 2px; */ + border-radius: 5px; + z-index: 10000; +} + +.languageOptions > button { + padding: 6px 8px; + align-items: baseline; + border-width: 0px; + box-sizing: border-box; + display: flex; + white-space: nowrap; + cursor: pointer; + background-color: transparent; + color: rgba(66, 82, 110, 1); + font-family: "Roboto Mono", monospace; + + width: 100%; + + align-items: center; + justify-content: flex-start; +} + +.icon { + margin-right: 3px; +} + +.languageOptions > button:hover { + /* This color is "Gram's hair" from https://atlassian.design/foundations/color */ + background: #f4f5f7; +} diff --git a/packages/frame/src/LanguageSelector.tsx b/packages/frame/src/LanguageSelector.tsx new file mode 100644 index 000000000..3c4e4de7e --- /dev/null +++ b/packages/frame/src/LanguageSelector.tsx @@ -0,0 +1,84 @@ +import { + useClick, + useDismiss, + useFloating, + useInteractions, +} from "@floating-ui/react"; +import React, { useState } from "react"; +import { SiCss3, SiTypescript } from "react-icons/si"; + +import styles from "./LanguageSelector.module.css"; + +type CellLanguage = "typescript" | "css"; + +type Props = { + language: CellLanguage; + onChangeLanguage: (language: CellLanguage) => void; + // onRemove: () => void; +}; + +// TODO: this is rerendered whenever the user types :/ +const LanguageSelector: React.FC = (props) => { + const [isOpen, setIsOpen] = useState(false); + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + placement: "bottom-end", + }); + + const dismiss = useDismiss(context); + const click = useClick(context); + + const { getReferenceProps, getFloatingProps } = useInteractions([ + click, + dismiss, + ]); + + const languageName = (language: CellLanguage) => { + switch (language) { + case "typescript": + return "TypeScript"; + case "css": + return "CSS"; + } + }; + return ( + <> + + {isOpen && ( +
+ + +
+ )} + + ); +}; + +export default LanguageSelector; diff --git a/packages/frame/src/MonacoBlockContent.tsx b/packages/frame/src/MonacoBlockContent.tsx index 89062aca8..e2174683e 100644 --- a/packages/frame/src/MonacoBlockContent.tsx +++ b/packages/frame/src/MonacoBlockContent.tsx @@ -1,4 +1,5 @@ -import { createTipTapBlock } from "@blocknote/core"; +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { BlockNoteEditor, createTipTapBlock } from "@blocknote/core"; import { mergeAttributes } from "@tiptap/core"; // import styles from "../../Block.module.css"; @@ -25,7 +26,7 @@ function arrowHandler( side ); console.log("nextPos", nextPos.$head.parent.type.name); - if (nextPos.$head && nextPos.$head.parent.type.name === "monaco") { + if (nextPos.$head && nextPos.$head.parent.type.name === "codeblock") { dispatch(state.tr.setSelection(nextPos)); return true; } @@ -39,12 +40,15 @@ const arrowHandlers = keymap({ ArrowRight: arrowHandler("right"), ArrowUp: arrowHandler("up"), ArrowDown: arrowHandler("down"), - // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any); const ComponentWithWrapper = ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - props: NodeViewProps & { block: any; htmlAttributes: any; selectionHack: any } + props: NodeViewProps & { + block: any; + htmlAttributes: any; + selectionHack: any; + blockNoteEditor: BlockNoteEditor; + } ) => { const { htmlAttributes, ...restProps } = props; return ( @@ -58,12 +62,13 @@ const ComponentWithWrapper = ( }; // TODO: clean up listeners -export const MonacoBlockContent = createTipTapBlock({ - name: "monaco", +export const MonacoBlockContent = createTipTapBlock<"codeblock", any>({ + name: "codeblock", content: "inline*", editable: true, selectable: true, - + whitespace: "pre", + code: true, addAttributes() { return { language: { @@ -71,7 +76,7 @@ export const MonacoBlockContent = createTipTapBlock({ parseHTML: (element) => element.getAttribute("data-language"), renderHTML: (attributes) => { return { - "data-language": attributes.level, + "data-language": attributes.language, }; }, }, @@ -83,7 +88,7 @@ export const MonacoBlockContent = createTipTapBlock({ { tag: "code", priority: 200, - node: "monaco", + node: "codeblock", }, ]; }, @@ -95,7 +100,6 @@ export const MonacoBlockContent = createTipTapBlock({ // class: styles.blockContent, "data-content-type": this.name, }), - ["p", 0], ]; }, @@ -131,7 +135,7 @@ export const MonacoBlockContent = createTipTapBlock({ diff --git a/packages/frame/src/MonacoElement.module.css b/packages/frame/src/MonacoElement.module.css index e7800416b..4be6bb115 100644 --- a/packages/frame/src/MonacoElement.module.css +++ b/packages/frame/src/MonacoElement.module.css @@ -1,6 +1,7 @@ .codeCell { display: flex; flex-direction: row; + padding: 15px 0; } .codeCellSideIcon { diff --git a/packages/frame/src/MonacoElement.tsx b/packages/frame/src/MonacoElement.tsx index 098061e76..4e9a2f41a 100644 --- a/packages/frame/src/MonacoElement.tsx +++ b/packages/frame/src/MonacoElement.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { NodeViewProps } from "@tiptap/core"; @@ -11,12 +12,15 @@ import React, { } from "react"; import { VscChevronDown, VscChevronRight } from "react-icons/vsc"; +import { BlockNoteEditor } from "@blocknote/core"; import { useResource } from "@typecell-org/util"; +import LanguageSelector from "./LanguageSelector"; import styles from "./MonacoElement.module.css"; import { applyDecorationsToMonaco, applyNodeChangesToMonaco, bindMonacoAndProsemirror, + textFromPMNode, } from "./MonacoProsemirrorHelpers"; import monacoStyles from "./MonacoSelection.module.css"; import { RichTextContext } from "./RichTextContext"; @@ -24,8 +28,11 @@ import { MonacoTypeCellCodeModel } from "./models/MonacoCodeModel"; import { getMonacoModel } from "./models/MonacoModelManager"; const MonacoElementComponent = function MonacoElement( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - props: NodeViewProps & { block: any; selectionHack: any } + props: NodeViewProps & { + block: any; + selectionHack: any; + blockNoteEditor: any; + } ) { const editorRef = useRef(); // const refa = useRef(Math.random()); @@ -37,9 +44,10 @@ const MonacoElementComponent = function MonacoElement( `file:///!${context.documentId}/${props.block.id}.cell.tsx` ); console.log("allocate model", uri.toString()); + const model = getMonacoModel( - props.node.textContent, - "typescript", + textFromPMNode(props.node), + props.block.props.language, uri, monaco ); @@ -72,6 +80,12 @@ const MonacoElementComponent = function MonacoElement( models.state.isUpdating = true; models.state.node = props.node; try { + if (props.block.props.language !== models.codeModel.language) { + monaco.editor.setModelLanguage( + models.model, + props.block.props.language + ); + } applyNodeChangesToMonaco(props.node, models.model); models.state.lastDecorations = applyDecorationsToMonaco( models.model, @@ -85,7 +99,7 @@ const MonacoElementComponent = function MonacoElement( } finally { models.state.isUpdating = false; } - }, [props.node, props.decorations, models]); + }, [props.node, props.block, props.decorations, models]); // useImperativeHandle( // ref, @@ -186,7 +200,9 @@ const MonacoElementComponent = function MonacoElement( [models.model, models.state, props.editor.view, props.getPos] ); - const [codeVisible, setCodeVisible] = useState(true); + const [codeVisible, setCodeVisible] = useState( + () => props.node.textContent.startsWith("// @default-collapsed") === false + ); return (
{/* {props.toolbar && props.toolbar} */} + { + (props.blockNoteEditor as BlockNoteEditor).updateBlock( + props.block, + { + props: { + language: lang, + }, + } + ); + }} + />
)} diff --git a/packages/frame/src/MonacoProsemirrorHelpers.ts b/packages/frame/src/MonacoProsemirrorHelpers.ts index d8ec46fb1..042909535 100644 --- a/packages/frame/src/MonacoProsemirrorHelpers.ts +++ b/packages/frame/src/MonacoProsemirrorHelpers.ts @@ -38,6 +38,25 @@ function getTransactionForSelectionUpdate( } } +// because node.textContent doesn't preserve newlines +export function textFromPMNode(node: Node): string { + if (!node.isTextblock) { + throw new Error("not a text node"); + } + let text = ""; + node.forEach((c) => { + if (c.type.name === "hardBreak") { + text += "\n"; + } else if (c.isText) { + text += c.text; + } else { + throw new Error("not a text or hardBreak node"); + } + }); + + return text; +} + export function bindMonacoAndProsemirror( mon: monaco.editor.IStandaloneCodeEditor, view: EditorView, @@ -210,7 +229,7 @@ export function applyNodeChangesToMonaco( node: Node, model: monaco.editor.ITextModel ) { - const newText = node.textContent; + const newText = textFromPMNode(node); const curText = model.getValue(); if (newText === curText) { return; diff --git a/packages/frame/src/models/MonacoCodeModel.ts b/packages/frame/src/models/MonacoCodeModel.ts index 3732984f1..e9cd79cdf 100644 --- a/packages/frame/src/models/MonacoCodeModel.ts +++ b/packages/frame/src/models/MonacoCodeModel.ts @@ -19,6 +19,13 @@ export class MonacoTypeCellCodeModel constructor(private readonly monacoModel: monaco.editor.ITextModel) { super(); + + this._register( + monacoModel.onDidChangeLanguage(() => { + this._onDidChangeContent.fire(); + }) + ); + this._register( monacoModel.onDidChangeContent(() => { this._onDidChangeContent.fire(); diff --git a/packages/frame/src/runtime/compiler/SourceModelCompiler.ts b/packages/frame/src/runtime/compiler/SourceModelCompiler.ts index 647309e3e..0003a62c8 100644 --- a/packages/frame/src/runtime/compiler/SourceModelCompiler.ts +++ b/packages/frame/src/runtime/compiler/SourceModelCompiler.ts @@ -116,12 +116,14 @@ export default class SourceModelCompiler } }; let prevValue: string | undefined = sourceModel.getValue(); + let prevLanguage: string | undefined = sourceModel.language; this._register( sourceModel.onDidChangeContent((_event) => { // make sure there were actual changes from the previous value const newValue = sourceModel.getValue(); - if (newValue === prevValue) { + const newLanguage = sourceModel.language; + if (newValue === prevValue && newLanguage === prevLanguage) { console.warn("same value"); return; } @@ -131,6 +133,7 @@ export default class SourceModelCompiler } prevValue = newValue; + prevLanguage = newLanguage; compile(); }) ); diff --git a/packages/frame/src/runtime/compiler/compilers/MonacoCompiler.ts b/packages/frame/src/runtime/compiler/compilers/MonacoCompiler.ts index d0d6cbce8..d0667eada 100644 --- a/packages/frame/src/runtime/compiler/compilers/MonacoCompiler.ts +++ b/packages/frame/src/runtime/compiler/compilers/MonacoCompiler.ts @@ -84,12 +84,12 @@ function saveCachedItem( model: monaco.editor.ITextModel, item: { hash: string; compiledCode: string } ) { - const key = "cc-" + model.uri.toString(); + const key = "cc-" + model.uri.toString(false); localStorage.setItem(key, JSON.stringify(item)); } function getCachedItem(model: monaco.editor.ITextModel) { - const key = "cc-" + model.uri.toString(); + const key = "cc-" + model.uri.toString(false); const cached = localStorage.getItem(key); if (cached) { try { diff --git a/packages/frame/src/runtime/editor/index.ts b/packages/frame/src/runtime/editor/index.ts index 591c63d3a..5671c4b7a 100644 --- a/packages/frame/src/runtime/editor/index.ts +++ b/packages/frame/src/runtime/editor/index.ts @@ -7,7 +7,7 @@ import type * as Monaco from "monaco-editor"; import EditorWorker from "./workers/editor.worker?worker"; // eslint-disable-line import/no-webpack-loader-syntax // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -import TsWorker from "./workers/ts.worker?worker"; // eslint-disable-line import/no-webpack-loader-syntax +import TsWorker from "./workers/ts.worker?sharedworker"; // eslint-disable-line import/no-webpack-loader-syntax // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import CSSWorker from "monaco-editor/esm/vs/language/css/css.worker?worker"; @@ -21,7 +21,31 @@ if (!(window as any).MonacoEnvironment) { (window as any).MonacoEnvironment = (global as any).MonacoEnvironment = { getWorker: function (workerId: string, label: string) { if (label === "typescript" || label === "javascript") { - return new TsWorker(); + const w = new TsWorker(); // TsWorker(); + // w.port.start(); + + return { + postMessage: w.port.postMessage.bind(w.port), + addEventListener: w.port.addEventListener.bind(w.port), + removeEventListener: w.port.removeEventListener.bind(w.port), + terminate: () => { + // noop + }, + get onmessage() { + return w.port.onmessage; + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + set onmessage(val: any) { + w.port.onmessage = val; + }, + get onmessageerror() { + return w.port.onmessageerror; + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + set onmessageerror(val: any) { + w.port.onmessageerror = val; + }, + }; } if (label === "json") { throw new Error("not implemented"); @@ -74,9 +98,10 @@ export const setMonacoDefaults = (monaco: typeof Monaco) => { // monaco.editor.EditorOptions.lineNumbers.defaultValue = 1 as any; // monaco.editor.EditorOptions.tab.defaultValue = 2; - // monaco.editor.EditorOptions.scrollbar.defaultValue = { - // alwaysConsumeMouseWheel: false, - // }; + monaco.editor.EditorOptions.scrollbar.defaultValue = { + ...monaco.editor.EditorOptions.scrollbar.defaultValue, + alwaysConsumeMouseWheel: false, + }; monaco.editor.EditorOptions.formatOnPaste.defaultValue = true; const defaults = monaco.languages.typescript.typescriptDefaults; diff --git a/packages/frame/src/runtime/editor/prettier/index.ts b/packages/frame/src/runtime/editor/prettier/index.ts index aefd43239..fa55912b1 100644 --- a/packages/frame/src/runtime/editor/prettier/index.ts +++ b/packages/frame/src/runtime/editor/prettier/index.ts @@ -4,6 +4,7 @@ import parserTypescript from "prettier/parser-typescript"; import prettier from "prettier/standalone"; import { diffToMonacoTextEdits } from "./diffToMonacoTextEdits"; +// TODO: move to shared webworker or host frame? export function setupPrettier(monacoInstance: typeof monaco) { monacoInstance.languages.registerDocumentFormattingEditProvider( "typescript", diff --git a/packages/frame/src/runtime/editor/workers/ts.worker.ts b/packages/frame/src/runtime/editor/workers/ts.worker.ts index 58b1afa93..dfcf5c775 100644 --- a/packages/frame/src/runtime/editor/workers/ts.worker.ts +++ b/packages/frame/src/runtime/editor/workers/ts.worker.ts @@ -1,13 +1,15 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-restricted-globals */ // based on https://github.com/microsoft/TypeScript-Website/issues/191#issuecomment-579531308 // and https://github.com/TypeScriptToLua/TypeScriptToLua.github.io/blob/source/src/pages/play/ts.worker.ts // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -import * as worker from "monaco-editor/esm/vs/editor/editor.worker.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { TypeScriptWorker } from "monaco-editor/esm/vs/language/typescript/ts.worker.js"; +import { initialize } from "./worker-init"; export class CustomTypeScriptWorker extends TypeScriptWorker { // eslint-disable-next-line @@ -81,10 +83,39 @@ export class CustomTypeScriptWorker extends TypeScriptWorker { } } -globalThis.onmessage = () => { - worker.initialize( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (context: any, createData: any) => - new CustomTypeScriptWorker(context, createData) - ); +// for regular webWorker: + +// globalThis.onmessage = () => { +// worker.initialize( +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// (context: any, createData: any) => +// new CustomTypeScriptWorker(context, createData) +// ); +// }; + +// For SharedWorker: + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const connect = (port: any) => { + // let initialized = false; + port.onmessage = (e: any) => { + initialize( + function (ctx: any, createData: any) { + return new CustomTypeScriptWorker(ctx, createData); + }, + port, + false + ); + }; }; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +self.onconnect = (e) => { + const [port] = e.ports; + connect(port); +}; + +if (!("SharedWorkerGlobalScope" in self)) { + connect(self); +} diff --git a/packages/frame/src/runtime/editor/workers/worker-init.ts b/packages/frame/src/runtime/editor/workers/worker-init.ts new file mode 100644 index 000000000..209f5208b --- /dev/null +++ b/packages/frame/src/runtime/editor/workers/worker-init.ts @@ -0,0 +1,25 @@ +// from https://github.com/microsoft/monaco-editor/issues/3019 + +/* eslint-disable @typescript-eslint/no-explicit-any */ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import { SimpleWorkerServer } from "monaco-editor/esm/vs/base/common/worker/simpleWorker.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import { EditorSimpleWorker } from "monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js"; + +export function initialize(foreignModule: any, port: any, initialized: any) { + if (initialized) { + return; + } + initialized = true; + const simpleWorker = new SimpleWorkerServer( + (msg: any) => { + port.postMessage(msg); + }, + (host: any) => new EditorSimpleWorker(host, foreignModule) + ); + port.onmessage = (e: any) => { + simpleWorker.onmessage(e.data); + }; +} diff --git a/packages/frame/tsconfig.json b/packages/frame/tsconfig.json index c8d1b4ea0..d258239f7 100644 --- a/packages/frame/tsconfig.json +++ b/packages/frame/tsconfig.json @@ -22,7 +22,7 @@ "composite": true, "jsx": "react-jsx" }, - "include": ["src", "../shared/src/codeModels/BasicCodeModel.ts"], + "include": ["src"], "references": [ { "path": "../shared" diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 94fabbfbf..cd8b0b22a 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -7,4 +7,5 @@ export * from "./frameInterop/HostBridgeMethods.js"; export * from "./frameInterop/IframeBridgeMethods.js"; export * from "./referenceDefinitions/child.js"; export * from "./referenceDefinitions/fork.js"; +export * from "./referenceDefinitions/indexFile.js"; export * from "./schema.js"; diff --git a/packages/shared/src/referenceDefinitions/indexFile.ts b/packages/shared/src/referenceDefinitions/indexFile.ts new file mode 100644 index 000000000..4ae0c0bc7 --- /dev/null +++ b/packages/shared/src/referenceDefinitions/indexFile.ts @@ -0,0 +1,6 @@ +import { createManyToOneReferenceDefinition } from "../Ref"; + +export const IndexFileReference = createManyToOneReferenceDefinition( + "typecell", + "hasIndexFile" +);