@petrarca/sonnet-ui 0.1.0
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/LICENSE.md +190 -0
- package/dist/index.d.ts +989 -0
- package/dist/index.js +5016 -0
- package/dist/index.js.map +1 -0
- package/dist/json-editor/index.d.ts +51 -0
- package/dist/json-editor/index.js +131 -0
- package/dist/json-editor/index.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as _codemirror_state from '@codemirror/state';
|
|
3
|
+
import { Extension } from '@codemirror/state';
|
|
4
|
+
|
|
5
|
+
interface JsonEditorProps {
|
|
6
|
+
/** The JSON string to display and edit. */
|
|
7
|
+
value: string;
|
|
8
|
+
/**
|
|
9
|
+
* JSON Pointer (RFC 6901) paths whose values are editable.
|
|
10
|
+
* Everything outside these paths is readonly.
|
|
11
|
+
* Example: ["/metadata", "/definitions/Patient/description"]
|
|
12
|
+
*/
|
|
13
|
+
editablePaths: string[];
|
|
14
|
+
/** Called when the document changes (only editable regions can change). */
|
|
15
|
+
onChange?: (value: string) => void;
|
|
16
|
+
/** Editor height. Defaults to "400px". */
|
|
17
|
+
height?: string;
|
|
18
|
+
/** Additional CSS class on the wrapper. */
|
|
19
|
+
className?: string;
|
|
20
|
+
/**
|
|
21
|
+
* CodeMirror theme extension. Defaults to a built-in theme that reads
|
|
22
|
+
* CSS variables (--border, --font-mono, --muted) from the host app.
|
|
23
|
+
* Pass your own Extension to override styling entirely.
|
|
24
|
+
*/
|
|
25
|
+
theme?: Extension;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* JsonEditor - A JSON text editor with selectively editable regions.
|
|
29
|
+
*
|
|
30
|
+
* Pass JSON Pointer paths to `editablePaths` to mark which parts of
|
|
31
|
+
* the document the user can modify. Everything else is visible but
|
|
32
|
+
* locked. Changes outside editable regions are silently rejected.
|
|
33
|
+
*
|
|
34
|
+
* The default theme reads CSS variables from @petrarca/sonnet-ui/styles.css
|
|
35
|
+
* (--border, --font-mono, --muted). Pass a custom `theme` extension to
|
|
36
|
+
* override styling for consumers that do not use sonnet-ui tokens.
|
|
37
|
+
*/
|
|
38
|
+
declare function JsonEditor({ value, editablePaths, onChange, height, className, theme, }: JsonEditorProps): react_jsx_runtime.JSX.Element;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Default CodeMirror theme for JsonEditor.
|
|
42
|
+
*
|
|
43
|
+
* Reads CSS variables provided by @petrarca/sonnet-ui/styles.css:
|
|
44
|
+
* --border, --font-mono, --muted
|
|
45
|
+
*
|
|
46
|
+
* Consumers not using sonnet-ui tokens can pass their own Extension
|
|
47
|
+
* via the JsonEditor `theme` prop to override this entirely.
|
|
48
|
+
*/
|
|
49
|
+
declare const defaultTheme: _codemirror_state.Extension;
|
|
50
|
+
|
|
51
|
+
export { JsonEditor, type JsonEditorProps, defaultTheme };
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// src/JsonEditor/JsonEditor.tsx
|
|
2
|
+
import { useCallback, useMemo } from "react";
|
|
3
|
+
import CodeMirror from "@uiw/react-codemirror";
|
|
4
|
+
import { json } from "@codemirror/lang-json";
|
|
5
|
+
import { EditorState, StateField } from "@codemirror/state";
|
|
6
|
+
import { EditorView as EditorView2, Decoration } from "@codemirror/view";
|
|
7
|
+
import { resolvePointerRanges } from "@petrarca/sonnet-core";
|
|
8
|
+
|
|
9
|
+
// src/JsonEditor/defaultTheme.ts
|
|
10
|
+
import { EditorView } from "@codemirror/view";
|
|
11
|
+
var defaultTheme = EditorView.theme({
|
|
12
|
+
"&": {
|
|
13
|
+
fontSize: "13px",
|
|
14
|
+
border: "1px solid var(--border)",
|
|
15
|
+
borderRadius: "6px"
|
|
16
|
+
},
|
|
17
|
+
".cm-content": {
|
|
18
|
+
fontFamily: "var(--font-mono, 'JetBrains Mono', monospace)"
|
|
19
|
+
},
|
|
20
|
+
".cm-readonly-region": {
|
|
21
|
+
backgroundColor: "rgb(219 234 254 / 0.5)",
|
|
22
|
+
opacity: "0.7"
|
|
23
|
+
},
|
|
24
|
+
".cm-gutters": {
|
|
25
|
+
backgroundColor: "hsl(var(--muted) / 0.3)",
|
|
26
|
+
border: "none"
|
|
27
|
+
},
|
|
28
|
+
".cm-activeLine": {
|
|
29
|
+
backgroundColor: "transparent"
|
|
30
|
+
},
|
|
31
|
+
".cm-activeLineGutter": {
|
|
32
|
+
backgroundColor: "transparent"
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// src/JsonEditor/JsonEditor.tsx
|
|
37
|
+
import { jsx } from "react/jsx-runtime";
|
|
38
|
+
var readonlyMark = Decoration.mark({ class: "cm-readonly-region" });
|
|
39
|
+
function computeReadonlyRanges(editableRanges, docLength) {
|
|
40
|
+
const ranges = [];
|
|
41
|
+
let cursor = 0;
|
|
42
|
+
for (const range of editableRanges) {
|
|
43
|
+
if (cursor < range.from) {
|
|
44
|
+
ranges.push({ from: cursor, to: range.from });
|
|
45
|
+
}
|
|
46
|
+
cursor = range.to;
|
|
47
|
+
}
|
|
48
|
+
if (cursor < docLength) {
|
|
49
|
+
ranges.push({ from: cursor, to: docLength });
|
|
50
|
+
}
|
|
51
|
+
return ranges;
|
|
52
|
+
}
|
|
53
|
+
function buildEditableExtensions(editablePaths) {
|
|
54
|
+
const changeFilter = EditorState.changeFilter.of((tr) => {
|
|
55
|
+
const currentDoc = tr.startState.doc.toString();
|
|
56
|
+
const editableRanges = resolvePointerRanges(currentDoc, editablePaths);
|
|
57
|
+
const readonlyRanges = computeReadonlyRanges(
|
|
58
|
+
editableRanges,
|
|
59
|
+
tr.startState.doc.length
|
|
60
|
+
);
|
|
61
|
+
if (readonlyRanges.length === 0) return true;
|
|
62
|
+
return readonlyRanges.flatMap((r) => [r.from, r.to]);
|
|
63
|
+
});
|
|
64
|
+
const readonlyDecorations = StateField.define({
|
|
65
|
+
create(state) {
|
|
66
|
+
const editableRanges = resolvePointerRanges(
|
|
67
|
+
state.doc.toString(),
|
|
68
|
+
editablePaths
|
|
69
|
+
);
|
|
70
|
+
const ranges = computeReadonlyRanges(editableRanges, state.doc.length);
|
|
71
|
+
return Decoration.set(
|
|
72
|
+
ranges.map((r) => readonlyMark.range(r.from, r.to))
|
|
73
|
+
);
|
|
74
|
+
},
|
|
75
|
+
update(deco, tr) {
|
|
76
|
+
if (!tr.docChanged) return deco;
|
|
77
|
+
const editableRanges = resolvePointerRanges(
|
|
78
|
+
tr.state.doc.toString(),
|
|
79
|
+
editablePaths
|
|
80
|
+
);
|
|
81
|
+
const ranges = computeReadonlyRanges(editableRanges, tr.state.doc.length);
|
|
82
|
+
return Decoration.set(
|
|
83
|
+
ranges.map((r) => readonlyMark.range(r.from, r.to))
|
|
84
|
+
);
|
|
85
|
+
},
|
|
86
|
+
provide: (field) => EditorView2.decorations.from(field)
|
|
87
|
+
});
|
|
88
|
+
return [changeFilter, readonlyDecorations];
|
|
89
|
+
}
|
|
90
|
+
function JsonEditor({
|
|
91
|
+
value,
|
|
92
|
+
editablePaths,
|
|
93
|
+
onChange,
|
|
94
|
+
height = "400px",
|
|
95
|
+
className,
|
|
96
|
+
theme = defaultTheme
|
|
97
|
+
}) {
|
|
98
|
+
const joinedPaths = editablePaths.join(",");
|
|
99
|
+
const extensions = useMemo(
|
|
100
|
+
() => [json(), theme, ...buildEditableExtensions(editablePaths)],
|
|
101
|
+
[joinedPaths, theme]
|
|
102
|
+
// eslint-disable-line react-hooks/exhaustive-deps
|
|
103
|
+
);
|
|
104
|
+
const handleChange = useCallback(
|
|
105
|
+
(val) => {
|
|
106
|
+
onChange?.(val);
|
|
107
|
+
},
|
|
108
|
+
[onChange]
|
|
109
|
+
);
|
|
110
|
+
return /* @__PURE__ */ jsx("div", { className, children: /* @__PURE__ */ jsx(
|
|
111
|
+
CodeMirror,
|
|
112
|
+
{
|
|
113
|
+
value,
|
|
114
|
+
height,
|
|
115
|
+
extensions,
|
|
116
|
+
onChange: handleChange,
|
|
117
|
+
basicSetup: {
|
|
118
|
+
lineNumbers: true,
|
|
119
|
+
foldGutter: true,
|
|
120
|
+
bracketMatching: true,
|
|
121
|
+
closeBrackets: true,
|
|
122
|
+
indentOnInput: true
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
) });
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
JsonEditor,
|
|
129
|
+
defaultTheme
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/JsonEditor/JsonEditor.tsx","../../src/JsonEditor/defaultTheme.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { json } from \"@codemirror/lang-json\";\nimport { EditorState, StateField, type Extension } from \"@codemirror/state\";\nimport { EditorView, Decoration, type DecorationSet } from \"@codemirror/view\";\nimport { resolvePointerRanges, type OffsetRange } from \"@petrarca/sonnet-core\";\nimport { defaultTheme } from \"./defaultTheme\";\n\nexport interface JsonEditorProps {\n /** The JSON string to display and edit. */\n value: string;\n /**\n * JSON Pointer (RFC 6901) paths whose values are editable.\n * Everything outside these paths is readonly.\n * Example: [\"/metadata\", \"/definitions/Patient/description\"]\n */\n editablePaths: string[];\n /** Called when the document changes (only editable regions can change). */\n onChange?: (value: string) => void;\n /** Editor height. Defaults to \"400px\". */\n height?: string;\n /** Additional CSS class on the wrapper. */\n className?: string;\n /**\n * CodeMirror theme extension. Defaults to a built-in theme that reads\n * CSS variables (--border, --font-mono, --muted) from the host app.\n * Pass your own Extension to override styling entirely.\n */\n theme?: Extension;\n}\n\n// Decoration mark for readonly regions (subtle blue background)\nconst readonlyMark = Decoration.mark({ class: \"cm-readonly-region\" });\n\n/**\n * Compute readonly ranges from editable ranges (inversion against doc length).\n * Used by both the changeFilter and the decoration builder.\n */\nfunction computeReadonlyRanges(\n editableRanges: OffsetRange[],\n docLength: number,\n): { from: number; to: number }[] {\n const ranges: { from: number; to: number }[] = [];\n let cursor = 0;\n for (const range of editableRanges) {\n if (cursor < range.from) {\n ranges.push({ from: cursor, to: range.from });\n }\n cursor = range.to;\n }\n if (cursor < docLength) {\n ranges.push({ from: cursor, to: docLength });\n }\n return ranges;\n}\n\n/**\n * Build CodeMirror extensions that enforce editable regions:\n * - changeFilter: suppresses changes outside editable ranges\n * - StateField: decorates readonly regions with a visual style\n */\nfunction buildEditableExtensions(editablePaths: string[]) {\n // changeFilter: recompute editable ranges from the live document on every\n // transaction so offsets remain accurate as the user types. Using a snapshot\n // from mount time would cause ranges to drift and incorrectly block edits.\n const changeFilter = EditorState.changeFilter.of((tr) => {\n const currentDoc = tr.startState.doc.toString();\n const editableRanges = resolvePointerRanges(currentDoc, editablePaths);\n const readonlyRanges = computeReadonlyRanges(\n editableRanges,\n tr.startState.doc.length,\n );\n // Empty readonly list means the whole document is editable -- return true\n // to allow all changes. An empty array would block everything.\n if (readonlyRanges.length === 0) return true;\n return readonlyRanges.flatMap((r) => [r.from, r.to]);\n });\n\n // Decorations: mark readonly regions with a subtle background.\n // Recomputed from the live document on every change so highlights stay\n // accurate as content shifts.\n const readonlyDecorations = StateField.define<DecorationSet>({\n create(state) {\n const editableRanges = resolvePointerRanges(\n state.doc.toString(),\n editablePaths,\n );\n const ranges = computeReadonlyRanges(editableRanges, state.doc.length);\n return Decoration.set(\n ranges.map((r) => readonlyMark.range(r.from, r.to)),\n );\n },\n update(deco, tr) {\n if (!tr.docChanged) return deco;\n const editableRanges = resolvePointerRanges(\n tr.state.doc.toString(),\n editablePaths,\n );\n const ranges = computeReadonlyRanges(editableRanges, tr.state.doc.length);\n return Decoration.set(\n ranges.map((r) => readonlyMark.range(r.from, r.to)),\n );\n },\n provide: (field) => EditorView.decorations.from(field),\n });\n\n return [changeFilter, readonlyDecorations];\n}\n\n/**\n * JsonEditor - A JSON text editor with selectively editable regions.\n *\n * Pass JSON Pointer paths to `editablePaths` to mark which parts of\n * the document the user can modify. Everything else is visible but\n * locked. Changes outside editable regions are silently rejected.\n *\n * The default theme reads CSS variables from @petrarca/sonnet-ui/styles.css\n * (--border, --font-mono, --muted). Pass a custom `theme` extension to\n * override styling for consumers that do not use sonnet-ui tokens.\n */\nexport default function JsonEditor({\n value,\n editablePaths,\n onChange,\n height = \"400px\",\n className,\n theme = defaultTheme,\n}: JsonEditorProps) {\n // Ranges are structural: recompute only when the set of editable paths\n // or the theme changes, not on every keystroke. When paths change, use the\n // current value so ranges are computed against what is actually in the editor.\n const joinedPaths = editablePaths.join(\",\");\n\n const extensions = useMemo(\n () => [json(), theme, ...buildEditableExtensions(editablePaths)],\n [joinedPaths, theme], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleChange = useCallback(\n (val: string) => {\n onChange?.(val);\n },\n [onChange],\n );\n\n return (\n <div className={className}>\n <CodeMirror\n value={value}\n height={height}\n extensions={extensions}\n onChange={handleChange}\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n bracketMatching: true,\n closeBrackets: true,\n indentOnInput: true,\n }}\n />\n </div>\n );\n}\n","import { EditorView } from \"@codemirror/view\";\n\n/**\n * Default CodeMirror theme for JsonEditor.\n *\n * Reads CSS variables provided by @petrarca/sonnet-ui/styles.css:\n * --border, --font-mono, --muted\n *\n * Consumers not using sonnet-ui tokens can pass their own Extension\n * via the JsonEditor `theme` prop to override this entirely.\n */\nexport const defaultTheme = EditorView.theme({\n \"&\": {\n fontSize: \"13px\",\n border: \"1px solid var(--border)\",\n borderRadius: \"6px\",\n },\n \".cm-content\": {\n fontFamily: \"var(--font-mono, 'JetBrains Mono', monospace)\",\n },\n \".cm-readonly-region\": {\n backgroundColor: \"rgb(219 234 254 / 0.5)\",\n opacity: \"0.7\",\n },\n \".cm-gutters\": {\n backgroundColor: \"hsl(var(--muted) / 0.3)\",\n border: \"none\",\n },\n \".cm-activeLine\": {\n backgroundColor: \"transparent\",\n },\n \".cm-activeLineGutter\": {\n backgroundColor: \"transparent\",\n },\n});\n"],"mappings":"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","names":["EditorView","EditorView"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@petrarca/sonnet-ui",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "UI primitives, data components, and table schema system for the Petrarca Sonnet component library",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./json-editor": {
|
|
18
|
+
"import": "./dist/json-editor/index.js",
|
|
19
|
+
"types": "./dist/json-editor/index.d.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@radix-ui/react-avatar": "^1.1.11",
|
|
27
|
+
"@radix-ui/react-checkbox": "^1.3.3",
|
|
28
|
+
"@radix-ui/react-collapsible": "^1.1.12",
|
|
29
|
+
"@radix-ui/react-dialog": "^1.1.15",
|
|
30
|
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
31
|
+
"@radix-ui/react-label": "^2.1.8",
|
|
32
|
+
"@radix-ui/react-popover": "^1.1.15",
|
|
33
|
+
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
34
|
+
"@radix-ui/react-separator": "^1.1.8",
|
|
35
|
+
"@radix-ui/react-slot": "^1.2.4",
|
|
36
|
+
"@radix-ui/react-tabs": "^1.1.13",
|
|
37
|
+
"@radix-ui/react-tooltip": "^1.2.8",
|
|
38
|
+
"@tanstack/react-table": "^8.21.3",
|
|
39
|
+
"@codemirror/lang-json": "^6.0.2",
|
|
40
|
+
"@codemirror/state": "^6.5.4",
|
|
41
|
+
"@codemirror/view": "^6.39.14",
|
|
42
|
+
"@uiw/react-codemirror": "^4.25.4",
|
|
43
|
+
"class-variance-authority": "^0.7.1",
|
|
44
|
+
"cmdk": "^1.1.1",
|
|
45
|
+
"lucide-react": "^0.553.0",
|
|
46
|
+
"radix-ui": "^1.4.3",
|
|
47
|
+
"react-json-tree": "0.20.0",
|
|
48
|
+
"zustand": "5.0.8",
|
|
49
|
+
"@petrarca/sonnet-core": "0.1.0"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"react": ">=18",
|
|
53
|
+
"react-dom": ">=18",
|
|
54
|
+
"tailwindcss": ">=3"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/react": "^19.0.0",
|
|
58
|
+
"@types/react-dom": "^19.0.0",
|
|
59
|
+
"tsup": "^8.4.0",
|
|
60
|
+
"typescript": "^5.9.2"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsup",
|
|
64
|
+
"dev": "tsup --watch",
|
|
65
|
+
"typecheck": "tsc --noEmit",
|
|
66
|
+
"lint": "tsc --noEmit",
|
|
67
|
+
"test": "vitest run",
|
|
68
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
69
|
+
}
|
|
70
|
+
}
|