@fieldia/viewer 0.11.0 → 0.13.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 (115) hide show
  1. package/bundle/fieldia.ar.js +2 -2
  2. package/bundle/fieldia.ar.js.map +2 -2
  3. package/bundle/fieldia.de.js +2 -2
  4. package/bundle/fieldia.de.js.map +2 -2
  5. package/bundle/fieldia.fr.js +2 -2
  6. package/bundle/fieldia.fr.js.map +2 -2
  7. package/bundle/fieldia.js +62 -4
  8. package/bundle/fieldia.js.map +4 -4
  9. package/package.json +3 -3
  10. package/src/index.d.mts +1 -1
  11. package/src/index.d.ts +1 -1
  12. package/src/index.js +5 -1
  13. package/src/index.js.map +1 -1
  14. package/src/index.mjs +1 -1
  15. package/src/index.mjs.map +1 -1
  16. package/src/lib/attachment-preview.d.mts +27 -0
  17. package/src/lib/attachment-preview.d.ts +27 -0
  18. package/src/lib/attachment-preview.js +89 -0
  19. package/src/lib/attachment-preview.js.map +1 -0
  20. package/src/lib/attachment-preview.mjs +86 -0
  21. package/src/lib/attachment-preview.mjs.map +1 -0
  22. package/src/lib/dialog.d.mts +8 -1
  23. package/src/lib/dialog.d.ts +8 -1
  24. package/src/lib/dialog.js +75 -10
  25. package/src/lib/dialog.js.map +1 -1
  26. package/src/lib/dialog.mjs +75 -11
  27. package/src/lib/dialog.mjs.map +1 -1
  28. package/src/lib/hotkeys.d.mts +11 -0
  29. package/src/lib/hotkeys.d.ts +11 -0
  30. package/src/lib/hotkeys.js +34 -0
  31. package/src/lib/hotkeys.js.map +1 -0
  32. package/src/lib/hotkeys.mjs +30 -0
  33. package/src/lib/hotkeys.mjs.map +1 -0
  34. package/src/lib/labels.d.mts +25 -0
  35. package/src/lib/labels.d.ts +25 -0
  36. package/src/lib/labels.js +17 -0
  37. package/src/lib/labels.js.map +1 -1
  38. package/src/lib/labels.mjs +17 -0
  39. package/src/lib/labels.mjs.map +1 -1
  40. package/src/lib/list.d.mts +3 -1
  41. package/src/lib/list.d.ts +3 -1
  42. package/src/lib/list.js +1 -1
  43. package/src/lib/list.js.map +1 -1
  44. package/src/lib/list.mjs +1 -1
  45. package/src/lib/list.mjs.map +1 -1
  46. package/src/lib/locales/ar.js +17 -0
  47. package/src/lib/locales/ar.js.map +1 -1
  48. package/src/lib/locales/ar.mjs +17 -0
  49. package/src/lib/locales/ar.mjs.map +1 -1
  50. package/src/lib/locales/de.js +17 -0
  51. package/src/lib/locales/de.js.map +1 -1
  52. package/src/lib/locales/de.mjs +17 -0
  53. package/src/lib/locales/de.mjs.map +1 -1
  54. package/src/lib/locales/fr.js +17 -0
  55. package/src/lib/locales/fr.js.map +1 -1
  56. package/src/lib/locales/fr.mjs +17 -0
  57. package/src/lib/locales/fr.mjs.map +1 -1
  58. package/src/lib/look.d.mts +16 -1
  59. package/src/lib/look.d.ts +16 -1
  60. package/src/lib/look.js +34 -0
  61. package/src/lib/look.js.map +1 -1
  62. package/src/lib/look.mjs +31 -0
  63. package/src/lib/look.mjs.map +1 -1
  64. package/src/lib/open.d.mts +7 -1
  65. package/src/lib/open.d.ts +7 -1
  66. package/src/lib/open.js +19 -8
  67. package/src/lib/open.js.map +1 -1
  68. package/src/lib/open.mjs +20 -9
  69. package/src/lib/open.mjs.map +1 -1
  70. package/src/lib/place.d.mts +2 -0
  71. package/src/lib/place.d.ts +2 -0
  72. package/src/lib/place.js.map +1 -1
  73. package/src/lib/place.mjs.map +1 -1
  74. package/src/lib/record-bar.d.mts +56 -0
  75. package/src/lib/record-bar.d.ts +56 -0
  76. package/src/lib/record-bar.js +237 -0
  77. package/src/lib/record-bar.js.map +1 -0
  78. package/src/lib/record-bar.mjs +234 -0
  79. package/src/lib/record-bar.mjs.map +1 -0
  80. package/src/lib/record-styles.d.mts +9 -0
  81. package/src/lib/record-styles.d.ts +9 -0
  82. package/src/lib/record-styles.js +83 -0
  83. package/src/lib/record-styles.js.map +1 -0
  84. package/src/lib/record-styles.mjs +79 -0
  85. package/src/lib/record-styles.mjs.map +1 -0
  86. package/src/lib/related.d.mts +7 -3
  87. package/src/lib/related.d.ts +7 -3
  88. package/src/lib/related.js +28 -9
  89. package/src/lib/related.js.map +1 -1
  90. package/src/lib/related.mjs +28 -9
  91. package/src/lib/related.mjs.map +1 -1
  92. package/src/lib/say.d.mts +3 -1
  93. package/src/lib/say.d.ts +3 -1
  94. package/src/lib/say.js +17 -1
  95. package/src/lib/say.js.map +1 -1
  96. package/src/lib/say.mjs +17 -1
  97. package/src/lib/say.mjs.map +1 -1
  98. package/src/lib/tab-strip.d.mts +17 -0
  99. package/src/lib/tab-strip.d.ts +17 -0
  100. package/src/lib/tab-strip.js +51 -0
  101. package/src/lib/tab-strip.js.map +1 -0
  102. package/src/lib/tab-strip.mjs +48 -0
  103. package/src/lib/tab-strip.mjs.map +1 -0
  104. package/src/lib/value-words.d.mts +10 -0
  105. package/src/lib/value-words.d.ts +10 -0
  106. package/src/lib/value-words.js +38 -0
  107. package/src/lib/value-words.js.map +1 -0
  108. package/src/lib/value-words.mjs +35 -0
  109. package/src/lib/value-words.mjs.map +1 -0
  110. package/src/lib/viewer.d.mts +45 -2
  111. package/src/lib/viewer.d.ts +45 -2
  112. package/src/lib/viewer.js +575 -51
  113. package/src/lib/viewer.js.map +1 -1
  114. package/src/lib/viewer.mjs +576 -53
  115. package/src/lib/viewer.mjs.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"related.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/related.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"related.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/related.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,8 @@ export function nameFieldOf(page) {
7
7
  return 'name';
8
8
  return Object.entries(page.fields).find(([, def]) => def.type === 'char')?.[0] ?? null;
9
9
  }
10
- /** A form made of fields, for values edited in a dialog (a line, for one). */
11
- function valuesPage(fields, title, readonly) {
10
+ /** A form made of fields, for values edited in a dialog (a line, for one): laid out as asked (a line's own form), else every field in two columns. */
11
+ function valuesPage(fields, title, readonly, layout) {
12
12
  const shown = Object.fromEntries(Object.entries(fields).map(([name, def]) => [name, readonly ? { ...def, readonly: true } : def]));
13
13
  return {
14
14
  fieldia: '0.1',
@@ -19,7 +19,7 @@ function valuesPage(fields, title, readonly) {
19
19
  layout: {
20
20
  type: 'sections',
21
21
  id: 'values',
22
- children: [{ type: 'section', id: 'values-section', columns: 2, children: Object.keys(shown).map((name) => ({ type: 'field', id: `values-${name}`, field: name })) }],
22
+ children: layout ?? [{ type: 'section', id: 'values-section', columns: 2, children: Object.keys(shown).map((name) => ({ type: 'field', id: `values-${name}`, field: name })) }],
23
23
  },
24
24
  };
25
25
  }
@@ -43,13 +43,22 @@ function lookupsOf(source) {
43
43
  ...(source.create ? { create: (request) => source.create(request) } : {}),
44
44
  };
45
45
  }
46
- /** The dialogs a page's widgets may open, made from the viewer's own options. */
47
- export function pageDialogs(options) {
46
+ /**
47
+ * The dialogs a page's widgets may open, made from the viewer's own options.
48
+ * A linked record's page says its words through `say`, the opener's, so they
49
+ * show over the dialog and outlive it.
50
+ */
51
+ export function pageDialogs(options, say) {
48
52
  const pageFor = (model) => findPage(options, { model });
49
53
  // A dialog's page looks and reads like the page that opened it, and can open dialogs of its own.
50
54
  const shared = {
51
55
  locale: options.locale,
52
56
  skin: options.skin,
57
+ theme: options.theme ?? options.page.look?.theme,
58
+ // Read as each dialog opens: the host's tokens as they are then.
59
+ get tokens() {
60
+ return options.tokens;
61
+ },
53
62
  dir: options.dir,
54
63
  widgets: options.widgets,
55
64
  preferences: options.preferences,
@@ -57,6 +66,9 @@ export function pageDialogs(options) {
57
66
  relatedPages: options.relatedPages,
58
67
  translate: options.translate,
59
68
  look: options.page.look,
69
+ // The person, and the values the app passes in, as the opener's own conditions and filters read them.
70
+ user: options.user,
71
+ context: options.context,
60
72
  };
61
73
  return {
62
74
  canOpen: (model) => pageFor(model) !== null,
@@ -70,25 +82,32 @@ export function pageDialogs(options) {
70
82
  page: related,
71
83
  dataSource: options.dataSource,
72
84
  recordId: request.recordId ?? null,
73
- values: request.name && nameField ? { [nameField]: request.name } : undefined,
85
+ values: request.name || request.values ? { ...(request.values ?? {}), ...(request.name && nameField ? { [nameField]: request.name } : {}) } : undefined,
74
86
  title: request.title,
75
87
  size: 'large',
88
+ ...(say ? { host: { say } } : {}),
76
89
  });
77
90
  if (!result.saved || result.recordId === null)
78
91
  return null;
79
92
  const name = nameField ? result.values[nameField] : null;
80
- return { id: result.recordId, label: typeof name === 'string' && name ? name : request.name ?? request.title };
93
+ const label = typeof name === 'string' && name ? name : request.name ?? request.title;
94
+ // Its values as its page saved them, for a line of a table that opened it to take back.
95
+ return request.withValues ? { id: result.recordId, label, values: result.values } : { id: result.recordId, label };
81
96
  },
82
- searchMore: (request) => openSearchDialog({ title: request.title, search: request.search, locale: options.locale, skin: options.skin, dir: options.dir, look: options.page.look }),
97
+ searchMore: (request) => openSearchDialog({ title: request.title, search: request.search, locale: options.locale, skin: options.skin, theme: options.theme, tokens: options.tokens, dir: options.dir, look: options.page.look }),
83
98
  async editValues(request) {
84
99
  const result = await openFormDialog({
85
100
  ...shared,
86
- page: valuesPage(request.fields, request.title, request.readonly === true),
101
+ page: valuesPage(request.fields, request.title, request.readonly === true, request.layout),
102
+ ...(request.parent ? { parent: request.parent } : {}),
87
103
  dataSource: lookupsOf(options.dataSource),
88
104
  values: request.values,
89
105
  title: request.title,
106
+ // A line's own form is laid out as a page is: the room of a record's dialog.
107
+ ...(request.layout ? { size: 'large' } : {}),
90
108
  mode: 'values',
91
109
  ...(request.recompute ? { recompute: request.recompute } : {}),
110
+ ...(say ? { host: { say } } : {}),
92
111
  });
93
112
  return result.saved ? result.values : null;
94
113
  },
@@ -1 +1 @@
1
- {"version":3,"file":"related.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/related.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"related.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/related.ts"],"names":[],"mappings":"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"}
package/src/lib/say.d.mts CHANGED
@@ -4,6 +4,8 @@ import type { El } from './dom.mjs';
4
4
  * Words a step says, as toasts at the foot of the screen: each in its tone,
5
5
  * one over another, in a polite live region inside the form — so they wear its
6
6
  * skin, scheme and direction. Each goes by itself after a moment, but not
7
- * while the pointer or the focus is on it, and at once with its ×.
7
+ * while the pointer or the focus is on it, and at once with its ×. They show
8
+ * over a dialog or panel too, and while a modal one is open, a screen reader —
9
+ * which hears only inside it — is told them there as well, unseen.
8
10
  */
9
11
  export declare function sayer(root: HTMLElement, el: El, dismiss: string): (message: string, tone: Tone) => void;
package/src/lib/say.d.ts CHANGED
@@ -4,6 +4,8 @@ import type { El } from './dom';
4
4
  * Words a step says, as toasts at the foot of the screen: each in its tone,
5
5
  * one over another, in a polite live region inside the form — so they wear its
6
6
  * skin, scheme and direction. Each goes by itself after a moment, but not
7
- * while the pointer or the focus is on it, and at once with its ×.
7
+ * while the pointer or the focus is on it, and at once with its ×. They show
8
+ * over a dialog or panel too, and while a modal one is open, a screen reader —
9
+ * which hears only inside it — is told them there as well, unseen.
8
10
  */
9
11
  export declare function sayer(root: HTMLElement, el: El, dismiss: string): (message: string, tone: Tone) => void;
package/src/lib/say.js CHANGED
@@ -10,7 +10,9 @@ const MOST = 4;
10
10
  * Words a step says, as toasts at the foot of the screen: each in its tone,
11
11
  * one over another, in a polite live region inside the form — so they wear its
12
12
  * skin, scheme and direction. Each goes by itself after a moment, but not
13
- * while the pointer or the focus is on it, and at once with its ×.
13
+ * while the pointer or the focus is on it, and at once with its ×. They show
14
+ * over a dialog or panel too, and while a modal one is open, a screen reader —
15
+ * which hears only inside it — is told them there as well, unseen.
14
16
  */
15
17
  function sayer(root, el, dismiss) {
16
18
  // There before anything is said, so a screen reader hears what comes into it.
@@ -39,7 +41,21 @@ function sayer(root, el, dismiss) {
39
41
  region.append(toast);
40
42
  while (region.children.length > MOST)
41
43
  region.firstElementChild?.remove();
44
+ echo(region, el, message);
42
45
  wait();
43
46
  };
44
47
  }
48
+ /** The words again, unseen, in a live region of the topmost modal dialog the region is not in. */
49
+ function echo(region, el, message) {
50
+ const modals = [...region.ownerDocument.querySelectorAll('[aria-modal="true"]')].filter((m) => !m.contains(region));
51
+ const top = modals[modals.length - 1];
52
+ if (!top)
53
+ return;
54
+ let heard = top.querySelector(':scope > .fd-says-echo');
55
+ if (!heard) {
56
+ heard = el('div', { class: 'fd-says-echo fd-sr-only', role: 'status', 'aria-live': 'polite' });
57
+ top.append(heard);
58
+ }
59
+ heard.textContent = message;
60
+ }
45
61
  //# sourceMappingURL=say.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"say.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/say.ts"],"names":[],"mappings":";;AAeA,sBA4BC;AAxCD,4FAA4F;AAC5F,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,YAAY,GAAG,KAAK,CAAC;AAC3B,8DAA8D;AAC9D,MAAM,IAAI,GAAG,CAAC,CAAC;AAEf;;;;;GAKG;AACH,SAAgB,KAAK,CAAC,IAAiB,EAAE,EAAM,EAAE,OAAe;IAC9D,8EAA8E;IAC9E,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACpG,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAChG,sFAAsF;QACtF,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACxF,IAAI,KAAgD,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,GAAG,EAAE;YACd,IAAI,EAAE,CAAC;YACP,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,CAAC;YACP,KAAK,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3F,CAAC,CAAC;QACF,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI;YAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QACzE,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"say.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/say.ts"],"names":[],"mappings":"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"}
package/src/lib/say.mjs CHANGED
@@ -7,7 +7,9 @@ const MOST = 4;
7
7
  * Words a step says, as toasts at the foot of the screen: each in its tone,
8
8
  * one over another, in a polite live region inside the form — so they wear its
9
9
  * skin, scheme and direction. Each goes by itself after a moment, but not
10
- * while the pointer or the focus is on it, and at once with its ×.
10
+ * while the pointer or the focus is on it, and at once with its ×. They show
11
+ * over a dialog or panel too, and while a modal one is open, a screen reader —
12
+ * which hears only inside it — is told them there as well, unseen.
11
13
  */
12
14
  export function sayer(root, el, dismiss) {
13
15
  // There before anything is said, so a screen reader hears what comes into it.
@@ -36,7 +38,21 @@ export function sayer(root, el, dismiss) {
36
38
  region.append(toast);
37
39
  while (region.children.length > MOST)
38
40
  region.firstElementChild?.remove();
41
+ echo(region, el, message);
39
42
  wait();
40
43
  };
41
44
  }
45
+ /** The words again, unseen, in a live region of the topmost modal dialog the region is not in. */
46
+ function echo(region, el, message) {
47
+ const modals = [...region.ownerDocument.querySelectorAll('[aria-modal="true"]')].filter((m) => !m.contains(region));
48
+ const top = modals[modals.length - 1];
49
+ if (!top)
50
+ return;
51
+ let heard = top.querySelector(':scope > .fd-says-echo');
52
+ if (!heard) {
53
+ heard = el('div', { class: 'fd-says-echo fd-sr-only', role: 'status', 'aria-live': 'polite' });
54
+ top.append(heard);
55
+ }
56
+ heard.textContent = message;
57
+ }
42
58
  //# sourceMappingURL=say.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"say.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/say.ts"],"names":[],"mappings":"AAGA,4FAA4F;AAC5F,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,YAAY,GAAG,KAAK,CAAC;AAC3B,8DAA8D;AAC9D,MAAM,IAAI,GAAG,CAAC,CAAC;AAEf;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,IAAiB,EAAE,EAAM,EAAE,OAAe;IAC9D,8EAA8E;IAC9E,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACpG,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAChG,sFAAsF;QACtF,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACxF,IAAI,KAAgD,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,GAAG,EAAE;YACd,IAAI,EAAE,CAAC;YACP,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,CAAC;YACP,KAAK,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3F,CAAC,CAAC;QACF,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI;YAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QACzE,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"say.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/say.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { El } from './dom.mjs';
2
+ export interface TabStrip {
3
+ /** The tabs' list with a button at each edge: what goes on the page. */
4
+ element: HTMLElement;
5
+ /** Look again at what is past each edge: after the tabs shown change, or the strip's width. */
6
+ measure(): void;
7
+ /** Scroll the strip, and only the strip, so this tab is in sight. */
8
+ reveal(tab: HTMLElement): void;
9
+ destroy(): void;
10
+ }
11
+ /**
12
+ * A row of tabs too long for its room scrolls sideways: past an edge with more
13
+ * beyond it, the tabs fade out under a button that moves the strip a width
14
+ * along — to the left at the start of a right-to-left page. The buttons are
15
+ * for a pointer: the keyboard moves along the tabs, which come into sight.
16
+ */
17
+ export declare function tabStrip(list: HTMLElement, el: El): TabStrip;
@@ -0,0 +1,17 @@
1
+ import type { El } from './dom';
2
+ export interface TabStrip {
3
+ /** The tabs' list with a button at each edge: what goes on the page. */
4
+ element: HTMLElement;
5
+ /** Look again at what is past each edge: after the tabs shown change, or the strip's width. */
6
+ measure(): void;
7
+ /** Scroll the strip, and only the strip, so this tab is in sight. */
8
+ reveal(tab: HTMLElement): void;
9
+ destroy(): void;
10
+ }
11
+ /**
12
+ * A row of tabs too long for its room scrolls sideways: past an edge with more
13
+ * beyond it, the tabs fade out under a button that moves the strip a width
14
+ * along — to the left at the start of a right-to-left page. The buttons are
15
+ * for a pointer: the keyboard moves along the tabs, which come into sight.
16
+ */
17
+ export declare function tabStrip(list: HTMLElement, el: El): TabStrip;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tabStrip = tabStrip;
4
+ const dom_1 = require("./dom");
5
+ /** Room kept beside a tab brought into sight: the button over that edge and the fade beside it. */
6
+ const EDGE = 64;
7
+ /**
8
+ * A row of tabs too long for its room scrolls sideways: past an edge with more
9
+ * beyond it, the tabs fade out under a button that moves the strip a width
10
+ * along — to the left at the start of a right-to-left page. The buttons are
11
+ * for a pointer: the keyboard moves along the tabs, which come into sight.
12
+ */
13
+ function tabStrip(list, el) {
14
+ const rtl = () => list.closest('[dir]')?.getAttribute('dir') === 'rtl';
15
+ const edge = (side) => el('button', { type: 'button', class: `fd-tabs-scroll fd-tabs-${side}`, tabindex: '-1', 'aria-hidden': 'true', hidden: '' });
16
+ const before = edge('before');
17
+ const after = edge('after');
18
+ const element = el('div', { class: 'fd-tabbar' }, before, list, after);
19
+ // A strip's width along, less a tab's room, toward the button's own edge.
20
+ const move = (toward) => list.scrollBy({ left: toward * (rtl() ? -1 : 1) * Math.max(list.clientWidth - 2 * EDGE, EDGE), behavior: 'smooth' });
21
+ before.addEventListener('click', () => move(-1));
22
+ after.addEventListener('click', () => move(1));
23
+ function measure() {
24
+ // How far along from the start: right to left, scrollLeft runs from 0 down.
25
+ const along = Math.abs(list.scrollLeft);
26
+ const start = along > 1;
27
+ const end = along + list.clientWidth < list.scrollWidth - 1;
28
+ (0, dom_1.setHidden)(before, !start);
29
+ (0, dom_1.setHidden)(after, !end);
30
+ const more = [start && 'start', end && 'end'].filter(Boolean).join(' ');
31
+ (0, dom_1.setAttr)(element, 'data-more', more || null);
32
+ }
33
+ function reveal(tab) {
34
+ if (!list.clientWidth || list.scrollWidth <= list.clientWidth)
35
+ return;
36
+ const room = list.getBoundingClientRect();
37
+ const at = tab.getBoundingClientRect();
38
+ // Either way round, a larger scrollLeft shows what is further right.
39
+ if (at.left < room.left + EDGE)
40
+ list.scrollLeft += at.left - room.left - EDGE;
41
+ else if (at.right > room.right - EDGE)
42
+ list.scrollLeft += at.right - room.right + EDGE;
43
+ measure();
44
+ }
45
+ list.addEventListener('scroll', measure, { passive: true });
46
+ const view = list.ownerDocument.defaultView;
47
+ const watcher = view && 'ResizeObserver' in view ? new view.ResizeObserver(() => measure()) : null;
48
+ watcher?.observe(list);
49
+ return { element, measure, reveal, destroy: () => watcher?.disconnect() };
50
+ }
51
+ //# sourceMappingURL=tab-strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-strip.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/tab-strip.ts"],"names":[],"mappings":";;AAsBA,4BAuCC;AA5DD,+BAA2C;AAE3C,mGAAmG;AACnG,MAAM,IAAI,GAAG,EAAE,CAAC;AAYhB;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,IAAiB,EAAE,EAAM;IAChD,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;IACvE,MAAM,IAAI,GAAG,CAAC,IAAwB,EAAE,EAAE,CACxC,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,0BAA0B,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/H,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACvE,0EAA0E;IAC1E,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtJ,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/C,SAAS,OAAO;QACd,4EAA4E;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAC5D,IAAA,eAAS,EAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAA,eAAS,EAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxE,IAAA,aAAO,EAAC,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS,MAAM,CAAC,GAAgB;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QACtE,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACvC,qEAAqE;QACrE,IAAI,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI;YAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;aACzE,IAAI,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI;YAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACvF,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,IAAI,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnG,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { setAttr, setHidden } from './dom.mjs';
2
+ /** Room kept beside a tab brought into sight: the button over that edge and the fade beside it. */
3
+ const EDGE = 64;
4
+ /**
5
+ * A row of tabs too long for its room scrolls sideways: past an edge with more
6
+ * beyond it, the tabs fade out under a button that moves the strip a width
7
+ * along — to the left at the start of a right-to-left page. The buttons are
8
+ * for a pointer: the keyboard moves along the tabs, which come into sight.
9
+ */
10
+ export function tabStrip(list, el) {
11
+ const rtl = () => list.closest('[dir]')?.getAttribute('dir') === 'rtl';
12
+ const edge = (side) => el('button', { type: 'button', class: `fd-tabs-scroll fd-tabs-${side}`, tabindex: '-1', 'aria-hidden': 'true', hidden: '' });
13
+ const before = edge('before');
14
+ const after = edge('after');
15
+ const element = el('div', { class: 'fd-tabbar' }, before, list, after);
16
+ // A strip's width along, less a tab's room, toward the button's own edge.
17
+ const move = (toward) => list.scrollBy({ left: toward * (rtl() ? -1 : 1) * Math.max(list.clientWidth - 2 * EDGE, EDGE), behavior: 'smooth' });
18
+ before.addEventListener('click', () => move(-1));
19
+ after.addEventListener('click', () => move(1));
20
+ function measure() {
21
+ // How far along from the start: right to left, scrollLeft runs from 0 down.
22
+ const along = Math.abs(list.scrollLeft);
23
+ const start = along > 1;
24
+ const end = along + list.clientWidth < list.scrollWidth - 1;
25
+ setHidden(before, !start);
26
+ setHidden(after, !end);
27
+ const more = [start && 'start', end && 'end'].filter(Boolean).join(' ');
28
+ setAttr(element, 'data-more', more || null);
29
+ }
30
+ function reveal(tab) {
31
+ if (!list.clientWidth || list.scrollWidth <= list.clientWidth)
32
+ return;
33
+ const room = list.getBoundingClientRect();
34
+ const at = tab.getBoundingClientRect();
35
+ // Either way round, a larger scrollLeft shows what is further right.
36
+ if (at.left < room.left + EDGE)
37
+ list.scrollLeft += at.left - room.left - EDGE;
38
+ else if (at.right > room.right - EDGE)
39
+ list.scrollLeft += at.right - room.right + EDGE;
40
+ measure();
41
+ }
42
+ list.addEventListener('scroll', measure, { passive: true });
43
+ const view = list.ownerDocument.defaultView;
44
+ const watcher = view && 'ResizeObserver' in view ? new view.ResizeObserver(() => measure()) : null;
45
+ watcher?.observe(list);
46
+ return { element, measure, reveal, destroy: () => watcher?.disconnect() };
47
+ }
48
+ //# sourceMappingURL=tab-strip.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-strip.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/tab-strip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Fields, type Locale, type Values } from '@fieldia/core';
2
+ /**
3
+ * Words that hold fields' values — "Entries before {lock_date} cannot be
4
+ * posted." — drawn as text with each value in a span of its own, written as
5
+ * the field shows it, and brought up to date as the record changes.
6
+ */
7
+ export declare function valueWords(doc: Document, fields: Fields, text: string, locale: Locale): {
8
+ nodes: (Node | string)[];
9
+ update(values: Readonly<Values>): void;
10
+ };
@@ -0,0 +1,10 @@
1
+ import { type Fields, type Locale, type Values } from '@fieldia/core';
2
+ /**
3
+ * Words that hold fields' values — "Entries before {lock_date} cannot be
4
+ * posted." — drawn as text with each value in a span of its own, written as
5
+ * the field shows it, and brought up to date as the record changes.
6
+ */
7
+ export declare function valueWords(doc: Document, fields: Fields, text: string, locale: Locale): {
8
+ nodes: (Node | string)[];
9
+ update(values: Readonly<Values>): void;
10
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.valueWords = valueWords;
4
+ const core_1 = require("@fieldia/core");
5
+ const widgets_1 = require("@fieldia/widgets");
6
+ /**
7
+ * Words that hold fields' values — "Entries before {lock_date} cannot be
8
+ * posted." — drawn as text with each value in a span of its own, written as
9
+ * the field shows it, and brought up to date as the record changes.
10
+ */
11
+ function valueWords(doc, fields, text, locale) {
12
+ const parts = (0, core_1.splitValues)(text);
13
+ if (!parts.some((part) => part.field))
14
+ return { nodes: [text], update: () => undefined };
15
+ const values = [];
16
+ const nodes = parts.map((part) => {
17
+ if (!part.field)
18
+ return part.text;
19
+ // Set apart from the words round it, so a date or an amount keeps its own order on a page read right to left.
20
+ const span = doc.createElement('bdi');
21
+ span.className = 'fd-value';
22
+ span.dataset['field'] = part.field;
23
+ values.push({ field: part.field, span });
24
+ return span;
25
+ });
26
+ return {
27
+ nodes,
28
+ update(record) {
29
+ for (const { field, span } of values) {
30
+ const def = fields[field];
31
+ const words = def ? (0, widgets_1.displayValue)(def, record[field], record, locale) : '';
32
+ if (span.textContent !== words)
33
+ span.textContent = words;
34
+ }
35
+ },
36
+ };
37
+ }
38
+ //# sourceMappingURL=value-words.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-words.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/value-words.ts"],"names":[],"mappings":";;AAQA,gCAuBC;AA/BD,wCAA+G;AAC/G,8CAAgD;AAEhD;;;;GAIG;AACH,SAAgB,UAAU,CAAC,GAAa,EAAE,MAAc,EAAE,IAAY,EAAE,MAAc;IACpF,MAAM,KAAK,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;IACzF,MAAM,MAAM,GAA2C,EAAE,CAAC;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAClC,8GAA8G;QAC9G,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO;QACL,KAAK;QACL,MAAM,CAAC,MAAM;YACX,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,sBAAY,EAAC,GAAgB,EAAE,MAAM,CAAC,KAAK,CAAsB,EAAE,MAA+B,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrI,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK;oBAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAC3D,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { splitValues } from '@fieldia/core';
2
+ import { displayValue } from '@fieldia/widgets';
3
+ /**
4
+ * Words that hold fields' values — "Entries before {lock_date} cannot be
5
+ * posted." — drawn as text with each value in a span of its own, written as
6
+ * the field shows it, and brought up to date as the record changes.
7
+ */
8
+ export function valueWords(doc, fields, text, locale) {
9
+ const parts = splitValues(text);
10
+ if (!parts.some((part) => part.field))
11
+ return { nodes: [text], update: () => undefined };
12
+ const values = [];
13
+ const nodes = parts.map((part) => {
14
+ if (!part.field)
15
+ return part.text;
16
+ // Set apart from the words round it, so a date or an amount keeps its own order on a page read right to left.
17
+ const span = doc.createElement('bdi');
18
+ span.className = 'fd-value';
19
+ span.dataset['field'] = part.field;
20
+ values.push({ field: part.field, span });
21
+ return span;
22
+ });
23
+ return {
24
+ nodes,
25
+ update(record) {
26
+ for (const { field, span } of values) {
27
+ const def = fields[field];
28
+ const words = def ? displayValue(def, record[field], record, locale) : '';
29
+ if (span.textContent !== words)
30
+ span.textContent = words;
31
+ }
32
+ },
33
+ };
34
+ }
35
+ //# sourceMappingURL=value-words.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-words.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/value-words.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqE,MAAM,eAAe,CAAC;AAC/G,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAa,EAAE,MAAc,EAAE,IAAY,EAAE,MAAc;IACpF,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;IACzF,MAAM,MAAM,GAA2C,EAAE,CAAC;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAClC,8GAA8G;QAC9G,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO;QACL,KAAK;QACL,MAAM,CAAC,MAAM;YACX,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAgB,EAAE,MAAM,CAAC,KAAK,CAAsB,EAAE,MAA+B,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrI,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK;oBAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAC3D,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,6 +1,9 @@
1
- import { type ActionHost, type ActionStep, type FormEvents, type Form, type FormOptions, type Page, type RecordId, type Locale, type OpenRequest, type OpenResult, type RunContext, type RunResult, type Values } from '@fieldia/core';
1
+ import { type ActionHost, type ActionStep, type FormEvents, type Form, type FormOptions, type LayoutNode, type Page, type Theme, type RecordId, type ResolvedFilter, type Locale, type OpenRequest, type OpenResult, type RunContext, type RunResult, type Values } from '@fieldia/core';
2
2
  import { type IconSet, type PreferenceStore, type WidgetFactory } from '@fieldia/widgets';
3
3
  import { type PageFinder } from './related.mjs';
4
+ import { type Tokens } from './look.mjs';
5
+ import { type Breadcrumb, type RecordPager } from './record-bar.mjs';
6
+ export type { Breadcrumb, RecordPager } from './record-bar.mjs';
4
7
  export type Skin = 'underline' | 'outlined';
5
8
  import { type ViewerLabels } from './labels.mjs';
6
9
  export { VIEWER_LABELS, DEFAULT_LABELS, type ViewerLabels } from './labels.mjs';
@@ -14,7 +17,17 @@ export interface ViewerOptions extends Omit<FormOptions, 'page' | 'host'> {
14
17
  page: Page;
15
18
  /** A form made elsewhere, to share one record between two views. */
16
19
  form?: Form;
20
+ /** The skin: a theme's own when it is left out (see `THEME_SKINS`), else `underline`. */
17
21
  skin?: Skin;
22
+ /** A theme in the style of a known design system, over the page's own (`look.theme`). */
23
+ theme?: Theme;
24
+ /**
25
+ * The host's own colours, corners and font, over the skin's, the theme's, the
26
+ * scheme's and the page's: `{ text, surface, accent, … }` (`TOKEN_NAMES`). The
27
+ * supported way to dress a form in an app's theme; a host's own stylesheet
28
+ * rule on the form does the same.
29
+ */
30
+ tokens?: Tokens;
18
31
  /** Widgets that replace or add to the built-in ones, by `type` or `type.widget`. */
19
32
  widgets?: Record<string, WidgetFactory>;
20
33
  slots?: Record<string, SlotRenderer>;
@@ -79,6 +92,8 @@ export interface ViewerOptions extends Omit<FormOptions, 'page' | 'host'> {
79
92
  translate?: (text: string) => string;
80
93
  /** A list page: a row was opened, by a click or by Enter. The app shows the record. */
81
94
  onOpenRecord?: (id: RecordId) => void;
95
+ /** A list page: only the records these conditions let through, whatever is searched — the invoices of one order, opened from it. */
96
+ listFilter?: ResolvedFilter[];
82
97
  /**
83
98
  * What the page's steps ask of the screen, the viewer does itself: a page
84
99
  * opened (in a dialog, a side panel, or this form's place, with Back), words
@@ -91,11 +106,32 @@ export interface ViewerOptions extends Omit<FormOptions, 'page' | 'host'> {
91
106
  * your router, your own dialog — or with undefined to let the viewer open it.
92
107
  */
93
108
  onOpen?: (request: OpenRequest) => Promise<OpenResult> | undefined;
109
+ /**
110
+ * The records round this one, for the pager over a record — "3 / 42",
111
+ * Previous and Next — as the list it was opened from has them: their ids in
112
+ * order, or how many there are, where this one is, and the id at a place.
113
+ * Moving saves what changed first, as Flectra does; the form then shows
114
+ * the other record (its `open` event says which). A copy joins them after
115
+ * its record; a record deleted leaves them, the pager moving to the next.
116
+ * Never in a dialog.
117
+ */
118
+ records?: readonly RecordId[] | RecordPager;
119
+ /**
120
+ * The trail to this record, for the breadcrumbs over it: each page before
121
+ * it with its words and what a press does (back to it); the record itself
122
+ * comes last, by its name. A page a step opens in this one's place adds
123
+ * this one to the trail, as the way back. Never in a dialog.
124
+ */
125
+ breadcrumbs?: readonly Breadcrumb[];
94
126
  }
95
127
  export interface ViewerHandle {
96
128
  readonly form: Form;
97
129
  readonly element: HTMLElement;
98
130
  setSkin(skin: Skin): void;
131
+ /** Wear another theme; the skin follows it unless the viewer was given one. */
132
+ setTheme(theme: Theme | null): void;
133
+ /** Wear the host's tokens in place of those given before, as when its app turns dark; null takes them off. Dialogs opened after wear them too. */
134
+ setTokens(tokens: Tokens | null): void;
99
135
  /** Save the record, or take the focus to the first problem when the form refuses. */
100
136
  save(): Promise<boolean>;
101
137
  /** Check the form without saving, taking the focus to the first problem. */
@@ -116,4 +152,11 @@ export interface ViewerHandle {
116
152
  * React, Angular and Vue bindings are thin shells around this function.
117
153
  * Throws when the page does not validate, listing every problem.
118
154
  */
119
- export declare function mountViewer(host: HTMLElement, options: ViewerOptions): ViewerHandle;
155
+ export declare function mountViewer(host: HTMLElement, given: ViewerOptions): ViewerHandle;
156
+ /**
157
+ * A one-line row's parts in runs that wrap as one: words before a field
158
+ * ("Expected:", "to") go with it, and words after it that no field follows
159
+ * ("attempts") too, as Flectra keeps them in one span; any other part runs
160
+ * alone.
161
+ */
162
+ export declare function onelineRuns(children: readonly LayoutNode[]): LayoutNode[][];