groove-dev 0.15.1 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/FILE-EDITOR-PLAN.md +253 -0
- package/node_modules/@codemirror/autocomplete/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/autocomplete/CHANGELOG.md +639 -0
- package/node_modules/@codemirror/autocomplete/LICENSE +21 -0
- package/node_modules/@codemirror/autocomplete/README.md +43 -0
- package/node_modules/@codemirror/autocomplete/dist/index.cjs +2151 -0
- package/node_modules/@codemirror/autocomplete/dist/index.d.cts +648 -0
- package/node_modules/@codemirror/autocomplete/dist/index.d.ts +648 -0
- package/node_modules/@codemirror/autocomplete/dist/index.js +2120 -0
- package/node_modules/@codemirror/autocomplete/package.json +41 -0
- package/node_modules/@codemirror/commands/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/commands/CHANGELOG.md +386 -0
- package/node_modules/@codemirror/commands/LICENSE +21 -0
- package/node_modules/@codemirror/commands/README.md +35 -0
- package/node_modules/@codemirror/commands/dist/index.cjs +1909 -0
- package/node_modules/@codemirror/commands/dist/index.d.cts +650 -0
- package/node_modules/@codemirror/commands/dist/index.d.ts +650 -0
- package/node_modules/@codemirror/commands/dist/index.js +1795 -0
- package/node_modules/@codemirror/commands/package.json +42 -0
- package/node_modules/@codemirror/lang-css/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/lang-css/CHANGELOG.md +106 -0
- package/node_modules/@codemirror/lang-css/LICENSE +21 -0
- package/node_modules/@codemirror/lang-css/README.md +50 -0
- package/node_modules/@codemirror/lang-css/dist/index.cjs +269 -0
- package/node_modules/@codemirror/lang-css/dist/index.d.cts +28 -0
- package/node_modules/@codemirror/lang-css/dist/index.d.ts +28 -0
- package/node_modules/@codemirror/lang-css/dist/index.js +264 -0
- package/node_modules/@codemirror/lang-css/package.json +42 -0
- package/node_modules/@codemirror/lang-html/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/lang-html/CHANGELOG.md +210 -0
- package/node_modules/@codemirror/lang-html/LICENSE +21 -0
- package/node_modules/@codemirror/lang-html/README.md +147 -0
- package/node_modules/@codemirror/lang-html/dist/index.cjs +667 -0
- package/node_modules/@codemirror/lang-html/dist/index.d.cts +115 -0
- package/node_modules/@codemirror/lang-html/dist/index.d.ts +115 -0
- package/node_modules/@codemirror/lang-html/dist/index.js +661 -0
- package/node_modules/@codemirror/lang-html/package.json +46 -0
- package/node_modules/@codemirror/lang-javascript/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/lang-javascript/CHANGELOG.md +206 -0
- package/node_modules/@codemirror/lang-javascript/LICENSE +21 -0
- package/node_modules/@codemirror/lang-javascript/README.md +125 -0
- package/node_modules/@codemirror/lang-javascript/dist/index.cjs +526 -0
- package/node_modules/@codemirror/lang-javascript/dist/index.d.cts +93 -0
- package/node_modules/@codemirror/lang-javascript/dist/index.d.ts +93 -0
- package/node_modules/@codemirror/lang-javascript/dist/index.js +513 -0
- package/node_modules/@codemirror/lang-javascript/package.json +45 -0
- package/node_modules/@codemirror/lang-json/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/lang-json/CHANGELOG.md +59 -0
- package/node_modules/@codemirror/lang-json/LICENSE +21 -0
- package/node_modules/@codemirror/lang-json/README.md +56 -0
- package/node_modules/@codemirror/lang-json/dist/index.cjs +68 -0
- package/node_modules/@codemirror/lang-json/dist/index.d.cts +22 -0
- package/node_modules/@codemirror/lang-json/dist/index.d.ts +22 -0
- package/node_modules/@codemirror/lang-json/dist/index.js +64 -0
- package/node_modules/@codemirror/lang-json/package.json +39 -0
- package/node_modules/@codemirror/lang-markdown/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/lang-markdown/CHANGELOG.md +246 -0
- package/node_modules/@codemirror/lang-markdown/LICENSE +21 -0
- package/node_modules/@codemirror/lang-markdown/README.md +162 -0
- package/node_modules/@codemirror/lang-markdown/dist/index.cjs +501 -0
- package/node_modules/@codemirror/lang-markdown/dist/index.d.cts +124 -0
- package/node_modules/@codemirror/lang-markdown/dist/index.d.ts +124 -0
- package/node_modules/@codemirror/lang-markdown/dist/index.js +492 -0
- package/node_modules/@codemirror/lang-markdown/package.json +44 -0
- package/node_modules/@codemirror/lang-python/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/lang-python/CHANGELOG.md +174 -0
- package/node_modules/@codemirror/lang-python/LICENSE +21 -0
- package/node_modules/@codemirror/lang-python/README.md +61 -0
- package/node_modules/@codemirror/lang-python/dist/index.cjs +313 -0
- package/node_modules/@codemirror/lang-python/dist/index.d.cts +26 -0
- package/node_modules/@codemirror/lang-python/dist/index.d.ts +26 -0
- package/node_modules/@codemirror/lang-python/dist/index.js +308 -0
- package/node_modules/@codemirror/lang-python/package.json +42 -0
- package/node_modules/@codemirror/language/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/language/CHANGELOG.md +412 -0
- package/node_modules/@codemirror/language/LICENSE +21 -0
- package/node_modules/@codemirror/language/README.md +66 -0
- package/node_modules/@codemirror/language/dist/index.cjs +2742 -0
- package/node_modules/@codemirror/language/dist/index.d.cts +1220 -0
- package/node_modules/@codemirror/language/dist/index.d.ts +1220 -0
- package/node_modules/@codemirror/language/dist/index.js +2687 -0
- package/node_modules/@codemirror/language/package.json +44 -0
- package/node_modules/@codemirror/lint/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/lint/CHANGELOG.md +318 -0
- package/node_modules/@codemirror/lint/LICENSE +21 -0
- package/node_modules/@codemirror/lint/README.md +18 -0
- package/node_modules/@codemirror/lint/dist/index.cjs +958 -0
- package/node_modules/@codemirror/lint/dist/index.d.cts +195 -0
- package/node_modules/@codemirror/lint/dist/index.d.ts +195 -0
- package/node_modules/@codemirror/lint/dist/index.js +945 -0
- package/node_modules/@codemirror/lint/package.json +40 -0
- package/node_modules/@codemirror/search/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/search/CHANGELOG.md +324 -0
- package/node_modules/@codemirror/search/LICENSE +21 -0
- package/node_modules/@codemirror/search/README.md +18 -0
- package/node_modules/@codemirror/search/dist/index.cjs +1237 -0
- package/node_modules/@codemirror/search/dist/index.d.cts +385 -0
- package/node_modules/@codemirror/search/dist/index.d.ts +385 -0
- package/node_modules/@codemirror/search/dist/index.js +1217 -0
- package/node_modules/@codemirror/search/package.json +40 -0
- package/node_modules/@codemirror/state/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/state/CHANGELOG.md +308 -0
- package/node_modules/@codemirror/state/LICENSE +21 -0
- package/node_modules/@codemirror/state/README.md +18 -0
- package/node_modules/@codemirror/state/dist/index.cjs +3922 -0
- package/node_modules/@codemirror/state/dist/index.d.cts +1713 -0
- package/node_modules/@codemirror/state/dist/index.d.ts +1713 -0
- package/node_modules/@codemirror/state/dist/index.js +3892 -0
- package/node_modules/@codemirror/state/package.json +38 -0
- package/node_modules/@codemirror/theme-one-dark/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/theme-one-dark/CHANGELOG.md +97 -0
- package/node_modules/@codemirror/theme-one-dark/LICENSE +21 -0
- package/node_modules/@codemirror/theme-one-dark/README.md +46 -0
- package/node_modules/@codemirror/theme-one-dark/dist/index.cjs +139 -0
- package/node_modules/@codemirror/theme-one-dark/dist/index.d.cts +39 -0
- package/node_modules/@codemirror/theme-one-dark/dist/index.d.ts +39 -0
- package/node_modules/@codemirror/theme-one-dark/dist/index.js +134 -0
- package/node_modules/@codemirror/theme-one-dark/package.json +41 -0
- package/node_modules/@codemirror/view/.github/workflows/dispatch.yml +16 -0
- package/node_modules/@codemirror/view/CHANGELOG.md +2284 -0
- package/node_modules/@codemirror/view/LICENSE +21 -0
- package/node_modules/@codemirror/view/README.md +37 -0
- package/node_modules/@codemirror/view/dist/index.cjs +11796 -0
- package/node_modules/@codemirror/view/dist/index.d.cts +2389 -0
- package/node_modules/@codemirror/view/dist/index.d.ts +2389 -0
- package/node_modules/@codemirror/view/dist/index.js +11745 -0
- package/node_modules/@codemirror/view/package.json +41 -0
- package/node_modules/@groove-dev/daemon/src/api.js +268 -2
- package/node_modules/@groove-dev/daemon/src/filewatcher.js +59 -0
- package/node_modules/@groove-dev/daemon/src/index.js +28 -1
- package/node_modules/@groove-dev/daemon/src/mimetypes.js +43 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-BQSznoq0.js +103 -0
- package/node_modules/@groove-dev/gui/dist/index.html +1 -1
- package/node_modules/@groove-dev/gui/package.json +15 -2
- package/node_modules/@groove-dev/gui/src/App.jsx +3 -0
- package/node_modules/@groove-dev/gui/src/components/CodeEditor.jsx +143 -0
- package/node_modules/@groove-dev/gui/src/components/EditorTabs.jsx +83 -0
- package/node_modules/@groove-dev/gui/src/components/FileTree.jsx +492 -0
- package/node_modules/@groove-dev/gui/src/components/MediaViewer.jsx +104 -0
- package/node_modules/@groove-dev/gui/src/stores/groove.js +287 -1
- package/node_modules/@groove-dev/gui/src/views/FileEditor.jsx +149 -0
- package/node_modules/@lezer/common/LICENSE +21 -0
- package/node_modules/@lezer/common/README.md +14 -0
- package/node_modules/@lezer/common/dist/index.cjs +2209 -0
- package/node_modules/@lezer/common/dist/index.d.cts +1174 -0
- package/node_modules/@lezer/common/dist/index.d.ts +1174 -0
- package/node_modules/@lezer/common/dist/index.js +2196 -0
- package/node_modules/@lezer/common/package.json +32 -0
- package/node_modules/@lezer/css/CHANGELOG.md +307 -0
- package/node_modules/@lezer/css/LICENSE +21 -0
- package/node_modules/@lezer/css/README.md +6 -0
- package/node_modules/@lezer/css/dist/index.cjs +151 -0
- package/node_modules/@lezer/css/dist/index.d.cts +3 -0
- package/node_modules/@lezer/css/dist/index.d.ts +3 -0
- package/node_modules/@lezer/css/dist/index.js +147 -0
- package/node_modules/@lezer/css/package.json +36 -0
- package/node_modules/@lezer/css/rollup.config.js +16 -0
- package/node_modules/@lezer/css/src/css.grammar +290 -0
- package/node_modules/@lezer/css/src/highlight.js +36 -0
- package/node_modules/@lezer/css/src/parser.js +31 -0
- package/node_modules/@lezer/css/src/parser.terms.js +63 -0
- package/node_modules/@lezer/css/src/tokens.js +75 -0
- package/node_modules/@lezer/css/test/declarations.txt +241 -0
- package/node_modules/@lezer/css/test/selector.txt +178 -0
- package/node_modules/@lezer/css/test/statements.txt +227 -0
- package/node_modules/@lezer/css/test/test-css.js +16 -0
- package/node_modules/@lezer/highlight/LICENSE +21 -0
- package/node_modules/@lezer/highlight/README.md +14 -0
- package/node_modules/@lezer/highlight/dist/index.cjs +936 -0
- package/node_modules/@lezer/highlight/dist/index.d.cts +623 -0
- package/node_modules/@lezer/highlight/dist/index.d.ts +623 -0
- package/node_modules/@lezer/highlight/dist/index.js +927 -0
- package/node_modules/@lezer/highlight/package.json +31 -0
- package/node_modules/@lezer/html/CHANGELOG.md +303 -0
- package/node_modules/@lezer/html/LICENSE +21 -0
- package/node_modules/@lezer/html/README.md +37 -0
- package/node_modules/@lezer/html/dist/index.cjs +354 -0
- package/node_modules/@lezer/html/dist/index.d.cts +14 -0
- package/node_modules/@lezer/html/dist/index.d.ts +14 -0
- package/node_modules/@lezer/html/dist/index.js +349 -0
- package/node_modules/@lezer/html/package.json +37 -0
- package/node_modules/@lezer/html/rollup.config.js +16 -0
- package/node_modules/@lezer/html/src/.tern-port +1 -0
- package/node_modules/@lezer/html/src/content.js +87 -0
- package/node_modules/@lezer/html/src/highlight.js +15 -0
- package/node_modules/@lezer/html/src/html.grammar +181 -0
- package/node_modules/@lezer/html/src/index.js +2 -0
- package/node_modules/@lezer/html/src/parser.js +27 -0
- package/node_modules/@lezer/html/src/parser.terms.js +53 -0
- package/node_modules/@lezer/html/src/tokens.js +199 -0
- package/node_modules/@lezer/html/test/mixed.txt +69 -0
- package/node_modules/@lezer/html/test/tags.txt +370 -0
- package/node_modules/@lezer/html/test/test-html.js +29 -0
- package/node_modules/@lezer/html/test/test-incremental.js +97 -0
- package/node_modules/@lezer/html/test/vue.txt +56 -0
- package/node_modules/@lezer/javascript/CHANGELOG.md +485 -0
- package/node_modules/@lezer/javascript/LICENSE +21 -0
- package/node_modules/@lezer/javascript/README.md +14 -0
- package/node_modules/@lezer/javascript/dist/index.cjs +196 -0
- package/node_modules/@lezer/javascript/dist/index.d.cts +3 -0
- package/node_modules/@lezer/javascript/dist/index.d.ts +3 -0
- package/node_modules/@lezer/javascript/dist/index.js +192 -0
- package/node_modules/@lezer/javascript/package.json +36 -0
- package/node_modules/@lezer/javascript/rollup.config.js +16 -0
- package/node_modules/@lezer/javascript/src/highlight.js +62 -0
- package/node_modules/@lezer/javascript/src/javascript.grammar +735 -0
- package/node_modules/@lezer/javascript/src/parser.js +33 -0
- package/node_modules/@lezer/javascript/src/parser.terms.js +177 -0
- package/node_modules/@lezer/javascript/src/tokens.js +87 -0
- package/node_modules/@lezer/javascript/test/decorator.txt +64 -0
- package/node_modules/@lezer/javascript/test/expression.txt +686 -0
- package/node_modules/@lezer/javascript/test/jsx.txt +79 -0
- package/node_modules/@lezer/javascript/test/semicolon.txt +77 -0
- package/node_modules/@lezer/javascript/test/statement.txt +404 -0
- package/node_modules/@lezer/javascript/test/test-javascript.js +17 -0
- package/node_modules/@lezer/javascript/test/typescript.txt +401 -0
- package/node_modules/@lezer/json/CHANGELOG.md +79 -0
- package/node_modules/@lezer/json/LICENSE +21 -0
- package/node_modules/@lezer/json/README.md +7 -0
- package/node_modules/@lezer/json/dist/index.cjs +41 -0
- package/node_modules/@lezer/json/dist/index.d.cts +3 -0
- package/node_modules/@lezer/json/dist/index.d.ts +3 -0
- package/node_modules/@lezer/json/dist/index.js +37 -0
- package/node_modules/@lezer/json/package.json +36 -0
- package/node_modules/@lezer/json/rollup.config.js +15 -0
- package/node_modules/@lezer/json/src/highlight.js +12 -0
- package/node_modules/@lezer/json/src/json.grammar +38 -0
- package/node_modules/@lezer/json/src/parser.js +23 -0
- package/node_modules/@lezer/json/src/parser.terms.js +12 -0
- package/node_modules/@lezer/json/test/arrays.txt +34 -0
- package/node_modules/@lezer/json/test/literals.txt +23 -0
- package/node_modules/@lezer/json/test/numbers.txt +87 -0
- package/node_modules/@lezer/json/test/objects.txt +34 -0
- package/node_modules/@lezer/json/test/strings.txt +50 -0
- package/node_modules/@lezer/json/test/test-json.js +17 -0
- package/node_modules/@lezer/lr/LICENSE +21 -0
- package/node_modules/@lezer/lr/README.md +25 -0
- package/node_modules/@lezer/lr/dist/constants.d.ts +45 -0
- package/node_modules/@lezer/lr/dist/constants.js +5 -0
- package/node_modules/@lezer/lr/dist/index.cjs +1891 -0
- package/node_modules/@lezer/lr/dist/index.d.cts +303 -0
- package/node_modules/@lezer/lr/dist/index.d.ts +303 -0
- package/node_modules/@lezer/lr/dist/index.js +1884 -0
- package/node_modules/@lezer/lr/package.json +32 -0
- package/node_modules/@lezer/markdown/CHANGELOG.md +279 -0
- package/node_modules/@lezer/markdown/LICENSE +21 -0
- package/node_modules/@lezer/markdown/README.md +725 -0
- package/node_modules/@lezer/markdown/bin/build-readme.cjs +39 -0
- package/node_modules/@lezer/markdown/build.js +16 -0
- package/node_modules/@lezer/markdown/dist/index.cjs +2352 -0
- package/node_modules/@lezer/markdown/dist/index.d.cts +600 -0
- package/node_modules/@lezer/markdown/dist/index.d.ts +600 -0
- package/node_modules/@lezer/markdown/dist/index.js +2335 -0
- package/node_modules/@lezer/markdown/package.json +37 -0
- package/node_modules/@lezer/markdown/src/README.md +83 -0
- package/node_modules/@lezer/markdown/src/extension.ts +301 -0
- package/node_modules/@lezer/markdown/src/index.ts +5 -0
- package/node_modules/@lezer/markdown/src/markdown.ts +1961 -0
- package/node_modules/@lezer/markdown/src/nest.ts +46 -0
- package/node_modules/@lezer/markdown/test/compare-tree.ts +14 -0
- package/node_modules/@lezer/markdown/test/spec.ts +79 -0
- package/node_modules/@lezer/markdown/test/test-extension.ts +269 -0
- package/node_modules/@lezer/markdown/test/test-incremental.ts +265 -0
- package/node_modules/@lezer/markdown/test/test-markdown.ts +3574 -0
- package/node_modules/@lezer/markdown/test/test-nesting.ts +86 -0
- package/node_modules/@lezer/markdown/test/tsconfig.json +12 -0
- package/node_modules/@lezer/markdown/tsconfig.json +14 -0
- package/node_modules/@lezer/python/CHANGELOG.md +243 -0
- package/node_modules/@lezer/python/LICENSE +21 -0
- package/node_modules/@lezer/python/README.md +6 -0
- package/node_modules/@lezer/python/dist/index.cjs +330 -0
- package/node_modules/@lezer/python/dist/index.d.cts +3 -0
- package/node_modules/@lezer/python/dist/index.d.ts +3 -0
- package/node_modules/@lezer/python/dist/index.js +326 -0
- package/node_modules/@lezer/python/package.json +36 -0
- package/node_modules/@lezer/python/rollup.config.js +16 -0
- package/node_modules/@lezer/python/src/highlight.js +35 -0
- package/node_modules/@lezer/python/src/python.grammar +381 -0
- package/node_modules/@lezer/python/src/tokens.js +224 -0
- package/node_modules/@lezer/python/test/expression.txt +231 -0
- package/node_modules/@lezer/python/test/statement.txt +442 -0
- package/node_modules/@lezer/python/test/test-incremental.js +33 -0
- package/node_modules/@lezer/python/test/test-python.js +17 -0
- package/node_modules/@marijn/find-cluster-break/LICENSE +21 -0
- package/node_modules/@marijn/find-cluster-break/README.md +28 -0
- package/node_modules/@marijn/find-cluster-break/dist/index.cjs +85 -0
- package/node_modules/@marijn/find-cluster-break/dist/index.d.cts +15 -0
- package/node_modules/@marijn/find-cluster-break/package.json +35 -0
- package/node_modules/@marijn/find-cluster-break/rollup.config.js +7 -0
- package/node_modules/@marijn/find-cluster-break/src/index.d.ts +15 -0
- package/node_modules/@marijn/find-cluster-break/src/index.js +87 -0
- package/node_modules/@marijn/find-cluster-break/test/test-cluster.js +30 -0
- package/node_modules/crelt/LICENSE +19 -0
- package/node_modules/crelt/README.md +23 -0
- package/node_modules/crelt/dist/index.cjs +31 -0
- package/node_modules/crelt/dist/index.d.cts +4 -0
- package/node_modules/crelt/index.d.ts +4 -0
- package/node_modules/crelt/index.js +28 -0
- package/node_modules/crelt/package.json +35 -0
- package/node_modules/crelt/rollup.config.js +13 -0
- package/node_modules/style-mod/LICENSE +19 -0
- package/node_modules/style-mod/README.md +98 -0
- package/node_modules/style-mod/dist/style-mod.cjs +165 -0
- package/node_modules/style-mod/dist/style-mod.d.cts +16 -0
- package/node_modules/style-mod/package.json +39 -0
- package/node_modules/style-mod/src/README.md +34 -0
- package/node_modules/style-mod/src/style-mod.d.ts +16 -0
- package/node_modules/style-mod/src/style-mod.js +172 -0
- package/node_modules/style-mod/test/test-style-mod.js +104 -0
- package/node_modules/w3c-keyname/.tern-port +1 -0
- package/node_modules/w3c-keyname/LICENSE +19 -0
- package/node_modules/w3c-keyname/README.md +18 -0
- package/node_modules/w3c-keyname/index.cjs +127 -0
- package/node_modules/w3c-keyname/index.d.cts +5 -0
- package/node_modules/w3c-keyname/index.d.ts +5 -0
- package/node_modules/w3c-keyname/index.js +119 -0
- package/node_modules/w3c-keyname/package.json +37 -0
- package/package.json +1 -1
- package/packages/daemon/src/api.js +268 -2
- package/packages/daemon/src/filewatcher.js +59 -0
- package/packages/daemon/src/index.js +28 -1
- package/packages/daemon/src/mimetypes.js +43 -0
- package/packages/gui/dist/assets/index-BQSznoq0.js +103 -0
- package/packages/gui/dist/index.html +1 -1
- package/packages/gui/package.json +15 -2
- package/packages/gui/src/App.jsx +3 -0
- package/packages/gui/src/components/CodeEditor.jsx +143 -0
- package/packages/gui/src/components/EditorTabs.jsx +83 -0
- package/packages/gui/src/components/FileTree.jsx +492 -0
- package/packages/gui/src/components/MediaViewer.jsx +104 -0
- package/packages/gui/src/stores/groove.js +287 -1
- package/packages/gui/src/views/FileEditor.jsx +149 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-8Kqi_LVo.js +0 -74
- package/packages/gui/dist/assets/index-8Kqi_LVo.js +0 -74
|
@@ -15,7 +15,7 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
15
15
|
tunneled: false, // true when accessed via SSH tunnel (port mismatch)
|
|
16
16
|
|
|
17
17
|
// UI state — unified panel model
|
|
18
|
-
activeTab: 'agents', // 'agents' | 'stats' | 'teams' | 'approvals'
|
|
18
|
+
activeTab: 'agents', // 'agents' | 'stats' | 'teams' | 'approvals' | 'editor'
|
|
19
19
|
detailPanel: null, // null | { type: 'agent', agentId } | { type: 'spawn' } | { type: 'journalist' }
|
|
20
20
|
activityLog: {},
|
|
21
21
|
statusMessage: null, // inline status text (replaces toast notifications)
|
|
@@ -24,6 +24,14 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
24
24
|
tokenTimeline: {}, // { [agentId]: [{ t: timestamp, v: tokensUsed }] }
|
|
25
25
|
dashTelemetry: {}, // { [agentId]: [{ t, v, name }] } — persists across tab switches
|
|
26
26
|
|
|
27
|
+
// Editor state
|
|
28
|
+
editorFiles: {}, // { [path]: { content, originalContent, language, loadedAt } }
|
|
29
|
+
editorActiveFile: null, // currently visible file path
|
|
30
|
+
editorOpenTabs: [], // ordered array of open file paths
|
|
31
|
+
editorTreeCache: {}, // { [dirPath]: entries[] }
|
|
32
|
+
editorChangedFiles: {}, // { [path]: timestamp } — externally modified files
|
|
33
|
+
editorRecentSaves: {}, // { [path]: timestamp } — suppress self-triggered change events
|
|
34
|
+
|
|
27
35
|
// Connection
|
|
28
36
|
connect() {
|
|
29
37
|
if (get().ws) return;
|
|
@@ -124,6 +132,15 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
124
132
|
get().showStatus(`rotation failed: ${msg.error}`);
|
|
125
133
|
break;
|
|
126
134
|
|
|
135
|
+
case 'file:changed': {
|
|
136
|
+
const savedAt = get().editorRecentSaves[msg.path];
|
|
137
|
+
if (savedAt && Date.now() - savedAt < 2000) break; // ignore self-triggered
|
|
138
|
+
set((s) => ({
|
|
139
|
+
editorChangedFiles: { ...s.editorChangedFiles, [msg.path]: msg.timestamp },
|
|
140
|
+
}));
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
|
|
127
144
|
case 'journalist:cycle':
|
|
128
145
|
break; // Journalist feed polls separately
|
|
129
146
|
}
|
|
@@ -256,6 +273,275 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
256
273
|
return data;
|
|
257
274
|
},
|
|
258
275
|
|
|
276
|
+
// Editor actions
|
|
277
|
+
async openFile(path) {
|
|
278
|
+
// Already loaded — just switch tab
|
|
279
|
+
if (get().editorFiles[path] || get().editorOpenTabs.includes(path)) {
|
|
280
|
+
set((s) => ({
|
|
281
|
+
editorActiveFile: path,
|
|
282
|
+
editorOpenTabs: s.editorOpenTabs.includes(path) ? s.editorOpenTabs : [...s.editorOpenTabs, path],
|
|
283
|
+
}));
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Media files — open as tab directly (served via /api/files/raw)
|
|
288
|
+
const ext = path.split('.').pop()?.toLowerCase();
|
|
289
|
+
const MEDIA_EXTS = ['png','jpg','jpeg','gif','svg','webp','ico','bmp','avif','mp4','webm','mov','avi','mkv','ogv'];
|
|
290
|
+
if (MEDIA_EXTS.includes(ext)) {
|
|
291
|
+
set((s) => ({
|
|
292
|
+
editorActiveFile: path,
|
|
293
|
+
editorOpenTabs: [...s.editorOpenTabs, path],
|
|
294
|
+
}));
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
try {
|
|
299
|
+
const res = await fetch(`${API_BASE}/api/files/read?path=${encodeURIComponent(path)}`);
|
|
300
|
+
if (!res.ok) {
|
|
301
|
+
const err = await res.json().catch(() => ({}));
|
|
302
|
+
get().showStatus(err.error || 'Failed to read file');
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const data = await res.json();
|
|
306
|
+
if (data.binary) {
|
|
307
|
+
get().showStatus('Binary file — cannot open');
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
set((s) => ({
|
|
311
|
+
editorFiles: {
|
|
312
|
+
...s.editorFiles,
|
|
313
|
+
[path]: { content: data.content, originalContent: data.content, language: data.language, loadedAt: Date.now() },
|
|
314
|
+
},
|
|
315
|
+
editorActiveFile: path,
|
|
316
|
+
editorOpenTabs: s.editorOpenTabs.includes(path) ? s.editorOpenTabs : [...s.editorOpenTabs, path],
|
|
317
|
+
}));
|
|
318
|
+
// Tell daemon to watch this file
|
|
319
|
+
const ws = get().ws;
|
|
320
|
+
if (ws?.readyState === 1) {
|
|
321
|
+
ws.send(JSON.stringify({ type: 'editor:watch', path }));
|
|
322
|
+
}
|
|
323
|
+
} catch {
|
|
324
|
+
get().showStatus('Failed to open file');
|
|
325
|
+
}
|
|
326
|
+
},
|
|
327
|
+
|
|
328
|
+
closeFile(path) {
|
|
329
|
+
set((s) => {
|
|
330
|
+
const tabs = s.editorOpenTabs.filter((t) => t !== path);
|
|
331
|
+
const files = { ...s.editorFiles };
|
|
332
|
+
delete files[path];
|
|
333
|
+
const changed = { ...s.editorChangedFiles };
|
|
334
|
+
delete changed[path];
|
|
335
|
+
let active = s.editorActiveFile;
|
|
336
|
+
if (active === path) {
|
|
337
|
+
const idx = s.editorOpenTabs.indexOf(path);
|
|
338
|
+
active = tabs[Math.min(idx, tabs.length - 1)] || null;
|
|
339
|
+
}
|
|
340
|
+
return { editorOpenTabs: tabs, editorFiles: files, editorChangedFiles: changed, editorActiveFile: active };
|
|
341
|
+
});
|
|
342
|
+
// Stop watching
|
|
343
|
+
const ws = get().ws;
|
|
344
|
+
if (ws?.readyState === 1) {
|
|
345
|
+
ws.send(JSON.stringify({ type: 'editor:unwatch', path }));
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
|
|
349
|
+
setActiveFile(path) {
|
|
350
|
+
set({ editorActiveFile: path });
|
|
351
|
+
},
|
|
352
|
+
|
|
353
|
+
updateFileContent(path, content) {
|
|
354
|
+
set((s) => ({
|
|
355
|
+
editorFiles: {
|
|
356
|
+
...s.editorFiles,
|
|
357
|
+
[path]: { ...s.editorFiles[path], content },
|
|
358
|
+
},
|
|
359
|
+
}));
|
|
360
|
+
},
|
|
361
|
+
|
|
362
|
+
async saveFile(path) {
|
|
363
|
+
const file = get().editorFiles[path];
|
|
364
|
+
if (!file) return;
|
|
365
|
+
try {
|
|
366
|
+
const res = await fetch(`${API_BASE}/api/files/write`, {
|
|
367
|
+
method: 'POST',
|
|
368
|
+
headers: { 'Content-Type': 'application/json' },
|
|
369
|
+
body: JSON.stringify({ path, content: file.content }),
|
|
370
|
+
});
|
|
371
|
+
if (!res.ok) {
|
|
372
|
+
const err = await res.json().catch(() => ({}));
|
|
373
|
+
get().showStatus(err.error || 'Save failed');
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
set((s) => ({
|
|
377
|
+
editorFiles: {
|
|
378
|
+
...s.editorFiles,
|
|
379
|
+
[path]: { ...s.editorFiles[path], originalContent: file.content },
|
|
380
|
+
},
|
|
381
|
+
editorChangedFiles: (() => {
|
|
382
|
+
const c = { ...s.editorChangedFiles };
|
|
383
|
+
delete c[path];
|
|
384
|
+
return c;
|
|
385
|
+
})(),
|
|
386
|
+
editorRecentSaves: { ...s.editorRecentSaves, [path]: Date.now() },
|
|
387
|
+
}));
|
|
388
|
+
get().showStatus('Saved');
|
|
389
|
+
} catch {
|
|
390
|
+
get().showStatus('Save failed');
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
|
|
394
|
+
async reloadFile(path) {
|
|
395
|
+
try {
|
|
396
|
+
const res = await fetch(`${API_BASE}/api/files/read?path=${encodeURIComponent(path)}`);
|
|
397
|
+
if (!res.ok) return;
|
|
398
|
+
const data = await res.json();
|
|
399
|
+
if (data.binary) return;
|
|
400
|
+
set((s) => ({
|
|
401
|
+
editorFiles: {
|
|
402
|
+
...s.editorFiles,
|
|
403
|
+
[path]: { content: data.content, originalContent: data.content, language: data.language, loadedAt: Date.now() },
|
|
404
|
+
},
|
|
405
|
+
editorChangedFiles: (() => {
|
|
406
|
+
const c = { ...s.editorChangedFiles };
|
|
407
|
+
delete c[path];
|
|
408
|
+
return c;
|
|
409
|
+
})(),
|
|
410
|
+
}));
|
|
411
|
+
} catch { /* ignore */ }
|
|
412
|
+
},
|
|
413
|
+
|
|
414
|
+
dismissFileChange(path) {
|
|
415
|
+
set((s) => {
|
|
416
|
+
const c = { ...s.editorChangedFiles };
|
|
417
|
+
delete c[path];
|
|
418
|
+
return { editorChangedFiles: c };
|
|
419
|
+
});
|
|
420
|
+
},
|
|
421
|
+
|
|
422
|
+
async fetchTreeDir(dirPath) {
|
|
423
|
+
try {
|
|
424
|
+
const res = await fetch(`${API_BASE}/api/files/tree?path=${encodeURIComponent(dirPath)}`);
|
|
425
|
+
if (!res.ok) return;
|
|
426
|
+
const data = await res.json();
|
|
427
|
+
set((s) => ({
|
|
428
|
+
editorTreeCache: { ...s.editorTreeCache, [dirPath]: data.entries },
|
|
429
|
+
}));
|
|
430
|
+
} catch { /* ignore */ }
|
|
431
|
+
},
|
|
432
|
+
|
|
433
|
+
async createFile(relPath) {
|
|
434
|
+
try {
|
|
435
|
+
const res = await fetch(`${API_BASE}/api/files/create`, {
|
|
436
|
+
method: 'POST',
|
|
437
|
+
headers: { 'Content-Type': 'application/json' },
|
|
438
|
+
body: JSON.stringify({ path: relPath }),
|
|
439
|
+
});
|
|
440
|
+
if (!res.ok) {
|
|
441
|
+
const err = await res.json().catch(() => ({}));
|
|
442
|
+
get().showStatus(err.error || 'Create failed');
|
|
443
|
+
return false;
|
|
444
|
+
}
|
|
445
|
+
// Refresh parent directory in tree
|
|
446
|
+
const parentDir = relPath.includes('/') ? relPath.split('/').slice(0, -1).join('/') : '';
|
|
447
|
+
await get().fetchTreeDir(parentDir);
|
|
448
|
+
get().showStatus('File created');
|
|
449
|
+
return true;
|
|
450
|
+
} catch {
|
|
451
|
+
get().showStatus('Create failed');
|
|
452
|
+
return false;
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
|
|
456
|
+
async createDir(relPath) {
|
|
457
|
+
try {
|
|
458
|
+
const res = await fetch(`${API_BASE}/api/files/mkdir`, {
|
|
459
|
+
method: 'POST',
|
|
460
|
+
headers: { 'Content-Type': 'application/json' },
|
|
461
|
+
body: JSON.stringify({ path: relPath }),
|
|
462
|
+
});
|
|
463
|
+
if (!res.ok) {
|
|
464
|
+
const err = await res.json().catch(() => ({}));
|
|
465
|
+
get().showStatus(err.error || 'Create failed');
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
const parentDir = relPath.includes('/') ? relPath.split('/').slice(0, -1).join('/') : '';
|
|
469
|
+
await get().fetchTreeDir(parentDir);
|
|
470
|
+
get().showStatus('Folder created');
|
|
471
|
+
return true;
|
|
472
|
+
} catch {
|
|
473
|
+
get().showStatus('Create failed');
|
|
474
|
+
return false;
|
|
475
|
+
}
|
|
476
|
+
},
|
|
477
|
+
|
|
478
|
+
async deleteFile(relPath) {
|
|
479
|
+
try {
|
|
480
|
+
const res = await fetch(`${API_BASE}/api/files/delete?path=${encodeURIComponent(relPath)}`, {
|
|
481
|
+
method: 'DELETE',
|
|
482
|
+
});
|
|
483
|
+
if (!res.ok) {
|
|
484
|
+
const err = await res.json().catch(() => ({}));
|
|
485
|
+
get().showStatus(err.error || 'Delete failed');
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
// Close tab if open
|
|
489
|
+
if (get().editorOpenTabs.includes(relPath)) {
|
|
490
|
+
get().closeFile(relPath);
|
|
491
|
+
}
|
|
492
|
+
// Refresh parent
|
|
493
|
+
const parentDir = relPath.includes('/') ? relPath.split('/').slice(0, -1).join('/') : '';
|
|
494
|
+
await get().fetchTreeDir(parentDir);
|
|
495
|
+
// Also clear cached children if it was a dir
|
|
496
|
+
set((s) => {
|
|
497
|
+
const cache = { ...s.editorTreeCache };
|
|
498
|
+
delete cache[relPath];
|
|
499
|
+
return { editorTreeCache: cache };
|
|
500
|
+
});
|
|
501
|
+
get().showStatus('Deleted');
|
|
502
|
+
return true;
|
|
503
|
+
} catch {
|
|
504
|
+
get().showStatus('Delete failed');
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
|
|
509
|
+
async renameFile(oldPath, newPath) {
|
|
510
|
+
try {
|
|
511
|
+
const res = await fetch(`${API_BASE}/api/files/rename`, {
|
|
512
|
+
method: 'POST',
|
|
513
|
+
headers: { 'Content-Type': 'application/json' },
|
|
514
|
+
body: JSON.stringify({ oldPath, newPath }),
|
|
515
|
+
});
|
|
516
|
+
if (!res.ok) {
|
|
517
|
+
const err = await res.json().catch(() => ({}));
|
|
518
|
+
get().showStatus(err.error || 'Rename failed');
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
// Update open tabs if renamed file was open
|
|
522
|
+
set((s) => {
|
|
523
|
+
const tabs = s.editorOpenTabs.map((t) => t === oldPath ? newPath : t);
|
|
524
|
+
const files = { ...s.editorFiles };
|
|
525
|
+
if (files[oldPath]) {
|
|
526
|
+
files[newPath] = files[oldPath];
|
|
527
|
+
delete files[oldPath];
|
|
528
|
+
}
|
|
529
|
+
const active = s.editorActiveFile === oldPath ? newPath : s.editorActiveFile;
|
|
530
|
+
return { editorOpenTabs: tabs, editorFiles: files, editorActiveFile: active };
|
|
531
|
+
});
|
|
532
|
+
// Refresh both parent dirs
|
|
533
|
+
const oldParent = oldPath.includes('/') ? oldPath.split('/').slice(0, -1).join('/') : '';
|
|
534
|
+
const newParent = newPath.includes('/') ? newPath.split('/').slice(0, -1).join('/') : '';
|
|
535
|
+
await get().fetchTreeDir(oldParent);
|
|
536
|
+
if (newParent !== oldParent) await get().fetchTreeDir(newParent);
|
|
537
|
+
get().showStatus('Renamed');
|
|
538
|
+
return true;
|
|
539
|
+
} catch {
|
|
540
|
+
get().showStatus('Rename failed');
|
|
541
|
+
return false;
|
|
542
|
+
}
|
|
543
|
+
},
|
|
544
|
+
|
|
259
545
|
addCommand(text) {
|
|
260
546
|
set((s) => ({
|
|
261
547
|
commandHistory: [...s.commandHistory.slice(-49), text],
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// GROOVE GUI — File Editor View
|
|
2
|
+
// FSL-1.1-Apache-2.0 — see LICENSE
|
|
3
|
+
|
|
4
|
+
import React, { useCallback } from 'react';
|
|
5
|
+
import { useGrooveStore } from '../stores/groove';
|
|
6
|
+
import FileTree from '../components/FileTree';
|
|
7
|
+
import EditorTabs from '../components/EditorTabs';
|
|
8
|
+
import CodeEditor from '../components/CodeEditor';
|
|
9
|
+
import MediaViewer, { isMediaFile } from '../components/MediaViewer';
|
|
10
|
+
|
|
11
|
+
export default function FileEditor() {
|
|
12
|
+
const activeFile = useGrooveStore((s) => s.editorActiveFile);
|
|
13
|
+
const files = useGrooveStore((s) => s.editorFiles);
|
|
14
|
+
const changedFiles = useGrooveStore((s) => s.editorChangedFiles);
|
|
15
|
+
const openTabs = useGrooveStore((s) => s.editorOpenTabs);
|
|
16
|
+
const updateFileContent = useGrooveStore((s) => s.updateFileContent);
|
|
17
|
+
const saveFile = useGrooveStore((s) => s.saveFile);
|
|
18
|
+
const reloadFile = useGrooveStore((s) => s.reloadFile);
|
|
19
|
+
const dismissFileChange = useGrooveStore((s) => s.dismissFileChange);
|
|
20
|
+
|
|
21
|
+
const file = activeFile ? files[activeFile] : null;
|
|
22
|
+
const isChanged = activeFile && changedFiles[activeFile];
|
|
23
|
+
const isMedia = activeFile && isMediaFile(activeFile);
|
|
24
|
+
// Media files go straight to viewer — they won't be in editorFiles
|
|
25
|
+
const isMediaTab = activeFile && openTabs.includes(activeFile) && isMedia;
|
|
26
|
+
|
|
27
|
+
const onContentChange = useCallback((content) => {
|
|
28
|
+
if (activeFile) updateFileContent(activeFile, content);
|
|
29
|
+
}, [activeFile, updateFileContent]);
|
|
30
|
+
|
|
31
|
+
const onSave = useCallback(() => {
|
|
32
|
+
if (activeFile) saveFile(activeFile);
|
|
33
|
+
}, [activeFile, saveFile]);
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div style={styles.container}>
|
|
37
|
+
{/* Tab bar */}
|
|
38
|
+
<EditorTabs />
|
|
39
|
+
|
|
40
|
+
{/* Main content row */}
|
|
41
|
+
<div style={styles.contentRow}>
|
|
42
|
+
{/* File tree sidebar */}
|
|
43
|
+
<div style={styles.sidebar}>
|
|
44
|
+
<FileTree />
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
{/* Editor area */}
|
|
48
|
+
<div style={styles.editorArea}>
|
|
49
|
+
{/* External change banner */}
|
|
50
|
+
{isChanged && !isMedia && (
|
|
51
|
+
<div style={styles.changeBanner}>
|
|
52
|
+
<span style={styles.bannerText}>File modified externally</span>
|
|
53
|
+
<button
|
|
54
|
+
onClick={() => reloadFile(activeFile)}
|
|
55
|
+
style={styles.bannerBtn}
|
|
56
|
+
>
|
|
57
|
+
Reload
|
|
58
|
+
</button>
|
|
59
|
+
<button
|
|
60
|
+
onClick={() => dismissFileChange(activeFile)}
|
|
61
|
+
style={styles.bannerDismiss}
|
|
62
|
+
>
|
|
63
|
+
Dismiss
|
|
64
|
+
</button>
|
|
65
|
+
</div>
|
|
66
|
+
)}
|
|
67
|
+
|
|
68
|
+
{/* Media viewer */}
|
|
69
|
+
{isMediaTab ? (
|
|
70
|
+
<MediaViewer path={activeFile} />
|
|
71
|
+
) : file ? (
|
|
72
|
+
<CodeEditor
|
|
73
|
+
key={activeFile}
|
|
74
|
+
content={file.content}
|
|
75
|
+
language={file.language}
|
|
76
|
+
onContentChange={onContentChange}
|
|
77
|
+
onSave={onSave}
|
|
78
|
+
/>
|
|
79
|
+
) : (
|
|
80
|
+
<div style={styles.emptyState}>
|
|
81
|
+
<div style={styles.emptyIcon}>{'\u2190'}</div>
|
|
82
|
+
<div style={styles.emptyText}>Select a file from the tree</div>
|
|
83
|
+
<div style={styles.emptyHint}>Cmd+S to save | right-click for options</div>
|
|
84
|
+
</div>
|
|
85
|
+
)}
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const styles = {
|
|
93
|
+
container: {
|
|
94
|
+
display: 'flex', flexDirection: 'column',
|
|
95
|
+
height: '100%', width: '100%',
|
|
96
|
+
},
|
|
97
|
+
contentRow: {
|
|
98
|
+
flex: 1, display: 'flex', overflow: 'hidden',
|
|
99
|
+
},
|
|
100
|
+
sidebar: {
|
|
101
|
+
width: 240, flexShrink: 0,
|
|
102
|
+
borderRight: '1px solid var(--border)',
|
|
103
|
+
overflow: 'hidden',
|
|
104
|
+
},
|
|
105
|
+
editorArea: {
|
|
106
|
+
flex: 1, display: 'flex', flexDirection: 'column',
|
|
107
|
+
position: 'relative', overflow: 'hidden',
|
|
108
|
+
background: 'var(--bg-base)',
|
|
109
|
+
},
|
|
110
|
+
changeBanner: {
|
|
111
|
+
position: 'absolute', top: 0, left: 0, right: 0, zIndex: 10,
|
|
112
|
+
display: 'flex', alignItems: 'center', gap: 8,
|
|
113
|
+
padding: '6px 12px',
|
|
114
|
+
background: 'rgba(229, 192, 123, 0.15)',
|
|
115
|
+
borderBottom: '1px solid var(--amber)',
|
|
116
|
+
},
|
|
117
|
+
bannerText: {
|
|
118
|
+
fontSize: 11, color: 'var(--amber)', fontWeight: 500,
|
|
119
|
+
fontFamily: 'var(--font)', flex: 1,
|
|
120
|
+
},
|
|
121
|
+
bannerBtn: {
|
|
122
|
+
padding: '3px 10px',
|
|
123
|
+
background: 'var(--amber)', border: 'none',
|
|
124
|
+
borderRadius: 2, color: 'var(--bg-base)',
|
|
125
|
+
fontSize: 10, fontWeight: 700,
|
|
126
|
+
fontFamily: 'var(--font)', cursor: 'pointer',
|
|
127
|
+
},
|
|
128
|
+
bannerDismiss: {
|
|
129
|
+
padding: '3px 10px',
|
|
130
|
+
background: 'transparent', border: '1px solid var(--amber)',
|
|
131
|
+
borderRadius: 2, color: 'var(--amber)',
|
|
132
|
+
fontSize: 10, fontWeight: 500,
|
|
133
|
+
fontFamily: 'var(--font)', cursor: 'pointer',
|
|
134
|
+
},
|
|
135
|
+
emptyState: {
|
|
136
|
+
flex: 1, display: 'flex', flexDirection: 'column',
|
|
137
|
+
alignItems: 'center', justifyContent: 'center',
|
|
138
|
+
gap: 8,
|
|
139
|
+
},
|
|
140
|
+
emptyIcon: {
|
|
141
|
+
fontSize: 28, color: 'var(--text-muted)', opacity: 0.5,
|
|
142
|
+
},
|
|
143
|
+
emptyText: {
|
|
144
|
+
fontSize: 13, color: 'var(--text-dim)', fontWeight: 500,
|
|
145
|
+
},
|
|
146
|
+
emptyHint: {
|
|
147
|
+
fontSize: 10, color: 'var(--text-muted)',
|
|
148
|
+
},
|
|
149
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2018 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# @lezer/common
|
|
2
|
+
|
|
3
|
+
[ [**WEBSITE**](http://lezer.codemirror.net) | [**ISSUES**](https://github.com/lezer-parser/lezer/issues) | [**FORUM**](https://discuss.codemirror.net/c/lezer) | [**CHANGELOG**](https://github.com/lezer-parser/common/blob/master/CHANGELOG.md) ]
|
|
4
|
+
|
|
5
|
+
[Lezer](https://lezer.codemirror.net/) is an incremental parser system
|
|
6
|
+
intended for use in an editor or similar system.
|
|
7
|
+
|
|
8
|
+
@lezer/common provides the syntax tree data structure and parser
|
|
9
|
+
abstractions for Lezer parsers.
|
|
10
|
+
|
|
11
|
+
Its programming interface is documented on [the
|
|
12
|
+
website](https://lezer.codemirror.net/docs/ref/#common).
|
|
13
|
+
|
|
14
|
+
This code is licensed under an MIT license.
|