@marimo-team/frontend 0.25.3-dev102 → 0.25.3-dev104

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.
Files changed (79) hide show
  1. package/dist/assets/{CellStatus-fK4n2NPc.js → CellStatus-DVrvejMC.js} +1 -1
  2. package/dist/assets/{ErrorBoundary-CAEGdoFW.js → ErrorBoundary-0akNKvJm.js} +2 -2
  3. package/dist/assets/{JsonOutput-CyAKmZDD.js → JsonOutput-DeUmpc_f.js} +1 -1
  4. package/dist/assets/{MarimoErrorOutput-CgZvP0p0.js → MarimoErrorOutput-BazxeAYV.js} +1 -1
  5. package/dist/assets/{RenderHTML-DQvxDDNS.js → RenderHTML-CbAdeual.js} +1 -1
  6. package/dist/assets/{RunButton-BBDnDL6G.js → RunButton-CjKwgCFU.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-Clg5FELx.js → add-cell-with-ai-BKVEws3J.js} +1 -1
  8. package/dist/assets/{add-connection-dialog-BqdWmD-7.js → add-connection-dialog-DS7LTz1T.js} +1 -1
  9. package/dist/assets/{agent-panel-5RxG5Y82.js → agent-panel-B34QcdOK.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-Bvl1ktQq.js → ai-model-dropdown-DqFJCFVR.js} +1 -1
  11. package/dist/assets/{app-config-button-0QTeQ2Mv.js → app-config-button-CVh4UKi9.js} +1 -1
  12. package/dist/assets/{blob-5VcB8K_t.js → blob-Bw0ZQoLx.js} +1 -1
  13. package/dist/assets/{cell-editor-Byw5y-oI.js → cell-editor-DQ0io5Ye.js} +1 -1
  14. package/dist/assets/{cell-link-C5yYyzuF.js → cell-link-DvOIu6A3.js} +1 -1
  15. package/dist/assets/{cells-D_11MjVB.js → cells-Do-63MKT.js} +1 -1
  16. package/dist/assets/{chat-display-BCR_ySiV.js → chat-display-DnkhBxdh.js} +1 -1
  17. package/dist/assets/{chat-panel-RPRvBsaU.js → chat-panel-CN3qoX9G.js} +1 -1
  18. package/dist/assets/{chat-ui-CGviVaRA.js → chat-ui-B54K5qqr.js} +1 -1
  19. package/dist/assets/{column-preview-xe533-Cn.js → column-preview-DmxzHzaW.js} +1 -1
  20. package/dist/assets/{command-palette-BB9bWdWp.js → command-palette-CciCeRhy.js} +1 -1
  21. package/dist/assets/{common-CaeItbcI.js → common-BCyx7t1i.js} +1 -1
  22. package/dist/assets/{components-G6frbw0c.js → components-CDvWXfXq.js} +1 -1
  23. package/dist/assets/{datasource-deuXnlU-.js → datasource-DieftweT.js} +1 -1
  24. package/dist/assets/{dependency-graph-panel-CIykLnJe.js → dependency-graph-panel-IfcqTHgq.js} +1 -1
  25. package/dist/assets/{documentation-panel-2PQ8kQLa.js → documentation-panel-DeLCgVcq.js} +1 -1
  26. package/dist/assets/{download-dK52bLxZ.js → download-BzfVCqUq.js} +1 -1
  27. package/dist/assets/{edit-page-DrElzw10.js → edit-page-HMyk4cWw.js} +4 -4
  28. package/dist/assets/{error-entries-3GVk2KjS.js → error-entries-DjjWrbt4.js} +1 -1
  29. package/dist/assets/{error-panel-CzDRGPeC.js → error-panel-CiG3JJA3.js} +1 -1
  30. package/dist/assets/{feedback-button-C5NgWpFg.js → feedback-button-B8zVQEi6.js} +1 -1
  31. package/dist/assets/feedback-button-DQdMkSvR.js +1 -0
  32. package/dist/assets/{file-explorer-panel-B50xDnTZ.js → file-explorer-panel-BPD8Q0L-.js} +1 -1
  33. package/dist/assets/{file-name-input-DqwMSgGU.js → file-name-input-CdkF9K3I.js} +1 -1
  34. package/dist/assets/{floating-outline-ChmAuvxz.js → floating-outline-TfDWJXBm.js} +1 -1
  35. package/dist/assets/{gallery-page-CiL8aMS1.js → gallery-page-BJpenPdQ.js} +1 -1
  36. package/dist/assets/{glide-data-editor-CqRclBkp.js → glide-data-editor-DO15Nm-R.js} +1 -1
  37. package/dist/assets/{home-page-BgZVl4dP.js → home-page-mvqldGvD.js} +1 -1
  38. package/dist/assets/{hooks-DM5n7Osw.js → hooks-C4AJfqV0.js} +1 -1
  39. package/dist/assets/{index-EG2n8Oht.js → index-C2XzUsS7.js} +4 -4
  40. package/dist/assets/{layout-BpP8nTjb.js → layout-1kSh6fBF.js} +3 -3
  41. package/dist/assets/{logs-panel-B5eVAZtH.js → logs-panel--QbHo7uS.js} +1 -1
  42. package/dist/assets/{markdown-renderer-BWUzqkJM.js → markdown-renderer-DJ7H8Rps.js} +1 -1
  43. package/dist/assets/{name-cell-input-DXW68gRW.js → name-cell-input-6Gd19S8T.js} +1 -1
  44. package/dist/assets/{outline-panel-DPxJhJ_A.js → outline-panel-CjKvunvX.js} +1 -1
  45. package/dist/assets/{packages-panel-gBE2FWQr.js → packages-panel-Gyrqi-MZ.js} +1 -1
  46. package/dist/assets/{panel-accordion-state-CCF5Gxnc.js → panel-accordion-state-D49TNCLQ.js} +1 -1
  47. package/dist/assets/{panels-Dr6qMCvU.js → panels-DfbxoeGa.js} +1 -1
  48. package/dist/assets/{process-output-Cw9IDcKQ.js → process-output-CgkoeA1-.js} +1 -1
  49. package/dist/assets/{readonly-code-display-DYcZQ28T.js → readonly-code-display-BMbl_4BR.js} +1 -1
  50. package/dist/assets/{readonly-python-code-RFuQP50v.js → readonly-python-code-BnPfpOJM.js} +1 -1
  51. package/dist/assets/{reveal-component-yRrDmCQz.js → reveal-component-D84yAzG7.js} +1 -1
  52. package/dist/assets/{run-page-B69M4-zE.js → run-page-B10s8Pre.js} +1 -1
  53. package/dist/assets/{runtime-details-state-pobtu6TO.js → runtime-details-state-Bkmgb59p.js} +1 -1
  54. package/dist/assets/{scratchpad-panel-H44_pvb_.js → scratchpad-panel-DtyjJ3yN.js} +1 -1
  55. package/dist/assets/{session-panel-Bnd1iXkO.js → session-panel-Chaq1do8.js} +1 -1
  56. package/dist/assets/{snippets-panel-DKApxKx9.js → snippets-panel-BaZmddOW.js} +1 -1
  57. package/dist/assets/{state-Dv059B3A.js → state-CqnCwHhY.js} +1 -1
  58. package/dist/assets/{state-Bl9BiY_s.js → state-Db73TZVD.js} +1 -1
  59. package/dist/assets/{tracing-Clwy4SlW.js → tracing-C2vQMUI0.js} +1 -1
  60. package/dist/assets/{tracing-panel-BwjLG_aC.js → tracing-panel-B4L2S2ac.js} +2 -2
  61. package/dist/assets/{tree-actions-BZNTQ12N.js → tree-actions-JXDiioHK.js} +1 -1
  62. package/dist/assets/{useAddCell-Cjuqk2YR.js → useAddCell-CP3HIjGl.js} +1 -1
  63. package/dist/assets/{useCellActionButton-MoWLvuGe.js → useCellActionButton-yi1_-emd.js} +1 -1
  64. package/dist/assets/{useDeleteCell-BC-MW7d1.js → useDeleteCell-BPLwyClM.js} +1 -1
  65. package/dist/assets/{useDependencyPanelTab-CZU7i-B3.js → useDependencyPanelTab-DmBiydXO.js} +1 -1
  66. package/dist/assets/{useNotebookActions-wFxVdRXQ.js → useNotebookActions-CfmgcJGx.js} +1 -1
  67. package/dist/assets/{useRunCells-ByaWxoIt.js → useRunCells-jF-7tJkw.js} +1 -1
  68. package/dist/assets/{useSplitCell-YJIystwv.js → useSplitCell-B6zWL8Zf.js} +1 -1
  69. package/dist/index.html +20 -20
  70. package/package.json +1 -1
  71. package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -0
  72. package/src/core/codemirror/cells/extensions.ts +7 -3
  73. package/src/core/document/__tests__/codemirror.test.ts +483 -0
  74. package/src/core/document/__tests__/hooks.test.tsx +386 -0
  75. package/src/core/document/codemirror.ts +311 -0
  76. package/src/core/document/hooks.tsx +118 -0
  77. package/src/core/document/index.ts +10 -0
  78. package/src/core/document/select.ts +9 -0
  79. package/dist/assets/feedback-button-CONwLFpw.js +0 -1
@@ -0,0 +1,118 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import type { CellId } from "@marimo-team/client/protocol";
4
+ import { useAtomValue, useSetAtom, useStore } from "jotai";
5
+ import { createContext, type ReactNode, useContext, useMemo } from "react";
6
+ import { cellCodeBinding } from "./codemirror";
7
+ import type { EditableCell } from "./draft";
8
+ import type { DocumentModel } from "./model";
9
+ import { selectCellField, selectOrder } from "./select";
10
+
11
+ const DocumentContext = createContext<DocumentModel | null>(null);
12
+
13
+ /**
14
+ * Expose a session-owned model to React. Construct the model with the same store
15
+ * as the enclosing Jotai Provider. The session owner controls its AbortSignal;
16
+ * mounting or unmounting this provider does not change the model's lifetime.
17
+ *
18
+ * ```tsx
19
+ * <Provider store={store}>
20
+ * <DocumentProvider model={model}>
21
+ * <Editor />
22
+ * </DocumentProvider>
23
+ * </Provider>
24
+ * ```
25
+ */
26
+ export function DocumentProvider({
27
+ model,
28
+ children,
29
+ }: {
30
+ model: DocumentModel;
31
+ children: ReactNode;
32
+ }) {
33
+ return (
34
+ <DocumentContext.Provider value={model}>
35
+ {children}
36
+ </DocumentContext.Provider>
37
+ );
38
+ }
39
+
40
+ function useDocumentModel() {
41
+ const model = useContext(DocumentContext);
42
+ if (model === null) {
43
+ throw new Error("Document hooks require a DocumentProvider");
44
+ }
45
+ return model;
46
+ }
47
+
48
+ /** Null while the document is unavailable; an empty array for an empty document. */
49
+ export function useCellOrder() {
50
+ const { documentAtom } = useDocumentModel();
51
+ return useAtomValue(useMemo(() => selectOrder(documentAtom), [documentAtom]));
52
+ }
53
+
54
+ function useCellField<K extends keyof EditableCell>(id: CellId, field: K) {
55
+ const { documentAtom } = useDocumentModel();
56
+ return useAtomValue(
57
+ useMemo(
58
+ () => selectCellField(documentAtom, id, field),
59
+ [documentAtom, id, field],
60
+ ),
61
+ );
62
+ }
63
+
64
+ /** Undefined for an absent cell; null when the host withholds its source. */
65
+ export function useCellCode(id: CellId) {
66
+ return useCellField(id, "code");
67
+ }
68
+
69
+ /** Undefined when the cell or document is unavailable. */
70
+ export function useCellName(id: CellId) {
71
+ return useCellField(id, "name");
72
+ }
73
+
74
+ /** Undefined when the cell or document is unavailable. */
75
+ export function useCellConfig(id: CellId) {
76
+ return useCellField(id, "config");
77
+ }
78
+
79
+ /**
80
+ * A CodeMirror extension that binds the editor's text to a cell's code.
81
+ * Stable until the cell id or document model changes.
82
+ *
83
+ * ```tsx
84
+ * const extension = useCellCodeExtension(cellId);
85
+ * ```
86
+ */
87
+ export function useCellCodeExtension(id: CellId) {
88
+ const model = useDocumentModel();
89
+ const store = useStore();
90
+ return useMemo(
91
+ () => cellCodeBinding({ store, model, cellId: id }),
92
+ [model, store, id],
93
+ );
94
+ }
95
+
96
+ /**
97
+ * A stable edit function. Synchronous callbacks publish atomically or roll back.
98
+ *
99
+ * ```ts
100
+ * const edit = useDocumentEdit();
101
+ * edit((tx) => tx.setCode(cellId, code));
102
+ * ```
103
+ */
104
+ export function useDocumentEdit() {
105
+ return useSetAtom(useDocumentModel().editAtom);
106
+ }
107
+
108
+ /**
109
+ * Sync status and explicit recovery. flush waits for edits, including newer
110
+ * typing, to reach the confirmed source and returns the revision for Run/Save.
111
+ * Rejections retain local edits; retry explicitly resubmits them. Requests
112
+ * with an unknown outcome reuse their original key within the retry window.
113
+ */
114
+ export function useDocumentSync() {
115
+ const model = useDocumentModel();
116
+ const status = useAtomValue(model.syncStatusAtom);
117
+ return { status, flush: model.flush, retry: model.retry };
118
+ }
@@ -1,5 +1,15 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
+ export {
4
+ DocumentProvider,
5
+ useCellCode,
6
+ useCellCodeExtension,
7
+ useCellConfig,
8
+ useCellName,
9
+ useCellOrder,
10
+ useDocumentEdit,
11
+ useDocumentSync,
12
+ } from "./hooks";
3
13
  export { createDocumentModel } from "./model";
4
14
  export type {
5
15
  DocumentEdit,
@@ -30,3 +30,12 @@ export function selectOrder(
30
30
  ): Atom<readonly Protocol.CellId[] | null> {
31
31
  return selectAtom(document, (value) => value?.order ?? null, dequal);
32
32
  }
33
+
34
+ /** Select one field of a cell, unchanged until that field's value changes. */
35
+ export function selectCellField<K extends keyof EditableCell>(
36
+ document: Atom<EditableDocument | null>,
37
+ id: Protocol.CellId,
38
+ field: K,
39
+ ): Atom<EditableCell[K] | undefined> {
40
+ return selectAtom(document, (value) => value?.cells.get(id)?.[field], dequal);
41
+ }
@@ -1 +0,0 @@
1
- import{n as e}from"./feedback-button-C5NgWpFg.js";export{e as FeedbackModal};