@fieldia/monaco 0.0.0-stage → 0.14.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +94 -2
  3. package/package.json +37 -3
  4. package/src/index.d.mts +7 -0
  5. package/src/index.d.ts +7 -0
  6. package/src/index.js +14 -0
  7. package/src/index.js.map +1 -0
  8. package/src/index.mjs +7 -0
  9. package/src/index.mjs.map +1 -0
  10. package/src/lib/json.d.mts +30 -0
  11. package/src/lib/json.d.ts +30 -0
  12. package/src/lib/json.js +55 -0
  13. package/src/lib/json.js.map +1 -0
  14. package/src/lib/json.mjs +51 -0
  15. package/src/lib/json.mjs.map +1 -0
  16. package/src/lib/languages.d.mts +28 -0
  17. package/src/lib/languages.d.ts +28 -0
  18. package/src/lib/languages.js +112 -0
  19. package/src/lib/languages.js.map +1 -0
  20. package/src/lib/languages.mjs +107 -0
  21. package/src/lib/languages.mjs.map +1 -0
  22. package/src/lib/loader.d.mts +19 -0
  23. package/src/lib/loader.d.ts +19 -0
  24. package/src/lib/loader.js +164 -0
  25. package/src/lib/loader.js.map +1 -0
  26. package/src/lib/loader.mjs +161 -0
  27. package/src/lib/loader.mjs.map +1 -0
  28. package/src/lib/monaco.d.mts +38 -0
  29. package/src/lib/monaco.d.ts +38 -0
  30. package/src/lib/monaco.js +271 -0
  31. package/src/lib/monaco.js.map +1 -0
  32. package/src/lib/monaco.mjs +267 -0
  33. package/src/lib/monaco.mjs.map +1 -0
  34. package/src/lib/styles.d.mts +8 -0
  35. package/src/lib/styles.d.ts +8 -0
  36. package/src/lib/styles.js +40 -0
  37. package/src/lib/styles.js.map +1 -0
  38. package/src/lib/styles.mjs +36 -0
  39. package/src/lib/styles.mjs.map +1 -0
  40. package/src/lib/theme.d.mts +48 -0
  41. package/src/lib/theme.d.ts +48 -0
  42. package/src/lib/theme.js +154 -0
  43. package/src/lib/theme.js.map +1 -0
  44. package/src/lib/theme.mjs +148 -0
  45. package/src/lib/theme.mjs.map +1 -0
  46. package/src/lib/types.d.mts +72 -0
  47. package/src/lib/types.d.ts +72 -0
  48. package/src/lib/types.js +9 -0
  49. package/src/lib/types.js.map +1 -0
  50. package/src/lib/types.mjs +8 -0
  51. package/src/lib/types.mjs.map +1 -0
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.monacoWidgets = void 0;
4
+ exports.createMonacoWidgets = createMonacoWidgets;
5
+ const widgets_1 = require("@fieldia/widgets");
6
+ const languages_1 = require("./languages");
7
+ const loader_1 = require("./loader");
8
+ const styles_1 = require("./styles");
9
+ const theme_1 = require("./theme");
10
+ /** The editor's settings: VS Code's look, kept to a field's size; Tab left to the page; the page scrolling past it. */
11
+ const EDITOR_OPTIONS = {
12
+ automaticLayout: true,
13
+ tabFocusMode: true,
14
+ // A text area takes the keyboard: labelled by the field's label, and read-only when the field is.
15
+ editContext: false,
16
+ minimap: { enabled: false },
17
+ scrollBeyondLastLine: false,
18
+ scrollbar: { alwaysConsumeMouseWheel: false, verticalScrollbarSize: 10, horizontalScrollbarSize: 10 },
19
+ overviewRulerLanes: 0,
20
+ hideCursorInOverviewRuler: true,
21
+ fixedOverflowWidgets: true,
22
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',
23
+ fontSize: 13,
24
+ lineHeight: 20,
25
+ lineNumbersMinChars: 3,
26
+ glyphMargin: false,
27
+ padding: { top: 6, bottom: 6 },
28
+ links: false,
29
+ // Several on a form: only the one being typed in marks its line.
30
+ renderLineHighlightOnlyWhenFocus: true,
31
+ };
32
+ /** Between a few lines and a screenful, as the field's text grows. */
33
+ const LEAST = 96;
34
+ const MOST = 360;
35
+ /** Each Monaco's themes defined so far, by name: one is defined once, and worn by any editor that wants it. */
36
+ const THEMES = new WeakMap();
37
+ /** A short name for a theme, the same for the same colours. */
38
+ function nameOf(data) {
39
+ const text = JSON.stringify(data);
40
+ let hash = 0;
41
+ for (let i = 0; i < text.length; i++)
42
+ hash = (Math.imul(31, hash) + text.charCodeAt(i)) | 0;
43
+ return `fieldia-${(hash >>> 0).toString(36)}`;
44
+ }
45
+ /** Tell Monaco of the app's workers, unless the app has told it already. */
46
+ function giveWorkers(getWorker) {
47
+ const scope = globalThis;
48
+ scope.MonacoEnvironment ??= { getWorker };
49
+ }
50
+ const textOf = (value) => (value === null || value === undefined ? '' : String(value));
51
+ /** The text as JSON, `null` for nothing, or `undefined` when it is not valid. */
52
+ function readJson(text) {
53
+ if (text.trim() === '')
54
+ return null;
55
+ try {
56
+ return JSON.parse(text);
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ }
62
+ function monacoWidget(context, json, loader, { getWorker, services: named = languages_1.MONACO_SERVICES }) {
63
+ const { form, name, node, id, document, labels = widgets_1.WIDGET_LABELS.en } = context;
64
+ (0, styles_1.installMonacoStyles)(document);
65
+ const language = json ? 'json' : node.options?.['language'];
66
+ // This field's language service, when it has one and the app gives a worker for it.
67
+ const service = (0, languages_1.serviceOf)(language);
68
+ const services = typeof getWorker === 'function' && service !== null && named.includes(service);
69
+ const element = document.createElement('div');
70
+ element.className = 'fd-monaco';
71
+ element.dir = 'ltr';
72
+ /** The value as text, as the editor shows it. */
73
+ const show = (value) => (json ? (value === null || value === undefined ? '' : JSON.stringify(value, null, 2)) : textOf(value));
74
+ /** The value as the widget compares it with what the form holds. */
75
+ const keyOf = (value) => (json ? JSON.stringify(value ?? null) : textOf(value));
76
+ // Until Monaco is here, and for good if it cannot be loaded: a plain box that works as one.
77
+ const plain = document.createElement('textarea');
78
+ plain.id = id;
79
+ plain.className = 'fd-input fd-textarea fd-code fd-monaco-plain';
80
+ plain.rows = 4;
81
+ plain.spellcheck = false;
82
+ if (node.placeholder)
83
+ plain.placeholder = node.placeholder;
84
+ plain.value = show(form.getState().values[name]);
85
+ const error = json ? document.createElement('div') : null;
86
+ if (error) {
87
+ error.className = 'fd-error fd-monaco-error';
88
+ error.dir = 'auto';
89
+ error.setAttribute('role', 'alert');
90
+ error.textContent = labels.invalidJson;
91
+ error.hidden = true;
92
+ }
93
+ element.append(plain, ...(error ? [error] : []));
94
+ /** What the form holds, as last written or shown: its echo of what was typed changes nothing. */
95
+ let known = keyOf(form.getState().values[name]);
96
+ let valid = true;
97
+ let last = null;
98
+ let writing = false;
99
+ let gone = false;
100
+ let monaco = null;
101
+ let editor = null;
102
+ let model = null;
103
+ let box = null;
104
+ let worn = '';
105
+ const leave = [];
106
+ /** Monaco's own input, or the plain box while there is no Monaco. */
107
+ const input = () => box?.querySelector('textarea.inputarea, textarea') ?? plain;
108
+ /** Its state, said on the box that takes the keyboard. */
109
+ function describe() {
110
+ const at = input();
111
+ at.setAttribute('aria-invalid', String(!valid || !!last?.invalid));
112
+ if (last?.describedBy)
113
+ at.setAttribute('aria-describedby', last.describedBy);
114
+ else
115
+ at.removeAttribute('aria-describedby');
116
+ if (at === plain)
117
+ at.setAttribute('aria-required', String(!!last?.required));
118
+ element.toggleAttribute('data-invalid', !valid);
119
+ }
120
+ function typed(text) {
121
+ if (!json) {
122
+ known = text;
123
+ form.setValue(name, text === '' ? null : text);
124
+ return;
125
+ }
126
+ const parsed = readJson(text);
127
+ valid = parsed !== undefined;
128
+ if (error) {
129
+ error.hidden = valid;
130
+ // Where it goes wrong, as the CodeMirror editor and the plain JSON box say it.
131
+ const problem = valid ? null : (0, widgets_1.jsonProblem)(text);
132
+ if (problem)
133
+ error.textContent = labels.invalidJsonAt.replace('{line}', String(problem.line)).replace('{column}', String(problem.column));
134
+ }
135
+ describe();
136
+ if (parsed === undefined)
137
+ return;
138
+ known = JSON.stringify(parsed);
139
+ form.setValue(name, parsed);
140
+ }
141
+ plain.addEventListener('input', () => typed(plain.value));
142
+ /** The theme made from the page's tokens as they are now, worn when they changed. */
143
+ function wear() {
144
+ if (!monaco || !element.isConnected)
145
+ return;
146
+ const data = (0, theme_1.monacoTheme)((0, theme_1.readColours)(element));
147
+ const themeName = nameOf(data);
148
+ if (themeName === worn)
149
+ return;
150
+ const defined = THEMES.get(monaco) ?? new Set();
151
+ if (!defined.has(themeName))
152
+ monaco.editor.defineTheme(themeName, data);
153
+ THEMES.set(monaco, defined.add(themeName));
154
+ monaco.editor.setTheme(themeName);
155
+ worn = themeName;
156
+ }
157
+ /** The page's look or scheme changing — or the reader's system going dark — gives the editor its colours again. */
158
+ function follow() {
159
+ const root = element.closest('.fd-form, .fd-form-dialog, .fd-theme');
160
+ const view = document.defaultView;
161
+ if (root && view && 'MutationObserver' in view) {
162
+ const observer = new view.MutationObserver(() => wear());
163
+ observer.observe(root, { attributes: true, attributeFilter: ['data-scheme', 'data-fd-theme', 'data-fd-skin', 'data-accent', 'style', 'class'] });
164
+ leave.push(() => observer.disconnect());
165
+ }
166
+ const dark = typeof view?.matchMedia === 'function' ? view.matchMedia('(prefers-color-scheme: dark)') : null;
167
+ if (dark) {
168
+ dark.addEventListener('change', wear);
169
+ leave.push(() => dark.removeEventListener('change', wear));
170
+ }
171
+ }
172
+ function fit(contentHeight) {
173
+ if (!box || !editor)
174
+ return;
175
+ box.style.height = `${Math.min(MOST, Math.max(LEAST, contentHeight + 2))}px`;
176
+ editor.layout();
177
+ }
178
+ async function start() {
179
+ if (getWorker)
180
+ giveWorkers(getWorker);
181
+ const loaded = await loader.monaco(services);
182
+ const monacoId = await loader.language(loaded, language, services);
183
+ if (gone)
184
+ return;
185
+ monaco = loaded;
186
+ box = document.createElement('div');
187
+ box.className = 'fd-monaco-box';
188
+ element.insertBefore(box, plain);
189
+ const focused = document.activeElement === plain;
190
+ model = monaco.editor.createModel(plain.value, monacoId);
191
+ editor = monaco.editor.create(box, {
192
+ ...EDITOR_OPTIONS,
193
+ model,
194
+ readOnly: !!last?.readonly,
195
+ domReadOnly: !!last?.readonly,
196
+ ariaRequired: !!last?.required,
197
+ wordBasedSuggestions: services ? 'currentDocument' : 'off',
198
+ quickSuggestions: services,
199
+ ...(plain.placeholder ? { placeholder: plain.placeholder } : {}),
200
+ });
201
+ wear();
202
+ follow();
203
+ // The field's label names Monaco's input now, and points at it.
204
+ plain.remove();
205
+ plain.removeAttribute('id');
206
+ const area = input();
207
+ area.id = id;
208
+ area.setAttribute('aria-labelledby', `${id}-label`);
209
+ describe();
210
+ const current = model;
211
+ editor.onDidChangeModelContent(() => {
212
+ if (!writing)
213
+ typed(current.getValue());
214
+ });
215
+ editor.onDidContentSizeChange(({ contentHeight }) => fit(contentHeight));
216
+ fit(editor.getContentHeight());
217
+ if (focused)
218
+ editor.focus();
219
+ }
220
+ // Monaco not loaded: the plain box stays, and works.
221
+ start().catch(() => undefined);
222
+ return {
223
+ element,
224
+ focus: () => (editor ? editor.focus() : plain.focus()),
225
+ destroy() {
226
+ gone = true;
227
+ for (const stop of leave.splice(0))
228
+ stop();
229
+ editor?.dispose();
230
+ model?.dispose();
231
+ },
232
+ update(state) {
233
+ last = state;
234
+ plain.readOnly = state.readonly;
235
+ element.toggleAttribute('data-readonly', state.readonly);
236
+ editor?.updateOptions({ readOnly: state.readonly, domReadOnly: state.readonly, ariaRequired: state.required });
237
+ if (!worn)
238
+ wear();
239
+ describe();
240
+ // A value from elsewhere (loaded, discarded, set by a step) replaces the text; the echo of what was typed does not.
241
+ const incoming = keyOf(state.value);
242
+ if (incoming === known)
243
+ return;
244
+ known = incoming;
245
+ valid = true;
246
+ if (error)
247
+ error.hidden = true;
248
+ const text = show(state.value);
249
+ if (model) {
250
+ writing = true;
251
+ model.setValue(text);
252
+ writing = false;
253
+ }
254
+ else
255
+ plain.value = text;
256
+ describe();
257
+ },
258
+ };
259
+ }
260
+ /**
261
+ * The widgets, made with the app's choices: `text.monaco` for text in a
262
+ * language, `json.monaco` for JSON. Pass them to the viewer (`widgets`).
263
+ */
264
+ function createMonacoWidgets(options = {}) {
265
+ const loader = options.loader ?? loader_1.defaultLoader;
266
+ const factory = (json) => (context) => monacoWidget(context, json, loader, options);
267
+ return { 'text.monaco': factory(false), 'json.monaco': factory(true) };
268
+ }
269
+ /** The widgets with no language services: code coloured, no worker started. */
270
+ exports.monacoWidgets = createMonacoWidgets();
271
+ //# sourceMappingURL=monaco.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monaco.js","sourceRoot":"","sources":["../../../../../libs/monaco/src/lib/monaco.ts"],"names":[],"mappings":";;;AA+RA,kDAIC;AAlSD,8CAAwH;AACxH,2CAA6E;AAC7E,qCAAyC;AACzC,qCAA+C;AAC/C,mCAAmD;AAiCnD,uHAAuH;AACvH,MAAM,cAAc,GAAG;IACrB,eAAe,EAAE,IAAI;IACrB,YAAY,EAAE,IAAI;IAClB,kGAAkG;IAClG,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,SAAS,EAAE,EAAE,uBAAuB,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE,uBAAuB,EAAE,EAAE,EAAE;IACrG,kBAAkB,EAAE,CAAC;IACrB,yBAAyB,EAAE,IAAI;IAC/B,oBAAoB,EAAE,IAAI;IAC1B,UAAU,EAAE,0DAA0D;IACtE,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,mBAAmB,EAAE,CAAC;IACtB,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IAC9B,KAAK,EAAE,KAAK;IACZ,iEAAiE;IACjE,gCAAgC,EAAE,IAAI;CACvC,CAAC;AAEF,sEAAsE;AACtE,MAAM,KAAK,GAAG,EAAE,CAAC;AACjB,MAAM,IAAI,GAAG,GAAG,CAAC;AAEjB,+GAA+G;AAC/G,MAAM,MAAM,GAAG,IAAI,OAAO,EAA0B,CAAC;AAErD,+DAA+D;AAC/D,SAAS,MAAM,CAAC,IAAa;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5F,OAAO,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,4EAA4E;AAC5E,SAAS,WAAW,CAAC,SAAyD;IAC5E,MAAM,KAAK,GAAG,UAA6D,CAAC;IAC5E,KAAK,CAAC,iBAAiB,KAAK,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1G,iFAAiF;AACjF,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB,EAAE,IAAa,EAAE,MAAoB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,GAAG,2BAAe,EAAwB;IACvJ,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,uBAAa,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC;IAC9E,IAAA,4BAAmB,EAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;IAC5D,oFAAoF;IACpF,MAAM,OAAO,GAAG,IAAA,qBAAS,EAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,SAAS,KAAK,UAAU,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC;IAChC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC;IAEpB,iDAAiD;IACjD,MAAM,IAAI,GAAG,CAAC,KAAwB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClJ,oEAAoE;IACpE,MAAM,KAAK,GAAG,CAAC,KAAwB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnG,4FAA4F;IAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,KAAK,CAAC,SAAS,GAAG,8CAA8C,CAAC;IACjE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACf,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;IACzB,IAAI,IAAI,CAAC,WAAW;QAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC3D,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,SAAS,GAAG,0BAA0B,CAAC;QAC7C,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC;QACnB,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACvC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjD,iGAAiG;IACjG,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,IAAI,GAAuB,IAAI,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,MAAM,GAAqB,IAAI,CAAC;IACpC,IAAI,MAAM,GAAwB,IAAI,CAAC;IACvC,IAAI,KAAK,GAAuB,IAAI,CAAC;IACrC,IAAI,GAAG,GAAuB,IAAI,CAAC;IACnC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,qEAAqE;IACrE,MAAM,KAAK,GAAG,GAAgB,EAAE,CAAC,GAAG,EAAE,aAAa,CAAc,8BAA8B,CAAC,IAAI,KAAK,CAAC;IAE1G,0DAA0D;IAC1D,SAAS,QAAQ;QACf,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,IAAI,IAAI,EAAE,WAAW;YAAE,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;;YACxE,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;QAC5C,IAAI,EAAE,KAAK,KAAK;YAAE,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,SAAS,KAAK,CAAC,IAAY;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC;QAC7B,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YACrB,+EAA+E;YAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,IAAI,CAAC,CAAC;YACjD,IAAI,OAAO;gBAAE,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5I,CAAC;QACD,QAAQ,EAAE,CAAC;QACX,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1D,qFAAqF;IACrF,SAAS,IAAI;QACX,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW;YAAE,OAAO;QAC5C,MAAM,IAAI,GAAG,IAAA,mBAAW,EAAC,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,GAAG,SAAS,CAAC;IACnB,CAAC;IAED,mHAAmH;IACnH,SAAS,MAAM;QACb,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;QAClC,IAAI,IAAI,IAAI,IAAI,IAAI,kBAAkB,IAAI,IAAI,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACjJ,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7G,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,SAAS,GAAG,CAAC,aAAqB;QAChC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO;QAC5B,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,UAAU,KAAK;QAClB,IAAI,SAAS;YAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnE,IAAI,IAAI;YAAE,OAAO;QACjB,MAAM,GAAG,MAAM,CAAC;QAChB,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACpC,GAAG,CAAC,SAAS,GAAG,eAAe,CAAC;QAChC,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,KAAK,KAAK,CAAC;QACjD,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YACjC,GAAG,cAAc;YACjB,KAAK;YACL,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ;YAC1B,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ;YAC7B,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ;YAC9B,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK;YAC1D,gBAAgB,EAAE,QAAQ;YAC1B,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC,CAAC;QACH,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,gEAAgE;QAChE,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpD,QAAQ,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,uBAAuB,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,OAAO;gBAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACzE,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC/B,IAAI,OAAO;YAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IACD,qDAAqD;IACrD,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE/B,OAAO;QACL,OAAO;QACP,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtD,OAAO;YACL,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,IAAI,EAAE,CAAC;YAC3C,MAAM,EAAE,OAAO,EAAE,CAAC;YAClB,KAAK,EAAE,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,KAAkB;YACvB,IAAI,GAAG,KAAK,CAAC;YACb,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAChC,OAAO,CAAC,eAAe,CAAC,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/G,IAAI,CAAC,IAAI;gBAAE,IAAI,EAAE,CAAC;YAClB,QAAQ,EAAE,CAAC;YACX,oHAAoH;YACpH,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,QAAQ,KAAK,KAAK;gBAAE,OAAO;YAC/B,KAAK,GAAG,QAAQ,CAAC;YACjB,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,KAAK;gBAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,GAAG,IAAI,CAAC;gBACf,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACrB,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;;gBAAM,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;YAC1B,QAAQ,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,UAAgC,EAAE;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,sBAAa,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,IAAa,EAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5G,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,+EAA+E;AAClE,QAAA,aAAa,GAAkC,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,267 @@
1
+ import { jsonProblem, WIDGET_LABELS } from '@fieldia/widgets';
2
+ import { MONACO_SERVICES, serviceOf } from './languages.mjs';
3
+ import { defaultLoader } from './loader.mjs';
4
+ import { installMonacoStyles } from './styles.mjs';
5
+ import { monacoTheme, readColours } from './theme.mjs';
6
+ /** The editor's settings: VS Code's look, kept to a field's size; Tab left to the page; the page scrolling past it. */
7
+ const EDITOR_OPTIONS = {
8
+ automaticLayout: true,
9
+ tabFocusMode: true,
10
+ // A text area takes the keyboard: labelled by the field's label, and read-only when the field is.
11
+ editContext: false,
12
+ minimap: { enabled: false },
13
+ scrollBeyondLastLine: false,
14
+ scrollbar: { alwaysConsumeMouseWheel: false, verticalScrollbarSize: 10, horizontalScrollbarSize: 10 },
15
+ overviewRulerLanes: 0,
16
+ hideCursorInOverviewRuler: true,
17
+ fixedOverflowWidgets: true,
18
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',
19
+ fontSize: 13,
20
+ lineHeight: 20,
21
+ lineNumbersMinChars: 3,
22
+ glyphMargin: false,
23
+ padding: { top: 6, bottom: 6 },
24
+ links: false,
25
+ // Several on a form: only the one being typed in marks its line.
26
+ renderLineHighlightOnlyWhenFocus: true,
27
+ };
28
+ /** Between a few lines and a screenful, as the field's text grows. */
29
+ const LEAST = 96;
30
+ const MOST = 360;
31
+ /** Each Monaco's themes defined so far, by name: one is defined once, and worn by any editor that wants it. */
32
+ const THEMES = new WeakMap();
33
+ /** A short name for a theme, the same for the same colours. */
34
+ function nameOf(data) {
35
+ const text = JSON.stringify(data);
36
+ let hash = 0;
37
+ for (let i = 0; i < text.length; i++)
38
+ hash = (Math.imul(31, hash) + text.charCodeAt(i)) | 0;
39
+ return `fieldia-${(hash >>> 0).toString(36)}`;
40
+ }
41
+ /** Tell Monaco of the app's workers, unless the app has told it already. */
42
+ function giveWorkers(getWorker) {
43
+ const scope = globalThis;
44
+ scope.MonacoEnvironment ??= { getWorker };
45
+ }
46
+ const textOf = (value) => (value === null || value === undefined ? '' : String(value));
47
+ /** The text as JSON, `null` for nothing, or `undefined` when it is not valid. */
48
+ function readJson(text) {
49
+ if (text.trim() === '')
50
+ return null;
51
+ try {
52
+ return JSON.parse(text);
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ }
58
+ function monacoWidget(context, json, loader, { getWorker, services: named = MONACO_SERVICES }) {
59
+ const { form, name, node, id, document, labels = WIDGET_LABELS.en } = context;
60
+ installMonacoStyles(document);
61
+ const language = json ? 'json' : node.options?.['language'];
62
+ // This field's language service, when it has one and the app gives a worker for it.
63
+ const service = serviceOf(language);
64
+ const services = typeof getWorker === 'function' && service !== null && named.includes(service);
65
+ const element = document.createElement('div');
66
+ element.className = 'fd-monaco';
67
+ element.dir = 'ltr';
68
+ /** The value as text, as the editor shows it. */
69
+ const show = (value) => (json ? (value === null || value === undefined ? '' : JSON.stringify(value, null, 2)) : textOf(value));
70
+ /** The value as the widget compares it with what the form holds. */
71
+ const keyOf = (value) => (json ? JSON.stringify(value ?? null) : textOf(value));
72
+ // Until Monaco is here, and for good if it cannot be loaded: a plain box that works as one.
73
+ const plain = document.createElement('textarea');
74
+ plain.id = id;
75
+ plain.className = 'fd-input fd-textarea fd-code fd-monaco-plain';
76
+ plain.rows = 4;
77
+ plain.spellcheck = false;
78
+ if (node.placeholder)
79
+ plain.placeholder = node.placeholder;
80
+ plain.value = show(form.getState().values[name]);
81
+ const error = json ? document.createElement('div') : null;
82
+ if (error) {
83
+ error.className = 'fd-error fd-monaco-error';
84
+ error.dir = 'auto';
85
+ error.setAttribute('role', 'alert');
86
+ error.textContent = labels.invalidJson;
87
+ error.hidden = true;
88
+ }
89
+ element.append(plain, ...(error ? [error] : []));
90
+ /** What the form holds, as last written or shown: its echo of what was typed changes nothing. */
91
+ let known = keyOf(form.getState().values[name]);
92
+ let valid = true;
93
+ let last = null;
94
+ let writing = false;
95
+ let gone = false;
96
+ let monaco = null;
97
+ let editor = null;
98
+ let model = null;
99
+ let box = null;
100
+ let worn = '';
101
+ const leave = [];
102
+ /** Monaco's own input, or the plain box while there is no Monaco. */
103
+ const input = () => box?.querySelector('textarea.inputarea, textarea') ?? plain;
104
+ /** Its state, said on the box that takes the keyboard. */
105
+ function describe() {
106
+ const at = input();
107
+ at.setAttribute('aria-invalid', String(!valid || !!last?.invalid));
108
+ if (last?.describedBy)
109
+ at.setAttribute('aria-describedby', last.describedBy);
110
+ else
111
+ at.removeAttribute('aria-describedby');
112
+ if (at === plain)
113
+ at.setAttribute('aria-required', String(!!last?.required));
114
+ element.toggleAttribute('data-invalid', !valid);
115
+ }
116
+ function typed(text) {
117
+ if (!json) {
118
+ known = text;
119
+ form.setValue(name, text === '' ? null : text);
120
+ return;
121
+ }
122
+ const parsed = readJson(text);
123
+ valid = parsed !== undefined;
124
+ if (error) {
125
+ error.hidden = valid;
126
+ // Where it goes wrong, as the CodeMirror editor and the plain JSON box say it.
127
+ const problem = valid ? null : jsonProblem(text);
128
+ if (problem)
129
+ error.textContent = labels.invalidJsonAt.replace('{line}', String(problem.line)).replace('{column}', String(problem.column));
130
+ }
131
+ describe();
132
+ if (parsed === undefined)
133
+ return;
134
+ known = JSON.stringify(parsed);
135
+ form.setValue(name, parsed);
136
+ }
137
+ plain.addEventListener('input', () => typed(plain.value));
138
+ /** The theme made from the page's tokens as they are now, worn when they changed. */
139
+ function wear() {
140
+ if (!monaco || !element.isConnected)
141
+ return;
142
+ const data = monacoTheme(readColours(element));
143
+ const themeName = nameOf(data);
144
+ if (themeName === worn)
145
+ return;
146
+ const defined = THEMES.get(monaco) ?? new Set();
147
+ if (!defined.has(themeName))
148
+ monaco.editor.defineTheme(themeName, data);
149
+ THEMES.set(monaco, defined.add(themeName));
150
+ monaco.editor.setTheme(themeName);
151
+ worn = themeName;
152
+ }
153
+ /** The page's look or scheme changing — or the reader's system going dark — gives the editor its colours again. */
154
+ function follow() {
155
+ const root = element.closest('.fd-form, .fd-form-dialog, .fd-theme');
156
+ const view = document.defaultView;
157
+ if (root && view && 'MutationObserver' in view) {
158
+ const observer = new view.MutationObserver(() => wear());
159
+ observer.observe(root, { attributes: true, attributeFilter: ['data-scheme', 'data-fd-theme', 'data-fd-skin', 'data-accent', 'style', 'class'] });
160
+ leave.push(() => observer.disconnect());
161
+ }
162
+ const dark = typeof view?.matchMedia === 'function' ? view.matchMedia('(prefers-color-scheme: dark)') : null;
163
+ if (dark) {
164
+ dark.addEventListener('change', wear);
165
+ leave.push(() => dark.removeEventListener('change', wear));
166
+ }
167
+ }
168
+ function fit(contentHeight) {
169
+ if (!box || !editor)
170
+ return;
171
+ box.style.height = `${Math.min(MOST, Math.max(LEAST, contentHeight + 2))}px`;
172
+ editor.layout();
173
+ }
174
+ async function start() {
175
+ if (getWorker)
176
+ giveWorkers(getWorker);
177
+ const loaded = await loader.monaco(services);
178
+ const monacoId = await loader.language(loaded, language, services);
179
+ if (gone)
180
+ return;
181
+ monaco = loaded;
182
+ box = document.createElement('div');
183
+ box.className = 'fd-monaco-box';
184
+ element.insertBefore(box, plain);
185
+ const focused = document.activeElement === plain;
186
+ model = monaco.editor.createModel(plain.value, monacoId);
187
+ editor = monaco.editor.create(box, {
188
+ ...EDITOR_OPTIONS,
189
+ model,
190
+ readOnly: !!last?.readonly,
191
+ domReadOnly: !!last?.readonly,
192
+ ariaRequired: !!last?.required,
193
+ wordBasedSuggestions: services ? 'currentDocument' : 'off',
194
+ quickSuggestions: services,
195
+ ...(plain.placeholder ? { placeholder: plain.placeholder } : {}),
196
+ });
197
+ wear();
198
+ follow();
199
+ // The field's label names Monaco's input now, and points at it.
200
+ plain.remove();
201
+ plain.removeAttribute('id');
202
+ const area = input();
203
+ area.id = id;
204
+ area.setAttribute('aria-labelledby', `${id}-label`);
205
+ describe();
206
+ const current = model;
207
+ editor.onDidChangeModelContent(() => {
208
+ if (!writing)
209
+ typed(current.getValue());
210
+ });
211
+ editor.onDidContentSizeChange(({ contentHeight }) => fit(contentHeight));
212
+ fit(editor.getContentHeight());
213
+ if (focused)
214
+ editor.focus();
215
+ }
216
+ // Monaco not loaded: the plain box stays, and works.
217
+ start().catch(() => undefined);
218
+ return {
219
+ element,
220
+ focus: () => (editor ? editor.focus() : plain.focus()),
221
+ destroy() {
222
+ gone = true;
223
+ for (const stop of leave.splice(0))
224
+ stop();
225
+ editor?.dispose();
226
+ model?.dispose();
227
+ },
228
+ update(state) {
229
+ last = state;
230
+ plain.readOnly = state.readonly;
231
+ element.toggleAttribute('data-readonly', state.readonly);
232
+ editor?.updateOptions({ readOnly: state.readonly, domReadOnly: state.readonly, ariaRequired: state.required });
233
+ if (!worn)
234
+ wear();
235
+ describe();
236
+ // A value from elsewhere (loaded, discarded, set by a step) replaces the text; the echo of what was typed does not.
237
+ const incoming = keyOf(state.value);
238
+ if (incoming === known)
239
+ return;
240
+ known = incoming;
241
+ valid = true;
242
+ if (error)
243
+ error.hidden = true;
244
+ const text = show(state.value);
245
+ if (model) {
246
+ writing = true;
247
+ model.setValue(text);
248
+ writing = false;
249
+ }
250
+ else
251
+ plain.value = text;
252
+ describe();
253
+ },
254
+ };
255
+ }
256
+ /**
257
+ * The widgets, made with the app's choices: `text.monaco` for text in a
258
+ * language, `json.monaco` for JSON. Pass them to the viewer (`widgets`).
259
+ */
260
+ export function createMonacoWidgets(options = {}) {
261
+ const loader = options.loader ?? defaultLoader;
262
+ const factory = (json) => (context) => monacoWidget(context, json, loader, options);
263
+ return { 'text.monaco': factory(false), 'json.monaco': factory(true) };
264
+ }
265
+ /** The widgets with no language services: code coloured, no worker started. */
266
+ export const monacoWidgets = createMonacoWidgets();
267
+ //# sourceMappingURL=monaco.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monaco.mjs","sourceRoot":"","sources":["../../../../../libs/monaco/src/lib/monaco.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The editor's frame in Fieldia's colours, so it sits among the other
3
+ * fields, and the code colours the theme is read from: light, dark where the
4
+ * page is dark, in Fieldia's tokens' layer so a host sets its own over them.
5
+ * Installed once per document.
6
+ */
7
+ export declare const MONACO_CSS: string;
8
+ export declare function installMonacoStyles(doc: Document): void;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The editor's frame in Fieldia's colours, so it sits among the other
3
+ * fields, and the code colours the theme is read from: light, dark where the
4
+ * page is dark, in Fieldia's tokens' layer so a host sets its own over them.
5
+ * Installed once per document.
6
+ */
7
+ export declare const MONACO_CSS: string;
8
+ export declare function installMonacoStyles(doc: Document): void;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MONACO_CSS = void 0;
4
+ exports.installMonacoStyles = installMonacoStyles;
5
+ const theme_1 = require("./theme");
6
+ const declare = (scheme) => Object.entries(theme_1.CODE_COLOURS[scheme])
7
+ .map(([role, colour]) => `--fd-code-${role}: ${colour};`)
8
+ .join(' ');
9
+ /**
10
+ * The editor's frame in Fieldia's colours, so it sits among the other
11
+ * fields, and the code colours the theme is read from: light, dark where the
12
+ * page is dark, in Fieldia's tokens' layer so a host sets its own over them.
13
+ * Installed once per document.
14
+ */
15
+ exports.MONACO_CSS = `
16
+ .fd-monaco { display: grid; gap: 4px; min-width: 0; }
17
+ .fd-monaco-box {
18
+ box-sizing: border-box; height: 96px; min-width: 0; overflow: hidden;
19
+ border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); background: var(--fd-surface);
20
+ }
21
+ .fd-monaco-box:focus-within { outline: 2px solid var(--fd-focus); outline-offset: 1px; }
22
+ .fd-monaco[data-invalid] .fd-monaco-box { border-color: var(--fd-error); }
23
+ .fd-monaco-plain { min-height: 96px; }
24
+ /* Only to be read: shaded as Fieldia shades such a box, over the colours Monaco's theme gives it. */
25
+ .fd-monaco[data-readonly] .monaco-editor { --vscode-editor-background: color-mix(in srgb, var(--fd-text) 4%, var(--fd-surface)); }
26
+ @layer fieldia-tokens {
27
+ .fd-monaco { ${declare('light')} }
28
+ :is(.fd-form, .fd-form-dialog, .fd-theme)[data-scheme="dark"] .fd-monaco { ${declare('dark')} }
29
+ @media (prefers-color-scheme: dark) { :is(.fd-form, .fd-form-dialog, .fd-theme)[data-scheme="auto"] .fd-monaco { ${declare('dark')} } }
30
+ }
31
+ `;
32
+ function installMonacoStyles(doc) {
33
+ if (doc.getElementById('fieldia-monaco-styles'))
34
+ return;
35
+ const style = doc.createElement('style');
36
+ style.id = 'fieldia-monaco-styles';
37
+ style.textContent = exports.MONACO_CSS;
38
+ doc.head.append(style);
39
+ }
40
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../libs/monaco/src/lib/styles.ts"],"names":[],"mappings":";;;AA+BA,kDAMC;AArCD,mCAAuC;AAEvC,MAAM,OAAO,GAAG,CAAC,MAAwB,EAAE,EAAE,CAC3C,MAAM,CAAC,OAAO,CAAC,oBAAY,CAAC,MAAM,CAAC,CAAC;KACjC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,aAAa,IAAI,KAAK,MAAM,GAAG,CAAC;KACxD,IAAI,CAAC,GAAG,CAAC,CAAC;AAEf;;;;;GAKG;AACU,QAAA,UAAU,GAAG;;;;;;;;;;;;eAYX,OAAO,CAAC,OAAO,CAAC;6EAC8C,OAAO,CAAC,MAAM,CAAC;mHACuB,OAAO,CAAC,MAAM,CAAC;;CAEjI,CAAC;AAEF,SAAgB,mBAAmB,CAAC,GAAa;IAC/C,IAAI,GAAG,CAAC,cAAc,CAAC,uBAAuB,CAAC;QAAE,OAAO;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,GAAG,uBAAuB,CAAC;IACnC,KAAK,CAAC,WAAW,GAAG,kBAAU,CAAC;IAC/B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC"}