@marimo-team/islands 0.15.2 → 0.15.4
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/dist/{ConnectedDataExplorerComponent-C39nQwtD.js → ConnectedDataExplorerComponent-B68gXlbY.js} +323 -328
- package/dist/{ImageComparisonComponent-BhkiyswP.js → ImageComparisonComponent-Cw1oA8Tn.js} +13 -13
- package/dist/{_baseUniq-DdHL34FO.js → _baseUniq-CQrhBg_9.js} +67 -67
- package/dist/any-language-editor-pzUl6lxp.js +27 -0
- package/dist/{arc-BXrety1g.js → arc-BOhn-m2C.js} +1 -1
- package/dist/{architectureDiagram-KFL7JDKH-BMy6ywCF.js → architectureDiagram-W76B3OCA-DdYf2VnU.js} +144 -144
- package/dist/assets/{worker-COGufAQn.js → worker-BcG8m3h5.js} +33 -29
- package/dist/asterisk-DS281yxp.js +271 -0
- package/dist/{blockDiagram-ZYB65J3Q-DYT2-nlI.js → blockDiagram-QIGZ2CNN-DmmYotkP.js} +10 -10
- package/dist/{c4Diagram-AAMF2YG6-ZiQzioe6.js → c4Diagram-FPNF74CW-Dyz4zMHJ.js} +8 -8
- package/dist/{channel-CeuXqUAU.js → channel-CCL8jXAe.js} +1 -1
- package/dist/{chunk-ANTBXLJU-BvYnIrdq.js → chunk-4BX2VUAB-BfKwWLfJ.js} +1 -1
- package/dist/{chunk-WVR4S24B-DXj8yaUk.js → chunk-55IACEB6-CFQU7zSp.js} +1 -1
- package/dist/{chunk-GLLZNHP4-CyFsosAe.js → chunk-FMBD7UC4-DDjZzUcl.js} +1 -1
- package/dist/{chunk-JBRWN2VN-DA_EEhy2.js → chunk-K7UQS3LO-nBRjBU1H.js} +117 -117
- package/dist/{chunk-NRVI72HA-BYx2jMlI.js → chunk-QN33PNHL-B-g8sJzl.js} +1 -1
- package/dist/{chunk-FHKO5MBM-DfCztBk8.js → chunk-QZHKN3VN-B7QSJS3J.js} +1 -1
- package/dist/{chunk-LXBSTHXV-Se7vdY6J.js → chunk-TVAH2DTR-pGXll4d1.js} +7 -7
- package/dist/{chunk-OMD6QJNC-CqgcPMgL.js → chunk-TZMSLE5B-Dx9h-1mv.js} +1 -1
- package/dist/{classDiagram-v2-QTMF73CY-B19A3G1l.js → classDiagram-KNZD7YFC-BXryI7DY.js} +2 -2
- package/dist/{classDiagram-3BZAVTQC-B19A3G1l.js → classDiagram-v2-RKCZMP56-BXryI7DY.js} +2 -2
- package/dist/{clone-78au0tn1.js → clone-DqwV7ges.js} +1 -1
- package/dist/cose-bilkent-S5V4N54A-Di6FNMXz.js +2609 -0
- package/dist/{cytoscape.esm-BYnVVhJX.js → cytoscape.esm-DfdJODL8.js} +34 -34
- package/dist/{dagre-2BBEFEWP-BfEn3ZUV.js → dagre-5GWH7T2D-BTZPMTey.js} +6 -6
- package/dist/{data-grid-overlay-editor-CH_qLkV2.js → data-grid-overlay-editor-ryatXXby.js} +11 -11
- package/dist/{diagram-4IRLE6MV-CL8xidnG.js → diagram-N5W7TBWH-D79_zdOu.js} +59 -60
- package/dist/{diagram-RP2FKANI-B1BPcUew.js → diagram-QEK2KX5R-DX2A_SD0.js} +15 -15
- package/dist/{diagram-GUPCWM2R-CZ5cfqlq.js → diagram-S2PKOQOG-DM6VMTrJ.js} +10 -10
- package/dist/dockerfile-BoowzQlp.js +194 -0
- package/dist/ebnf-DUPDuY4r.js +78 -0
- package/dist/{erDiagram-HZWUO2LU-BEAIww50.js → erDiagram-AWTI2OKA-BBirxtlI.js} +8 -8
- package/dist/fcl-CPC2WYrI.js +103 -0
- package/dist/{flowDiagram-THRYKUMA-Czs2UAI2.js → flowDiagram-PVAE7QVJ-DyVweEMs.js} +9 -9
- package/dist/{ganttDiagram-WV7ZQ7D5-ByYIAVFO.js → ganttDiagram-OWAHRB6G-DTB7FX7r.js} +34 -34
- package/dist/{gitGraphDiagram-OJR772UL-BcpDsiyB.js → gitGraphDiagram-NY62KEGX-BrbIb5pD.js} +4 -4
- package/dist/{glide-data-editor-CmN6FVyi.js → glide-data-editor-DhMX4nmM.js} +33 -33
- package/dist/{graph-77W6heli.js → graph-CuLSrclI.js} +3 -3
- package/dist/http-D9LttvKF.js +44 -0
- package/dist/{index-BOojn38D.js → index-BNgdUQ2e.js} +7711 -7711
- package/dist/index-DIy6LHLJ.js +98 -0
- package/dist/{index-CmozKMxx.js → index-Df2dsx1t.js} +6 -6
- package/dist/{index-pBmAzQJl.js → index-MCx5v1x0.js} +2 -2
- package/dist/{index-Bfk9dnyS.js → index-cz_xaKvT.js} +33090 -32892
- package/dist/{infoDiagram-6WOFNB3A-CfzLHHVP.js → infoDiagram-STP46IZ2-CCBHc7-K.js} +2 -2
- package/dist/{journeyDiagram-FFXJYRFH-ndAcpkGn.js → journeyDiagram-BIP6EPQ6-LhGSj54j.js} +24 -26
- package/dist/{kanban-definition-KOZQBZVT-DcQYzNvc.js → kanban-definition-6OIFK2YF-aegTMFS6.js} +14 -14
- package/dist/{layout-XySVHJgD.js → layout-BEARWMhl.js} +81 -81
- package/dist/{linear-PbooOqg7.js → linear-fbJq6cdO.js} +35 -35
- package/dist/{main-B5yML0bw.js → main-HerZgEhd.js} +76533 -69945
- package/dist/main.js +1 -1
- package/dist/{mermaid-Cg5IX6Nv.js → mermaid-DxPYK0KX.js} +6160 -7493
- package/dist/min-DBJkhObB.js +80 -0
- package/dist/mindmap-definition-Q6HEUPPD-A3Fh5XDZ.js +785 -0
- package/dist/nginx-zDPm3Z74.js +89 -0
- package/dist/{number-overlay-editor-DUhfZqtP.js → number-overlay-editor-USMrY6k3.js} +19 -19
- package/dist/{pieDiagram-DBDJKBY4-DTOlNsja.js → pieDiagram-ADFJNKIX-Q9uFlCV0.js} +17 -17
- package/dist/{quadrantDiagram-YPSRARAO-BX2d8VS-.js → quadrantDiagram-LMRXKWRM-BuPh-qpK.js} +6 -6
- package/dist/{react-plotly-Dcyw-3Sa.js → react-plotly-HSqJPRfa.js} +3577 -3577
- package/dist/{requirementDiagram-EGVEC5DT-D1T5u-wG.js → requirementDiagram-4UW4RH46-CHROYNU_.js} +7 -7
- package/dist/{sankeyDiagram-HRAUVNP4-G6xDfnp-.js → sankeyDiagram-GR3RE2ED-DkUqHP2d.js} +5 -5
- package/dist/sequenceDiagram-C3RYC4MD-YoPTMplP.js +2519 -0
- package/dist/{slides-component-BJLlPJSr.js → slides-component-D7CHSR00.js} +66 -66
- package/dist/solr-BNlsLglM.js +41 -0
- package/dist/spreadsheet-C-cy4P5N.js +49 -0
- package/dist/{stateDiagram-UUKSUZ4H-CYXbjaom.js → stateDiagram-KXAO66HF-DEN00mVU.js} +5 -5
- package/dist/{stateDiagram-v2-EYPG3UTE-Br1HYKT6.js → stateDiagram-v2-UMBNRL4Z-DlQqSUAa.js} +2 -2
- package/dist/style.css +1 -1
- package/dist/tiddlywiki-5wqsXtSk.js +155 -0
- package/dist/tiki-__Kn3CeS.js +181 -0
- package/dist/{time-B9SZnSen.js → time-BtVcKqeD.js} +58 -58
- package/dist/{timeline-definition-3HZDQTIS-DeK_ZRD0.js → timeline-definition-XQNQX7LJ-DEteLt8D.js} +10 -12
- package/dist/{timer-BYwnU4DF.js → timer-B0-z63CM.js} +16 -16
- package/dist/{treemap-75Q7IDZK-CKP4vV_0.js → treemap-75Q7IDZK-8S6podme.js} +14 -14
- package/dist/{vega-component-CpgdqX2d.js → vega-component-D35L45kI.js} +30 -30
- package/dist/{xychartDiagram-FDP5SA34-AMEPsx_R.js → xychartDiagram-6GGTOJPD-DKwGThyy.js} +7 -7
- package/package.json +44 -41
- package/src/__mocks__/notebook.ts +3 -0
- package/src/__mocks__/requests.ts +3 -0
- package/src/__tests__/__snapshots__/CellStatus.test.tsx.snap +12 -12
- package/src/__tests__/chat-utils.test.ts +26 -211
- package/src/components/ai/ai-model-dropdown.tsx +25 -9
- package/src/components/ai/ai-provider-icon.tsx +5 -1
- package/src/components/app-config/ai-config.tsx +7 -0
- package/src/components/chat/acp/__tests__/__snapshots__/prompt.test.ts.snap +304 -0
- package/src/components/chat/acp/__tests__/atoms.test.ts +56 -0
- package/src/components/chat/acp/__tests__/prompt.test.ts +12 -0
- package/src/components/chat/acp/__tests__/state.test.ts +621 -0
- package/src/components/chat/acp/agent-docs.tsx +78 -0
- package/src/components/chat/acp/agent-panel.css +23 -0
- package/src/components/chat/acp/agent-panel.tsx +715 -0
- package/src/components/chat/acp/agent-selector.tsx +138 -0
- package/src/components/chat/acp/blocks.tsx +664 -0
- package/src/components/chat/acp/common.tsx +198 -0
- package/src/components/chat/acp/prompt.ts +284 -0
- package/src/components/chat/acp/scroll-to-bottom-button.tsx +50 -0
- package/src/components/chat/acp/session-tabs.tsx +138 -0
- package/src/components/chat/acp/state.ts +263 -0
- package/src/components/chat/acp/thread.tsx +121 -0
- package/src/components/chat/acp/types.ts +63 -0
- package/src/components/chat/acp/utils.ts +45 -0
- package/src/components/chat/chat-components.tsx +71 -0
- package/src/components/chat/chat-panel.tsx +481 -291
- package/src/components/chat/chat-utils.ts +50 -0
- package/src/components/chat/markdown-renderer.tsx +3 -7
- package/src/components/chat/tool-call-accordion.tsx +6 -6
- package/src/components/datasources/__tests__/utils.test.ts +6 -0
- package/src/components/datasources/column-preview.tsx +1 -3
- package/src/components/editor/actions/useNotebookActions.tsx +1 -1
- package/src/components/editor/ai/add-cell-with-ai.tsx +20 -15
- package/src/components/editor/ai/ai-completion-editor.tsx +22 -3
- package/src/components/editor/ai/completion-handlers.tsx +2 -4
- package/src/components/editor/ai/completion-utils.ts +85 -11
- package/src/components/editor/alerts/startup-logs-alert.tsx +72 -0
- package/src/components/editor/chrome/panels/datasources-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/documentation-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/error-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/file-explorer-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/logs-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/outline-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/packages-panel.tsx +4 -2
- package/src/components/editor/chrome/panels/scratchpad-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/secrets-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/snippets-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/tracing-panel.tsx +3 -1
- package/src/components/editor/chrome/panels/variable-panel.tsx +3 -1
- package/src/components/editor/chrome/types.ts +10 -0
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +55 -31
- package/src/components/editor/controls/command-palette-button.tsx +1 -1
- package/src/components/editor/controls/command-palette.tsx +5 -4
- package/src/components/editor/controls/state.ts +4 -0
- package/src/components/editor/package-alert.tsx +108 -58
- package/src/components/editor/renderers/CellArray.tsx +2 -0
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +0 -1
- package/src/components/pages/edit-page.tsx +7 -3
- package/src/core/ai/chat-utils.ts +26 -43
- package/src/core/ai/config.ts +1 -1
- package/src/core/ai/context/__tests__/registry.test.ts +277 -3
- package/src/core/ai/context/context.ts +11 -1
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +378 -0
- package/src/core/ai/context/providers/__tests__/error.test.ts +3 -2
- package/src/core/ai/context/providers/__tests__/file.test.ts +119 -0
- package/src/core/ai/context/providers/cell-output.ts +349 -0
- package/src/core/ai/context/providers/common.ts +5 -1
- package/src/core/ai/context/providers/file.ts +287 -0
- package/src/core/ai/context/registry.ts +79 -0
- package/src/core/ai/state.ts +22 -5
- package/src/core/alerts/state.ts +71 -3
- package/src/core/cells/cell.ts +2 -2
- package/src/core/cells/cells.ts +1 -1
- package/src/core/cells/logs.ts +1 -1
- package/src/core/cells/runs.ts +6 -5
- package/src/core/codemirror/ai/resources.ts +47 -5
- package/src/core/codemirror/ai/state.ts +12 -0
- package/src/core/codemirror/language/__tests__/sql.test.ts +45 -0
- package/src/core/codemirror/markdown/__tests__/commands.test.ts +1 -0
- package/src/core/codemirror/theme/dark.ts +1 -1
- package/src/core/config/capabilities.ts +1 -1
- package/src/core/config/feature-flag.tsx +2 -0
- package/src/core/datasets/__tests__/data-source.test.ts +24 -0
- package/src/core/errors/__tests__/errors.test.ts +2 -0
- package/src/core/islands/bridge.ts +1 -0
- package/src/core/islands/main.ts +1 -0
- package/src/core/kernel/messages.ts +12 -6
- package/src/core/layout/layout.ts +3 -3
- package/src/core/network/requests-network.ts +8 -0
- package/src/core/network/requests-static.ts +1 -0
- package/src/core/network/requests-toasting.ts +1 -0
- package/src/core/network/types.ts +4 -1
- package/src/core/wasm/bridge.ts +18 -2
- package/src/core/wasm/worker/bootstrap.ts +3 -1
- package/src/core/wasm/worker/getMarimoWheel.ts +3 -8
- package/src/core/wasm/worker/types.ts +3 -0
- package/src/core/websocket/useMarimoWebSocket.tsx +7 -1
- package/src/css/app/Cell.css +42 -21
- package/src/css/app/codemirror.css +5 -1
- package/src/css/globals.css +3 -0
- package/src/css/md.css +1 -1
- package/src/plugins/impl/MicrophonePlugin.tsx +2 -2
- package/src/plugins/impl/chat/ChatPlugin.tsx +2 -9
- package/src/plugins/impl/chat/chat-ui.tsx +129 -110
- package/src/plugins/impl/chat/types.ts +5 -8
- package/src/plugins/impl/code/__tests__/language.test.ts +15 -0
- package/src/plugins/impl/code/any-language-editor.tsx +11 -8
- package/src/plugins/impl/vega/vega.css +121 -0
- package/src/plugins/layout/MimeRenderPlugin.tsx +3 -6
- package/src/stories/cell.stories.tsx +6 -0
- package/src/stories/layout/vertical/one-column.stories.tsx +215 -0
- package/src/theme/useTheme.ts +11 -6
- package/src/utils/Logger.ts +5 -6
- package/src/utils/__tests__/blob.test.ts +37 -0
- package/src/utils/arrays.ts +13 -0
- package/src/utils/fileToBase64.ts +21 -6
- package/src/utils/json/base64.ts +5 -2
- package/src/utils/numbers.ts +9 -7
- package/dist/any-language-editor-DC5170DQ.js +0 -45
- package/dist/asn1-jKiBa2Ya.js +0 -95
- package/dist/clojure-CCKyeQKf.js +0 -800
- package/dist/css-BkF-NPzE.js +0 -1553
- package/dist/index-5ZH_qS8j.js +0 -288
- package/dist/index-U4yn89qO.js +0 -341
- package/dist/javascript-C2yteZeJ.js +0 -691
- package/dist/min-DS5Jz-hg.js +0 -80
- package/dist/mindmap-definition-LNHGMQRG-0aOVaMR8.js +0 -3234
- package/dist/mllike-BSnXJBGA.js +0 -272
- package/dist/pug-CwAQJzGR.js +0 -248
- package/dist/python-BkR3uSy8.js +0 -313
- package/dist/rpm-IznJm2Xc.js +0 -57
- package/dist/sequenceDiagram-WFGC7UMF-DMhHzllb.js +0 -2284
- package/dist/ttcn-cfg-Bac_acMi.js +0 -88
|
@@ -22,7 +22,7 @@ import { copyToClipboard } from "@/utils/copy";
|
|
|
22
22
|
import { PanelEmptyState } from "./empty-state";
|
|
23
23
|
import { sortProviders, WriteSecretModal } from "./write-secret-modal";
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
const SecretsPanel: React.FC = () => {
|
|
26
26
|
const { openModal, closeModal } = useImperativeModal();
|
|
27
27
|
const {
|
|
28
28
|
data: secretKeyProviders,
|
|
@@ -125,6 +125,8 @@ export const SecretsPanel: React.FC = () => {
|
|
|
125
125
|
);
|
|
126
126
|
};
|
|
127
127
|
|
|
128
|
+
export default SecretsPanel;
|
|
129
|
+
|
|
128
130
|
const CopyButton: React.FC<{
|
|
129
131
|
className?: string;
|
|
130
132
|
ariaLabel: string;
|
|
@@ -32,7 +32,7 @@ import { ContributeSnippetButton } from "../components/contribute-snippet-button
|
|
|
32
32
|
|
|
33
33
|
const extensions = [EditorView.lineWrapping];
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
const SnippetsPanel: React.FC = () => {
|
|
36
36
|
const { readSnippets } = useRequestClient();
|
|
37
37
|
const [selectedSnippet, setSelectedSnippet] = React.useState<Snippet>();
|
|
38
38
|
const {
|
|
@@ -98,6 +98,8 @@ export const SnippetsPanel: React.FC = () => {
|
|
|
98
98
|
);
|
|
99
99
|
};
|
|
100
100
|
|
|
101
|
+
export default SnippetsPanel;
|
|
102
|
+
|
|
101
103
|
const SnippetViewer: React.FC<{ snippet: Snippet; onClose: () => void }> = ({
|
|
102
104
|
snippet,
|
|
103
105
|
onClose,
|
|
@@ -11,7 +11,7 @@ const LazyTracing = React.lazy(() =>
|
|
|
11
11
|
}),
|
|
12
12
|
);
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
const TracingPanel: React.FC = () => {
|
|
15
15
|
return (
|
|
16
16
|
<React.Suspense fallback={<Loading />}>
|
|
17
17
|
<LazyTracing />
|
|
@@ -19,6 +19,8 @@ export const TracingPanel: React.FC = () => {
|
|
|
19
19
|
);
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
+
export default TracingPanel;
|
|
23
|
+
|
|
22
24
|
const Loading = () => {
|
|
23
25
|
return (
|
|
24
26
|
<div className="flex flex-col items-center justify-center h-full">
|
|
@@ -7,7 +7,7 @@ import { useCellIds } from "@/core/cells/cells";
|
|
|
7
7
|
import { useVariables } from "@/core/variables/state";
|
|
8
8
|
import { PanelEmptyState } from "./empty-state";
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
const VariablePanel: React.FC = () => {
|
|
11
11
|
const variables = useVariables();
|
|
12
12
|
const cellIds = useCellIds();
|
|
13
13
|
|
|
@@ -29,3 +29,5 @@ export const VariablePanel: React.FC = () => {
|
|
|
29
29
|
/>
|
|
30
30
|
);
|
|
31
31
|
};
|
|
32
|
+
|
|
33
|
+
export default VariablePanel;
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
FileTextIcon,
|
|
9
9
|
FolderTreeIcon,
|
|
10
10
|
FunctionSquareIcon,
|
|
11
|
+
HatGlassesIcon,
|
|
11
12
|
KeyRoundIcon,
|
|
12
13
|
type LucideIcon,
|
|
13
14
|
NetworkIcon,
|
|
@@ -17,6 +18,7 @@ import {
|
|
|
17
18
|
TextSearchIcon,
|
|
18
19
|
XCircleIcon,
|
|
19
20
|
} from "lucide-react";
|
|
21
|
+
import { getFeatureFlag } from "@/core/config/feature-flag";
|
|
20
22
|
import { isWasm } from "@/core/wasm/utils";
|
|
21
23
|
|
|
22
24
|
export type PanelType =
|
|
@@ -32,6 +34,7 @@ export type PanelType =
|
|
|
32
34
|
| "datasources"
|
|
33
35
|
| "scratchpad"
|
|
34
36
|
| "chat"
|
|
37
|
+
| "agents"
|
|
35
38
|
| "secrets"
|
|
36
39
|
| "logs";
|
|
37
40
|
|
|
@@ -86,6 +89,13 @@ export const PANELS: PanelDescriptor[] = [
|
|
|
86
89
|
tooltip: "Chat with AI",
|
|
87
90
|
position: "sidebar",
|
|
88
91
|
},
|
|
92
|
+
{
|
|
93
|
+
type: "agents",
|
|
94
|
+
Icon: HatGlassesIcon,
|
|
95
|
+
tooltip: "Agents",
|
|
96
|
+
position: "sidebar",
|
|
97
|
+
hidden: !getFeatureFlag("external_agents"),
|
|
98
|
+
},
|
|
89
99
|
{
|
|
90
100
|
type: "documentation",
|
|
91
101
|
Icon: TextSearchIcon,
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
-
import React, {
|
|
2
|
+
import React, {
|
|
3
|
+
type PropsWithChildren,
|
|
4
|
+
Suspense,
|
|
5
|
+
useEffect,
|
|
6
|
+
useId,
|
|
7
|
+
} from "react";
|
|
3
8
|
import {
|
|
4
9
|
type ImperativePanelHandle,
|
|
5
10
|
Panel,
|
|
@@ -11,26 +16,12 @@ import { Sidebar } from "./sidebar";
|
|
|
11
16
|
import "./app-chrome.css";
|
|
12
17
|
import { TooltipProvider } from "@radix-ui/react-tooltip";
|
|
13
18
|
import { XIcon } from "lucide-react";
|
|
14
|
-
import { ChatPanel } from "@/components/chat/chat-panel";
|
|
15
|
-
import { DependencyGraphPanel } from "@/components/editor/chrome/panels/dependency-graph-panel";
|
|
16
19
|
import { Button } from "@/components/ui/button";
|
|
17
20
|
import { LazyMount } from "@/components/utils/lazy-mount";
|
|
18
21
|
import { IfCapability } from "@/core/config/if-capability";
|
|
19
22
|
import { cn } from "@/utils/cn";
|
|
20
23
|
import { ErrorBoundary } from "../../boundary/ErrorBoundary";
|
|
21
24
|
import { ContextAwarePanel } from "../panels/context-aware-panel/context-aware-panel";
|
|
22
|
-
import { DataSourcesPanel } from "../panels/datasources-panel";
|
|
23
|
-
import { DocumentationPanel } from "../panels/documentation-panel";
|
|
24
|
-
import { ErrorsPanel } from "../panels/error-panel";
|
|
25
|
-
import { FileExplorerPanel } from "../panels/file-explorer-panel";
|
|
26
|
-
import { LogsPanel } from "../panels/logs-panel";
|
|
27
|
-
import { OutlinePanel } from "../panels/outline-panel";
|
|
28
|
-
import { PackagesPanel } from "../panels/packages-panel";
|
|
29
|
-
import { ScratchpadPanel } from "../panels/scratchpad-panel";
|
|
30
|
-
import { SecretsPanel } from "../panels/secrets-panel";
|
|
31
|
-
import { SnippetsPanel } from "../panels/snippets-panel";
|
|
32
|
-
import { TracingPanel } from "../panels/tracing-panel";
|
|
33
|
-
import { VariablePanel } from "../panels/variable-panel";
|
|
34
25
|
import { useChromeActions, useChromeState } from "../state";
|
|
35
26
|
import { Minimap } from "./minimap";
|
|
36
27
|
import { PanelsWrapper } from "./panels";
|
|
@@ -38,6 +29,33 @@ import { createStorage } from "./storage";
|
|
|
38
29
|
import { handleDragging } from "./utils";
|
|
39
30
|
|
|
40
31
|
const LazyTerminal = React.lazy(() => import("@/components/terminal/terminal"));
|
|
32
|
+
const LazyChatPanel = React.lazy(() => import("@/components/chat/chat-panel"));
|
|
33
|
+
const LazyAgentPanel = React.lazy(
|
|
34
|
+
() => import("@/components/chat/acp/agent-panel"),
|
|
35
|
+
);
|
|
36
|
+
const LazyDependencyGraphPanel = React.lazy(
|
|
37
|
+
() => import("@/components/editor/chrome/panels/dependency-graph-panel"),
|
|
38
|
+
);
|
|
39
|
+
const LazyDataSourcesPanel = React.lazy(
|
|
40
|
+
() => import("../panels/datasources-panel"),
|
|
41
|
+
);
|
|
42
|
+
const LazyDocumentationPanel = React.lazy(
|
|
43
|
+
() => import("../panels/documentation-panel"),
|
|
44
|
+
);
|
|
45
|
+
const LazyErrorsPanel = React.lazy(() => import("../panels/error-panel"));
|
|
46
|
+
const LazyFileExplorerPanel = React.lazy(
|
|
47
|
+
() => import("../panels/file-explorer-panel"),
|
|
48
|
+
);
|
|
49
|
+
const LazyLogsPanel = React.lazy(() => import("../panels/logs-panel"));
|
|
50
|
+
const LazyOutlinePanel = React.lazy(() => import("../panels/outline-panel"));
|
|
51
|
+
const LazyPackagesPanel = React.lazy(() => import("../panels/packages-panel"));
|
|
52
|
+
const LazyScratchpadPanel = React.lazy(
|
|
53
|
+
() => import("../panels/scratchpad-panel"),
|
|
54
|
+
);
|
|
55
|
+
const LazySecretsPanel = React.lazy(() => import("../panels/secrets-panel"));
|
|
56
|
+
const LazySnippetsPanel = React.lazy(() => import("../panels/snippets-panel"));
|
|
57
|
+
const LazyTracingPanel = React.lazy(() => import("../panels/tracing-panel"));
|
|
58
|
+
const LazyVariablePanel = React.lazy(() => import("../panels/variable-panel"));
|
|
41
59
|
|
|
42
60
|
export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
43
61
|
const { isSidebarOpen, isTerminalOpen, selectedPanel } = useChromeState();
|
|
@@ -45,6 +63,9 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
|
45
63
|
const sidebarRef = React.useRef<ImperativePanelHandle>(null);
|
|
46
64
|
const terminalRef = React.useRef<ImperativePanelHandle>(null);
|
|
47
65
|
|
|
66
|
+
const helperPanelId = useId();
|
|
67
|
+
const terminalPanelId = useId();
|
|
68
|
+
|
|
48
69
|
// sync sidebar
|
|
49
70
|
useEffect(() => {
|
|
50
71
|
if (!sidebarRef.current) {
|
|
@@ -140,20 +161,21 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
|
140
161
|
</div>
|
|
141
162
|
<Suspense>
|
|
142
163
|
<TooltipProvider>
|
|
143
|
-
{selectedPanel === "files" && <
|
|
144
|
-
{selectedPanel === "errors" && <
|
|
145
|
-
{selectedPanel === "variables" && <
|
|
146
|
-
{selectedPanel === "dependencies" && <
|
|
147
|
-
{selectedPanel === "packages" && <
|
|
148
|
-
{selectedPanel === "outline" && <
|
|
149
|
-
{selectedPanel === "datasources" && <
|
|
150
|
-
{selectedPanel === "documentation" && <
|
|
151
|
-
{selectedPanel === "snippets" && <
|
|
152
|
-
{selectedPanel === "scratchpad" && <
|
|
153
|
-
{selectedPanel === "chat" && <
|
|
154
|
-
{selectedPanel === "
|
|
155
|
-
{selectedPanel === "
|
|
156
|
-
{selectedPanel === "
|
|
164
|
+
{selectedPanel === "files" && <LazyFileExplorerPanel />}
|
|
165
|
+
{selectedPanel === "errors" && <LazyErrorsPanel />}
|
|
166
|
+
{selectedPanel === "variables" && <LazyVariablePanel />}
|
|
167
|
+
{selectedPanel === "dependencies" && <LazyDependencyGraphPanel />}
|
|
168
|
+
{selectedPanel === "packages" && <LazyPackagesPanel />}
|
|
169
|
+
{selectedPanel === "outline" && <LazyOutlinePanel />}
|
|
170
|
+
{selectedPanel === "datasources" && <LazyDataSourcesPanel />}
|
|
171
|
+
{selectedPanel === "documentation" && <LazyDocumentationPanel />}
|
|
172
|
+
{selectedPanel === "snippets" && <LazySnippetsPanel />}
|
|
173
|
+
{selectedPanel === "scratchpad" && <LazyScratchpadPanel />}
|
|
174
|
+
{selectedPanel === "chat" && <LazyChatPanel />}
|
|
175
|
+
{selectedPanel === "agents" && <LazyAgentPanel />}
|
|
176
|
+
{selectedPanel === "logs" && <LazyLogsPanel />}
|
|
177
|
+
{selectedPanel === "tracing" && <LazyTracingPanel />}
|
|
178
|
+
{selectedPanel === "secrets" && <LazySecretsPanel />}
|
|
157
179
|
</TooltipProvider>
|
|
158
180
|
</Suspense>
|
|
159
181
|
</div>
|
|
@@ -163,7 +185,8 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
|
163
185
|
const helperPanel = (
|
|
164
186
|
<Panel
|
|
165
187
|
ref={sidebarRef}
|
|
166
|
-
id=
|
|
188
|
+
id={`helper-${helperPanelId}`}
|
|
189
|
+
data-testid="helper"
|
|
167
190
|
key={"helper"}
|
|
168
191
|
collapsedSize={0}
|
|
169
192
|
collapsible={true}
|
|
@@ -193,7 +216,8 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
|
|
|
193
216
|
const terminalPanel = (
|
|
194
217
|
<Panel
|
|
195
218
|
ref={terminalRef}
|
|
196
|
-
id=
|
|
219
|
+
id={`terminal-${terminalPanelId}`}
|
|
220
|
+
data-testid="terminal"
|
|
197
221
|
key={"terminal"}
|
|
198
222
|
collapsedSize={0}
|
|
199
223
|
collapsible={true}
|
|
@@ -6,7 +6,7 @@ import React from "react";
|
|
|
6
6
|
import { renderShortcut } from "@/components/shortcuts/renderShortcut";
|
|
7
7
|
import { Tooltip } from "@/components/ui/tooltip";
|
|
8
8
|
import { Button } from "../inputs/Inputs";
|
|
9
|
-
import { commandPaletteAtom } from "./
|
|
9
|
+
import { commandPaletteAtom } from "./state";
|
|
10
10
|
|
|
11
11
|
export const CommandPaletteButton: React.FC = () => {
|
|
12
12
|
const setCommandPaletteOpen = useSetAtom(commandPaletteAtom);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { useAtom, useAtomValue } from "jotai";
|
|
4
4
|
import {
|
|
5
5
|
CommandDialog,
|
|
6
6
|
CommandEmpty,
|
|
@@ -28,10 +28,9 @@ import {
|
|
|
28
28
|
import { useCellActionButtons } from "../actions/useCellActionButton";
|
|
29
29
|
import { useConfigActions } from "../actions/useConfigActions";
|
|
30
30
|
import { useNotebookActions } from "../actions/useNotebookActions";
|
|
31
|
+
import { commandPaletteAtom } from "./state";
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
export const CommandPalette = () => {
|
|
33
|
+
const CommandPalette = () => {
|
|
35
34
|
const [open, setOpen] = useAtom(commandPaletteAtom);
|
|
36
35
|
const registeredActions = useRegisteredActions();
|
|
37
36
|
const lastFocusedCell = useAtomValue(lastFocusedCellAtom);
|
|
@@ -208,3 +207,5 @@ export const CommandPalette = () => {
|
|
|
208
207
|
</CommandDialog>
|
|
209
208
|
);
|
|
210
209
|
};
|
|
210
|
+
|
|
211
|
+
export default CommandPalette;
|
|
@@ -4,6 +4,8 @@ import { zodResolver } from "@hookform/resolvers/zod";
|
|
|
4
4
|
import {
|
|
5
5
|
BoxIcon,
|
|
6
6
|
CheckIcon,
|
|
7
|
+
ChevronDownIcon,
|
|
8
|
+
ChevronRightIcon,
|
|
7
9
|
DownloadCloudIcon,
|
|
8
10
|
PackageCheckIcon,
|
|
9
11
|
PackageXIcon,
|
|
@@ -73,7 +75,7 @@ function buildPackageSpecifier(name: string, extras: string[]): string {
|
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
export const PackageAlert: React.FC = () => {
|
|
76
|
-
const { packageAlert } = useAlerts();
|
|
78
|
+
const { packageAlert, packageLogs } = useAlerts();
|
|
77
79
|
const { clearPackageAlert } = useAlertActions();
|
|
78
80
|
const [userConfig] = useResolvedMarimoConfig();
|
|
79
81
|
const [desiredPackageVersions, setDesiredPackageVersions] = useState<
|
|
@@ -92,10 +94,10 @@ export const PackageAlert: React.FC = () => {
|
|
|
92
94
|
|
|
93
95
|
if (isMissingPackageAlert(packageAlert)) {
|
|
94
96
|
return (
|
|
95
|
-
<div className="flex flex-col gap-4 mb-5 fixed top-5 left-12 min-w-[400px] z-200 opacity-95">
|
|
97
|
+
<div className="flex flex-col gap-4 mb-5 fixed top-5 left-12 min-w-[400px] z-200 opacity-95 max-w-[600px]">
|
|
96
98
|
<Banner
|
|
97
99
|
kind="danger"
|
|
98
|
-
className="flex flex-col rounded py-3 px-5 animate-in slide-in-from-left"
|
|
100
|
+
className="flex flex-col rounded py-3 px-5 animate-in slide-in-from-left overflow-auto max-h-[80vh] scrollbar-thin"
|
|
99
101
|
>
|
|
100
102
|
<div className="flex justify-between">
|
|
101
103
|
<span className="font-bold text-lg flex items-center mb-2">
|
|
@@ -114,45 +116,46 @@ export const PackageAlert: React.FC = () => {
|
|
|
114
116
|
<div className="flex flex-col gap-4 justify-between items-start text-muted-foreground text-base">
|
|
115
117
|
<div>
|
|
116
118
|
<p>The following packages were not found:</p>
|
|
117
|
-
<
|
|
119
|
+
<table className="list-disc ml-2 mt-1">
|
|
118
120
|
{packageAlert.packages.map((pkg, index) => {
|
|
119
121
|
const parsed = parsePackageSpecifier(pkg);
|
|
120
122
|
const currentExtras = selectedExtras[pkg] || parsed.extras;
|
|
121
123
|
|
|
122
124
|
return (
|
|
123
|
-
<
|
|
124
|
-
className="
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
<
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
setSelectedExtras((prev) => ({
|
|
134
|
-
...prev,
|
|
135
|
-
[pkg]: extras,
|
|
136
|
-
}))
|
|
137
|
-
}
|
|
138
|
-
/>
|
|
139
|
-
|
|
140
|
-
{doesSupportVersioning && (
|
|
141
|
-
<PackageVersionSelect
|
|
142
|
-
value={desiredPackageVersions[pkg] ?? "latest"}
|
|
143
|
-
onChange={(value) =>
|
|
144
|
-
setDesiredPackageVersions((prev) => ({
|
|
125
|
+
<tr className="font-mono text-sm" key={index}>
|
|
126
|
+
<td className="pr-2 py-1 align-middle">
|
|
127
|
+
<BoxIcon size="1rem" />
|
|
128
|
+
</td>
|
|
129
|
+
<td className="pr-2 py-1 align-middle">
|
|
130
|
+
<ExtrasSelector
|
|
131
|
+
packageName={parsed.name}
|
|
132
|
+
selectedExtras={currentExtras}
|
|
133
|
+
onExtrasChange={(extras) =>
|
|
134
|
+
setSelectedExtras((prev) => ({
|
|
145
135
|
...prev,
|
|
146
|
-
[pkg]:
|
|
136
|
+
[pkg]: extras,
|
|
147
137
|
}))
|
|
148
138
|
}
|
|
149
|
-
packageName={parsed.name}
|
|
150
139
|
/>
|
|
140
|
+
</td>
|
|
141
|
+
{doesSupportVersioning && (
|
|
142
|
+
<td className="pr-2 py-1 align-middle">
|
|
143
|
+
<PackageVersionSelect
|
|
144
|
+
value={desiredPackageVersions[pkg] ?? "latest"}
|
|
145
|
+
onChange={(value) =>
|
|
146
|
+
setDesiredPackageVersions((prev) => ({
|
|
147
|
+
...prev,
|
|
148
|
+
[pkg]: value,
|
|
149
|
+
}))
|
|
150
|
+
}
|
|
151
|
+
packageName={parsed.name}
|
|
152
|
+
/>
|
|
153
|
+
</td>
|
|
151
154
|
)}
|
|
152
|
-
</
|
|
155
|
+
</tr>
|
|
153
156
|
);
|
|
154
157
|
})}
|
|
155
|
-
</
|
|
158
|
+
</table>
|
|
156
159
|
</div>
|
|
157
160
|
<div className="ml-auto flex flex-row items-baseline">
|
|
158
161
|
{packageAlert.isolated ? (
|
|
@@ -200,10 +203,10 @@ export const PackageAlert: React.FC = () => {
|
|
|
200
203
|
}
|
|
201
204
|
|
|
202
205
|
return (
|
|
203
|
-
<div className="flex flex-col gap-4 mb-5 fixed top-5 left-12 min-w-[400px] z-200 opacity-95">
|
|
206
|
+
<div className="flex flex-col gap-4 mb-5 fixed top-5 left-12 min-w-[400px] z-200 opacity-95 max-w-[600px] ">
|
|
204
207
|
<Banner
|
|
205
208
|
kind={status === "failed" ? "danger" : "info"}
|
|
206
|
-
className="flex flex-col rounded pt-3 pb-4 px-5"
|
|
209
|
+
className="flex flex-col rounded pt-3 pb-4 px-5 overflow-auto max-h-[80vh] scrollbar-thin"
|
|
207
210
|
>
|
|
208
211
|
<div className="flex justify-between">
|
|
209
212
|
<span className="font-bold text-lg flex items-center mb-2">
|
|
@@ -225,30 +228,29 @@ export const PackageAlert: React.FC = () => {
|
|
|
225
228
|
status === "installed" && "text-accent-foreground",
|
|
226
229
|
)}
|
|
227
230
|
>
|
|
228
|
-
<
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
(
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
</div>
|
|
231
|
+
<p>{description}</p>
|
|
232
|
+
<ul className="list-disc ml-2 mt-1">
|
|
233
|
+
{Object.entries(packageAlert.packages).map(([pkg, st], index) => (
|
|
234
|
+
<li
|
|
235
|
+
className={cn(
|
|
236
|
+
"flex items-center gap-1 font-mono text-sm",
|
|
237
|
+
st === "installing" && "font-semibold",
|
|
238
|
+
st === "failed" && "text-destructive",
|
|
239
|
+
st === "installed" && "text-accent-foreground",
|
|
240
|
+
st === "installed" &&
|
|
241
|
+
status === "failed" &&
|
|
242
|
+
"text-muted-foreground",
|
|
243
|
+
)}
|
|
244
|
+
key={index}
|
|
245
|
+
>
|
|
246
|
+
<ProgressIcon status={st} />
|
|
247
|
+
{pkg}
|
|
248
|
+
</li>
|
|
249
|
+
))}
|
|
250
|
+
</ul>
|
|
251
|
+
{Object.keys(packageLogs).length > 0 && (
|
|
252
|
+
<StreamingLogsViewer packageLogs={packageLogs} />
|
|
253
|
+
)}
|
|
252
254
|
</div>
|
|
253
255
|
</Banner>
|
|
254
256
|
</div>
|
|
@@ -288,7 +290,7 @@ function getInstallationStatusElements(packages: PackageInstallationStatus) {
|
|
|
288
290
|
status: "failed",
|
|
289
291
|
title: "Some packages failed to install",
|
|
290
292
|
titleIcon: <PackageXIcon className="w-5 h-5 inline-block mr-2" />,
|
|
291
|
-
description: "See
|
|
293
|
+
description: "See error logs.",
|
|
292
294
|
};
|
|
293
295
|
}
|
|
294
296
|
|
|
@@ -441,7 +443,7 @@ const ExtrasSelector: React.FC<ExtrasSelectorProps> = ({
|
|
|
441
443
|
|
|
442
444
|
return (
|
|
443
445
|
<div className="flex items-center max-w-72">
|
|
444
|
-
<span className="shrink-0">{packageName}</span>
|
|
446
|
+
<span className="shrink-0 flex-1">{packageName}</span>
|
|
445
447
|
|
|
446
448
|
{selectedExtras.length > 0 ? (
|
|
447
449
|
<span className="flex items-center min-w-0 flex-1">
|
|
@@ -594,3 +596,51 @@ const PackageVersionSelect: React.FC<PackageVersionSelectProps> = ({
|
|
|
594
596
|
</NativeSelect>
|
|
595
597
|
);
|
|
596
598
|
};
|
|
599
|
+
|
|
600
|
+
interface StreamingLogsViewerProps {
|
|
601
|
+
packageLogs: { [packageName: string]: string };
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
const StreamingLogsViewer: React.FC<StreamingLogsViewerProps> = ({
|
|
605
|
+
packageLogs,
|
|
606
|
+
}) => {
|
|
607
|
+
const [isExpanded, setIsExpanded] = useState(true);
|
|
608
|
+
|
|
609
|
+
const packageCount = Object.keys(packageLogs).length;
|
|
610
|
+
if (packageCount === 0) {
|
|
611
|
+
return null;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
return (
|
|
615
|
+
<div className="mt-4 border-t border-border pt-4 w-full">
|
|
616
|
+
<button
|
|
617
|
+
onClick={() => setIsExpanded(!isExpanded)}
|
|
618
|
+
className="flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors"
|
|
619
|
+
>
|
|
620
|
+
{isExpanded ? (
|
|
621
|
+
<ChevronDownIcon className="w-4 h-4" />
|
|
622
|
+
) : (
|
|
623
|
+
<ChevronRightIcon className="w-4 h-4" />
|
|
624
|
+
)}
|
|
625
|
+
Installation logs
|
|
626
|
+
</button>
|
|
627
|
+
|
|
628
|
+
{isExpanded && (
|
|
629
|
+
<div className="mt-3 space-y-3 w-full">
|
|
630
|
+
{Object.entries(packageLogs).map(([packageName, logs]) => (
|
|
631
|
+
<div key={packageName} className="w-full">
|
|
632
|
+
<h4 className="font-mono text-sm font-medium mb-2 text-foreground">
|
|
633
|
+
{packageName}
|
|
634
|
+
</h4>
|
|
635
|
+
<div className="border border-border rounded w-full">
|
|
636
|
+
<pre className="p-3 text-xs font-mono bg-background max-h-64 overflow-y-auto text-muted-foreground whitespace-pre-wrap scrollbar-thin">
|
|
637
|
+
{logs || "No logs available"}
|
|
638
|
+
</pre>
|
|
639
|
+
</div>
|
|
640
|
+
</div>
|
|
641
|
+
))}
|
|
642
|
+
</div>
|
|
643
|
+
)}
|
|
644
|
+
</div>
|
|
645
|
+
);
|
|
646
|
+
};
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
SquareMIcon,
|
|
14
14
|
} from "lucide-react";
|
|
15
15
|
import { useEffect } from "react";
|
|
16
|
+
import { StartupLogsAlert } from "@/components/editor/alerts/startup-logs-alert";
|
|
16
17
|
import { Cell } from "@/components/editor/Cell";
|
|
17
18
|
import { PackageAlert } from "@/components/editor/package-alert";
|
|
18
19
|
import { SortableCellsProvider } from "@/components/sort/SortableCellsProvider";
|
|
@@ -120,6 +121,7 @@ const CellArrayInternal: React.FC<CellArrayProps> = ({
|
|
|
120
121
|
innerClassName="pr-4" // For the floating actions
|
|
121
122
|
>
|
|
122
123
|
<PackageAlert />
|
|
124
|
+
<StartupLogsAlert />
|
|
123
125
|
<StdinBlockingAlert />
|
|
124
126
|
<ConnectingAlert />
|
|
125
127
|
<NotebookBanner width={appConfig.width} />
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import { lazy } from "react";
|
|
3
4
|
import type { AppConfig, UserConfig } from "@/core/config/config-schema";
|
|
4
5
|
import { KnownQueryParams } from "@/core/constants";
|
|
5
6
|
import { EditApp } from "@/core/edit-app";
|
|
6
7
|
import { AppChrome } from "../editor/chrome/wrapper/app-chrome";
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
const LazyCommandPalette = lazy(
|
|
10
|
+
() => import("../editor/controls/command-palette"),
|
|
11
|
+
);
|
|
8
12
|
|
|
9
13
|
interface Props {
|
|
10
14
|
userConfig: UserConfig;
|
|
@@ -21,7 +25,7 @@ const EditPage = (props: Props) => {
|
|
|
21
25
|
return (
|
|
22
26
|
<>
|
|
23
27
|
<EditApp hideControls={true} {...props} />
|
|
24
|
-
<
|
|
28
|
+
<LazyCommandPalette />
|
|
25
29
|
</>
|
|
26
30
|
);
|
|
27
31
|
}
|
|
@@ -29,7 +33,7 @@ const EditPage = (props: Props) => {
|
|
|
29
33
|
return (
|
|
30
34
|
<AppChrome>
|
|
31
35
|
<EditApp {...props} />
|
|
32
|
-
<
|
|
36
|
+
<LazyCommandPalette />
|
|
33
37
|
</AppChrome>
|
|
34
38
|
);
|
|
35
39
|
};
|