diff --git a/package.json b/package.json index 546a9d84..55ebfc17 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "appId": "dev.commandline.waveterm" }, "dependencies": { + "@lexical/react": "^0.14.3", "@monaco-editor/react": "^4.5.1", "@table-nav/core": "^0.0.7", "@table-nav/react": "^0.0.7", @@ -31,6 +32,7 @@ "electron-squirrel-startup": "^1.0.0", "electron-updater": "^6.1.8", "framer-motion": "^10.16.16", + "lexical": "^0.14.3", "mobx": "6.12", "mobx-react": "^7.5.0", "monaco-editor": "^0.44.0", @@ -50,8 +52,8 @@ "uuid": "^9.0.0", "winston": "^3.8.2", "xterm": "^5.3.0", - "xterm-addon-web-links": "^0.9.0", "xterm-addon-serialize": "^0.11.0", + "xterm-addon-web-links": "^0.9.0", "xterm-addon-webgl": "^0.16.0" }, "devDependencies": { diff --git a/src/app/app.tsx b/src/app/app.tsx index 684d04f6..d66cda18 100644 --- a/src/app/app.tsx +++ b/src/app/app.tsx @@ -146,7 +146,7 @@ class App extends React.Component<{}, {}> { - + diff --git a/src/app/sidebar/right.less b/src/app/sidebar/right.less index f5a9bbb0..4c15fb3d 100644 --- a/src/app/sidebar/right.less +++ b/src/app/sidebar/right.less @@ -22,6 +22,23 @@ border-bottom: 1px solid var(--app-border-color); } + .rsb-modes { + display: flex; + flex-direction: row; + padding: 5px 10px; + gap: 5px; + border-bottom: 1px solid var(--app-border-color); + + .icon-container { + padding: 2px; + cursor: pointer; + } + + .icon-container:hover { + background-color: var(--app-selected-mask-color); + } + } + &.collapsed { display: none; } diff --git a/src/app/sidebar/right.tsx b/src/app/sidebar/right.tsx index 26191c3f..70f3a22c 100644 --- a/src/app/sidebar/right.tsx +++ b/src/app/sidebar/right.tsx @@ -1,14 +1,16 @@ -// Copyright 2023, Command Line Inc. +// Copyright 2023-2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 import * as React from "react"; import * as mobxReact from "mobx-react"; +import * as mobx from "mobx"; import dayjs from "dayjs"; import { If, For } from "tsx-control-statements/components"; import localizedFormat from "dayjs/plugin/localizedFormat"; import { GlobalModel } from "@/models"; import { ResizableSidebar, Button } from "@/elements"; +import { WaveBookDisplay } from "./wavebook"; import "./right.less"; @@ -55,6 +57,14 @@ class KeybindDevPane extends React.Component<{}, {}> { @mobxReact.observer class RightSideBar extends React.Component { + mode: OV = mobx.observable.box(null, { name: "RightSideBar-mode" }); + + setMode(mode: string) { + mobx.action(() => { + this.mode.set(mode); + })(); + } + render() { return ( { - + + + + this.setMode("keybind")} + > + + + + this.setMode("wavebook")} + > + + + + + + + )} diff --git a/src/app/sidebar/wavebook.tsx b/src/app/sidebar/wavebook.tsx new file mode 100644 index 00000000..8b4d7ee4 --- /dev/null +++ b/src/app/sidebar/wavebook.tsx @@ -0,0 +1,53 @@ +// Copyright 2024, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +import * as React from "react"; +import * as mobxReact from "mobx-react"; +import * as mobx from "mobx"; +import { If, For } from "tsx-control-statements/components"; +import { GlobalModel } from "@/models"; + +import * as lexical from "lexical"; +import { AutoFocusPlugin } from "@lexical/react/LexicalAutoFocusPlugin"; +import { LexicalComposer } from "@lexical/react/LexicalComposer"; +import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin"; +import { ContentEditable } from "@lexical/react/LexicalContentEditable"; +import { HistoryPlugin } from "@lexical/react/LexicalHistoryPlugin"; +import LexicalErrorBoundary from "@lexical/react/LexicalErrorBoundary"; +import { MarkdownShortcutPlugin } from "@lexical/react/LexicalMarkdownShortcutPlugin"; +import { $convertFromMarkdownString, $convertToMarkdownString, TRANSFORMERS } from "@lexical/markdown"; +import { CodeNode, CodeHighlightNode } from "@lexical/code"; +import { LinkNode } from "@lexical/link"; +import { ListNode, ListItemNode } from "@lexical/list"; +import { HeadingNode, QuoteNode } from "@lexical/rich-text"; +import { HorizontalRuleNode } from "@lexical/react/LexicalHorizontalRuleNode"; +import { KeybindManager } from "@/util/keyutil"; + +const theme = { + // Theme styling goes here +}; + +class WaveBookKeybindings extends React.Component<{}, {}> { + componentDidMount(): void { + const keybindManager = GlobalModel.keybindManager; + keybindManager.registerKeybinding("pane", "wavebook", "generic:confirm", (waveEvent) => { + return true; + }); + } + componentWillUnmount(): void { + const keybindManager = GlobalModel.keybindManager; + keybindManager.unregisterDomain("wavebook"); + } + render() { + return null; + } +} + +@mobxReact.observer +class WaveBookDisplay extends React.Component<{}, {}> { + render() { + return "playbooks"; + } +} + +export { WaveBookDisplay }; diff --git a/yarn.lock b/yarn.lock index 515fb593..c2ac9b96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1743,6 +1743,13 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== +"@babel/runtime@^7.12.5": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.8.4": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" @@ -1997,6 +2004,194 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@lexical/clipboard@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/clipboard/-/clipboard-0.14.3.tgz#c759fddb384fbda7ecfd1a2e9dd9a304ee08ee76" + integrity sha512-kMasHJQCNSSdD6US8XF/GJEZAgdmIUIoqwcV/7Q8jVUICYT53bcr+Rh7RxL+1c7ZpJE2rXg5KTELsUPGjs0uwA== + dependencies: + "@lexical/html" "0.14.3" + "@lexical/list" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/code@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/code/-/code-0.14.3.tgz#be7b7ebef5de9db3a88d939492084cda99f6f7c2" + integrity sha512-eBhs+TsJ5z7Vg/0e77bau86lN7R5nqO7effkPNNndn0XV2VSDpjMF+PTj4Cd1peenFlfqVivBr9gdewDrvPQng== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + prismjs "^1.27.0" + +"@lexical/dragon@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/dragon/-/dragon-0.14.3.tgz#f9fb313daa04be4d04ead5fdd3cb46c54793955c" + integrity sha512-GTnt5a5Zs1f3q5Z9tC63VPzCFNAG+37ySHO+mQpVqlTsDmwSeJzFKGZyxq81tZXsKaXQZ4llc9K6I1f/XJoypw== + dependencies: + lexical "0.14.3" + +"@lexical/hashtag@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/hashtag/-/hashtag-0.14.3.tgz#c8ff80bfbbae901bbeb5e9685c27a0a10dac80d6" + integrity sha512-BlMhegitxNscJyM0QGjnzpt7QQaiftVf80dqfiVGdgFJi9hS4wrYEsPpA7jlsZG5Q46DSw/zMRp3tpHfdU6TCQ== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/history@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/history/-/history-0.14.3.tgz#792252dc8932ff48139b9f4ca8d8c0e8b789cdde" + integrity sha512-I5Ssaz+uRYsFmqN5WfKCyTkPPV1CTnEQ21vuKp8PVI4hBdlIy5aJdeQXbQhg0BdCtQVSjpm7WRGMk5ATiAXLPw== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/html@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/html/-/html-0.14.3.tgz#fe960afdc94232d5cec13a070bbb965b6d4bce66" + integrity sha512-ID4RdHdOXv2qIg6cqNhbYiqgcV5aEJFAV+zZ14CMpxPlW71tiRlmy/Pp4WqCFgjnZ2GZRq34+kag+cT2H69ILQ== + dependencies: + "@lexical/selection" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/link@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/link/-/link-0.14.3.tgz#7320f5eba82f451da9449a4b8c57fa60341938cb" + integrity sha512-txhuzcx2OfOtZ/fy9cgauDGW1gi2vSU0iQdde4i0UP2KK4ltioA9eFkjqAacGiPvwJ8w2CZV9q5Ck4DgFAKQ7w== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/list@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/list/-/list-0.14.3.tgz#1b587e2c807465d1b50d0f09aedda58b7591a958" + integrity sha512-d9ZiEkZ34DpzBNq2GkedJpXF8sIxSQvHOGhNbVvTuBvgDcCwbmXL0KY4k+xu+jMScRO/3oR7C6YZpZT3GaUO+Q== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/mark@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/mark/-/mark-0.14.3.tgz#b4f1606b9887e7b7f5ead57e325b7317d4662c0c" + integrity sha512-HegYMuiCazmM4XXVUzteA5bOFEiWxeIZSMK98rCV7t5czYlQmgaV5PWIT5/wLnSgrJA6apa02JHLINE9CuUHlw== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/markdown@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/markdown/-/markdown-0.14.3.tgz#051ace914eafcc1c81e7834b09396a491a97be10" + integrity sha512-G97Twk0qq5Mkj7S95fFODN6D7nBZsHiXgd2QeCZQ+qbrItEsjEsM0vCtVBELpZzyl700ExfIJCA9eHrq28VNxw== + dependencies: + "@lexical/code" "0.14.3" + "@lexical/link" "0.14.3" + "@lexical/list" "0.14.3" + "@lexical/rich-text" "0.14.3" + "@lexical/text" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/offset@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/offset/-/offset-0.14.3.tgz#53dfa5ca3d32c3b02a036d43bf195cf37fbcf68c" + integrity sha512-xzyHLED9N3VPsLSpxs235W1xnh1xLl0SFqLLN9fkZs4fBLPtoPrzfYjjTMx6KgRPCa96GauAMsAaKn+JWHaD4g== + dependencies: + lexical "0.14.3" + +"@lexical/overflow@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/overflow/-/overflow-0.14.3.tgz#addb108ca69c12f5058c0ba705e1b9f789112bed" + integrity sha512-2PabHT5vCtfN1lx2d3j1AW6naGJEcjLyUxEMrPzqNZ8IDGuLbD3uRi/wS8evmFLgKkF5mqRnPPlpwGbqGg+qUw== + dependencies: + lexical "0.14.3" + +"@lexical/plain-text@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/plain-text/-/plain-text-0.14.3.tgz#9039f8635b0d79d32d3af0f95f2bbaa5e0256f86" + integrity sha512-Ct3sQmhc34Iuj0YWT5dlLzTcuCLAMx7uaLKb0lxb7A6bcUBPfC1eBv2KtILZ9eW/GEUCMTqYEnmixTY7vPR9AA== + dependencies: + "@lexical/clipboard" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/react@^0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/react/-/react-0.14.3.tgz#eacbfc6bd8237aaafbc73daa655c0585b44c8256" + integrity sha512-sUgF7dStJTYvkS14QzlpB5XJ5p498JDSEBSADRsf0KOJsTINAQhh27vXuS8/I2FH3FanonH/RrLwSildL/FnzA== + dependencies: + "@lexical/clipboard" "0.14.3" + "@lexical/code" "0.14.3" + "@lexical/dragon" "0.14.3" + "@lexical/hashtag" "0.14.3" + "@lexical/history" "0.14.3" + "@lexical/link" "0.14.3" + "@lexical/list" "0.14.3" + "@lexical/mark" "0.14.3" + "@lexical/markdown" "0.14.3" + "@lexical/overflow" "0.14.3" + "@lexical/plain-text" "0.14.3" + "@lexical/rich-text" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/table" "0.14.3" + "@lexical/text" "0.14.3" + "@lexical/utils" "0.14.3" + "@lexical/yjs" "0.14.3" + lexical "0.14.3" + react-error-boundary "^3.1.4" + +"@lexical/rich-text@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/rich-text/-/rich-text-0.14.3.tgz#92a26e5092af387c550c094df7a8353a8318f95b" + integrity sha512-o8wGvRDyPSRcfb6bauF5lzK5u/kzCW+hAQq0ExM1e8p4GHDb0vwz9DA6NH5D0BPHb2fUgknwClHOoJX95WUA8A== + dependencies: + "@lexical/clipboard" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/selection@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/selection/-/selection-0.14.3.tgz#79b81dd8a9afeb442e180644dcde82d708b2c069" + integrity sha512-43EmqG6flLqFJJNZ7GCxFlx3qXy7osB3AQBgxKTthWtQeBrJPdgacctL1jhO7etTIQWP5C1DExy3opDLVKyDjg== + dependencies: + lexical "0.14.3" + +"@lexical/table@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/table/-/table-0.14.3.tgz#84df456c0565db2d18ef4e5fe2aa65cc1bff1b19" + integrity sha512-9btpU2lfAE34ucIqlMu5RiSVlxREXY7Zp+s26oFsXNoNPhW57iND96TrqwYo9FJl/6zXXfvqYxnUEcUD2dLgwQ== + dependencies: + "@lexical/utils" "0.14.3" + lexical "0.14.3" + +"@lexical/text@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/text/-/text-0.14.3.tgz#8f868a6954e566db6348d541b68d024a739a3b88" + integrity sha512-7+B9KkA37iHTlPqt6GHdfBIoaA9dQfhKrQNP9+422/CO/adCru4S94yNxiHXFq7iCvgucfuFop9M8jOfqLQbBQ== + dependencies: + lexical "0.14.3" + +"@lexical/utils@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/utils/-/utils-0.14.3.tgz#dc5fe87282f77ad40b46b5d4aee148a9843ad939" + integrity sha512-coqG2AO7QhJCM0xBlYvtETjl0il9u4HQRuc8ye3j8jMfNadVvVVWO3Fodmm/8FTPyJuxIij1Ruma9zqhlAbN6Q== + dependencies: + "@lexical/list" "0.14.3" + "@lexical/selection" "0.14.3" + "@lexical/table" "0.14.3" + lexical "0.14.3" + +"@lexical/yjs@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@lexical/yjs/-/yjs-0.14.3.tgz#ac3773c4db2f589e5940ef9a409cc6f11e4c1fab" + integrity sha512-Ju+PQJg4NjQoNzfPlQKa6A71sjgGWj5lL4cbe+4xlNoknfK3NApVeznOi3xAM7rUCr6fPBAjzF9/uwfMXR451g== + dependencies: + "@lexical/offset" "0.14.3" + lexical "0.14.3" + "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" @@ -5328,6 +5523,11 @@ less@^4.1.2: needle "^3.1.0" source-map "~0.6.0" +lexical@0.14.3, lexical@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/lexical/-/lexical-0.14.3.tgz#81c41a4c585100192f6d330e81cc6013bf326f5e" + integrity sha512-LaWSKj6OpvJ+bdfQA2AybEzho0YoWfAdRGkuCtPNYd/uf7IHyoEwCFQsIBvWCQF23saDgE1NONR4uiwl6iaJ9g== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -6569,6 +6769,11 @@ prettier@^2.8.8: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -6689,6 +6894,13 @@ react-dom@^18.1.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-error-boundary@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" + integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== + dependencies: + "@babel/runtime" "^7.12.5" + react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"