@openleaf-editor/ui 0.1.0-beta.0 → 0.1.0-beta.2

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 (62) hide show
  1. package/dist/content-css.d.ts +13 -0
  2. package/dist/content-css.d.ts.map +1 -0
  3. package/dist/content-css.js +57 -0
  4. package/dist/content-css.js.map +1 -0
  5. package/dist/dialog.d.ts +87 -2
  6. package/dist/dialog.d.ts.map +1 -1
  7. package/dist/dialog.js +358 -68
  8. package/dist/dialog.js.map +1 -1
  9. package/dist/floating.d.ts +25 -0
  10. package/dist/floating.d.ts.map +1 -0
  11. package/dist/floating.js +82 -0
  12. package/dist/floating.js.map +1 -0
  13. package/dist/help.d.ts +9 -0
  14. package/dist/help.d.ts.map +1 -0
  15. package/dist/help.js +73 -0
  16. package/dist/help.js.map +1 -0
  17. package/dist/i18n.d.ts +31 -0
  18. package/dist/i18n.d.ts.map +1 -0
  19. package/dist/i18n.js +89 -0
  20. package/dist/i18n.js.map +1 -0
  21. package/dist/icons.d.ts +1 -1
  22. package/dist/icons.d.ts.map +1 -1
  23. package/dist/icons.js +17 -1
  24. package/dist/icons.js.map +1 -1
  25. package/dist/index.d.ts +10 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +10 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/items.d.ts +2 -0
  30. package/dist/items.d.ts.map +1 -1
  31. package/dist/items.js +81 -4
  32. package/dist/items.js.map +1 -1
  33. package/dist/menu.d.ts +56 -0
  34. package/dist/menu.d.ts.map +1 -0
  35. package/dist/menu.js +360 -0
  36. package/dist/menu.js.map +1 -0
  37. package/dist/openleaf.css +216 -0
  38. package/dist/overflow.d.ts +17 -0
  39. package/dist/overflow.d.ts.map +1 -0
  40. package/dist/overflow.js +138 -0
  41. package/dist/overflow.js.map +1 -0
  42. package/dist/pickers.d.ts +43 -0
  43. package/dist/pickers.d.ts.map +1 -0
  44. package/dist/pickers.js +52 -0
  45. package/dist/pickers.js.map +1 -0
  46. package/dist/registry.d.ts +49 -8
  47. package/dist/registry.d.ts.map +1 -1
  48. package/dist/registry.js +14 -0
  49. package/dist/registry.js.map +1 -1
  50. package/dist/styles.d.ts +1 -1
  51. package/dist/styles.d.ts.map +1 -1
  52. package/dist/styles.js +216 -0
  53. package/dist/styles.js.map +1 -1
  54. package/dist/toolbar.d.ts +20 -0
  55. package/dist/toolbar.d.ts.map +1 -1
  56. package/dist/toolbar.js +181 -21
  57. package/dist/toolbar.js.map +1 -1
  58. package/dist/upload.d.ts +95 -0
  59. package/dist/upload.d.ts.map +1 -0
  60. package/dist/upload.js +104 -0
  61. package/dist/upload.js.map +1 -0
  62. package/package.json +2 -2
package/dist/dialog.js CHANGED
@@ -6,8 +6,22 @@
6
6
  * is a few hundred lines that would then owe real screen reader testing to be
7
7
  * worth anything, and the native element is already tested by the browser
8
8
  * vendors. Choosing it is the single biggest accessibility win available here.
9
+ *
10
+ * ## Why committing is asynchronous
11
+ *
12
+ * The image dialog uploads a file, and an upload is the one thing in this editor
13
+ * that can take five seconds and fail for a reason the author needs to read. So
14
+ * the form's commit step returns a promise: the dialog stays open while it runs,
15
+ * disables its buttons, says what it is doing in a polite live region, and on
16
+ * failure shows the message and keeps everything the author typed.
17
+ *
18
+ * The alternative -- close the dialog, upload in the background, report through a
19
+ * toast -- loses the alt text they wrote when the upload fails, and makes the
20
+ * retry a whole new dialog.
9
21
  */
10
22
  import { ensureStyles } from './styles.js';
23
+ import { IMAGE_ACCEPT, dimension } from './upload.js';
24
+ import { filePickerFor, listedImageClasses, listedImages, listedLinks, } from './pickers.js';
11
25
  const DIALOG_CSS = `
12
26
  .ol-dialog {
13
27
  box-sizing: border-box;
@@ -25,13 +39,15 @@ const DIALOG_CSS = `
25
39
  .ol-dialog h2 { margin: 0; font-size: 1.1em; }
26
40
  .ol-dialog label { display: grid; gap: 4px; font-weight: 500; }
27
41
  .ol-dialog .ol-hint { font-weight: 400; font-size: .9em; opacity: .75; }
28
- .ol-dialog input[type="text"], .ol-dialog input[type="url"] {
42
+ .ol-dialog input[type="text"], .ol-dialog input[type="url"], .ol-dialog input[type="file"],
43
+ .ol-dialog input[type="color"], .ol-dialog input[type="number"], .ol-dialog select {
29
44
  box-sizing: border-box; width: 100%; padding: 6px 8px;
30
45
  border: 1px solid var(--openleaf-color-border, #d1d9e0);
31
46
  border-radius: var(--openleaf-radius, 4px);
32
47
  background: var(--openleaf-color-surface, #fff);
33
48
  color: inherit; font: inherit;
34
49
  }
50
+ .ol-dialog input[type="color"] { height: 2.25rem; padding: 2px; }
35
51
  .ol-dialog .ol-check { display: flex; align-items: center; gap: 8px; font-weight: 400; }
36
52
  .ol-dialog .ol-check input { margin: 0; }
37
53
  .ol-dialog .ol-actions { display: flex; justify-content: flex-end; gap: 8px; }
@@ -50,10 +66,12 @@ const DIALOG_CSS = `
50
66
  .ol-dialog button:focus-visible {
51
67
  outline: 2px solid var(--openleaf-color-focus, #0969da); outline-offset: 1px;
52
68
  }
69
+ .ol-dialog button[aria-disabled="true"] { opacity: .55; cursor: default; }
53
70
  .ol-dialog .ol-error { color: #cf222e; font-size: .9em; min-height: 1.2em; }
71
+ .ol-dialog .ol-progress { font-size: .9em; opacity: .8; min-height: 1.2em; }
54
72
  `;
55
73
  let dialogStylesReady = false;
56
- function ensureDialogStyles(doc) {
74
+ export function ensureDialogStyles(doc) {
57
75
  ensureStyles(doc);
58
76
  if (dialogStylesReady)
59
77
  return;
@@ -75,14 +93,15 @@ function ensureDialogStyles(doc) {
75
93
  dialogStylesReady = true;
76
94
  }
77
95
  /**
78
- * Build and show a modal form, resolving to the field values or null on cancel.
96
+ * Build and show a modal form, resolving to whatever `commit` produced or null
97
+ * on cancel.
79
98
  *
80
99
  * Focus is returned to whatever held it before opening. `<dialog>` does this
81
100
  * itself in current browsers, but it is done explicitly because "where did my
82
101
  * cursor go" is the most common complaint about editor dialogs and relying on
83
102
  * an implementation detail for it is not good enough.
84
103
  */
85
- function showForm(doc, title, fields, options = {}, validate) {
104
+ function showForm(doc, title, fields, options = {}, commit = () => ({ error: 'This form has nothing to do.' })) {
86
105
  ensureDialogStyles(doc);
87
106
  const previouslyFocused = doc.activeElement;
88
107
  const dialog = doc.createElement('dialog');
@@ -95,6 +114,12 @@ function showForm(doc, title, fields, options = {}, validate) {
95
114
  heading.id = headingId;
96
115
  dialog.setAttribute('aria-labelledby', headingId);
97
116
  form.appendChild(heading);
117
+ if (options.note) {
118
+ const note = doc.createElement('div');
119
+ note.className = 'ol-hint';
120
+ note.textContent = options.note;
121
+ form.appendChild(note);
122
+ }
98
123
  const inputs = new Map();
99
124
  for (const field of fields) {
100
125
  const label = doc.createElement('label');
@@ -107,16 +132,75 @@ function showForm(doc, title, fields, options = {}, validate) {
107
132
  hint.textContent = field.hint;
108
133
  label.appendChild(hint);
109
134
  }
110
- const input = doc.createElement('input');
111
- input.type = field.type ?? 'text';
112
- input.name = field.name;
113
- input.value = field.value ?? '';
114
- if (field.required)
115
- input.required = true;
116
- label.appendChild(input);
117
- inputs.set(field.name, input);
135
+ let control;
136
+ if (field.options) {
137
+ const select = doc.createElement('select');
138
+ select.name = field.name;
139
+ for (const option of field.options) {
140
+ const item = doc.createElement('option');
141
+ item.value = option.value;
142
+ item.textContent = option.label;
143
+ if (option.value === (field.value ?? ''))
144
+ item.selected = true;
145
+ select.appendChild(item);
146
+ }
147
+ control = select;
148
+ }
149
+ else {
150
+ const input = doc.createElement('input');
151
+ input.type = field.type ?? 'text';
152
+ input.name = field.name;
153
+ if (field.type === 'file') {
154
+ if (field.accept)
155
+ input.accept = field.accept;
156
+ }
157
+ else {
158
+ input.value = field.value ?? '';
159
+ }
160
+ control = input;
161
+ }
162
+ // `required` is deliberately not set on the element. The browser's own
163
+ // validation bubble cannot be read by a screen reader in every engine and
164
+ // cannot express "one of these two fields"; the commit step reports into a
165
+ // live region instead.
166
+ label.appendChild(control);
167
+ inputs.set(field.name, control);
118
168
  form.appendChild(label);
119
169
  }
170
+ // Wired after the loop, so a chooser can fill a field declared after it.
171
+ for (const field of fields) {
172
+ if (!field.fills)
173
+ continue;
174
+ const source = inputs.get(field.name);
175
+ const target = inputs.get(field.fills);
176
+ if (!source || !target)
177
+ continue;
178
+ source.addEventListener('change', () => {
179
+ if (source.value !== '')
180
+ target.value = source.value;
181
+ });
182
+ }
183
+ if (options.browse) {
184
+ const browse = doc.createElement('button');
185
+ browse.type = 'button';
186
+ browse.textContent = options.browse.label;
187
+ browse.addEventListener('click', () => {
188
+ void options.browse?.fill().then((filled) => {
189
+ if (!filled)
190
+ return;
191
+ for (const [name, value] of Object.entries(filled)) {
192
+ const control = inputs.get(name);
193
+ if (control && control instanceof HTMLInputElement && control.type !== 'file') {
194
+ control.value = value;
195
+ }
196
+ else if (control) {
197
+ control.value = value;
198
+ }
199
+ }
200
+ });
201
+ });
202
+ form.appendChild(browse);
203
+ }
120
204
  let checkbox = null;
121
205
  if (options.extraCheckbox) {
122
206
  const wrap = doc.createElement('label');
@@ -137,10 +221,16 @@ function showForm(doc, title, fields, options = {}, validate) {
137
221
  form.appendChild(hint);
138
222
  }
139
223
  }
224
+ // Progress and failure are separate regions with different urgency. An upload
225
+ // starting is polite news; an upload failing is something the author must act
226
+ // on, and role="alert" is what makes it interrupt.
227
+ const progress = doc.createElement('div');
228
+ progress.className = 'ol-progress';
229
+ progress.setAttribute('role', 'status');
230
+ progress.setAttribute('aria-live', 'polite');
231
+ form.appendChild(progress);
140
232
  const error = doc.createElement('div');
141
233
  error.className = 'ol-error';
142
- // Announced when it changes, so a validation failure is not silent for a
143
- // screen reader user who cannot see the red text appear.
144
234
  error.setAttribute('role', 'alert');
145
235
  form.appendChild(error);
146
236
  const actions = doc.createElement('div');
@@ -157,49 +247,128 @@ function showForm(doc, title, fields, options = {}, validate) {
157
247
  dialog.appendChild(form);
158
248
  doc.body.appendChild(dialog);
159
249
  return new Promise((resolve) => {
250
+ let busy = false;
160
251
  const finish = (result) => {
161
252
  dialog.close();
162
253
  dialog.remove();
163
254
  previouslyFocused?.focus?.();
164
255
  resolve(result);
165
256
  };
166
- cancel.addEventListener('click', () => finish(null));
167
- // Escape fires `cancel` on <dialog>; treat it as a cancel, not a save.
257
+ const setBusy = (value) => {
258
+ busy = value;
259
+ form.setAttribute('aria-busy', value ? 'true' : 'false');
260
+ for (const button of [ok, cancel]) {
261
+ // aria-disabled rather than the disabled attribute, for the same reason
262
+ // the toolbar uses it: a disabled button leaves the tab order, so a
263
+ // screen reader user loses track of where they are mid-upload.
264
+ button.setAttribute('aria-disabled', value ? 'true' : 'false');
265
+ }
266
+ ok.textContent = value ? (options.busyLabel ?? 'Working…') : 'Save';
267
+ progress.textContent = value ? (options.busyLabel ?? 'Working…') : '';
268
+ };
269
+ cancel.addEventListener('click', () => {
270
+ // Cancelling mid-upload abandons the result rather than the request: there
271
+ // is no portable way to cancel somebody else's fetch, and pretending
272
+ // otherwise would leave the author thinking nothing was sent.
273
+ if (!busy)
274
+ finish(null);
275
+ });
168
276
  dialog.addEventListener('cancel', (event) => {
169
277
  event.preventDefault();
170
- finish(null);
278
+ if (!busy)
279
+ finish(null);
171
280
  });
172
281
  form.addEventListener('submit', (event) => {
173
282
  event.preventDefault();
283
+ if (busy)
284
+ return;
174
285
  const values = {};
175
- for (const [name, input] of inputs)
176
- values[name] = input.value.trim();
286
+ const files = {};
287
+ for (const [name, input] of inputs) {
288
+ if (input instanceof HTMLInputElement && input.type === 'file')
289
+ files[name] = input.files?.[0];
290
+ else
291
+ values[name] = input.value.trim();
292
+ }
177
293
  if (checkbox)
178
294
  values[checkbox.name] = checkbox.checked ? 'on' : '';
179
- const message = validate?.(values) ?? null;
180
- if (message) {
181
- error.textContent = message;
182
- const first = fields.find((f) => f.required);
183
- if (first)
184
- inputs.get(first.name)?.focus();
295
+ error.textContent = '';
296
+ let outcome;
297
+ try {
298
+ outcome = commit(values, files);
299
+ }
300
+ catch (thrown) {
301
+ error.textContent = messageFrom(thrown);
302
+ return;
303
+ }
304
+ if (!(outcome instanceof Promise)) {
305
+ if ('error' in outcome) {
306
+ error.textContent = outcome.error;
307
+ focusFirst();
308
+ return;
309
+ }
310
+ finish(outcome.value);
185
311
  return;
186
312
  }
187
- finish(values);
313
+ setBusy(true);
314
+ void outcome
315
+ .then((settled) => {
316
+ setBusy(false);
317
+ if ('error' in settled) {
318
+ error.textContent = settled.error;
319
+ focusFirst();
320
+ return;
321
+ }
322
+ finish(settled.value);
323
+ })
324
+ .catch((thrown) => {
325
+ setBusy(false);
326
+ error.textContent = messageFrom(thrown);
327
+ });
188
328
  });
329
+ const focusFirst = () => {
330
+ const first = fields[0] ? inputs.get(fields[0].name) : undefined;
331
+ first?.focus();
332
+ };
189
333
  dialog.showModal();
190
- const firstInput = fields[0] ? inputs.get(fields[0].name) : undefined;
191
- firstInput?.focus();
192
- firstInput?.select();
334
+ focusFirst();
335
+ const first = fields[0] ? inputs.get(fields[0].name) : undefined;
336
+ if (first instanceof HTMLInputElement && first.type !== 'file')
337
+ first.select();
193
338
  });
194
339
  }
340
+ /** A failure message worth showing an author, from whatever was thrown. */
341
+ function messageFrom(thrown) {
342
+ const message = thrown instanceof Error ? thrown.message : String(thrown);
343
+ return message === '' ? 'Something went wrong.' : message;
344
+ }
195
345
  function hash(value) {
196
346
  let out = 0;
197
347
  for (let i = 0; i < value.length; i += 1)
198
348
  out = (out * 31 + value.charCodeAt(i)) | 0;
199
349
  return out;
200
350
  }
201
- export async function promptForLink(doc, existing) {
202
- const values = await showForm(doc, existing?.href ? 'Edit link' : 'Insert link', [
351
+ /**
352
+ * A generic modal form, used by table property dialogs and anything else that
353
+ * is a handful of labelled fields rather than a specialised prompt.
354
+ */
355
+ export function promptFields(doc, title, fields, options, commit) {
356
+ return showForm(doc, title, fields, options, commit);
357
+ }
358
+ export async function promptForLink(doc, existing, host) {
359
+ const listed = listedLinks();
360
+ const picker = host ? filePickerFor(host) : null;
361
+ const fields = [
362
+ ...(listed.length > 0
363
+ ? [
364
+ {
365
+ name: 'listed',
366
+ label: 'Choose a page',
367
+ options: [{ value: '', label: 'Type an address instead' }, ...listed.map((item) => ({ value: item.value, label: item.title }))],
368
+ fills: 'href',
369
+ },
370
+ ]
371
+ : []),
203
372
  {
204
373
  name: 'href',
205
374
  label: 'Address',
@@ -208,7 +377,15 @@ export async function promptForLink(doc, existing) {
208
377
  required: true,
209
378
  hint: 'For example https://example.org, /about, or mailto:someone@example.org',
210
379
  },
211
- ], {
380
+ {
381
+ name: 'title',
382
+ label: 'Title',
383
+ type: 'text',
384
+ value: existing?.title ?? '',
385
+ hint: 'Shown as a tooltip. Optional.',
386
+ },
387
+ ];
388
+ return showForm(doc, existing?.href ? 'Edit link' : 'Insert link', fields, {
212
389
  extraCheckbox: {
213
390
  name: 'newWindow',
214
391
  label: 'Open in a new window',
@@ -216,51 +393,164 @@ export async function promptForLink(doc, existing) {
216
393
  hint: 'Opening in a new window without warning can disorient people using ' +
217
394
  'screen readers or magnification. Leave this off unless you have a reason.',
218
395
  },
219
- }, (v) => (v['href'] ? null : 'Enter an address for the link.'));
220
- if (!values)
221
- return null;
222
- const newWindow = values['newWindow'] === 'on';
223
- return {
224
- href: values['href'] ?? '',
225
- target: newWindow ? '_blank' : null,
226
- // rel="noopener" is not optional with target=_blank: without it the opened
227
- // page gets a handle on this window.
228
- rel: newWindow ? 'noopener noreferrer' : null,
229
- };
396
+ ...(picker && host
397
+ ? {
398
+ browse: {
399
+ label: 'Browse files',
400
+ fill: async () => {
401
+ const picked = await picker({ kind: 'file', host });
402
+ if (!picked)
403
+ return null;
404
+ return { href: picked.url, title: picked.title ?? '' };
405
+ },
406
+ },
407
+ }
408
+ : {}),
409
+ }, (values) => {
410
+ // The address field alone: choosing from the list writes into it, so there
411
+ // is no second place a destination can hide.
412
+ const href = values['href'] || '';
413
+ if (!href)
414
+ return { error: 'Enter an address for the link.' };
415
+ const newWindow = values['newWindow'] === 'on';
416
+ return {
417
+ value: {
418
+ href,
419
+ title: values['title'] || null,
420
+ target: newWindow ? '_blank' : null,
421
+ rel: newWindow ? 'noopener noreferrer' : null,
422
+ },
423
+ };
424
+ });
230
425
  }
231
- export async function promptForImage(doc) {
232
- const values = await showForm(doc, 'Insert image', [
233
- { name: 'src', label: 'Image address', type: 'text', required: true },
426
+ export async function promptForImage(doc, options = {}) {
427
+ const { file, upload, host, existing } = options;
428
+ const listed = listedImages();
429
+ const classes = listedImageClasses();
430
+ const picker = host ? filePickerFor(host) : null;
431
+ const describe = {
432
+ name: 'alt',
433
+ label: 'Alternative text',
434
+ type: 'text',
435
+ value: existing?.alt ?? '',
436
+ hint: 'Describe what the image shows, for people who cannot see it.',
437
+ };
438
+ const extras = [
439
+ {
440
+ name: 'title',
441
+ label: 'Title',
442
+ type: 'text',
443
+ value: existing?.title ?? '',
444
+ hint: 'Shown as a tooltip. Optional.',
445
+ },
446
+ {
447
+ name: 'align',
448
+ label: 'Alignment',
449
+ options: [
450
+ { value: '', label: 'None' },
451
+ { value: 'left', label: 'Float left' },
452
+ { value: 'center', label: 'Centre' },
453
+ { value: 'right', label: 'Float right' },
454
+ ],
455
+ value: existing?.align ?? '',
456
+ },
457
+ {
458
+ name: 'className',
459
+ label: 'CSS classes',
460
+ type: 'text',
461
+ value: existing?.className ?? '',
462
+ hint: classes.length > 0 ? `Suggested: ${classes.join(', ')}` : 'Optional class names, separated by spaces.',
463
+ },
234
464
  {
235
- name: 'alt',
236
- label: 'Alternative text',
465
+ name: 'caption',
466
+ label: 'Caption',
237
467
  type: 'text',
238
- hint: 'Describe what the image shows, for people who cannot see it.',
468
+ value: existing?.caption ?? '',
469
+ hint: 'Wraps the image in a figure. Leave blank for no caption.',
239
470
  },
240
- ], {
471
+ ];
472
+ const fields = file
473
+ ? [describe, ...extras]
474
+ : [
475
+ ...(listed.length > 0
476
+ ? [
477
+ {
478
+ name: 'listed',
479
+ label: 'Choose an image',
480
+ options: [{ value: '', label: 'Type an address instead' }, ...listed.map((item) => ({ value: item.value, label: item.title }))],
481
+ fills: 'src',
482
+ },
483
+ ]
484
+ : []),
485
+ ...(upload
486
+ ? [
487
+ {
488
+ name: 'file',
489
+ label: 'Choose a file',
490
+ type: 'file',
491
+ accept: IMAGE_ACCEPT,
492
+ hint: 'PNG, JPEG, GIF, WebP or AVIF.',
493
+ },
494
+ ]
495
+ : []),
496
+ {
497
+ name: 'src',
498
+ label: upload ? 'Or paste an image address' : 'Image address',
499
+ type: 'text',
500
+ value: existing?.src ?? '',
501
+ required: !upload,
502
+ },
503
+ describe,
504
+ ...extras,
505
+ ];
506
+ const finish = (src, alt, width, height, values) => ({
507
+ src,
508
+ alt,
509
+ title: values['title'] || null,
510
+ width,
511
+ height,
512
+ className: values['className'] || null,
513
+ align: values['align'] === 'left' || values['align'] === 'right' || values['align'] === 'center'
514
+ ? values['align']
515
+ : null,
516
+ caption: values['caption'] ? values['caption'] : null,
517
+ });
518
+ return showForm(doc, file ? 'Describe this image' : 'Insert image', fields, {
241
519
  extraCheckbox: {
242
520
  name: 'decorative',
243
521
  label: 'This image is decorative and needs no description',
244
522
  },
245
- }, (v) => {
246
- if (!v['src'])
247
- return 'Enter an image address.';
248
- // Required unless explicitly marked decorative. The checkbox exists so
249
- // that the honest answer "this needs no description" is easier than
250
- // typing "image" to defeat a validator -- which is what a hard
251
- // requirement actually teaches people to do.
252
- if (!v['alt'] && v['decorative'] !== 'on') {
253
- return 'Add alternative text, or tick the decorative box.';
523
+ ...(file ? { note: `Ready to upload: ${file.name}` } : {}),
524
+ busyLabel: 'Uploading…',
525
+ ...(picker && host
526
+ ? {
527
+ browse: {
528
+ label: 'Browse files',
529
+ fill: async () => {
530
+ const picked = await picker({ kind: 'image', host });
531
+ if (!picked)
532
+ return null;
533
+ return { src: picked.url, alt: picked.alt ?? '', title: picked.title ?? '' };
534
+ },
535
+ },
536
+ }
537
+ : {}),
538
+ }, (values, files) => {
539
+ const chosen = file ?? files['file'];
540
+ const src = values['src'] || '';
541
+ if (!chosen && !src) {
542
+ return { error: upload ? 'Choose a file or enter an image address.' : 'Enter an image address.' };
254
543
  }
255
- return null;
544
+ if (!values['alt'] && values['decorative'] !== 'on') {
545
+ return { error: 'Add alternative text, or tick the decorative box.' };
546
+ }
547
+ const alt = values['decorative'] === 'on' ? '' : (values['alt'] ?? '');
548
+ if (!chosen || !upload) {
549
+ return { value: finish(src, alt, null, null, values) };
550
+ }
551
+ return upload(chosen).then((result) => ({
552
+ value: finish(result.src, alt, dimension(result.width), dimension(result.height), values),
553
+ }));
256
554
  });
257
- if (!values)
258
- return null;
259
- return {
260
- src: values['src'] ?? '',
261
- // Explicitly empty for decorative images: alt="" tells a screen reader to
262
- // skip it, whereas a missing alt makes it read the filename.
263
- alt: values['decorative'] === 'on' ? '' : (values['alt'] ?? ''),
264
- };
265
555
  }
266
556
  //# sourceMappingURL=dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../src/dialog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../src/dialog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Floating toolbars: one for a non-empty selection, one for an empty block
3
+ * that is waiting to be filled.
4
+ *
5
+ * They reuse the same `Toolbar` class as the main bar so the keyboard model,
6
+ * live region and item registry stay in one place. Positioning is the only
7
+ * extra job, and it is deliberately pointer-driven: a keyboard user already
8
+ * has Alt+F10 for the main toolbar, and a second bar that jumps around under
9
+ * arrow keys is a focus trap waiting to happen.
10
+ */
11
+ import type { EditorState } from 'prosemirror-state';
12
+ import type { EditorView } from 'prosemirror-view';
13
+ export declare const DEFAULT_SELECTION_LAYOUT = "bold italic underline | link";
14
+ export declare const DEFAULT_INSERT_LAYOUT = "link image horizontalRule";
15
+ export declare class FloatingToolbars {
16
+ #private;
17
+ constructor(host: HTMLElement, doc: Document, options: {
18
+ selectionLayout?: string | null;
19
+ insertLayout?: string | null;
20
+ });
21
+ mount(view: EditorView): void;
22
+ update(state: EditorState): void;
23
+ destroy(): void;
24
+ }
25
+ //# sourceMappingURL=floating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating.d.ts","sourceRoot":"","sources":["../src/floating.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAGlD,eAAO,MAAM,wBAAwB,iCAAiC,CAAA;AACtE,eAAO,MAAM,qBAAqB,8BAA8B,CAAA;AAEhE,qBAAa,gBAAgB;;gBAQzB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAsB5E,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAM7B,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAMhC,OAAO,IAAI,IAAI;CA8BhB"}