@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
@@ -0,0 +1,148 @@
1
+ import { announcer, describeState, fillIn, maker, wordsFor } from './kind-parts.mjs';
2
+ import { moveLineTo } from './line-moves.mjs';
3
+ import { lineForm } from './lines.mjs';
4
+ import { createWidget } from './widgets.mjs';
5
+ const count = (value) => (typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined);
6
+ export const cardsWidget = ({ form, name, field, node, id, document, labels, locale, dialogs }) => {
7
+ const words = wordsFor(labels, locale);
8
+ const make = maker(document);
9
+ const def = field;
10
+ const options = node.options ?? {};
11
+ const min = count(options['min']) ?? 0;
12
+ const max = count(options['max']) ?? Infinity;
13
+ const itemLabel = typeof options['itemLabel'] === 'string' && options['itemLabel'].trim() ? options['itemLabel'].trim() : null;
14
+ const titleOf = (n) => (itemLabel ? `${itemLabel} ${n}` : fillIn(words.entry, { n }));
15
+ // The fields that keep the lines' order or say what a line is are not asked for.
16
+ const names = (node.columns ?? Object.keys(def.fields)).filter((f) => def.fields[f] && f !== def.sequenceField && f !== def.lineKinds?.field);
17
+ const list = make('div', { class: 'fd-repeat-list' });
18
+ const addButton = make('button', { type: 'button', class: 'fd-button fd-repeat-add' }, typeof options['addLabel'] === 'string' && options['addLabel'] ? options['addLabel'] : words.addAnother);
19
+ const voice = announcer(make);
20
+ const element = make('div', { id, class: 'fd-repeat', role: 'group' }, list, addButton, voice.element);
21
+ const cards = new Map();
22
+ const lines = () => form.getState().values[name] ?? [];
23
+ let readonly = false;
24
+ /** Where the cursor goes once the cards are drawn again. */
25
+ let focusNext = null;
26
+ // A new form starts with the cards it needs at least.
27
+ for (let have = lines().length; have < min; have++)
28
+ form.addLine(name);
29
+ addButton.addEventListener('click', () => {
30
+ if (readonly || lines().length >= max)
31
+ return;
32
+ const key = form.addLine(name);
33
+ focusNext = () => cards.get(key)?.fields[0]?.widget.focus();
34
+ settle();
35
+ });
36
+ function makeCard(line) {
37
+ const titleId = `${id}-${line.key}-title`;
38
+ const title = make('span', { id: titleId, class: 'fd-repeat-title' });
39
+ const remove = make('button', { type: 'button', class: 'fd-repeat-remove' }, '×');
40
+ const tool = (text, word, act) => {
41
+ const button = make('button', { type: 'button', class: 'fd-repeat-tool' }, text);
42
+ button.addEventListener('click', act);
43
+ return [button, word];
44
+ };
45
+ const at = () => lines().findIndex((l) => l.key === line.key);
46
+ const tools = [tool('↑', 'moveUp', () => move(line.key, at() - 1)), tool('↓', 'moveDown', () => move(line.key, at() + 1)), tool('⧉', 'copy', () => copy(line.key))];
47
+ const body = make('div', { class: 'fd-repeat-fields' });
48
+ const cardElement = make('div', { class: 'fd-repeat-card', role: 'group', 'aria-labelledby': titleId, 'data-line': line.key }, make('div', { class: 'fd-repeat-head' }, title, ...tools.map(([b]) => b), remove), body);
49
+ const fields = names.map((column) => {
50
+ const sub = def.fields[column];
51
+ const cellId = `${id}-${line.key}-${column}`;
52
+ const subNode = { type: 'field', id: `${node.id}.${line.key}.${column}`, field: column };
53
+ const widget = createWidget({ form: lineForm(form, name, line.key), name: column, field: sub, node: subNode, id: cellId, document, labels, locale, dialogs });
54
+ const label = make('label', { class: 'fd-repeat-label', for: cellId }, sub.label);
55
+ if (!['INPUT', 'SELECT', 'TEXTAREA'].includes(widget.element.tagName))
56
+ label.addEventListener('click', () => widget.focus());
57
+ const error = make('div', { class: 'fd-cell-error', hidden: '' });
58
+ body.append(make('div', { class: 'fd-repeat-field' }, label, widget.element, error));
59
+ return { name: column, def: sub, widget, error };
60
+ });
61
+ remove.addEventListener('click', () => {
62
+ const all = lines();
63
+ const at = all.findIndex((l) => l.key === line.key);
64
+ if (readonly || at === -1 || all.length <= min)
65
+ return;
66
+ const gone = title.textContent ?? '';
67
+ form.removeLine(name, line.key);
68
+ voice.say(fillIn(words.removed, { name: gone }));
69
+ // The card that took its place, else the one before, else "Add another".
70
+ const after = lines();
71
+ const next = after[Math.min(at, after.length - 1)];
72
+ focusNext = () => (next ? cards.get(next.key)?.fields[0]?.widget.focus() : addButton.focus());
73
+ settle();
74
+ });
75
+ return { element: cardElement, title, remove, tools, fields };
76
+ }
77
+ /** A card to another place, the focus kept on what had it, and where it went said aloud. */
78
+ function move(key, to) {
79
+ const from = lines().findIndex((l) => l.key === key);
80
+ if (readonly || to < 0 || to >= lines().length || to === from)
81
+ return;
82
+ const gone = cards.get(key)?.title.textContent ?? '';
83
+ moveLineTo(form, name, def, key, to);
84
+ // The focus stays on the button pressed; at an end, the other way takes it.
85
+ const way = (from > to && to > 0) || to === lines().length - 1 ? 0 : 1;
86
+ cards.get(key)?.tools[way][0].focus();
87
+ voice.say(fillIn(words.movedTo, { label: gone, n: to + 1, total: lines().length }));
88
+ }
89
+ /** A copy of a card, its answers too, right after it, the cursor in its first field. */
90
+ function copy(key) {
91
+ const all = lines();
92
+ const at = all.findIndex((l) => l.key === key);
93
+ if (readonly || at < 0 || all.length >= max)
94
+ return;
95
+ const values = { ...all[at].values };
96
+ if (def.sequenceField)
97
+ delete values[def.sequenceField];
98
+ const made = form.addLine(name, values);
99
+ moveLineTo(form, name, def, made, at + 1);
100
+ cards.get(made)?.fields[0]?.widget.focus();
101
+ }
102
+ function settle() {
103
+ const run = focusNext;
104
+ focusNext = null;
105
+ run?.();
106
+ }
107
+ return {
108
+ element,
109
+ focus: () => ([...cards.values()].find((card) => card.element === list.firstElementChild)?.fields[0]?.widget ?? addButton).focus(),
110
+ update(state) {
111
+ readonly = state.readonly;
112
+ const current = state.value ?? [];
113
+ const errors = form.getState().errors;
114
+ const keep = new Set(current.map((l) => l.key));
115
+ for (const [key, card] of cards) {
116
+ if (keep.has(key))
117
+ continue;
118
+ card.element.remove();
119
+ for (const f of card.fields)
120
+ f.widget.destroy?.();
121
+ cards.delete(key);
122
+ }
123
+ current.forEach((line, index) => {
124
+ let card = cards.get(line.key);
125
+ if (!card)
126
+ cards.set(line.key, (card = makeCard(line)));
127
+ if (list.children[index] !== card.element)
128
+ list.insertBefore(card.element, list.children[index] ?? null);
129
+ card.title.textContent = titleOf(index + 1);
130
+ card.remove.setAttribute('aria-label', fillIn(words.remove, { name: card.title.textContent }));
131
+ card.remove.hidden = readonly || current.length <= min;
132
+ for (const [button, word] of card.tools) {
133
+ button.setAttribute('aria-label', fillIn(words[word], { label: card.title.textContent, name: card.title.textContent }));
134
+ button.hidden = readonly || (word === 'moveUp' ? index === 0 : word === 'moveDown' ? index === current.length - 1 : current.length >= max);
135
+ }
136
+ for (const f of card.fields) {
137
+ const message = errors[`${name}.${line.key}.${f.name}`];
138
+ f.error.hidden = !message;
139
+ f.error.textContent = message ?? '';
140
+ f.widget.update({ value: line.values[f.name], values: line.values, readonly: readonly || f.def.readonly === true, required: f.def.required === true, invalid: !!message });
141
+ }
142
+ });
143
+ addButton.hidden = readonly || current.length >= max;
144
+ describeState(element, state);
145
+ },
146
+ };
147
+ };
148
+ //# sourceMappingURL=cards.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/cards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { WidgetFactory } from './widgets.mjs';
2
+ export declare const imageChoiceWidget: WidgetFactory;
@@ -0,0 +1,2 @@
1
+ import type { WidgetFactory } from './widgets';
2
+ export declare const imageChoiceWidget: WidgetFactory;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.imageChoiceWidget = void 0;
4
+ const choice_rules_1 = require("./choice-rules");
5
+ const kind_parts_1 = require("./kind-parts");
6
+ const shuffle_1 = require("./shuffle");
7
+ /**
8
+ * Pictures to choose from (`selection.image-choice`): each option a card of
9
+ * its `image` over its words. One answer is a radio group with one stop for
10
+ * Tab — the arrows move and pick, going round at the ends, Home and End go to
11
+ * the ends, and left is forward on a right-to-left page — with "Clear
12
+ * selection" when it need not be answered. Several answers, when the field
13
+ * takes several, are checkboxes, each its own stop. "Other" is not offered:
14
+ * an answer of one's own has no picture. `options.shuffle` shows the cards
15
+ * in an order of the form's own. Each picture is described by its option's
16
+ * `alt`. `options.showLabels: false` keeps the words out of sight (still each
17
+ * card's name), `imageSize` is small, medium or large, `imageFit: "whole"`
18
+ * shows the whole picture rather than filling the card, and `columns` lays
19
+ * the cards in columns or in a row.
20
+ */
21
+ /** A frame with a hill and a sun: the tile of an option without a picture. */
22
+ const BLANK = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="2"/><path d="M21 16l-5-5-9 9"/></svg>';
23
+ const imageChoiceWidget = ({ form, name, field, node, id, document, labels, locale }) => {
24
+ const words = (0, kind_parts_1.wordsFor)(labels, locale);
25
+ const make = (0, kind_parts_1.maker)(document);
26
+ const multiple = field.type === 'selection' && field.multiple === true;
27
+ const written = field.type === 'selection' ? field.options : [];
28
+ const options = (0, shuffle_1.shownOptions)(written, form, name, node);
29
+ const look = node.options ?? {};
30
+ const bare = look['showLabels'] === false;
31
+ const group = make('div', { id, class: `fd-image-choices${bare ? ' fd-image-choices-bare' : ''}`, role: multiple ? 'group' : 'radiogroup', 'data-size': look['imageSize'], 'data-fit': look['imageFit'] });
32
+ (0, choice_rules_1.layOut)(group, node);
33
+ const limit = multiple ? (0, choice_rules_1.limiter)(make, words, node) : null;
34
+ const cards = options.map((option) => {
35
+ const picture = option.image ? make('img', { src: option.image, alt: option.alt ?? '', loading: 'lazy', draggable: 'false' }) : make('span', { class: 'fd-image-card-blank' });
36
+ if (!option.image)
37
+ picture.innerHTML = BLANK; // a constant drawing, never words from the page
38
+ const card = make('button', { type: 'button', class: 'fd-image-card', role: multiple ? 'checkbox' : 'radio', 'aria-checked': 'false', 'aria-label': bare ? option.label : undefined }, make('span', { class: 'fd-image-card-picture' }, picture), make('span', { class: 'fd-image-card-words' }, option.label));
39
+ card.addEventListener('click', () => pick(option));
40
+ group.append(card);
41
+ return card;
42
+ });
43
+ const current = () => form.getState().values[name];
44
+ function pick(option) {
45
+ if (!multiple)
46
+ return form.setValue(name, option.value);
47
+ const now = Array.isArray(current()) ? current() : [];
48
+ const on = new Set(now.includes(option.value) ? now.filter((v) => v !== option.value) : (0, choice_rules_1.withAlone)(written, now, option.value));
49
+ // In the options' own order, as checkboxes keep them, however they are shown.
50
+ form.setValue(name, written.filter((o) => on.has(o.value)).map((o) => o.value));
51
+ }
52
+ let readonly = false;
53
+ if (!multiple) {
54
+ group.addEventListener('keydown', (event) => {
55
+ if (readonly)
56
+ return;
57
+ const at = cards.indexOf(event.target);
58
+ if (at === -1)
59
+ return;
60
+ const back = (0, kind_parts_1.rightToLeft)(group);
61
+ const steps = { ArrowDown: 1, ArrowUp: -1, ArrowRight: back ? -1 : 1, ArrowLeft: back ? 1 : -1 };
62
+ const to = event.key === 'Home' ? 0 : event.key === 'End' ? cards.length - 1 : event.key in steps ? (at + steps[event.key] + cards.length) % cards.length : -1;
63
+ if (to === -1)
64
+ return;
65
+ event.preventDefault();
66
+ pick(options[to]);
67
+ cards[to].focus();
68
+ });
69
+ }
70
+ const clear = multiple
71
+ ? null
72
+ : (0, kind_parts_1.clearSelection)(document, words, () => {
73
+ form.setValue(name, null);
74
+ cards[0]?.focus();
75
+ });
76
+ if (limit?.element)
77
+ group.append(limit.element);
78
+ return {
79
+ element: clear ? make('div', { class: 'fd-choices-box' }, group, clear.button) : group,
80
+ focus: () => (cards.find((c) => c.getAttribute('aria-checked') === 'true') ?? cards[0])?.focus(),
81
+ update(state) {
82
+ readonly = state.readonly;
83
+ const chosen = new Set(Array.isArray(state.value) ? state.value : [state.value]);
84
+ const stop = multiple ? -1 : Math.max(0, options.findIndex((o) => chosen.has(o.value)));
85
+ const full = !!limit?.full(Array.isArray(state.value) ? state.value.length : 0);
86
+ cards.forEach((card, i) => {
87
+ const on = chosen.has(options[i].value);
88
+ card.setAttribute('aria-checked', String(on));
89
+ card.tabIndex = multiple || i === stop ? 0 : -1;
90
+ card.disabled = readonly || (full && !on && !options[i].exclusive);
91
+ });
92
+ clear?.allow(state);
93
+ clear?.show(options.some((o) => chosen.has(o.value)));
94
+ (0, kind_parts_1.describeState)(group, state);
95
+ },
96
+ };
97
+ };
98
+ exports.imageChoiceWidget = imageChoiceWidget;
99
+ //# sourceMappingURL=choice-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice-images.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/choice-images.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { layOut, limiter, withAlone } from './choice-rules.mjs';
2
+ import { clearSelection, describeState, maker, rightToLeft, wordsFor } from './kind-parts.mjs';
3
+ import { shownOptions } from './shuffle.mjs';
4
+ /**
5
+ * Pictures to choose from (`selection.image-choice`): each option a card of
6
+ * its `image` over its words. One answer is a radio group with one stop for
7
+ * Tab — the arrows move and pick, going round at the ends, Home and End go to
8
+ * the ends, and left is forward on a right-to-left page — with "Clear
9
+ * selection" when it need not be answered. Several answers, when the field
10
+ * takes several, are checkboxes, each its own stop. "Other" is not offered:
11
+ * an answer of one's own has no picture. `options.shuffle` shows the cards
12
+ * in an order of the form's own. Each picture is described by its option's
13
+ * `alt`. `options.showLabels: false` keeps the words out of sight (still each
14
+ * card's name), `imageSize` is small, medium or large, `imageFit: "whole"`
15
+ * shows the whole picture rather than filling the card, and `columns` lays
16
+ * the cards in columns or in a row.
17
+ */
18
+ /** A frame with a hill and a sun: the tile of an option without a picture. */
19
+ const BLANK = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="2"/><path d="M21 16l-5-5-9 9"/></svg>';
20
+ export const imageChoiceWidget = ({ form, name, field, node, id, document, labels, locale }) => {
21
+ const words = wordsFor(labels, locale);
22
+ const make = maker(document);
23
+ const multiple = field.type === 'selection' && field.multiple === true;
24
+ const written = field.type === 'selection' ? field.options : [];
25
+ const options = shownOptions(written, form, name, node);
26
+ const look = node.options ?? {};
27
+ const bare = look['showLabels'] === false;
28
+ const group = make('div', { id, class: `fd-image-choices${bare ? ' fd-image-choices-bare' : ''}`, role: multiple ? 'group' : 'radiogroup', 'data-size': look['imageSize'], 'data-fit': look['imageFit'] });
29
+ layOut(group, node);
30
+ const limit = multiple ? limiter(make, words, node) : null;
31
+ const cards = options.map((option) => {
32
+ const picture = option.image ? make('img', { src: option.image, alt: option.alt ?? '', loading: 'lazy', draggable: 'false' }) : make('span', { class: 'fd-image-card-blank' });
33
+ if (!option.image)
34
+ picture.innerHTML = BLANK; // a constant drawing, never words from the page
35
+ const card = make('button', { type: 'button', class: 'fd-image-card', role: multiple ? 'checkbox' : 'radio', 'aria-checked': 'false', 'aria-label': bare ? option.label : undefined }, make('span', { class: 'fd-image-card-picture' }, picture), make('span', { class: 'fd-image-card-words' }, option.label));
36
+ card.addEventListener('click', () => pick(option));
37
+ group.append(card);
38
+ return card;
39
+ });
40
+ const current = () => form.getState().values[name];
41
+ function pick(option) {
42
+ if (!multiple)
43
+ return form.setValue(name, option.value);
44
+ const now = Array.isArray(current()) ? current() : [];
45
+ const on = new Set(now.includes(option.value) ? now.filter((v) => v !== option.value) : withAlone(written, now, option.value));
46
+ // In the options' own order, as checkboxes keep them, however they are shown.
47
+ form.setValue(name, written.filter((o) => on.has(o.value)).map((o) => o.value));
48
+ }
49
+ let readonly = false;
50
+ if (!multiple) {
51
+ group.addEventListener('keydown', (event) => {
52
+ if (readonly)
53
+ return;
54
+ const at = cards.indexOf(event.target);
55
+ if (at === -1)
56
+ return;
57
+ const back = rightToLeft(group);
58
+ const steps = { ArrowDown: 1, ArrowUp: -1, ArrowRight: back ? -1 : 1, ArrowLeft: back ? 1 : -1 };
59
+ const to = event.key === 'Home' ? 0 : event.key === 'End' ? cards.length - 1 : event.key in steps ? (at + steps[event.key] + cards.length) % cards.length : -1;
60
+ if (to === -1)
61
+ return;
62
+ event.preventDefault();
63
+ pick(options[to]);
64
+ cards[to].focus();
65
+ });
66
+ }
67
+ const clear = multiple
68
+ ? null
69
+ : clearSelection(document, words, () => {
70
+ form.setValue(name, null);
71
+ cards[0]?.focus();
72
+ });
73
+ if (limit?.element)
74
+ group.append(limit.element);
75
+ return {
76
+ element: clear ? make('div', { class: 'fd-choices-box' }, group, clear.button) : group,
77
+ focus: () => (cards.find((c) => c.getAttribute('aria-checked') === 'true') ?? cards[0])?.focus(),
78
+ update(state) {
79
+ readonly = state.readonly;
80
+ const chosen = new Set(Array.isArray(state.value) ? state.value : [state.value]);
81
+ const stop = multiple ? -1 : Math.max(0, options.findIndex((o) => chosen.has(o.value)));
82
+ const full = !!limit?.full(Array.isArray(state.value) ? state.value.length : 0);
83
+ cards.forEach((card, i) => {
84
+ const on = chosen.has(options[i].value);
85
+ card.setAttribute('aria-checked', String(on));
86
+ card.tabIndex = multiple || i === stop ? 0 : -1;
87
+ card.disabled = readonly || (full && !on && !options[i].exclusive);
88
+ });
89
+ clear?.allow(state);
90
+ clear?.show(options.some((o) => chosen.has(o.value)));
91
+ describeState(group, state);
92
+ },
93
+ };
94
+ };
95
+ //# sourceMappingURL=choice-images.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice-images.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/choice-images.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { FieldNode, Option } from '@fieldia/core';
2
+ import { type Make } from './kind-parts.mjs';
3
+ import type { WidgetLabels } from './labels.mjs';
4
+ /**
5
+ * What the choice kinds share beyond their looks: an option that goes alone
6
+ * ("None of these"), a limit on how many are ticked, and the options laid
7
+ * out in columns or in a row.
8
+ */
9
+ /** The values once `value` is added: alone when it goes alone, else without those that do. */
10
+ export declare function withAlone(options: readonly Option[], now: readonly unknown[], value: unknown): unknown[];
11
+ /**
12
+ * The most a question takes, from an answer rule that always holds and stops
13
+ * the form: once that many are ticked the rest are turned off, and a polite
14
+ * "Up to 3" says why — as Form.io does, rather than complaining after.
15
+ */
16
+ export declare function limiter(make: Make, words: WidgetLabels, node: FieldNode): {
17
+ element: HTMLSpanElement | null;
18
+ /** Whether `count` fills it, saying so when it does. */
19
+ full(count: number): boolean;
20
+ };
21
+ /** Columns (`options.columns`, 1 to 4) or all in a row (`"row"`); a phone stacks them again. */
22
+ export declare function layOut(group: HTMLElement, node: FieldNode): void;
@@ -0,0 +1,22 @@
1
+ import type { FieldNode, Option } from '@fieldia/core';
2
+ import { type Make } from './kind-parts';
3
+ import type { WidgetLabels } from './labels';
4
+ /**
5
+ * What the choice kinds share beyond their looks: an option that goes alone
6
+ * ("None of these"), a limit on how many are ticked, and the options laid
7
+ * out in columns or in a row.
8
+ */
9
+ /** The values once `value` is added: alone when it goes alone, else without those that do. */
10
+ export declare function withAlone(options: readonly Option[], now: readonly unknown[], value: unknown): unknown[];
11
+ /**
12
+ * The most a question takes, from an answer rule that always holds and stops
13
+ * the form: once that many are ticked the rest are turned off, and a polite
14
+ * "Up to 3" says why — as Form.io does, rather than complaining after.
15
+ */
16
+ export declare function limiter(make: Make, words: WidgetLabels, node: FieldNode): {
17
+ element: HTMLSpanElement | null;
18
+ /** Whether `count` fills it, saying so when it does. */
19
+ full(count: number): boolean;
20
+ };
21
+ /** Columns (`options.columns`, 1 to 4) or all in a row (`"row"`); a phone stacks them again. */
22
+ export declare function layOut(group: HTMLElement, node: FieldNode): void;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withAlone = withAlone;
4
+ exports.limiter = limiter;
5
+ exports.layOut = layOut;
6
+ const kind_parts_1 = require("./kind-parts");
7
+ /**
8
+ * What the choice kinds share beyond their looks: an option that goes alone
9
+ * ("None of these"), a limit on how many are ticked, and the options laid
10
+ * out in columns or in a row.
11
+ */
12
+ /** The values once `value` is added: alone when it goes alone, else without those that do. */
13
+ function withAlone(options, now, value) {
14
+ const alone = (v) => options.some((o) => o.exclusive && o.value === v);
15
+ return alone(value) ? [value] : [...now.filter((v) => !alone(v)), value];
16
+ }
17
+ /**
18
+ * The most a question takes, from an answer rule that always holds and stops
19
+ * the form: once that many are ticked the rest are turned off, and a polite
20
+ * "Up to 3" says why — as Form.io does, rather than complaining after.
21
+ */
22
+ function limiter(make, words, node) {
23
+ const most = node.validate?.find((r) => r.atMost !== undefined && (r.when ?? true) === true && r.level !== 'warning')?.atMost;
24
+ const element = most ? make('span', { class: 'fd-choice-limit', role: 'status' }) : null;
25
+ return {
26
+ element,
27
+ /** Whether `count` fills it, saying so when it does. */
28
+ full(count) {
29
+ const full = !!most && count >= most;
30
+ if (element)
31
+ (0, kind_parts_1.setText)(element, full ? (0, kind_parts_1.fillIn)(words.upTo, { n: most }) : '');
32
+ return full;
33
+ },
34
+ };
35
+ }
36
+ /** Columns (`options.columns`, 1 to 4) or all in a row (`"row"`); a phone stacks them again. */
37
+ function layOut(group, node) {
38
+ const columns = node.options?.['columns'];
39
+ if (columns === 'row')
40
+ group.classList.add('fd-choices-row');
41
+ else if (typeof columns === 'number' && columns >= 1) {
42
+ group.classList.add('fd-choices-columns');
43
+ group.style.setProperty('--fd-choice-columns', String(Math.min(4, Math.round(columns))));
44
+ }
45
+ }
46
+ //# sourceMappingURL=choice-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice-rules.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/choice-rules.ts"],"names":[],"mappings":";;AAWA,8BAGC;AAOD,0BAYC;AAGD,wBAOC;AA1CD,6CAA0D;AAG1D;;;;GAIG;AAEH,8FAA8F;AAC9F,SAAgB,SAAS,CAAC,OAA0B,EAAE,GAAuB,EAAE,KAAc;IAC3F,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,IAAU,EAAE,KAAmB,EAAE,IAAe;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,MAAM,CAAC;IAC9H,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,OAAO;QACL,OAAO;QACP,wDAAwD;QACxD,IAAI,CAAC,KAAa;YAChB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;YACrC,IAAI,OAAO;gBAAE,IAAA,oBAAO,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAA,mBAAM,EAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,IAAc,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,SAAgB,MAAM,CAAC,KAAkB,EAAE,IAAe;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK;QAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;SACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1C,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { fillIn, setText } from './kind-parts.mjs';
2
+ /**
3
+ * What the choice kinds share beyond their looks: an option that goes alone
4
+ * ("None of these"), a limit on how many are ticked, and the options laid
5
+ * out in columns or in a row.
6
+ */
7
+ /** The values once `value` is added: alone when it goes alone, else without those that do. */
8
+ export function withAlone(options, now, value) {
9
+ const alone = (v) => options.some((o) => o.exclusive && o.value === v);
10
+ return alone(value) ? [value] : [...now.filter((v) => !alone(v)), value];
11
+ }
12
+ /**
13
+ * The most a question takes, from an answer rule that always holds and stops
14
+ * the form: once that many are ticked the rest are turned off, and a polite
15
+ * "Up to 3" says why — as Form.io does, rather than complaining after.
16
+ */
17
+ export function limiter(make, words, node) {
18
+ const most = node.validate?.find((r) => r.atMost !== undefined && (r.when ?? true) === true && r.level !== 'warning')?.atMost;
19
+ const element = most ? make('span', { class: 'fd-choice-limit', role: 'status' }) : null;
20
+ return {
21
+ element,
22
+ /** Whether `count` fills it, saying so when it does. */
23
+ full(count) {
24
+ const full = !!most && count >= most;
25
+ if (element)
26
+ setText(element, full ? fillIn(words.upTo, { n: most }) : '');
27
+ return full;
28
+ },
29
+ };
30
+ }
31
+ /** Columns (`options.columns`, 1 to 4) or all in a row (`"row"`); a phone stacks them again. */
32
+ export function layOut(group, node) {
33
+ const columns = node.options?.['columns'];
34
+ if (columns === 'row')
35
+ group.classList.add('fd-choices-row');
36
+ else if (typeof columns === 'number' && columns >= 1) {
37
+ group.classList.add('fd-choices-columns');
38
+ group.style.setProperty('--fd-choice-columns', String(Math.min(4, Math.round(columns))));
39
+ }
40
+ }
41
+ //# sourceMappingURL=choice-rules.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice-rules.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/choice-rules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAa,MAAM,cAAc,CAAC;AAG1D;;;;GAIG;AAEH,8FAA8F;AAC9F,MAAM,UAAU,SAAS,CAAC,OAA0B,EAAE,GAAuB,EAAE,KAAc;IAC3F,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAU,EAAE,KAAmB,EAAE,IAAe;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,MAAM,CAAC;IAC9H,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,OAAO;QACL,OAAO;QACP,wDAAwD;QACxD,IAAI,CAAC,KAAa;YAChB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;YACrC,IAAI,OAAO;gBAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,IAAc,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,MAAM,CAAC,KAAkB,EAAE,IAAe;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK;QAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;SACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1C,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { WidgetFactory } from './widgets.mjs';
2
+ /**
3
+ * Several answers from a list, as tags in a box (`selection.tags`): the box
4
+ * is an ARIA combobox whose list holds the options not chosen yet, those whose
5
+ * words hold what is typed. The arrows reach one and Enter adds it — or the
6
+ * first match, when none is reached — as does a click. A tag goes with its ×,
7
+ * or the last with Backspace in the empty box. The answer keeps the order the
8
+ * tags were added in; a value not among the options shows as its own words.
9
+ * With `ownAnswers`, words that match nothing are offered as an answer of
10
+ * their own; "None of these" goes alone.
11
+ *
12
+ * One answer, the same box (`searchWidget`): a dropdown that searches its
13
+ * list — the box shows the choice, typing finds others, and a box left half
14
+ * typed shows the choice again; emptied, it takes the choice away.
15
+ */
16
+ export declare const choiceTagsWidget: WidgetFactory;
17
+ export declare const searchWidget: WidgetFactory;
@@ -0,0 +1,17 @@
1
+ import type { WidgetFactory } from './widgets';
2
+ /**
3
+ * Several answers from a list, as tags in a box (`selection.tags`): the box
4
+ * is an ARIA combobox whose list holds the options not chosen yet, those whose
5
+ * words hold what is typed. The arrows reach one and Enter adds it — or the
6
+ * first match, when none is reached — as does a click. A tag goes with its ×,
7
+ * or the last with Backspace in the empty box. The answer keeps the order the
8
+ * tags were added in; a value not among the options shows as its own words.
9
+ * With `ownAnswers`, words that match nothing are offered as an answer of
10
+ * their own; "None of these" goes alone.
11
+ *
12
+ * One answer, the same box (`searchWidget`): a dropdown that searches its
13
+ * list — the box shows the choice, typing finds others, and a box left half
14
+ * typed shows the choice again; emptied, it takes the choice away.
15
+ */
16
+ export declare const choiceTagsWidget: WidgetFactory;
17
+ export declare const searchWidget: WidgetFactory;