@fieldia/widgets 0.9.2 → 0.10.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.
Files changed (211) hide show
  1. package/package.json +2 -2
  2. package/src/index.d.mts +2 -0
  3. package/src/index.d.ts +2 -0
  4. package/src/index.js +4 -0
  5. package/src/index.js.map +1 -1
  6. package/src/index.mjs +2 -0
  7. package/src/index.mjs.map +1 -1
  8. package/src/lib/address.d.mts +4 -0
  9. package/src/lib/address.d.ts +4 -0
  10. package/src/lib/address.js +105 -0
  11. package/src/lib/address.js.map +1 -0
  12. package/src/lib/address.mjs +100 -0
  13. package/src/lib/address.mjs.map +1 -0
  14. package/src/lib/cards.d.mts +2 -0
  15. package/src/lib/cards.d.ts +2 -0
  16. package/src/lib/cards.js +152 -0
  17. package/src/lib/cards.js.map +1 -0
  18. package/src/lib/cards.mjs +148 -0
  19. package/src/lib/cards.mjs.map +1 -0
  20. package/src/lib/choice-images.d.mts +2 -0
  21. package/src/lib/choice-images.d.ts +2 -0
  22. package/src/lib/choice-images.js +99 -0
  23. package/src/lib/choice-images.js.map +1 -0
  24. package/src/lib/choice-images.mjs +95 -0
  25. package/src/lib/choice-images.mjs.map +1 -0
  26. package/src/lib/choice-rules.d.mts +22 -0
  27. package/src/lib/choice-rules.d.ts +22 -0
  28. package/src/lib/choice-rules.js +46 -0
  29. package/src/lib/choice-rules.js.map +1 -0
  30. package/src/lib/choice-rules.mjs +41 -0
  31. package/src/lib/choice-rules.mjs.map +1 -0
  32. package/src/lib/choice-tags.d.mts +17 -0
  33. package/src/lib/choice-tags.d.ts +17 -0
  34. package/src/lib/choice-tags.js +187 -0
  35. package/src/lib/choice-tags.js.map +1 -0
  36. package/src/lib/choice-tags.mjs +182 -0
  37. package/src/lib/choice-tags.mjs.map +1 -0
  38. package/src/lib/choices-from.d.mts +8 -0
  39. package/src/lib/choices-from.d.ts +8 -0
  40. package/src/lib/choices-from.js +63 -0
  41. package/src/lib/choices-from.js.map +1 -0
  42. package/src/lib/choices-from.mjs +60 -0
  43. package/src/lib/choices-from.mjs.map +1 -0
  44. package/src/lib/display.js +4 -3
  45. package/src/lib/display.js.map +1 -1
  46. package/src/lib/display.mjs +5 -4
  47. package/src/lib/display.mjs.map +1 -1
  48. package/src/lib/extras.js +8 -4
  49. package/src/lib/extras.js.map +1 -1
  50. package/src/lib/extras.mjs +8 -4
  51. package/src/lib/extras.mjs.map +1 -1
  52. package/src/lib/files.d.mts +2 -0
  53. package/src/lib/files.d.ts +2 -0
  54. package/src/lib/files.js +180 -80
  55. package/src/lib/files.js.map +1 -1
  56. package/src/lib/files.mjs +179 -80
  57. package/src/lib/files.mjs.map +1 -1
  58. package/src/lib/focus-trap.d.mts +7 -0
  59. package/src/lib/focus-trap.d.ts +7 -0
  60. package/src/lib/focus-trap.js +26 -0
  61. package/src/lib/focus-trap.js.map +1 -0
  62. package/src/lib/focus-trap.mjs +23 -0
  63. package/src/lib/focus-trap.mjs.map +1 -0
  64. package/src/lib/icons.js +1 -0
  65. package/src/lib/icons.js.map +1 -1
  66. package/src/lib/icons.mjs +1 -0
  67. package/src/lib/icons.mjs.map +1 -1
  68. package/src/lib/kind-parts.d.mts +56 -0
  69. package/src/lib/kind-parts.d.ts +56 -0
  70. package/src/lib/kind-parts.js +121 -0
  71. package/src/lib/kind-parts.js.map +1 -0
  72. package/src/lib/kind-parts.mjs +107 -0
  73. package/src/lib/kind-parts.mjs.map +1 -0
  74. package/src/lib/labels.d.mts +80 -0
  75. package/src/lib/labels.d.ts +80 -0
  76. package/src/lib/labels.js +107 -189
  77. package/src/lib/labels.js.map +1 -1
  78. package/src/lib/labels.mjs +107 -189
  79. package/src/lib/labels.mjs.map +1 -1
  80. package/src/lib/layout-styles.d.mts +11 -0
  81. package/src/lib/layout-styles.d.ts +11 -0
  82. package/src/lib/layout-styles.js +176 -0
  83. package/src/lib/layout-styles.js.map +1 -0
  84. package/src/lib/layout-styles.mjs +173 -0
  85. package/src/lib/layout-styles.mjs.map +1 -0
  86. package/src/lib/limits.d.mts +20 -0
  87. package/src/lib/limits.d.ts +20 -0
  88. package/src/lib/limits.js +71 -0
  89. package/src/lib/limits.js.map +1 -0
  90. package/src/lib/limits.mjs +66 -0
  91. package/src/lib/limits.mjs.map +1 -0
  92. package/src/lib/line-moves.d.mts +8 -0
  93. package/src/lib/line-moves.d.ts +8 -0
  94. package/src/lib/line-moves.js +20 -0
  95. package/src/lib/line-moves.js.map +1 -0
  96. package/src/lib/line-moves.mjs +17 -0
  97. package/src/lib/line-moves.mjs.map +1 -0
  98. package/src/lib/lines.js +85 -7
  99. package/src/lib/lines.js.map +1 -1
  100. package/src/lib/lines.mjs +86 -8
  101. package/src/lib/lines.mjs.map +1 -1
  102. package/src/lib/locales/all.d.mts +8 -0
  103. package/src/lib/locales/all.d.ts +8 -0
  104. package/src/lib/locales/all.js +13 -0
  105. package/src/lib/locales/all.js.map +1 -0
  106. package/src/lib/locales/all.mjs +10 -0
  107. package/src/lib/locales/all.mjs.map +1 -0
  108. package/src/lib/locales/ar.d.mts +3 -0
  109. package/src/lib/locales/ar.d.ts +3 -0
  110. package/src/lib/locales/ar.js +104 -0
  111. package/src/lib/locales/ar.js.map +1 -0
  112. package/src/lib/locales/ar.mjs +101 -0
  113. package/src/lib/locales/ar.mjs.map +1 -0
  114. package/src/lib/locales/de.d.mts +3 -0
  115. package/src/lib/locales/de.d.ts +3 -0
  116. package/src/lib/locales/de.js +104 -0
  117. package/src/lib/locales/de.js.map +1 -0
  118. package/src/lib/locales/de.mjs +101 -0
  119. package/src/lib/locales/de.mjs.map +1 -0
  120. package/src/lib/locales/fr.d.mts +3 -0
  121. package/src/lib/locales/fr.d.ts +3 -0
  122. package/src/lib/locales/fr.js +104 -0
  123. package/src/lib/locales/fr.js.map +1 -0
  124. package/src/lib/locales/fr.mjs +101 -0
  125. package/src/lib/locales/fr.mjs.map +1 -0
  126. package/src/lib/matrix.d.mts +10 -0
  127. package/src/lib/matrix.d.ts +10 -0
  128. package/src/lib/matrix.js +86 -0
  129. package/src/lib/matrix.js.map +1 -0
  130. package/src/lib/matrix.mjs +82 -0
  131. package/src/lib/matrix.mjs.map +1 -0
  132. package/src/lib/numbers.d.mts +7 -0
  133. package/src/lib/numbers.d.ts +7 -0
  134. package/src/lib/numbers.js +15 -0
  135. package/src/lib/numbers.js.map +1 -1
  136. package/src/lib/numbers.mjs +14 -0
  137. package/src/lib/numbers.mjs.map +1 -1
  138. package/src/lib/progress.js +8 -4
  139. package/src/lib/progress.js.map +1 -1
  140. package/src/lib/progress.mjs +8 -4
  141. package/src/lib/progress.mjs.map +1 -1
  142. package/src/lib/ranking.d.mts +2 -0
  143. package/src/lib/ranking.d.ts +2 -0
  144. package/src/lib/ranking.js +172 -0
  145. package/src/lib/ranking.js.map +1 -0
  146. package/src/lib/ranking.mjs +168 -0
  147. package/src/lib/ranking.mjs.map +1 -0
  148. package/src/lib/relations.d.mts +1 -1
  149. package/src/lib/relations.d.ts +1 -1
  150. package/src/lib/relations.js +43 -18
  151. package/src/lib/relations.js.map +1 -1
  152. package/src/lib/relations.mjs +43 -18
  153. package/src/lib/relations.mjs.map +1 -1
  154. package/src/lib/shuffle.d.mts +7 -0
  155. package/src/lib/shuffle.d.ts +7 -0
  156. package/src/lib/shuffle.js +60 -0
  157. package/src/lib/shuffle.js.map +1 -0
  158. package/src/lib/shuffle.mjs +57 -0
  159. package/src/lib/shuffle.mjs.map +1 -0
  160. package/src/lib/signature.d.mts +2 -0
  161. package/src/lib/signature.d.ts +2 -0
  162. package/src/lib/signature.js +223 -0
  163. package/src/lib/signature.js.map +1 -0
  164. package/src/lib/signature.mjs +219 -0
  165. package/src/lib/signature.mjs.map +1 -0
  166. package/src/lib/slider.d.mts +10 -0
  167. package/src/lib/slider.d.ts +10 -0
  168. package/src/lib/slider.js +57 -0
  169. package/src/lib/slider.js.map +1 -0
  170. package/src/lib/slider.mjs +53 -0
  171. package/src/lib/slider.mjs.map +1 -0
  172. package/src/lib/styles-choices.d.mts +7 -0
  173. package/src/lib/styles-choices.d.ts +7 -0
  174. package/src/lib/styles-choices.js +47 -0
  175. package/src/lib/styles-choices.js.map +1 -0
  176. package/src/lib/styles-choices.mjs +44 -0
  177. package/src/lib/styles-choices.mjs.map +1 -0
  178. package/src/lib/styles-inputs.d.mts +9 -0
  179. package/src/lib/styles-inputs.d.ts +9 -0
  180. package/src/lib/styles-inputs.js +41 -0
  181. package/src/lib/styles-inputs.js.map +1 -0
  182. package/src/lib/styles-inputs.mjs +38 -0
  183. package/src/lib/styles-inputs.mjs.map +1 -0
  184. package/src/lib/styles-kinds.d.mts +7 -0
  185. package/src/lib/styles-kinds.d.ts +7 -0
  186. package/src/lib/styles-kinds.js +119 -0
  187. package/src/lib/styles-kinds.js.map +1 -0
  188. package/src/lib/styles-kinds.mjs +116 -0
  189. package/src/lib/styles-kinds.mjs.map +1 -0
  190. package/src/lib/styles.d.mts +2 -14
  191. package/src/lib/styles.d.ts +2 -14
  192. package/src/lib/styles.js +172 -60
  193. package/src/lib/styles.js.map +1 -1
  194. package/src/lib/styles.mjs +172 -60
  195. package/src/lib/styles.mjs.map +1 -1
  196. package/src/lib/units.d.mts +10 -0
  197. package/src/lib/units.d.ts +10 -0
  198. package/src/lib/units.js +19 -0
  199. package/src/lib/units.js.map +1 -0
  200. package/src/lib/units.mjs +16 -0
  201. package/src/lib/units.mjs.map +1 -0
  202. package/src/lib/widgets.js +215 -57
  203. package/src/lib/widgets.js.map +1 -1
  204. package/src/lib/widgets.mjs +215 -57
  205. package/src/lib/widgets.mjs.map +1 -1
  206. package/src/lib/yes-no.d.mts +9 -0
  207. package/src/lib/yes-no.d.ts +9 -0
  208. package/src/lib/yes-no.js +58 -0
  209. package/src/lib/yes-no.js.map +1 -0
  210. package/src/lib/yes-no.mjs +54 -0
  211. package/src/lib/yes-no.mjs.map +1 -0
package/src/lib/files.mjs CHANGED
@@ -1,70 +1,90 @@
1
- import { formatBytes } from '@fieldia/core';
2
- import { WIDGET_LABELS } from './labels.mjs';
3
- /**
4
- * File and image fields. A chosen or dropped file is read into the value as
5
- * base64, the way a backend's binary fields carry it; a stored one may carry
6
- * a `url` instead. Size and type limits are checked by the field's validation.
7
- */
8
- function read(file) {
9
- return new Promise((resolve, reject) => {
10
- const reader = new FileReader();
11
- reader.onload = () => {
12
- const url = String(reader.result ?? '');
13
- resolve({ name: file.name, type: file.type, size: file.size, data: url.slice(url.indexOf(',') + 1) });
14
- };
15
- reader.onerror = () => reject(reader.error);
16
- reader.readAsDataURL(file);
17
- });
1
+ import { describeTypes, fileProblem, fill, formatBytes, MESSAGES } from '@fieldia/core';
2
+ import { keepTabIn } from './focus-trap.mjs';
3
+ import { askFirst, describeState, maker, rightToLeft, setHidden, setText, wordsFor } from './kind-parts.mjs';
4
+ export const readFile = (file) => new Promise((resolve, reject) => {
5
+ const reader = new FileReader();
6
+ reader.onload = () => {
7
+ const url = String(reader.result ?? '');
8
+ resolve({ name: file.name, type: file.type, size: file.size, data: url.slice(url.indexOf(',') + 1) });
9
+ };
10
+ reader.onerror = () => reject(reader.error);
11
+ reader.readAsDataURL(file);
12
+ });
13
+ const extension = (name) => (/\.(\w{1,5})$/.exec(name)?.[1] ?? '').toUpperCase();
14
+ /** What a file is, for its icon and its preview: by its media type, else its extension. */
15
+ function kindOf(file) {
16
+ const of = `${file.type} ${extension(file.name)}`.toLowerCase();
17
+ return /^image\//.test(of) ? 'image' : /pdf/.test(of) ? 'pdf' : /sheet|excel|csv|xlsx?$|ods$/.test(of) ? 'sheet' : /zip|rar|7z|tar|gz/.test(of) ? 'zip' : /word|opendocument|^text|docx?$|odt$|rtf$/.test(of) ? 'doc' : 'file';
18
18
  }
19
+ const asText = (file) => /^text\/|json|xml|csv/.test(file.type);
20
+ /** Where a file's picture is: its data, or where it is stored. */
21
+ const source = (file) => (file.data ? `data:${file.type};base64,${file.data}` : (file.url ?? ''));
22
+ const bytes = (data) => Uint8Array.from(atob(data), (c) => c.charCodeAt(0));
23
+ const icon = (make, file) => make('span', { class: 'fd-file-icon', 'data-kind': kindOf(file), 'aria-hidden': 'true' }, extension(file.name) || '?');
24
+ /** A name cut in the middle where it must be: its start may end in an ellipsis, its last characters — the extension — stay. */
25
+ const named = (make, name) => make('span', { class: 'fd-file-name', dir: 'auto', title: name }, make('span', {}, name.slice(0, -9)), name.slice(-9));
19
26
  function fileWidget(kind) {
20
- return ({ form, name, field, id, document, labels = WIDGET_LABELS.en }) => {
21
- const element = document.createElement('div');
22
- element.className = `fd-file fd-file-${kind}`;
23
- const input = document.createElement('input');
24
- input.type = 'file';
25
- input.id = id;
26
- input.className = 'fd-sr-only';
27
- const accept = field.type === 'binary' ? field.accept : kind === 'image' ? ['image/*'] : undefined;
28
- if (accept)
29
- input.accept = accept.join(',');
30
- const preview = document.createElement('img');
31
- preview.className = 'fd-image-preview';
32
- preview.alt = field.label;
33
- preview.hidden = true;
34
- const pick = document.createElement('label');
35
- pick.className = kind === 'image' ? 'fd-file-pick fd-image-pick' : 'fd-file-pick';
36
- pick.htmlFor = id;
37
- const pickText = document.createElement('span');
38
- pickText.className = 'fd-button';
39
- pickText.textContent = kind === 'image' ? labels.uploadImage : labels.upload;
40
- const hint = document.createElement('span');
41
- hint.className = 'fd-help';
42
- hint.textContent = labels.dropHere;
43
- pick.append(pickText, hint);
44
- const chosen = document.createElement('div');
45
- chosen.className = 'fd-file-chosen';
46
- const fileName = document.createElement('span');
47
- fileName.className = 'fd-file-name';
48
- const replace = document.createElement('button');
49
- replace.type = 'button';
50
- replace.className = 'fd-button fd-button-link';
51
- replace.textContent = labels.replace;
27
+ return ({ form, name, field: def, node, id, document: doc, labels, locale = 'en' }) => {
28
+ const field = def;
29
+ const words = wordsFor(labels, locale);
30
+ const messages = MESSAGES[locale] ?? MESSAGES.en;
31
+ const make = maker(doc);
32
+ const several = field.multiple === true;
33
+ const most = several ? (field.maxFiles ?? Infinity) : 1;
34
+ const image = kind === 'image';
35
+ const thumbs = (node.options?.['files'] ?? (image ? 'thumbnails' : 'list')) === 'thumbnails';
36
+ const camera = node.options?.['camera'];
37
+ const accept = field.type === 'binary' ? field.accept : ['image/*'];
38
+ const element = make('div', { class: `fd-file fd-file-${kind} fd-files-${thumbs ? 'thumbs' : 'list'}` });
39
+ const input = make('input', { type: 'file', id, class: 'fd-sr-only', accept: accept?.join(','), capture: camera ? (camera === 'user' ? 'user' : 'environment') : undefined });
40
+ input.multiple = several;
41
+ // The limits, said before anyone tries.
42
+ const limits = [
43
+ !image && accept ? describeTypes(accept, messages.or) : '',
44
+ field.maxSize ? fill(several ? words.upToEach : words.upToSize, { size: formatBytes(field.maxSize) }) : '',
45
+ several && field.maxFiles ? fill(words.upToFiles, { max: field.maxFiles }) : '',
46
+ ].filter(Boolean);
47
+ // A tile among the thumbnails, a drop zone over the list.
48
+ const pick = make('label', { class: `fd-file-pick${thumbs ? ' fd-image-pick' : ''}`, for: id }, make('span', { class: 'fd-button' }, several ? (image ? words.addPhotos : words.addFiles) : image ? words.uploadImage : words.upload), make('span', { class: 'fd-help' }, several ? words.dropThem : words.dropHere));
49
+ const limited = make('span', { class: 'fd-help fd-file-limits' }, limits.join(' · '));
50
+ const count = several ? make('span', { class: 'fd-help fd-file-count' }) : null;
51
+ const list = make('ul', { class: 'fd-files', role: 'list' });
52
+ const replace = make('button', { type: 'button', class: 'fd-button fd-button-link' }, words.replace);
52
53
  replace.addEventListener('click', () => input.click());
53
- const remove = document.createElement('button');
54
- remove.type = 'button';
55
- remove.className = 'fd-button fd-button-link';
56
- remove.textContent = labels.removeFile;
57
- remove.addEventListener('click', () => form.setValue(name, null));
58
- chosen.append(fileName, replace, remove);
59
- element.append(input, ...(kind === 'image' ? [preview] : []), pick, chosen);
54
+ // Removing asks first, in place: "Remove report.pdf? Remove · Keep".
55
+ const confirm = askFirst(make, words);
56
+ // Why files were not added, and one removed: said politely, and shown.
57
+ const note = make('div', { class: 'fd-help fd-file-note', role: 'status' });
58
+ element.append(input, pick, ...(limits.length ? [limited] : []), ...(count ? [count] : []), list, replace, confirm.element, note);
60
59
  let readonly = false;
61
- const take = async (file) => {
62
- if (!file || readonly)
60
+ let files = [];
61
+ let shown;
62
+ const say = (lines) => note.replaceChildren(...lines.map((line) => make('div', {}, line)));
63
+ const take = async (chosen) => {
64
+ if (readonly || !chosen.length)
63
65
  return;
64
- form.setValue(name, await read(file));
66
+ const kept = [];
67
+ const lines = [];
68
+ let over = 0;
69
+ for (const file of chosen) {
70
+ const problem = fileProblem(field, file, messages) ?? (several && [...files, ...kept].some((f) => f.name === file.name) ? fill(words.alreadyAdded, { name: file.name }) : undefined);
71
+ if (problem)
72
+ lines.push(problem);
73
+ else if ((several ? files.length : 0) + kept.length < most)
74
+ kept.push(file);
75
+ else
76
+ over++;
77
+ }
78
+ if (over && several)
79
+ lines.push(fill(words.tooMany, { max: most, n: over }));
80
+ say(lines);
81
+ if (!kept.length)
82
+ return;
83
+ const added = await Promise.all(kept.map(readFile));
84
+ form.setValue(name, several ? [...files, ...added] : added[0]);
65
85
  };
66
86
  input.addEventListener('change', () => {
67
- void take(input.files?.[0]);
87
+ void take([...(input.files ?? [])]);
68
88
  input.value = '';
69
89
  });
70
90
  element.addEventListener('dragover', (event) => {
@@ -77,32 +97,111 @@ function fileWidget(kind) {
77
97
  element.addEventListener('drop', (event) => {
78
98
  event.preventDefault();
79
99
  element.classList.remove('fd-dragging');
80
- void take(event.dataTransfer?.files?.[0]);
100
+ void take([...(event.dataTransfer?.files ?? [])]);
81
101
  });
102
+ list.addEventListener('click', (event) => {
103
+ const button = event.target.closest('button');
104
+ const at = Number(button?.dataset['at']);
105
+ if (!button)
106
+ return;
107
+ if (button.classList.contains('fd-file-open'))
108
+ return view(at, button);
109
+ confirm.ask(fill(words.removeAsk, { name: files[at].name }), (remove) => {
110
+ const gone = files[at];
111
+ if (remove) {
112
+ form.setValue(name, several ? files.filter((_, i) => i !== at) : null);
113
+ say([fill(words.removed, { name: gone.name })]);
114
+ }
115
+ (list.querySelectorAll('.fd-file-remove')[remove ? Math.min(at, files.length - 1) : at] ?? (pick.hidden ? replace : input)).focus();
116
+ });
117
+ });
118
+ /** A file open in a dialog, the arrows and Previous and Next going through them all. */
119
+ function view(at, opener) {
120
+ const all = files;
121
+ let url = '';
122
+ const title = make('h2', { id: `${id}-view`, class: 'fd-form-dialog-title' });
123
+ const meta = make('span', { class: 'fd-help' });
124
+ const step = (by, words, arrow) => {
125
+ const button = make('button', { type: 'button', class: 'fd-button fd-file-step', 'aria-label': words }, arrow);
126
+ button.hidden = all.length < 2;
127
+ button.addEventListener('click', () => show(at + by));
128
+ return button;
129
+ };
130
+ const download = make('a', { class: 'fd-button' }, words.download);
131
+ const close = make('button', { type: 'button', class: 'fd-dialog-close', 'aria-label': words.close }, '×');
132
+ const body = make('div', { class: 'fd-file-viewer-body' });
133
+ const box = make('div',
134
+ // A page's dialog, as the viewer's are.
135
+ { class: 'fd-form-dialog fd-file-viewer', role: 'dialog', 'aria-modal': 'true', 'aria-labelledby': title.id, tabindex: '-1' }, make('div', { class: 'fd-form-dialog-head' }, title, meta, step(-1, words.previous, '‹'), step(1, words.next, '›'), download, close), body);
136
+ const backdrop = make('div', { class: 'fd-dialog-backdrop' }, box);
137
+ const free = () => url.startsWith('blob:') && URL.revokeObjectURL(url);
138
+ const none = (file) => make('div', { class: 'fd-file-none' }, icon(make, file), make('strong', {}, file.name), formatBytes(file.size), make('p', {}, words.noPreview));
139
+ function show(to) {
140
+ at = (to + all.length) % all.length;
141
+ const file = all[at];
142
+ free();
143
+ const data = file.data ? bytes(file.data) : null;
144
+ url = data ? URL.createObjectURL(new Blob([data], { type: file.type })) : (file.url ?? '');
145
+ title.textContent = file.name;
146
+ meta.replaceChildren(make('span', { class: 'fd-file-size' }, formatBytes(file.size)), all.length > 1 ? ` · ${fill(words.fileAt, { n: at + 1, total: all.length })}` : '');
147
+ download.href = url;
148
+ download.download = file.name;
149
+ const kind = kindOf(file);
150
+ if (kind === 'image')
151
+ return body.replaceChildren(make('img', { src: url, alt: file.name }));
152
+ if (kind === 'pdf')
153
+ return body.replaceChildren(make('iframe', { src: url, title: file.name }));
154
+ if (!asText(file))
155
+ return body.replaceChildren(none(file));
156
+ const pre = make('pre', { tabindex: '0' });
157
+ body.replaceChildren(pre);
158
+ // The first 200 KB: enough to see what it is.
159
+ (data ? Promise.resolve(new TextDecoder().decode(data.subarray(0, 2e5))) : fetch(url).then((r) => r.text())).then((words) => (pre.textContent = words.slice(0, 2e5)), () => pre.replaceWith(none(file)));
160
+ }
161
+ const done = () => {
162
+ free();
163
+ backdrop.remove();
164
+ (opener.isConnected ? opener : list.querySelectorAll('.fd-file-open')[at])?.focus();
165
+ };
166
+ close.addEventListener('click', done);
167
+ backdrop.addEventListener('click', (event) => event.target === backdrop && done());
168
+ box.addEventListener('keydown', (event) => {
169
+ const by = { ArrowLeft: -1, ArrowRight: 1 }[event.key];
170
+ if (event.key === 'Escape')
171
+ done();
172
+ else if (by && all.length > 1 && event.target.tagName !== 'PRE')
173
+ show(at + (rightToLeft(element) ? -by : by));
174
+ else
175
+ keepTabIn(box, event);
176
+ });
177
+ show(at);
178
+ // Over the page, wearing the form's skin, scheme and direction.
179
+ (element.closest('.fd-form') ?? doc.body).append(backdrop);
180
+ box.focus();
181
+ }
82
182
  return {
83
183
  element,
84
- focus: () => (pick.hidden ? replace : input).focus(),
184
+ focus: () => (list.querySelector('button') ?? (pick.hidden ? replace : input)).focus(),
85
185
  update(state) {
86
186
  readonly = state.readonly;
87
- const file = state.value;
88
- pick.hidden = !!file || readonly;
89
- chosen.hidden = !file;
90
- replace.hidden = remove.hidden = readonly;
187
+ const value = state.value;
188
+ files = Array.isArray(value) ? value : value ? [value] : [];
189
+ const full = files.length >= most;
190
+ setHidden(pick, full || readonly);
191
+ setHidden(limited, readonly);
91
192
  input.disabled = readonly;
92
- input.setAttribute('aria-invalid', String(state.invalid));
93
- if (state.describedBy)
94
- input.setAttribute('aria-describedby', state.describedBy);
95
- fileName.textContent = file ? `${file.name} · ${formatBytes(file.size)}` : '';
96
- if (kind === 'image') {
97
- const src = file ? (file.data ? `data:${file.type};base64,${file.data}` : file.url ?? '') : '';
98
- preview.hidden = !src;
99
- if (preview.getAttribute('src') !== src) {
100
- if (src)
101
- preview.src = src;
102
- else
103
- preview.removeAttribute('src');
104
- }
105
- }
193
+ input.hidden = pick.hidden;
194
+ setHidden(replace, several || !files.length || readonly);
195
+ if (count)
196
+ setText(count, !files.length ? '' : several && field.maxFiles ? fill(words.fileCountOf, { n: files.length, max: field.maxFiles }) : files.length === 1 ? words.oneFile : fill(words.fileCount, { n: files.length }));
197
+ describeState(input, state);
198
+ if (shown === value && list.dataset['readonly'] === String(readonly))
199
+ return;
200
+ shown = value;
201
+ list.dataset['readonly'] = String(readonly);
202
+ list.replaceChildren(...files.map((file, at) => make('li', { class: 'fd-file-item' }, make('button',
203
+ // Named whole: the name's two parts would be read as two words.
204
+ { type: 'button', class: 'fd-file-open', 'data-at': String(at), 'aria-haspopup': 'dialog', 'aria-label': `${file.name}, ${formatBytes(file.size)}` }, kindOf(file) === 'image' && source(file) ? make('img', { class: 'fd-file-thumb', src: source(file), alt: '' }) : icon(make, file), named(make, file.name), make('span', { class: 'fd-file-size' }, formatBytes(file.size))), ...(readonly ? [] : [make('button', { type: 'button', class: 'fd-file-remove', 'data-at': String(at), 'aria-label': fill(words.remove, { name: file.name }) }, '×')]))));
106
205
  },
107
206
  };
108
207
  };
@@ -1 +1 @@
1
- {"version":3,"file":"files.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"files.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Keep Tab inside a modal dialog (WCAG 2.4.3, and what aria-modal promises):
3
+ * past its last stop Tab goes round to the first, and Shift+Tab before the
4
+ * first goes to the last. Call it from the dialog's keydown; it does nothing
5
+ * for any other key.
6
+ */
7
+ export declare function keepTabIn(box: HTMLElement, event: KeyboardEvent): void;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Keep Tab inside a modal dialog (WCAG 2.4.3, and what aria-modal promises):
3
+ * past its last stop Tab goes round to the first, and Shift+Tab before the
4
+ * first goes to the last. Call it from the dialog's keydown; it does nothing
5
+ * for any other key.
6
+ */
7
+ export declare function keepTabIn(box: HTMLElement, event: KeyboardEvent): void;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.keepTabIn = keepTabIn;
4
+ /** What Tab can reach in a box. */
5
+ const FOCUSABLE = 'a[href], button, input:not([type="hidden"]), select, textarea, [tabindex]:not([tabindex="-1"]), [contenteditable="true"]';
6
+ /**
7
+ * Keep Tab inside a modal dialog (WCAG 2.4.3, and what aria-modal promises):
8
+ * past its last stop Tab goes round to the first, and Shift+Tab before the
9
+ * first goes to the last. Call it from the dialog's keydown; it does nothing
10
+ * for any other key.
11
+ */
12
+ function keepTabIn(box, event) {
13
+ if (event.key !== 'Tab')
14
+ return;
15
+ const all = [...box.querySelectorAll(FOCUSABLE)].filter((e) => !e.closest('[hidden], [inert]') && !e.disabled);
16
+ if (!all.length)
17
+ return;
18
+ const first = all[0];
19
+ const last = all[all.length - 1];
20
+ const at = box.ownerDocument.activeElement;
21
+ if (event.shiftKey ? at === first || !box.contains(at) : at === last) {
22
+ event.preventDefault();
23
+ (event.shiftKey ? last : first).focus();
24
+ }
25
+ }
26
+ //# sourceMappingURL=focus-trap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-trap.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/focus-trap.ts"],"names":[],"mappings":";;AASA,8BAWC;AApBD,mCAAmC;AACnC,MAAM,SAAS,GAAG,0HAA0H,CAAC;AAE7I;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,GAAgB,EAAE,KAAoB;IAC9D,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;QAAE,OAAO;IAChC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,gBAAgB,CAAc,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAE,CAAuB,CAAC,QAAQ,CAAC,CAAC;IACnJ,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC;IAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACrE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /** What Tab can reach in a box. */
2
+ const FOCUSABLE = 'a[href], button, input:not([type="hidden"]), select, textarea, [tabindex]:not([tabindex="-1"]), [contenteditable="true"]';
3
+ /**
4
+ * Keep Tab inside a modal dialog (WCAG 2.4.3, and what aria-modal promises):
5
+ * past its last stop Tab goes round to the first, and Shift+Tab before the
6
+ * first goes to the last. Call it from the dialog's keydown; it does nothing
7
+ * for any other key.
8
+ */
9
+ export function keepTabIn(box, event) {
10
+ if (event.key !== 'Tab')
11
+ return;
12
+ const all = [...box.querySelectorAll(FOCUSABLE)].filter((e) => !e.closest('[hidden], [inert]') && !e.disabled);
13
+ if (!all.length)
14
+ return;
15
+ const first = all[0];
16
+ const last = all[all.length - 1];
17
+ const at = box.ownerDocument.activeElement;
18
+ if (event.shiftKey ? at === first || !box.contains(at) : at === last) {
19
+ event.preventDefault();
20
+ (event.shiftKey ? last : first).focus();
21
+ }
22
+ }
23
+ //# sourceMappingURL=focus-trap.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-trap.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/focus-trap.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,MAAM,SAAS,GAAG,0HAA0H,CAAC;AAE7I;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAgB,EAAE,KAAoB;IAC9D,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;QAAE,OAAO;IAChC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,gBAAgB,CAAc,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAE,CAAuB,CAAC,QAAQ,CAAC,CAAC;IACnJ,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC;IAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACrE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC"}
package/src/lib/icons.js CHANGED
@@ -35,6 +35,7 @@ exports.ICONS = {
35
35
  search: '<circle cx="11" cy="11" r="6.5"/><path d="M16 16l5 5"/>',
36
36
  filter: '<path d="M3 5h18l-7 8.5V20l-4-2v-4.5z"/>',
37
37
  layers: '<path d="M12 3l9 5-9 5-9-5z"/><path d="M3 13l9 5 9-5"/>',
38
+ thumb: '<path d="M7 21V10l4-8c1.6 0 2.6 1.3 2.2 3L12.5 9H19a2 2 0 0 1 2 2.3l-1.3 7.6a2.5 2.5 0 0 1-2.5 2.1H7zM7 10H3v11h4"/>',
38
39
  };
39
40
  /** An icon by name, the app's own first and then Fieldia's; null for a name neither has. */
40
41
  function drawIcon(doc, name, own) {
@@ -1 +1 @@
1
- {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/icons.ts"],"names":[],"mappings":";;;AA6CA,4BAoBC;AAzDD,MAAM,GAAG,GAAG,4BAA4B,CAAC;AAE5B,QAAA,KAAK,GAAY;IAC5B,IAAI,EAAE,uEAAuE;IAC7E,KAAK,EAAE,wJAAwJ;IAC/J,QAAQ,EAAE,uGAAuG;IACjH,IAAI,EAAE,8EAA8E;IACpF,KAAK,EAAE,uEAAuE;IAC9E,IAAI,EAAE,2EAA2E;IACjF,GAAG,EAAE,gGAAgG;IACrG,KAAK,EAAE,oGAAoG;IAC3G,QAAQ,EAAE,oFAAoF;IAC9F,KAAK,EAAE,wDAAwD;IAC/D,KAAK,EAAE,gHAAgH;IACvH,IAAI,EAAE,4GAA4G;IAClH,GAAG,EAAE,kFAAkF;IACvF,KAAK,EAAE,qHAAqH;IAC5H,OAAO,EAAE,mEAAmE;IAC5E,IAAI,EAAE,iEAAiE;IACvE,IAAI,EAAE,8DAA8D;IACpE,GAAG,EAAE,mEAAmE;IACxE,IAAI,EAAE,mFAAmF;IACzF,IAAI,EAAE,uFAAuF;IAC7F,KAAK,EAAE,oCAAoC;IAC3C,IAAI,EAAE,8DAA8D;IACpE,OAAO,EAAE,wDAAwD;IACjE,QAAQ,EAAE,qJAAqJ;IAC/J,KAAK,EAAE,+CAA+C;IACtD,IAAI,EAAE,4HAA4H;IAClI,IAAI,EAAE,yDAAyD;IAC/D,IAAI,EAAE,gCAAgC;IACtC,MAAM,EAAE,yDAAyD;IACjE,MAAM,EAAE,0CAA0C;IAClD,MAAM,EAAE,yDAAyD;CAClE,CAAC;AAEF,4FAA4F;AAC5F,SAAgB,QAAQ,CAAC,GAAa,EAAE,IAAwB,EAAE,GAAa;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,aAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;QACxC,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,cAAc;QACtB,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,OAAO;QACzB,iBAAiB,EAAE,OAAO;QAC1B,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,OAAO;QAClB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,IAAc;KAC5B,CAAC,EAAE,CAAC;QACH,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;IACvB,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/icons.ts"],"names":[],"mappings":";;;AA8CA,4BAoBC;AA1DD,MAAM,GAAG,GAAG,4BAA4B,CAAC;AAE5B,QAAA,KAAK,GAAY;IAC5B,IAAI,EAAE,uEAAuE;IAC7E,KAAK,EAAE,wJAAwJ;IAC/J,QAAQ,EAAE,uGAAuG;IACjH,IAAI,EAAE,8EAA8E;IACpF,KAAK,EAAE,uEAAuE;IAC9E,IAAI,EAAE,2EAA2E;IACjF,GAAG,EAAE,gGAAgG;IACrG,KAAK,EAAE,oGAAoG;IAC3G,QAAQ,EAAE,oFAAoF;IAC9F,KAAK,EAAE,wDAAwD;IAC/D,KAAK,EAAE,gHAAgH;IACvH,IAAI,EAAE,4GAA4G;IAClH,GAAG,EAAE,kFAAkF;IACvF,KAAK,EAAE,qHAAqH;IAC5H,OAAO,EAAE,mEAAmE;IAC5E,IAAI,EAAE,iEAAiE;IACvE,IAAI,EAAE,8DAA8D;IACpE,GAAG,EAAE,mEAAmE;IACxE,IAAI,EAAE,mFAAmF;IACzF,IAAI,EAAE,uFAAuF;IAC7F,KAAK,EAAE,oCAAoC;IAC3C,IAAI,EAAE,8DAA8D;IACpE,OAAO,EAAE,wDAAwD;IACjE,QAAQ,EAAE,qJAAqJ;IAC/J,KAAK,EAAE,+CAA+C;IACtD,IAAI,EAAE,4HAA4H;IAClI,IAAI,EAAE,yDAAyD;IAC/D,IAAI,EAAE,gCAAgC;IACtC,MAAM,EAAE,yDAAyD;IACjE,MAAM,EAAE,0CAA0C;IAClD,MAAM,EAAE,yDAAyD;IACjE,KAAK,EAAE,sHAAsH;CAC9H,CAAC;AAEF,4FAA4F;AAC5F,SAAgB,QAAQ,CAAC,GAAa,EAAE,IAAwB,EAAE,GAAa;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,aAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;QACxC,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,cAAc;QACtB,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,OAAO;QACzB,iBAAiB,EAAE,OAAO;QAC1B,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,OAAO;QAClB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,IAAc;KAC5B,CAAC,EAAE,CAAC;QACH,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;IACvB,OAAO,GAAG,CAAC;AACb,CAAC"}
package/src/lib/icons.mjs CHANGED
@@ -31,6 +31,7 @@ export const ICONS = {
31
31
  search: '<circle cx="11" cy="11" r="6.5"/><path d="M16 16l5 5"/>',
32
32
  filter: '<path d="M3 5h18l-7 8.5V20l-4-2v-4.5z"/>',
33
33
  layers: '<path d="M12 3l9 5-9 5-9-5z"/><path d="M3 13l9 5 9-5"/>',
34
+ thumb: '<path d="M7 21V10l4-8c1.6 0 2.6 1.3 2.2 3L12.5 9H19a2 2 0 0 1 2 2.3l-1.3 7.6a2.5 2.5 0 0 1-2.5 2.1H7zM7 10H3v11h4"/>',
34
35
  };
35
36
  /** An icon by name, the app's own first and then Fieldia's; null for a name neither has. */
36
37
  export function drawIcon(doc, name, own) {
@@ -1 +1 @@
1
- {"version":3,"file":"icons.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/icons.ts"],"names":[],"mappings":"AAQA,MAAM,GAAG,GAAG,4BAA4B,CAAC;AAEzC,MAAM,CAAC,MAAM,KAAK,GAAY;IAC5B,IAAI,EAAE,uEAAuE;IAC7E,KAAK,EAAE,wJAAwJ;IAC/J,QAAQ,EAAE,uGAAuG;IACjH,IAAI,EAAE,8EAA8E;IACpF,KAAK,EAAE,uEAAuE;IAC9E,IAAI,EAAE,2EAA2E;IACjF,GAAG,EAAE,gGAAgG;IACrG,KAAK,EAAE,oGAAoG;IAC3G,QAAQ,EAAE,oFAAoF;IAC9F,KAAK,EAAE,wDAAwD;IAC/D,KAAK,EAAE,gHAAgH;IACvH,IAAI,EAAE,4GAA4G;IAClH,GAAG,EAAE,kFAAkF;IACvF,KAAK,EAAE,qHAAqH;IAC5H,OAAO,EAAE,mEAAmE;IAC5E,IAAI,EAAE,iEAAiE;IACvE,IAAI,EAAE,8DAA8D;IACpE,GAAG,EAAE,mEAAmE;IACxE,IAAI,EAAE,mFAAmF;IACzF,IAAI,EAAE,uFAAuF;IAC7F,KAAK,EAAE,oCAAoC;IAC3C,IAAI,EAAE,8DAA8D;IACpE,OAAO,EAAE,wDAAwD;IACjE,QAAQ,EAAE,qJAAqJ;IAC/J,KAAK,EAAE,+CAA+C;IACtD,IAAI,EAAE,4HAA4H;IAClI,IAAI,EAAE,yDAAyD;IAC/D,IAAI,EAAE,gCAAgC;IACtC,MAAM,EAAE,yDAAyD;IACjE,MAAM,EAAE,0CAA0C;IAClD,MAAM,EAAE,yDAAyD;CAClE,CAAC;AAEF,4FAA4F;AAC5F,MAAM,UAAU,QAAQ,CAAC,GAAa,EAAE,IAAwB,EAAE,GAAa;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;QACxC,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,cAAc;QACtB,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,OAAO;QACzB,iBAAiB,EAAE,OAAO;QAC1B,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,OAAO;QAClB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,IAAc;KAC5B,CAAC,EAAE,CAAC;QACH,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;IACvB,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"icons.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/icons.ts"],"names":[],"mappings":"AAQA,MAAM,GAAG,GAAG,4BAA4B,CAAC;AAEzC,MAAM,CAAC,MAAM,KAAK,GAAY;IAC5B,IAAI,EAAE,uEAAuE;IAC7E,KAAK,EAAE,wJAAwJ;IAC/J,QAAQ,EAAE,uGAAuG;IACjH,IAAI,EAAE,8EAA8E;IACpF,KAAK,EAAE,uEAAuE;IAC9E,IAAI,EAAE,2EAA2E;IACjF,GAAG,EAAE,gGAAgG;IACrG,KAAK,EAAE,oGAAoG;IAC3G,QAAQ,EAAE,oFAAoF;IAC9F,KAAK,EAAE,wDAAwD;IAC/D,KAAK,EAAE,gHAAgH;IACvH,IAAI,EAAE,4GAA4G;IAClH,GAAG,EAAE,kFAAkF;IACvF,KAAK,EAAE,qHAAqH;IAC5H,OAAO,EAAE,mEAAmE;IAC5E,IAAI,EAAE,iEAAiE;IACvE,IAAI,EAAE,8DAA8D;IACpE,GAAG,EAAE,mEAAmE;IACxE,IAAI,EAAE,mFAAmF;IACzF,IAAI,EAAE,uFAAuF;IAC7F,KAAK,EAAE,oCAAoC;IAC3C,IAAI,EAAE,8DAA8D;IACpE,OAAO,EAAE,wDAAwD;IACjE,QAAQ,EAAE,qJAAqJ;IAC/J,KAAK,EAAE,+CAA+C;IACtD,IAAI,EAAE,4HAA4H;IAClI,IAAI,EAAE,yDAAyD;IAC/D,IAAI,EAAE,gCAAgC;IACtC,MAAM,EAAE,yDAAyD;IACjE,MAAM,EAAE,0CAA0C;IAClD,MAAM,EAAE,yDAAyD;IACjE,KAAK,EAAE,sHAAsH;CAC9H,CAAC;AAEF,4FAA4F;AAC5F,MAAM,UAAU,QAAQ,CAAC,GAAa,EAAE,IAAwB,EAAE,GAAa;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;QACxC,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,cAAc;QACtB,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,OAAO;QACzB,iBAAiB,EAAE,OAAO;QAC1B,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,OAAO;QAClB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,IAAc;KAC5B,CAAC,EAAE,CAAC;QACH,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;IACvB,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { Locale } from '@fieldia/core';
2
+ import { type WidgetLabels } from './labels.mjs';
3
+ import type { WidgetState } from './widgets.mjs';
4
+ /**
5
+ * Small parts the question kinds share: making elements, their words, saying
6
+ * what is wrong with them, and a polite voice for screen readers.
7
+ */
8
+ export type Make = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, string | undefined>, ...children: (Node | string)[]) => HTMLElementTagNameMap[K];
9
+ /** An element with its attributes and children, in one call. */
10
+ export declare function maker(document: Document): Make;
11
+ /** The words a widget shows: the page's, its language's, or English (a language the one-tag script was not given). */
12
+ export declare const wordsFor: (labels: WidgetLabels | undefined, locale: Locale | undefined) => WidgetLabels;
13
+ /** `{name}` and the like filled in. */
14
+ export declare const fillIn: (template: string, values: Record<string, string | number>) => string;
15
+ /**
16
+ * An attribute set, or taken away with null, only when that changes it.
17
+ * Every field is brought up to date at each change of a form; writing what is
18
+ * there already still has the browser look at the page anew, which on a big
19
+ * page is most of the time a key takes.
20
+ */
21
+ export declare function setAttr(element: Element, name: string, value: string | null): void;
22
+ /** Shown or hidden, written only when that changes. */
23
+ export declare function setHidden(element: HTMLElement, hidden: boolean): void;
24
+ /** Words written only when they change: written again, they would be new words to lay out. */
25
+ export declare function setText(element: Node, text: string): void;
26
+ /** Whether the answer is wrong, and the help and error that describe it, on the element assistive technology reads. */
27
+ export declare function describeState(element: HTMLElement, state: {
28
+ invalid: boolean;
29
+ describedBy?: string;
30
+ }): void;
31
+ /** Words said to screen readers when something moves or goes, without taking the focus. */
32
+ export declare function announcer(make: Make): {
33
+ element: HTMLDivElement;
34
+ say(text: string): void;
35
+ };
36
+ /** Whether the element sits in a right-to-left page, where left is forward. */
37
+ export declare const rightToLeft: (element: Element) => boolean;
38
+ /**
39
+ * "Clear selection", as Google Forms has it: under a single choice that need not be answered, once something is
40
+ * picked — a radio, once picked, cannot be unpicked; nor can a slider, once slid.
41
+ */
42
+ export declare function clearSelection(document: Document, words: WidgetLabels, clear: () => void): {
43
+ button: HTMLButtonElement;
44
+ /** Whether the answer may be left out: not required, and not read-only. */
45
+ allow(state: WidgetState): void;
46
+ show(picked: boolean): void;
47
+ };
48
+ /**
49
+ * Removing asks first, in place: "Remove report.pdf? Remove · Keep", the
50
+ * focus on Keep, Escape keeping it. `ask` shows the question; `then` hears
51
+ * the answer, true to remove.
52
+ */
53
+ export declare function askFirst(make: Make, words: WidgetLabels): {
54
+ element: HTMLDivElement;
55
+ ask(text: string, answer: (remove: boolean) => void): void;
56
+ };
@@ -0,0 +1,56 @@
1
+ import type { Locale } from '@fieldia/core';
2
+ import { type WidgetLabels } from './labels';
3
+ import type { WidgetState } from './widgets';
4
+ /**
5
+ * Small parts the question kinds share: making elements, their words, saying
6
+ * what is wrong with them, and a polite voice for screen readers.
7
+ */
8
+ export type Make = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, string | undefined>, ...children: (Node | string)[]) => HTMLElementTagNameMap[K];
9
+ /** An element with its attributes and children, in one call. */
10
+ export declare function maker(document: Document): Make;
11
+ /** The words a widget shows: the page's, its language's, or English (a language the one-tag script was not given). */
12
+ export declare const wordsFor: (labels: WidgetLabels | undefined, locale: Locale | undefined) => WidgetLabels;
13
+ /** `{name}` and the like filled in. */
14
+ export declare const fillIn: (template: string, values: Record<string, string | number>) => string;
15
+ /**
16
+ * An attribute set, or taken away with null, only when that changes it.
17
+ * Every field is brought up to date at each change of a form; writing what is
18
+ * there already still has the browser look at the page anew, which on a big
19
+ * page is most of the time a key takes.
20
+ */
21
+ export declare function setAttr(element: Element, name: string, value: string | null): void;
22
+ /** Shown or hidden, written only when that changes. */
23
+ export declare function setHidden(element: HTMLElement, hidden: boolean): void;
24
+ /** Words written only when they change: written again, they would be new words to lay out. */
25
+ export declare function setText(element: Node, text: string): void;
26
+ /** Whether the answer is wrong, and the help and error that describe it, on the element assistive technology reads. */
27
+ export declare function describeState(element: HTMLElement, state: {
28
+ invalid: boolean;
29
+ describedBy?: string;
30
+ }): void;
31
+ /** Words said to screen readers when something moves or goes, without taking the focus. */
32
+ export declare function announcer(make: Make): {
33
+ element: HTMLDivElement;
34
+ say(text: string): void;
35
+ };
36
+ /** Whether the element sits in a right-to-left page, where left is forward. */
37
+ export declare const rightToLeft: (element: Element) => boolean;
38
+ /**
39
+ * "Clear selection", as Google Forms has it: under a single choice that need not be answered, once something is
40
+ * picked — a radio, once picked, cannot be unpicked; nor can a slider, once slid.
41
+ */
42
+ export declare function clearSelection(document: Document, words: WidgetLabels, clear: () => void): {
43
+ button: HTMLButtonElement;
44
+ /** Whether the answer may be left out: not required, and not read-only. */
45
+ allow(state: WidgetState): void;
46
+ show(picked: boolean): void;
47
+ };
48
+ /**
49
+ * Removing asks first, in place: "Remove report.pdf? Remove · Keep", the
50
+ * focus on Keep, Escape keeping it. `ask` shows the question; `then` hears
51
+ * the answer, true to remove.
52
+ */
53
+ export declare function askFirst(make: Make, words: WidgetLabels): {
54
+ element: HTMLDivElement;
55
+ ask(text: string, answer: (remove: boolean) => void): void;
56
+ };