@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.
- package/package.json +2 -2
- package/src/index.d.mts +2 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +4 -0
- package/src/index.js.map +1 -1
- package/src/index.mjs +2 -0
- package/src/index.mjs.map +1 -1
- package/src/lib/address.d.mts +4 -0
- package/src/lib/address.d.ts +4 -0
- package/src/lib/address.js +105 -0
- package/src/lib/address.js.map +1 -0
- package/src/lib/address.mjs +100 -0
- package/src/lib/address.mjs.map +1 -0
- package/src/lib/cards.d.mts +2 -0
- package/src/lib/cards.d.ts +2 -0
- package/src/lib/cards.js +152 -0
- package/src/lib/cards.js.map +1 -0
- package/src/lib/cards.mjs +148 -0
- package/src/lib/cards.mjs.map +1 -0
- package/src/lib/choice-images.d.mts +2 -0
- package/src/lib/choice-images.d.ts +2 -0
- package/src/lib/choice-images.js +99 -0
- package/src/lib/choice-images.js.map +1 -0
- package/src/lib/choice-images.mjs +95 -0
- package/src/lib/choice-images.mjs.map +1 -0
- package/src/lib/choice-rules.d.mts +22 -0
- package/src/lib/choice-rules.d.ts +22 -0
- package/src/lib/choice-rules.js +46 -0
- package/src/lib/choice-rules.js.map +1 -0
- package/src/lib/choice-rules.mjs +41 -0
- package/src/lib/choice-rules.mjs.map +1 -0
- package/src/lib/choice-tags.d.mts +17 -0
- package/src/lib/choice-tags.d.ts +17 -0
- package/src/lib/choice-tags.js +187 -0
- package/src/lib/choice-tags.js.map +1 -0
- package/src/lib/choice-tags.mjs +182 -0
- package/src/lib/choice-tags.mjs.map +1 -0
- package/src/lib/choices-from.d.mts +8 -0
- package/src/lib/choices-from.d.ts +8 -0
- package/src/lib/choices-from.js +63 -0
- package/src/lib/choices-from.js.map +1 -0
- package/src/lib/choices-from.mjs +60 -0
- package/src/lib/choices-from.mjs.map +1 -0
- package/src/lib/display.js +4 -3
- package/src/lib/display.js.map +1 -1
- package/src/lib/display.mjs +5 -4
- package/src/lib/display.mjs.map +1 -1
- package/src/lib/extras.js +8 -4
- package/src/lib/extras.js.map +1 -1
- package/src/lib/extras.mjs +8 -4
- package/src/lib/extras.mjs.map +1 -1
- package/src/lib/files.d.mts +2 -0
- package/src/lib/files.d.ts +2 -0
- package/src/lib/files.js +180 -80
- package/src/lib/files.js.map +1 -1
- package/src/lib/files.mjs +179 -80
- package/src/lib/files.mjs.map +1 -1
- package/src/lib/focus-trap.d.mts +7 -0
- package/src/lib/focus-trap.d.ts +7 -0
- package/src/lib/focus-trap.js +26 -0
- package/src/lib/focus-trap.js.map +1 -0
- package/src/lib/focus-trap.mjs +23 -0
- package/src/lib/focus-trap.mjs.map +1 -0
- package/src/lib/icons.js +1 -0
- package/src/lib/icons.js.map +1 -1
- package/src/lib/icons.mjs +1 -0
- package/src/lib/icons.mjs.map +1 -1
- package/src/lib/kind-parts.d.mts +56 -0
- package/src/lib/kind-parts.d.ts +56 -0
- package/src/lib/kind-parts.js +121 -0
- package/src/lib/kind-parts.js.map +1 -0
- package/src/lib/kind-parts.mjs +107 -0
- package/src/lib/kind-parts.mjs.map +1 -0
- package/src/lib/labels.d.mts +80 -0
- package/src/lib/labels.d.ts +80 -0
- package/src/lib/labels.js +107 -189
- package/src/lib/labels.js.map +1 -1
- package/src/lib/labels.mjs +107 -189
- package/src/lib/labels.mjs.map +1 -1
- package/src/lib/layout-styles.d.mts +11 -0
- package/src/lib/layout-styles.d.ts +11 -0
- package/src/lib/layout-styles.js +176 -0
- package/src/lib/layout-styles.js.map +1 -0
- package/src/lib/layout-styles.mjs +173 -0
- package/src/lib/layout-styles.mjs.map +1 -0
- package/src/lib/limits.d.mts +20 -0
- package/src/lib/limits.d.ts +20 -0
- package/src/lib/limits.js +71 -0
- package/src/lib/limits.js.map +1 -0
- package/src/lib/limits.mjs +66 -0
- package/src/lib/limits.mjs.map +1 -0
- package/src/lib/line-moves.d.mts +8 -0
- package/src/lib/line-moves.d.ts +8 -0
- package/src/lib/line-moves.js +20 -0
- package/src/lib/line-moves.js.map +1 -0
- package/src/lib/line-moves.mjs +17 -0
- package/src/lib/line-moves.mjs.map +1 -0
- package/src/lib/lines.js +85 -7
- package/src/lib/lines.js.map +1 -1
- package/src/lib/lines.mjs +86 -8
- package/src/lib/lines.mjs.map +1 -1
- package/src/lib/locales/all.d.mts +8 -0
- package/src/lib/locales/all.d.ts +8 -0
- package/src/lib/locales/all.js +13 -0
- package/src/lib/locales/all.js.map +1 -0
- package/src/lib/locales/all.mjs +10 -0
- package/src/lib/locales/all.mjs.map +1 -0
- package/src/lib/locales/ar.d.mts +3 -0
- package/src/lib/locales/ar.d.ts +3 -0
- package/src/lib/locales/ar.js +104 -0
- package/src/lib/locales/ar.js.map +1 -0
- package/src/lib/locales/ar.mjs +101 -0
- package/src/lib/locales/ar.mjs.map +1 -0
- package/src/lib/locales/de.d.mts +3 -0
- package/src/lib/locales/de.d.ts +3 -0
- package/src/lib/locales/de.js +104 -0
- package/src/lib/locales/de.js.map +1 -0
- package/src/lib/locales/de.mjs +101 -0
- package/src/lib/locales/de.mjs.map +1 -0
- package/src/lib/locales/fr.d.mts +3 -0
- package/src/lib/locales/fr.d.ts +3 -0
- package/src/lib/locales/fr.js +104 -0
- package/src/lib/locales/fr.js.map +1 -0
- package/src/lib/locales/fr.mjs +101 -0
- package/src/lib/locales/fr.mjs.map +1 -0
- package/src/lib/matrix.d.mts +10 -0
- package/src/lib/matrix.d.ts +10 -0
- package/src/lib/matrix.js +86 -0
- package/src/lib/matrix.js.map +1 -0
- package/src/lib/matrix.mjs +82 -0
- package/src/lib/matrix.mjs.map +1 -0
- package/src/lib/numbers.d.mts +7 -0
- package/src/lib/numbers.d.ts +7 -0
- package/src/lib/numbers.js +15 -0
- package/src/lib/numbers.js.map +1 -1
- package/src/lib/numbers.mjs +14 -0
- package/src/lib/numbers.mjs.map +1 -1
- package/src/lib/progress.js +8 -4
- package/src/lib/progress.js.map +1 -1
- package/src/lib/progress.mjs +8 -4
- package/src/lib/progress.mjs.map +1 -1
- package/src/lib/ranking.d.mts +2 -0
- package/src/lib/ranking.d.ts +2 -0
- package/src/lib/ranking.js +172 -0
- package/src/lib/ranking.js.map +1 -0
- package/src/lib/ranking.mjs +168 -0
- package/src/lib/ranking.mjs.map +1 -0
- package/src/lib/relations.d.mts +1 -1
- package/src/lib/relations.d.ts +1 -1
- package/src/lib/relations.js +43 -18
- package/src/lib/relations.js.map +1 -1
- package/src/lib/relations.mjs +43 -18
- package/src/lib/relations.mjs.map +1 -1
- package/src/lib/shuffle.d.mts +7 -0
- package/src/lib/shuffle.d.ts +7 -0
- package/src/lib/shuffle.js +60 -0
- package/src/lib/shuffle.js.map +1 -0
- package/src/lib/shuffle.mjs +57 -0
- package/src/lib/shuffle.mjs.map +1 -0
- package/src/lib/signature.d.mts +2 -0
- package/src/lib/signature.d.ts +2 -0
- package/src/lib/signature.js +223 -0
- package/src/lib/signature.js.map +1 -0
- package/src/lib/signature.mjs +219 -0
- package/src/lib/signature.mjs.map +1 -0
- package/src/lib/slider.d.mts +10 -0
- package/src/lib/slider.d.ts +10 -0
- package/src/lib/slider.js +57 -0
- package/src/lib/slider.js.map +1 -0
- package/src/lib/slider.mjs +53 -0
- package/src/lib/slider.mjs.map +1 -0
- package/src/lib/styles-choices.d.mts +7 -0
- package/src/lib/styles-choices.d.ts +7 -0
- package/src/lib/styles-choices.js +47 -0
- package/src/lib/styles-choices.js.map +1 -0
- package/src/lib/styles-choices.mjs +44 -0
- package/src/lib/styles-choices.mjs.map +1 -0
- package/src/lib/styles-inputs.d.mts +9 -0
- package/src/lib/styles-inputs.d.ts +9 -0
- package/src/lib/styles-inputs.js +41 -0
- package/src/lib/styles-inputs.js.map +1 -0
- package/src/lib/styles-inputs.mjs +38 -0
- package/src/lib/styles-inputs.mjs.map +1 -0
- package/src/lib/styles-kinds.d.mts +7 -0
- package/src/lib/styles-kinds.d.ts +7 -0
- package/src/lib/styles-kinds.js +119 -0
- package/src/lib/styles-kinds.js.map +1 -0
- package/src/lib/styles-kinds.mjs +116 -0
- package/src/lib/styles-kinds.mjs.map +1 -0
- package/src/lib/styles.d.mts +2 -14
- package/src/lib/styles.d.ts +2 -14
- package/src/lib/styles.js +172 -60
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +172 -60
- package/src/lib/styles.mjs.map +1 -1
- package/src/lib/units.d.mts +10 -0
- package/src/lib/units.d.ts +10 -0
- package/src/lib/units.js +19 -0
- package/src/lib/units.js.map +1 -0
- package/src/lib/units.mjs +16 -0
- package/src/lib/units.mjs.map +1 -0
- package/src/lib/widgets.js +215 -57
- package/src/lib/widgets.js.map +1 -1
- package/src/lib/widgets.mjs +215 -57
- package/src/lib/widgets.mjs.map +1 -1
- package/src/lib/yes-no.d.mts +9 -0
- package/src/lib/yes-no.d.ts +9 -0
- package/src/lib/yes-no.js +58 -0
- package/src/lib/yes-no.js.map +1 -0
- package/src/lib/yes-no.mjs +54 -0
- 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 {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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 =
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
};
|
package/src/lib/files.mjs.map
CHANGED
|
@@ -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) {
|
package/src/lib/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/icons.ts"],"names":[],"mappings":";;;
|
|
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) {
|
package/src/lib/icons.mjs.map
CHANGED
|
@@ -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;
|
|
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
|
+
};
|