@fieldia/widgets 0.10.0 → 0.12.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 (228) hide show
  1. package/README.md +2 -1
  2. package/package.json +2 -2
  3. package/src/index.d.mts +2 -0
  4. package/src/index.d.ts +2 -0
  5. package/src/index.js +6 -1
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +2 -0
  8. package/src/index.mjs.map +1 -1
  9. package/src/lib/badge.d.mts +8 -0
  10. package/src/lib/badge.d.ts +8 -0
  11. package/src/lib/badge.js +37 -0
  12. package/src/lib/badge.js.map +1 -0
  13. package/src/lib/badge.mjs +33 -0
  14. package/src/lib/badge.mjs.map +1 -0
  15. package/src/lib/calendar.d.mts +3 -1
  16. package/src/lib/calendar.d.ts +3 -1
  17. package/src/lib/calendar.js +17 -1
  18. package/src/lib/calendar.js.map +1 -1
  19. package/src/lib/calendar.mjs +17 -1
  20. package/src/lib/calendar.mjs.map +1 -1
  21. package/src/lib/cards.js +12 -4
  22. package/src/lib/cards.js.map +1 -1
  23. package/src/lib/cards.mjs +13 -5
  24. package/src/lib/cards.mjs.map +1 -1
  25. package/src/lib/choice-images.js +1 -1
  26. package/src/lib/choice-images.js.map +1 -1
  27. package/src/lib/choice-images.mjs +1 -1
  28. package/src/lib/choice-images.mjs.map +1 -1
  29. package/src/lib/choice-tags.js +2 -2
  30. package/src/lib/choice-tags.js.map +1 -1
  31. package/src/lib/choice-tags.mjs +2 -2
  32. package/src/lib/choice-tags.mjs.map +1 -1
  33. package/src/lib/colour.d.mts +11 -0
  34. package/src/lib/colour.d.ts +11 -0
  35. package/src/lib/colour.js +114 -0
  36. package/src/lib/colour.js.map +1 -0
  37. package/src/lib/colour.mjs +110 -0
  38. package/src/lib/colour.mjs.map +1 -0
  39. package/src/lib/copy.d.mts +8 -0
  40. package/src/lib/copy.d.ts +8 -0
  41. package/src/lib/copy.js +58 -0
  42. package/src/lib/copy.js.map +1 -0
  43. package/src/lib/copy.mjs +54 -0
  44. package/src/lib/copy.mjs.map +1 -0
  45. package/src/lib/date-range.d.mts +2 -0
  46. package/src/lib/date-range.d.ts +2 -0
  47. package/src/lib/date-range.js +220 -0
  48. package/src/lib/date-range.js.map +1 -0
  49. package/src/lib/date-range.mjs +216 -0
  50. package/src/lib/date-range.mjs.map +1 -0
  51. package/src/lib/display.d.mts +25 -1
  52. package/src/lib/display.d.ts +25 -1
  53. package/src/lib/display.js +42 -2
  54. package/src/lib/display.js.map +1 -1
  55. package/src/lib/display.mjs +39 -2
  56. package/src/lib/display.mjs.map +1 -1
  57. package/src/lib/distribution.d.mts +13 -0
  58. package/src/lib/distribution.d.ts +13 -0
  59. package/src/lib/distribution.js +159 -0
  60. package/src/lib/distribution.js.map +1 -0
  61. package/src/lib/distribution.mjs +152 -0
  62. package/src/lib/distribution.mjs.map +1 -0
  63. package/src/lib/duration.d.mts +18 -0
  64. package/src/lib/duration.d.ts +18 -0
  65. package/src/lib/duration.js +137 -0
  66. package/src/lib/duration.js.map +1 -0
  67. package/src/lib/duration.mjs +128 -0
  68. package/src/lib/duration.mjs.map +1 -0
  69. package/src/lib/embed.d.mts +3 -0
  70. package/src/lib/embed.d.ts +3 -0
  71. package/src/lib/embed.js +97 -0
  72. package/src/lib/embed.js.map +1 -0
  73. package/src/lib/embed.mjs +92 -0
  74. package/src/lib/embed.mjs.map +1 -0
  75. package/src/lib/extras.js +6 -0
  76. package/src/lib/extras.js.map +1 -1
  77. package/src/lib/extras.mjs +6 -0
  78. package/src/lib/extras.mjs.map +1 -1
  79. package/src/lib/files.d.mts +11 -0
  80. package/src/lib/files.d.ts +11 -0
  81. package/src/lib/files.js +86 -9
  82. package/src/lib/files.js.map +1 -1
  83. package/src/lib/files.mjs +85 -9
  84. package/src/lib/files.mjs.map +1 -1
  85. package/src/lib/kind-parts.d.mts +4 -3
  86. package/src/lib/kind-parts.d.ts +4 -3
  87. package/src/lib/kind-parts.js +5 -3
  88. package/src/lib/kind-parts.js.map +1 -1
  89. package/src/lib/kind-parts.mjs +5 -3
  90. package/src/lib/kind-parts.mjs.map +1 -1
  91. package/src/lib/labels.d.mts +42 -0
  92. package/src/lib/labels.d.ts +42 -0
  93. package/src/lib/labels.js +32 -0
  94. package/src/lib/labels.js.map +1 -1
  95. package/src/lib/labels.mjs +32 -0
  96. package/src/lib/labels.mjs.map +1 -1
  97. package/src/lib/layout-styles.d.mts +1 -1
  98. package/src/lib/layout-styles.d.ts +1 -1
  99. package/src/lib/layout-styles.js +2 -0
  100. package/src/lib/layout-styles.js.map +1 -1
  101. package/src/lib/layout-styles.mjs +2 -0
  102. package/src/lib/layout-styles.mjs.map +1 -1
  103. package/src/lib/lines.d.mts +12 -2
  104. package/src/lib/lines.d.ts +12 -2
  105. package/src/lib/lines.js +251 -15
  106. package/src/lib/lines.js.map +1 -1
  107. package/src/lib/lines.mjs +250 -16
  108. package/src/lib/lines.mjs.map +1 -1
  109. package/src/lib/links-table.d.mts +11 -0
  110. package/src/lib/links-table.d.ts +11 -0
  111. package/src/lib/links-table.js +116 -0
  112. package/src/lib/links-table.js.map +1 -0
  113. package/src/lib/links-table.mjs +112 -0
  114. package/src/lib/links-table.mjs.map +1 -0
  115. package/src/lib/locales/ar.js +32 -0
  116. package/src/lib/locales/ar.js.map +1 -1
  117. package/src/lib/locales/ar.mjs +32 -0
  118. package/src/lib/locales/ar.mjs.map +1 -1
  119. package/src/lib/locales/de.js +32 -0
  120. package/src/lib/locales/de.js.map +1 -1
  121. package/src/lib/locales/de.mjs +32 -0
  122. package/src/lib/locales/de.mjs.map +1 -1
  123. package/src/lib/locales/fr.js +32 -0
  124. package/src/lib/locales/fr.js.map +1 -1
  125. package/src/lib/locales/fr.mjs +32 -0
  126. package/src/lib/locales/fr.mjs.map +1 -1
  127. package/src/lib/payments.d.mts +2 -0
  128. package/src/lib/payments.d.ts +2 -0
  129. package/src/lib/payments.js +94 -0
  130. package/src/lib/payments.js.map +1 -0
  131. package/src/lib/payments.mjs +90 -0
  132. package/src/lib/payments.mjs.map +1 -0
  133. package/src/lib/popup.d.mts +11 -0
  134. package/src/lib/popup.d.ts +11 -0
  135. package/src/lib/popup.js +48 -0
  136. package/src/lib/popup.js.map +1 -0
  137. package/src/lib/popup.mjs +45 -0
  138. package/src/lib/popup.mjs.map +1 -0
  139. package/src/lib/priority.d.mts +10 -0
  140. package/src/lib/priority.d.ts +10 -0
  141. package/src/lib/priority.js +59 -0
  142. package/src/lib/priority.js.map +1 -0
  143. package/src/lib/priority.mjs +55 -0
  144. package/src/lib/priority.mjs.map +1 -0
  145. package/src/lib/progress.js +3 -0
  146. package/src/lib/progress.js.map +1 -1
  147. package/src/lib/progress.mjs +3 -0
  148. package/src/lib/progress.mjs.map +1 -1
  149. package/src/lib/properties.js +100 -9
  150. package/src/lib/properties.js.map +1 -1
  151. package/src/lib/properties.mjs +100 -9
  152. package/src/lib/properties.mjs.map +1 -1
  153. package/src/lib/read-text.d.mts +25 -0
  154. package/src/lib/read-text.d.ts +25 -0
  155. package/src/lib/read-text.js +102 -0
  156. package/src/lib/read-text.js.map +1 -0
  157. package/src/lib/read-text.mjs +98 -0
  158. package/src/lib/read-text.mjs.map +1 -0
  159. package/src/lib/relations.d.mts +12 -0
  160. package/src/lib/relations.d.ts +12 -0
  161. package/src/lib/relations.js +99 -8
  162. package/src/lib/relations.js.map +1 -1
  163. package/src/lib/relations.mjs +97 -8
  164. package/src/lib/relations.mjs.map +1 -1
  165. package/src/lib/slider.js +1 -1
  166. package/src/lib/slider.js.map +1 -1
  167. package/src/lib/slider.mjs +1 -1
  168. package/src/lib/slider.mjs.map +1 -1
  169. package/src/lib/state-dot.d.mts +2 -0
  170. package/src/lib/state-dot.d.ts +2 -0
  171. package/src/lib/state-dot.js +107 -0
  172. package/src/lib/state-dot.js.map +1 -0
  173. package/src/lib/state-dot.mjs +103 -0
  174. package/src/lib/state-dot.mjs.map +1 -0
  175. package/src/lib/statusbar.js +151 -14
  176. package/src/lib/statusbar.js.map +1 -1
  177. package/src/lib/statusbar.mjs +151 -14
  178. package/src/lib/statusbar.mjs.map +1 -1
  179. package/src/lib/styles-business.d.mts +8 -0
  180. package/src/lib/styles-business.d.ts +8 -0
  181. package/src/lib/styles-business.js +120 -0
  182. package/src/lib/styles-business.js.map +1 -0
  183. package/src/lib/styles-business.mjs +117 -0
  184. package/src/lib/styles-business.mjs.map +1 -0
  185. package/src/lib/styles-kinds.d.mts +1 -1
  186. package/src/lib/styles-kinds.d.ts +1 -1
  187. package/src/lib/styles-kinds.js +1 -1
  188. package/src/lib/styles-kinds.mjs +1 -1
  189. package/src/lib/styles-parts.d.mts +16 -0
  190. package/src/lib/styles-parts.d.ts +16 -0
  191. package/src/lib/styles-parts.js +69 -0
  192. package/src/lib/styles-parts.js.map +1 -0
  193. package/src/lib/styles-parts.mjs +66 -0
  194. package/src/lib/styles-parts.mjs.map +1 -0
  195. package/src/lib/styles-sheet.d.mts +6 -0
  196. package/src/lib/styles-sheet.d.ts +6 -0
  197. package/src/lib/styles-sheet.js +123 -0
  198. package/src/lib/styles-sheet.js.map +1 -0
  199. package/src/lib/styles-sheet.mjs +120 -0
  200. package/src/lib/styles-sheet.mjs.map +1 -0
  201. package/src/lib/styles.d.mts +10 -0
  202. package/src/lib/styles.d.ts +10 -0
  203. package/src/lib/styles.js +234 -19
  204. package/src/lib/styles.js.map +1 -1
  205. package/src/lib/styles.mjs +233 -18
  206. package/src/lib/styles.mjs.map +1 -1
  207. package/src/lib/tax-totals.d.mts +2 -0
  208. package/src/lib/tax-totals.d.ts +2 -0
  209. package/src/lib/tax-totals.js +92 -0
  210. package/src/lib/tax-totals.js.map +1 -0
  211. package/src/lib/tax-totals.mjs +88 -0
  212. package/src/lib/tax-totals.mjs.map +1 -0
  213. package/src/lib/timer.d.mts +4 -0
  214. package/src/lib/timer.d.ts +4 -0
  215. package/src/lib/timer.js +62 -0
  216. package/src/lib/timer.js.map +1 -0
  217. package/src/lib/timer.mjs +57 -0
  218. package/src/lib/timer.mjs.map +1 -0
  219. package/src/lib/widgets.d.mts +18 -3
  220. package/src/lib/widgets.d.ts +18 -3
  221. package/src/lib/widgets.js +63 -5
  222. package/src/lib/widgets.js.map +1 -1
  223. package/src/lib/widgets.mjs +63 -5
  224. package/src/lib/widgets.mjs.map +1 -1
  225. package/src/lib/yes-no.js +1 -1
  226. package/src/lib/yes-no.js.map +1 -1
  227. package/src/lib/yes-no.mjs +1 -1
  228. package/src/lib/yes-no.mjs.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-dot.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/state-dot.ts"],"names":[],"mappings":"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"}
@@ -1,55 +1,192 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.statusbarWidget = void 0;
4
- const statusbarWidget = ({ form, name, field, node, id, document }) => {
4
+ const labels_1 = require("./labels");
5
+ /** Seconds as a person reads time spent: days, else hours, else minutes, short. */
6
+ function timeSpent(seconds, locale) {
7
+ const [amount, unit] = seconds >= 86400 ? [seconds / 86400, 'day'] : seconds >= 3600 ? [seconds / 3600, 'hour'] : [Math.max(1, seconds / 60), 'minute'];
8
+ try {
9
+ return new Intl.NumberFormat(locale, { style: 'unit', unit, unitDisplay: 'narrow', maximumFractionDigits: 0, numberingSystem: 'latn' }).format(Math.floor(amount));
10
+ }
11
+ catch {
12
+ return `${Math.floor(amount)}${unit[0]}`;
13
+ }
14
+ }
15
+ const statusbarWidget = ({ form, name, field, node, id, document, labels = labels_1.WIDGET_LABELS.en, locale = 'en' }) => {
5
16
  const options = node.options ?? {};
6
17
  const clickable = options['clickable'] === true;
7
18
  const visible = Array.isArray(options['visibleStates']) ? options['visibleStates'] : null;
19
+ const durationsField = typeof options['durationsField'] === 'string' ? options['durationsField'] : null;
20
+ const fold = options['fold'] === true;
21
+ const saves = options['saves'] === true;
8
22
  const list = document.createElement('ol');
9
23
  list.className = 'fd-statusbar';
10
24
  list.id = id;
11
25
  list.setAttribute('aria-label', field.label);
12
26
  const keyOf = (value) => value && typeof value === 'object' && 'id' in value ? `id:${String(value.id)}` : `v:${String(value)}`;
13
- // A selection knows its steps; a link's are looked up once.
14
- let steps = field.type === 'selection' ? field.options.map((o) => ({ key: keyOf(o.value), label: o.label, value: o.value })) : [];
15
- let lookedUp = field.type === 'selection';
16
- let last = { value: undefined, readonly: false };
27
+ /** A step's value as the record's time per step names it: a stage's id, or a choice's value. */
28
+ const durationKey = (value) => (value && typeof value === 'object' && 'id' in value ? String(value.id) : String(value));
29
+ // A selection knows its steps; a link's are looked up, and again whenever a
30
+ // value its filter reads changes — the record's project, once it has loaded.
31
+ let steps = field.type === 'selection' ? field.options.map((o) => ({ key: keyOf(o.value), label: o.label, value: o.value, folded: false })) : [];
32
+ const reads = [];
33
+ const readsOf = (items) => items.forEach((item) => ('any' in item ? readsOf(item.any) : 'all' in item ? readsOf(item.all) : item.valueFrom && reads.push(item.valueFrom)));
34
+ if (field.type === 'many2one')
35
+ readsOf(field.filter ?? []);
36
+ let lookedUp = field.type === 'selection' ? '' : null;
37
+ let asked = 0;
38
+ let last = { value: undefined, readonly: false, durations: {} };
39
+ /** What the bar shows now: drawn again only when that changes — redrawing a focused step loses the focus, and the form redraws as focus leaves. */
40
+ let drawn = '';
41
+ let menuOpen = false;
42
+ /** Move the record to a step; and, when told to, save it at once. */
43
+ const pick = (step) => {
44
+ form.setValue(name, step.value);
45
+ // Saved once what the server works out from the step is back, as Flectra saves after its onchange.
46
+ if (saves)
47
+ void form.settled().then(() => form.save());
48
+ };
17
49
  function draw() {
18
- const { value, readonly } = last;
50
+ const { value, readonly, durations } = last;
51
+ // A step clicked becomes the current one: the focus stays on it as the bar is drawn again.
52
+ const focused = list.contains(document.activeElement) ? document.activeElement.dataset['key'] : undefined;
19
53
  const currentKey = value === null || value === undefined ? null : keyOf(value);
20
54
  let shown = steps.filter((s) => !visible || visible.some((v) => keyOf(v) === s.key) || s.key === currentKey);
21
55
  if (currentKey && !shown.some((s) => s.key === currentKey) && value && typeof value === 'object') {
22
- shown = [...shown, { key: currentKey, label: value.label, value }];
56
+ shown = [...shown, { key: currentKey, label: value.label, value, folded: false }];
23
57
  }
24
- list.replaceChildren(...shown.map((step) => {
58
+ // Folded stages wait under More, the one the record stands on excepted.
59
+ const folded = fold ? shown.filter((s) => s.folded && s.key !== currentKey) : [];
60
+ shown = shown.filter((s) => !folded.includes(s));
61
+ const times = shown.map((s) => (durationsField ? Number(durations[durationKey(s.value)] ?? 0) : 0));
62
+ const now = JSON.stringify([shown.map((s) => [s.key, s.label]), folded.map((s) => s.key), times, currentKey, readonly, menuOpen]);
63
+ if (now === drawn)
64
+ return;
65
+ drawn = now;
66
+ const items = shown.map((step, i) => {
25
67
  const label = document.createElement('span');
26
68
  label.textContent = step.label;
27
69
  const inner = document.createElement(clickable ? 'button' : 'span');
28
70
  if (inner instanceof HTMLButtonElement) {
29
71
  inner.type = 'button';
30
72
  inner.disabled = readonly;
31
- inner.addEventListener('click', () => form.setValue(name, step.value));
73
+ inner.dataset['key'] = step.key;
74
+ inner.addEventListener('click', () => pick(step));
32
75
  }
33
76
  inner.append(label);
77
+ // The time the record spent in it, when the app tells it.
78
+ if (times[i] > 0) {
79
+ const time = document.createElement('small');
80
+ time.className = 'fd-step-time';
81
+ time.textContent = timeSpent(times[i], locale);
82
+ inner.title = labels.timeInStep.replace('{time}', time.textContent);
83
+ inner.append(time);
84
+ }
34
85
  if (step.key === currentKey)
35
86
  inner.setAttribute('aria-current', 'step');
36
87
  const item = document.createElement('li');
37
88
  item.append(inner);
38
89
  return item;
39
- }));
90
+ });
91
+ if (folded.length)
92
+ items.push(moreItem(folded, readonly));
93
+ list.replaceChildren(...items);
94
+ // The menu is fixed to the page, so the bar's scrolling never cuts it: under More, from its end.
95
+ const menu = list.querySelector('.fd-step-menu:not([hidden])');
96
+ const toggle = menu?.previousElementSibling;
97
+ if (menu && toggle) {
98
+ const at = toggle.getBoundingClientRect();
99
+ const view = document.defaultView;
100
+ const rtl = getComputedStyle(list).direction === 'rtl';
101
+ menu.style.top = `${at.bottom + 4}px`;
102
+ if (rtl)
103
+ menu.style.left = `${at.left}px`;
104
+ else
105
+ menu.style.right = `${Math.max(0, (view?.innerWidth ?? at.right) - at.right)}px`;
106
+ }
107
+ if (focused)
108
+ [...list.querySelectorAll('button')].find((b) => b.dataset['key'] === focused)?.focus();
40
109
  }
110
+ /** The folded stages, in a menu at the bar's end: picked as any step when the bar can be clicked. */
111
+ function moreItem(folded, readonly) {
112
+ const item = document.createElement('li');
113
+ item.className = 'fd-step-more';
114
+ const toggle = document.createElement('button');
115
+ toggle.type = 'button';
116
+ toggle.dataset['key'] = 'more';
117
+ toggle.setAttribute('aria-haspopup', 'menu');
118
+ toggle.setAttribute('aria-expanded', String(menuOpen));
119
+ toggle.setAttribute('aria-label', labels.moreSteps);
120
+ toggle.title = labels.moreSteps;
121
+ const dots = document.createElement('span');
122
+ dots.textContent = '⋯';
123
+ dots.setAttribute('aria-hidden', 'true');
124
+ toggle.append(dots);
125
+ const menu = document.createElement('div');
126
+ menu.className = 'fd-step-menu';
127
+ menu.setAttribute('role', 'menu');
128
+ menu.hidden = !menuOpen;
129
+ for (const step of folded) {
130
+ const choice = document.createElement('button');
131
+ choice.type = 'button';
132
+ choice.setAttribute('role', 'menuitem');
133
+ choice.textContent = step.label;
134
+ choice.disabled = readonly || !clickable;
135
+ choice.addEventListener('click', () => {
136
+ menuOpen = false;
137
+ pick(step);
138
+ draw();
139
+ });
140
+ menu.append(choice);
141
+ }
142
+ toggle.addEventListener('click', () => {
143
+ menuOpen = !menuOpen;
144
+ draw();
145
+ if (menuOpen)
146
+ list.querySelector('.fd-step-menu button:not([disabled])')?.focus();
147
+ });
148
+ menu.addEventListener('keydown', (event) => {
149
+ if (event.key !== 'Escape')
150
+ return;
151
+ event.stopPropagation();
152
+ menuOpen = false;
153
+ draw();
154
+ list.querySelector('.fd-step-more > button')?.focus();
155
+ });
156
+ item.append(toggle, menu);
157
+ return item;
158
+ }
159
+ // A click elsewhere, or the page scrolled from under it, puts the menu away.
160
+ const away = (event) => {
161
+ if (menuOpen && !list.contains(event.target)) {
162
+ menuOpen = false;
163
+ draw();
164
+ }
165
+ };
166
+ document.addEventListener('pointerdown', away);
167
+ document.addEventListener('scroll', away, true);
41
168
  return {
42
169
  element: list,
43
170
  focus: () => list.querySelector('button:not([disabled])')?.focus(),
171
+ destroy() {
172
+ document.removeEventListener('pointerdown', away);
173
+ document.removeEventListener('scroll', away, true);
174
+ },
44
175
  update(state) {
45
- last = { value: state.value, readonly: state.readonly };
176
+ const durations = durationsField ? state.values?.[durationsField] : null;
177
+ last = { value: state.value, readonly: state.readonly, durations: durations && typeof durations === 'object' && !Array.isArray(durations) ? durations : {} };
46
178
  draw();
47
- if (!lookedUp) {
48
- lookedUp = true;
179
+ const key = field.type === 'selection' ? '' : JSON.stringify(reads.map((read) => state.values?.[read] ?? null));
180
+ if (lookedUp !== key) {
181
+ lookedUp = key;
182
+ const ask = ++asked;
49
183
  void form
50
184
  .search(name, '', 20)
51
185
  .then((records) => {
52
- steps = records.map((r) => ({ key: keyOf(r), label: r.label, value: r }));
186
+ // Only the latest answer counts: an earlier search may come back last.
187
+ if (ask !== asked)
188
+ return;
189
+ steps = records.map((r) => ({ key: keyOf(r), label: r.label, value: r, folded: r.folded === true }));
53
190
  draw();
54
191
  })
55
192
  .catch(() => undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"statusbar.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/statusbar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"statusbar.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/statusbar.ts"],"names":[],"mappings":"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"}
@@ -1,52 +1,189 @@
1
- export const statusbarWidget = ({ form, name, field, node, id, document }) => {
1
+ import { WIDGET_LABELS } from './labels.mjs';
2
+ /** Seconds as a person reads time spent: days, else hours, else minutes, short. */
3
+ function timeSpent(seconds, locale) {
4
+ const [amount, unit] = seconds >= 86400 ? [seconds / 86400, 'day'] : seconds >= 3600 ? [seconds / 3600, 'hour'] : [Math.max(1, seconds / 60), 'minute'];
5
+ try {
6
+ return new Intl.NumberFormat(locale, { style: 'unit', unit, unitDisplay: 'narrow', maximumFractionDigits: 0, numberingSystem: 'latn' }).format(Math.floor(amount));
7
+ }
8
+ catch {
9
+ return `${Math.floor(amount)}${unit[0]}`;
10
+ }
11
+ }
12
+ export const statusbarWidget = ({ form, name, field, node, id, document, labels = WIDGET_LABELS.en, locale = 'en' }) => {
2
13
  const options = node.options ?? {};
3
14
  const clickable = options['clickable'] === true;
4
15
  const visible = Array.isArray(options['visibleStates']) ? options['visibleStates'] : null;
16
+ const durationsField = typeof options['durationsField'] === 'string' ? options['durationsField'] : null;
17
+ const fold = options['fold'] === true;
18
+ const saves = options['saves'] === true;
5
19
  const list = document.createElement('ol');
6
20
  list.className = 'fd-statusbar';
7
21
  list.id = id;
8
22
  list.setAttribute('aria-label', field.label);
9
23
  const keyOf = (value) => value && typeof value === 'object' && 'id' in value ? `id:${String(value.id)}` : `v:${String(value)}`;
10
- // A selection knows its steps; a link's are looked up once.
11
- let steps = field.type === 'selection' ? field.options.map((o) => ({ key: keyOf(o.value), label: o.label, value: o.value })) : [];
12
- let lookedUp = field.type === 'selection';
13
- let last = { value: undefined, readonly: false };
24
+ /** A step's value as the record's time per step names it: a stage's id, or a choice's value. */
25
+ const durationKey = (value) => (value && typeof value === 'object' && 'id' in value ? String(value.id) : String(value));
26
+ // A selection knows its steps; a link's are looked up, and again whenever a
27
+ // value its filter reads changes — the record's project, once it has loaded.
28
+ let steps = field.type === 'selection' ? field.options.map((o) => ({ key: keyOf(o.value), label: o.label, value: o.value, folded: false })) : [];
29
+ const reads = [];
30
+ const readsOf = (items) => items.forEach((item) => ('any' in item ? readsOf(item.any) : 'all' in item ? readsOf(item.all) : item.valueFrom && reads.push(item.valueFrom)));
31
+ if (field.type === 'many2one')
32
+ readsOf(field.filter ?? []);
33
+ let lookedUp = field.type === 'selection' ? '' : null;
34
+ let asked = 0;
35
+ let last = { value: undefined, readonly: false, durations: {} };
36
+ /** What the bar shows now: drawn again only when that changes — redrawing a focused step loses the focus, and the form redraws as focus leaves. */
37
+ let drawn = '';
38
+ let menuOpen = false;
39
+ /** Move the record to a step; and, when told to, save it at once. */
40
+ const pick = (step) => {
41
+ form.setValue(name, step.value);
42
+ // Saved once what the server works out from the step is back, as Flectra saves after its onchange.
43
+ if (saves)
44
+ void form.settled().then(() => form.save());
45
+ };
14
46
  function draw() {
15
- const { value, readonly } = last;
47
+ const { value, readonly, durations } = last;
48
+ // A step clicked becomes the current one: the focus stays on it as the bar is drawn again.
49
+ const focused = list.contains(document.activeElement) ? document.activeElement.dataset['key'] : undefined;
16
50
  const currentKey = value === null || value === undefined ? null : keyOf(value);
17
51
  let shown = steps.filter((s) => !visible || visible.some((v) => keyOf(v) === s.key) || s.key === currentKey);
18
52
  if (currentKey && !shown.some((s) => s.key === currentKey) && value && typeof value === 'object') {
19
- shown = [...shown, { key: currentKey, label: value.label, value }];
53
+ shown = [...shown, { key: currentKey, label: value.label, value, folded: false }];
20
54
  }
21
- list.replaceChildren(...shown.map((step) => {
55
+ // Folded stages wait under More, the one the record stands on excepted.
56
+ const folded = fold ? shown.filter((s) => s.folded && s.key !== currentKey) : [];
57
+ shown = shown.filter((s) => !folded.includes(s));
58
+ const times = shown.map((s) => (durationsField ? Number(durations[durationKey(s.value)] ?? 0) : 0));
59
+ const now = JSON.stringify([shown.map((s) => [s.key, s.label]), folded.map((s) => s.key), times, currentKey, readonly, menuOpen]);
60
+ if (now === drawn)
61
+ return;
62
+ drawn = now;
63
+ const items = shown.map((step, i) => {
22
64
  const label = document.createElement('span');
23
65
  label.textContent = step.label;
24
66
  const inner = document.createElement(clickable ? 'button' : 'span');
25
67
  if (inner instanceof HTMLButtonElement) {
26
68
  inner.type = 'button';
27
69
  inner.disabled = readonly;
28
- inner.addEventListener('click', () => form.setValue(name, step.value));
70
+ inner.dataset['key'] = step.key;
71
+ inner.addEventListener('click', () => pick(step));
29
72
  }
30
73
  inner.append(label);
74
+ // The time the record spent in it, when the app tells it.
75
+ if (times[i] > 0) {
76
+ const time = document.createElement('small');
77
+ time.className = 'fd-step-time';
78
+ time.textContent = timeSpent(times[i], locale);
79
+ inner.title = labels.timeInStep.replace('{time}', time.textContent);
80
+ inner.append(time);
81
+ }
31
82
  if (step.key === currentKey)
32
83
  inner.setAttribute('aria-current', 'step');
33
84
  const item = document.createElement('li');
34
85
  item.append(inner);
35
86
  return item;
36
- }));
87
+ });
88
+ if (folded.length)
89
+ items.push(moreItem(folded, readonly));
90
+ list.replaceChildren(...items);
91
+ // The menu is fixed to the page, so the bar's scrolling never cuts it: under More, from its end.
92
+ const menu = list.querySelector('.fd-step-menu:not([hidden])');
93
+ const toggle = menu?.previousElementSibling;
94
+ if (menu && toggle) {
95
+ const at = toggle.getBoundingClientRect();
96
+ const view = document.defaultView;
97
+ const rtl = getComputedStyle(list).direction === 'rtl';
98
+ menu.style.top = `${at.bottom + 4}px`;
99
+ if (rtl)
100
+ menu.style.left = `${at.left}px`;
101
+ else
102
+ menu.style.right = `${Math.max(0, (view?.innerWidth ?? at.right) - at.right)}px`;
103
+ }
104
+ if (focused)
105
+ [...list.querySelectorAll('button')].find((b) => b.dataset['key'] === focused)?.focus();
37
106
  }
107
+ /** The folded stages, in a menu at the bar's end: picked as any step when the bar can be clicked. */
108
+ function moreItem(folded, readonly) {
109
+ const item = document.createElement('li');
110
+ item.className = 'fd-step-more';
111
+ const toggle = document.createElement('button');
112
+ toggle.type = 'button';
113
+ toggle.dataset['key'] = 'more';
114
+ toggle.setAttribute('aria-haspopup', 'menu');
115
+ toggle.setAttribute('aria-expanded', String(menuOpen));
116
+ toggle.setAttribute('aria-label', labels.moreSteps);
117
+ toggle.title = labels.moreSteps;
118
+ const dots = document.createElement('span');
119
+ dots.textContent = '⋯';
120
+ dots.setAttribute('aria-hidden', 'true');
121
+ toggle.append(dots);
122
+ const menu = document.createElement('div');
123
+ menu.className = 'fd-step-menu';
124
+ menu.setAttribute('role', 'menu');
125
+ menu.hidden = !menuOpen;
126
+ for (const step of folded) {
127
+ const choice = document.createElement('button');
128
+ choice.type = 'button';
129
+ choice.setAttribute('role', 'menuitem');
130
+ choice.textContent = step.label;
131
+ choice.disabled = readonly || !clickable;
132
+ choice.addEventListener('click', () => {
133
+ menuOpen = false;
134
+ pick(step);
135
+ draw();
136
+ });
137
+ menu.append(choice);
138
+ }
139
+ toggle.addEventListener('click', () => {
140
+ menuOpen = !menuOpen;
141
+ draw();
142
+ if (menuOpen)
143
+ list.querySelector('.fd-step-menu button:not([disabled])')?.focus();
144
+ });
145
+ menu.addEventListener('keydown', (event) => {
146
+ if (event.key !== 'Escape')
147
+ return;
148
+ event.stopPropagation();
149
+ menuOpen = false;
150
+ draw();
151
+ list.querySelector('.fd-step-more > button')?.focus();
152
+ });
153
+ item.append(toggle, menu);
154
+ return item;
155
+ }
156
+ // A click elsewhere, or the page scrolled from under it, puts the menu away.
157
+ const away = (event) => {
158
+ if (menuOpen && !list.contains(event.target)) {
159
+ menuOpen = false;
160
+ draw();
161
+ }
162
+ };
163
+ document.addEventListener('pointerdown', away);
164
+ document.addEventListener('scroll', away, true);
38
165
  return {
39
166
  element: list,
40
167
  focus: () => list.querySelector('button:not([disabled])')?.focus(),
168
+ destroy() {
169
+ document.removeEventListener('pointerdown', away);
170
+ document.removeEventListener('scroll', away, true);
171
+ },
41
172
  update(state) {
42
- last = { value: state.value, readonly: state.readonly };
173
+ const durations = durationsField ? state.values?.[durationsField] : null;
174
+ last = { value: state.value, readonly: state.readonly, durations: durations && typeof durations === 'object' && !Array.isArray(durations) ? durations : {} };
43
175
  draw();
44
- if (!lookedUp) {
45
- lookedUp = true;
176
+ const key = field.type === 'selection' ? '' : JSON.stringify(reads.map((read) => state.values?.[read] ?? null));
177
+ if (lookedUp !== key) {
178
+ lookedUp = key;
179
+ const ask = ++asked;
46
180
  void form
47
181
  .search(name, '', 20)
48
182
  .then((records) => {
49
- steps = records.map((r) => ({ key: keyOf(r), label: r.label, value: r }));
183
+ // Only the latest answer counts: an earlier search may come back last.
184
+ if (ask !== asked)
185
+ return;
186
+ steps = records.map((r) => ({ key: keyOf(r), label: r.label, value: r, folded: r.folded === true }));
50
187
  draw();
51
188
  })
52
189
  .catch(() => undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"statusbar.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/statusbar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"statusbar.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/statusbar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The business widgets' part of the stylesheet: priority stars, a state's
3
+ * dot and its menu, a tag colour, a copy button, a range of dates, a running
4
+ * timer, a document shown inline, an analytic distribution, tax totals and a
5
+ * list of payments. Scoped, and written with logical properties, as the rest
6
+ * of it is; it comes after the inputs' part.
7
+ */
8
+ export declare const BUSINESS_CSS = "\n/* ---- business widgets ------------------------------------------------------- */\n/* Priority: grey stars, gold up to the one picked; hovered, they show what a click would pick. */\n.fd-priority { display: inline-flex; align-items: center; gap: 1px; }\n.fd-priority-star { border: none; background: none; padding: 0 1px; min-width: 0; font: inherit; font-size: 20px; line-height: 1; color: var(--fd-border-strong); cursor: pointer; }\n.fd-priority-star.fd-on { color: #e8a317; }\n.fd-priority:not(:has(:disabled)):hover .fd-priority-star { color: #e8a317; }\n.fd-priority:not(:has(:disabled)) .fd-priority-star:hover ~ .fd-priority-star { color: var(--fd-border-strong); }\n.fd-priority-star:disabled { cursor: default; }\n/* Fields on the title's line: a priority star before the name, a state's dot after it; the name keeps the room and its big words. */\n.fd-title-line { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; min-width: 0; }\n/* On a phone the name takes a row of its own rather than be cut. */\n.fd-title-line > .fd-title-name { flex: 1 1 18em; min-width: 0; }\n.fd-title-line > .fd-title-name .fd-input { font-size: 24px; font-weight: 600; min-height: 40px; }\n/* A read-only name on the title's line reads as the title too, as it does alone. */\n.fd-title-line > .fd-title-name > .fd-read-text { font-size: 24px; font-weight: 600; line-height: 1.25; }\n.fd-form .fd-title-line > .fd-field { grid-template-columns: minmax(0, 1fr); }\n.fd-form .fd-title-line > .fd-field > * { grid-column: 1 !important; }\n.fd-form .fd-title-line > .fd-title-side { display: flex; align-items: center; flex: none; }\n.fd-title-line > .fd-field > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n.fd-title-line .fd-priority-star { font-size: 24px; }\n/* A state's dot: grey, red, green\u2026, in the state's tone; its menu floats under it. */\n.fd-dot-box { position: relative; display: inline-flex; align-items: center; gap: 6px; }\n.fd-dot-button { display: inline-grid; place-items: center; width: 24px; height: 24px; padding: 0; border: none; border-radius: 50%; background: none; cursor: pointer; }\n.fd-dot-button:hover:not(:disabled) { background: var(--fd-accent-soft); }\n.fd-dot-button:disabled { cursor: default; }\n.fd-dot { display: inline-block; width: 12px; height: 12px; flex: none; border-radius: 50%; background: var(--fd-dot, var(--fd-border-strong)); }\n.fd-dot-button[data-tone=\"muted\"], .fd-dot-item[data-tone=\"muted\"] { --fd-dot: var(--fd-border-strong); }\n.fd-dot-button[data-tone=\"danger\"], .fd-dot-item[data-tone=\"danger\"] { --fd-dot: var(--fd-error); }\n.fd-dot-button[data-tone=\"success\"], .fd-dot-item[data-tone=\"success\"] { --fd-dot: var(--fd-success); }\n.fd-dot-button[data-tone=\"warning\"], .fd-dot-item[data-tone=\"warning\"] { --fd-dot: #d97706; }\n.fd-dot-button[data-tone=\"info\"], .fd-dot-item[data-tone=\"info\"] { --fd-dot: var(--fd-info); }\n.fd-dot-label { font-size: 13px; color: var(--fd-muted); }\n.fd-dot-menu { position: absolute; top: calc(100% + 4px); inset-inline-start: 0; z-index: 30; min-width: 180px; padding: 4px; display: grid; background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16); }\n.fd-dot-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: 4px; cursor: pointer; white-space: nowrap; font-size: 14px; }\n.fd-dot-item:hover, .fd-dot-item:focus { background: var(--fd-accent-soft); outline: none; }\n.fd-dot-item[aria-checked=\"true\"] { font-weight: 600; }\n/* A colour: a swatch of it, and a palette of Flectra's twelve under it; none is a crossed-out square. */\n.fd-colour-box { position: relative; display: inline-flex; align-items: center; gap: 8px; }\n.fd-colour-button, .fd-colour { width: 24px; height: 24px; padding: 0; border: 1px solid var(--fd-border-strong); border-radius: 4px; background: var(--fd-swatch, transparent); cursor: pointer; }\n.fd-colour-button:disabled { cursor: default; }\n.fd-colour-none, .fd-colour[data-colour=\"0\"] { background: linear-gradient(to top right, transparent calc(50% - 1px), var(--fd-error) calc(50% - 1px), var(--fd-error) calc(50% + 1px), transparent calc(50% + 1px)); }\n.fd-colour-palette { position: absolute; top: calc(100% + 4px); inset-inline-start: 0; z-index: 30; display: grid; grid-template-columns: repeat(6, 24px); gap: 6px; padding: 8px; background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16); }\n.fd-colour[aria-checked=\"true\"] { box-shadow: 0 0 0 2px var(--fd-surface), 0 0 0 4px var(--fd-accent); }\n.fd-colour-input { width: 44px; height: 30px; padding: 2px; border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); background: var(--fd-surface); }\n.fd-colour-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px; color: var(--fd-muted); }\n/* A value to copy: its box, the button after it. */\n.fd-copy { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.fd-copy > .fd-input { flex: 1 1 auto; min-width: 0; }\n.fd-copy-long { align-items: flex-start; }\n.fd-copy-button { flex: none; }\n/* A range of dates: two boxes, from \u2192 to, in one row that wraps on a phone, its calendar under it marking the days between. */\n.fd-range { position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }\n/* Too narrow for a date and the calendar's button beside it, the button goes under: a date is never cut. */\n.fd-range-box { flex: 1 1 8em; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; min-width: 0; }\n.fd-range-box > .fd-input { flex: 1 1 9em; min-width: 0; }\n.fd-range-box > .fd-input[type=\"datetime-local\"] { flex-basis: 13em; }\n.fd-range-arrow { flex: none; display: inline-block; color: var(--fd-muted); }\n.fd-range-arrow:dir(rtl) { transform: scaleX(-1); }\n.fd-range-calendar .fd-calendar-grid td button.fd-in-range { background: var(--fd-accent-soft); border-radius: 0; }\n/* A timer: its time in even digits, a green dot beating while it runs. */\n.fd-timer { display: inline-flex; align-items: center; gap: 8px; font-variant-numeric: tabular-nums; font-weight: 600; direction: ltr; unicode-bidi: isolate; }\n.fd-timer-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--fd-border-strong); }\n.fd-timer[data-running] .fd-timer-dot { background: var(--fd-success); animation: fd-timer-beat 1s ease-in-out infinite alternate; }\n.fd-timer[data-running] .fd-timer-time { color: var(--fd-success); }\n@keyframes fd-timer-beat { to { opacity: 0.35; } }\n@media (prefers-reduced-motion: reduce) { .fd-timer[data-running] .fd-timer-dot { animation: none; } }\n/* A document shown inline: the browser's own viewer, as wide as the field. */\n.fd-embed { display: grid; gap: 8px; min-width: 0; }\n.fd-embed-bar { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.fd-embed-bar > .fd-input { flex: 1 1 auto; min-width: 0; }\n.fd-embed-open { flex: none; }\n.fd-embed-frame { display: block; width: 100%; border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 4px); background: var(--fd-page); }\n.fd-embed-none { padding: 24px 12px; text-align: center; color: var(--fd-muted); border: 1px dashed var(--fd-border); border-radius: max(var(--fd-control-radius), 4px); }\n/* An analytic distribution: lines of an account and its share, their total under them. */\n.fd-distribution { display: grid; gap: 6px; min-width: 0; }\n.fd-distribution-table .fd-distribution-share { width: 8.5em; }\n.fd-distribution-table .fd-share { text-align: end; padding-inline-end: calc(var(--fd-pad-x) + 2ch); }\n.fd-distribution-total { font-weight: 600; text-align: end; padding-inline-end: calc(var(--fd-pad-x) + 2ch + 4px); font-variant-numeric: tabular-nums; }\n.fd-distribution-add { justify-self: start; }\n/* Tax totals: words at the start, amounts at the end in even digits, the total in bold over a rule. */\n.fd-tax-totals { justify-self: end; border-collapse: collapse; min-width: min(100%, 320px); font-variant-numeric: tabular-nums; }\n.fd-tax-totals th { text-align: start; font-weight: 400; color: var(--fd-muted); padding: 3px 16px 3px 0; padding-inline: 0 16px; }\n.fd-tax-totals td { text-align: end; padding: 3px 0; white-space: nowrap; }\n.fd-tax-totals .fd-tax-subtotal th { color: var(--fd-text); }\n.fd-tax-totals .fd-tax-total :is(th, td) { font-weight: 700; color: var(--fd-text); font-size: 15px; border-top: 1px solid var(--fd-border); padding-top: 6px; }\n.fd-tax-totals .fd-input { width: 9em; text-align: end; }\n/* Payments: each one's button, \"Paid on \u2026\" and its amount; its details in a small box under it; the amount due in bold. */\n.fd-payments { display: grid; gap: 6px; justify-self: end; min-width: min(100%, 320px); font-variant-numeric: tabular-nums; }\n.fd-payments-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }\n.fd-payment { position: relative; display: flex; align-items: center; gap: 8px; }\n.fd-payment-info { flex: none; width: 20px; height: 20px; padding: 0; border: 1px solid var(--fd-border-strong); border-radius: 50%; background: var(--fd-surface); color: var(--fd-muted); font: italic 600 12px/1 Georgia, serif; cursor: pointer; }\n.fd-payment-info:hover, .fd-payment-info[aria-expanded=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-payment-date { flex: 1 1 auto; font-style: italic; color: var(--fd-muted); }\n.fd-payment-amount { white-space: nowrap; }\n.fd-payment-details { position: absolute; top: calc(100% + 4px); inset-inline-start: 0; z-index: 30; min-width: 240px; display: grid; gap: 6px; padding: 10px 12px; background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16); }\n.fd-payment-details dl { display: grid; grid-template-columns: auto 1fr; gap: 2px 12px; margin: 0; }\n.fd-payment-details dt { color: var(--fd-muted); }\n.fd-payment-details dd { margin: 0; }\n.fd-payment-open { justify-self: start; }\n.fd-payment-due { display: flex; justify-content: space-between; gap: 16px; padding-top: 6px; border-top: 1px solid var(--fd-border); font-weight: 600; }\n/* Properties: in two columns when asked, one on a narrow form; adding one in place, its name and kind in a row. */\n.fd-properties-list { display: grid; gap: 8px; min-width: 0; }\n.fd-properties[data-columns=\"2\"] > .fd-properties-list { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 24px; }\n@container (max-width: 520px) { .fd-properties[data-columns=\"2\"] > .fd-properties-list { grid-template-columns: minmax(0, 1fr); } }\n.fd-property-add { justify-self: start; }\n.fd-property-new { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }\n.fd-property-new > .fd-input { flex: 1 1 10em; width: auto; }\n";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The business widgets' part of the stylesheet: priority stars, a state's
3
+ * dot and its menu, a tag colour, a copy button, a range of dates, a running
4
+ * timer, a document shown inline, an analytic distribution, tax totals and a
5
+ * list of payments. Scoped, and written with logical properties, as the rest
6
+ * of it is; it comes after the inputs' part.
7
+ */
8
+ export declare const BUSINESS_CSS = "\n/* ---- business widgets ------------------------------------------------------- */\n/* Priority: grey stars, gold up to the one picked; hovered, they show what a click would pick. */\n.fd-priority { display: inline-flex; align-items: center; gap: 1px; }\n.fd-priority-star { border: none; background: none; padding: 0 1px; min-width: 0; font: inherit; font-size: 20px; line-height: 1; color: var(--fd-border-strong); cursor: pointer; }\n.fd-priority-star.fd-on { color: #e8a317; }\n.fd-priority:not(:has(:disabled)):hover .fd-priority-star { color: #e8a317; }\n.fd-priority:not(:has(:disabled)) .fd-priority-star:hover ~ .fd-priority-star { color: var(--fd-border-strong); }\n.fd-priority-star:disabled { cursor: default; }\n/* Fields on the title's line: a priority star before the name, a state's dot after it; the name keeps the room and its big words. */\n.fd-title-line { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; min-width: 0; }\n/* On a phone the name takes a row of its own rather than be cut. */\n.fd-title-line > .fd-title-name { flex: 1 1 18em; min-width: 0; }\n.fd-title-line > .fd-title-name .fd-input { font-size: 24px; font-weight: 600; min-height: 40px; }\n/* A read-only name on the title's line reads as the title too, as it does alone. */\n.fd-title-line > .fd-title-name > .fd-read-text { font-size: 24px; font-weight: 600; line-height: 1.25; }\n.fd-form .fd-title-line > .fd-field { grid-template-columns: minmax(0, 1fr); }\n.fd-form .fd-title-line > .fd-field > * { grid-column: 1 !important; }\n.fd-form .fd-title-line > .fd-title-side { display: flex; align-items: center; flex: none; }\n.fd-title-line > .fd-field > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n.fd-title-line .fd-priority-star { font-size: 24px; }\n/* A state's dot: grey, red, green\u2026, in the state's tone; its menu floats under it. */\n.fd-dot-box { position: relative; display: inline-flex; align-items: center; gap: 6px; }\n.fd-dot-button { display: inline-grid; place-items: center; width: 24px; height: 24px; padding: 0; border: none; border-radius: 50%; background: none; cursor: pointer; }\n.fd-dot-button:hover:not(:disabled) { background: var(--fd-accent-soft); }\n.fd-dot-button:disabled { cursor: default; }\n.fd-dot { display: inline-block; width: 12px; height: 12px; flex: none; border-radius: 50%; background: var(--fd-dot, var(--fd-border-strong)); }\n.fd-dot-button[data-tone=\"muted\"], .fd-dot-item[data-tone=\"muted\"] { --fd-dot: var(--fd-border-strong); }\n.fd-dot-button[data-tone=\"danger\"], .fd-dot-item[data-tone=\"danger\"] { --fd-dot: var(--fd-error); }\n.fd-dot-button[data-tone=\"success\"], .fd-dot-item[data-tone=\"success\"] { --fd-dot: var(--fd-success); }\n.fd-dot-button[data-tone=\"warning\"], .fd-dot-item[data-tone=\"warning\"] { --fd-dot: #d97706; }\n.fd-dot-button[data-tone=\"info\"], .fd-dot-item[data-tone=\"info\"] { --fd-dot: var(--fd-info); }\n.fd-dot-label { font-size: 13px; color: var(--fd-muted); }\n.fd-dot-menu { position: absolute; top: calc(100% + 4px); inset-inline-start: 0; z-index: 30; min-width: 180px; padding: 4px; display: grid; background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16); }\n.fd-dot-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: 4px; cursor: pointer; white-space: nowrap; font-size: 14px; }\n.fd-dot-item:hover, .fd-dot-item:focus { background: var(--fd-accent-soft); outline: none; }\n.fd-dot-item[aria-checked=\"true\"] { font-weight: 600; }\n/* A colour: a swatch of it, and a palette of Flectra's twelve under it; none is a crossed-out square. */\n.fd-colour-box { position: relative; display: inline-flex; align-items: center; gap: 8px; }\n.fd-colour-button, .fd-colour { width: 24px; height: 24px; padding: 0; border: 1px solid var(--fd-border-strong); border-radius: 4px; background: var(--fd-swatch, transparent); cursor: pointer; }\n.fd-colour-button:disabled { cursor: default; }\n.fd-colour-none, .fd-colour[data-colour=\"0\"] { background: linear-gradient(to top right, transparent calc(50% - 1px), var(--fd-error) calc(50% - 1px), var(--fd-error) calc(50% + 1px), transparent calc(50% + 1px)); }\n.fd-colour-palette { position: absolute; top: calc(100% + 4px); inset-inline-start: 0; z-index: 30; display: grid; grid-template-columns: repeat(6, 24px); gap: 6px; padding: 8px; background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16); }\n.fd-colour[aria-checked=\"true\"] { box-shadow: 0 0 0 2px var(--fd-surface), 0 0 0 4px var(--fd-accent); }\n.fd-colour-input { width: 44px; height: 30px; padding: 2px; border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); background: var(--fd-surface); }\n.fd-colour-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px; color: var(--fd-muted); }\n/* A value to copy: its box, the button after it. */\n.fd-copy { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.fd-copy > .fd-input { flex: 1 1 auto; min-width: 0; }\n.fd-copy-long { align-items: flex-start; }\n.fd-copy-button { flex: none; }\n/* A range of dates: two boxes, from \u2192 to, in one row that wraps on a phone, its calendar under it marking the days between. */\n.fd-range { position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }\n/* Too narrow for a date and the calendar's button beside it, the button goes under: a date is never cut. */\n.fd-range-box { flex: 1 1 8em; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; min-width: 0; }\n.fd-range-box > .fd-input { flex: 1 1 9em; min-width: 0; }\n.fd-range-box > .fd-input[type=\"datetime-local\"] { flex-basis: 13em; }\n.fd-range-arrow { flex: none; display: inline-block; color: var(--fd-muted); }\n.fd-range-arrow:dir(rtl) { transform: scaleX(-1); }\n.fd-range-calendar .fd-calendar-grid td button.fd-in-range { background: var(--fd-accent-soft); border-radius: 0; }\n/* A timer: its time in even digits, a green dot beating while it runs. */\n.fd-timer { display: inline-flex; align-items: center; gap: 8px; font-variant-numeric: tabular-nums; font-weight: 600; direction: ltr; unicode-bidi: isolate; }\n.fd-timer-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--fd-border-strong); }\n.fd-timer[data-running] .fd-timer-dot { background: var(--fd-success); animation: fd-timer-beat 1s ease-in-out infinite alternate; }\n.fd-timer[data-running] .fd-timer-time { color: var(--fd-success); }\n@keyframes fd-timer-beat { to { opacity: 0.35; } }\n@media (prefers-reduced-motion: reduce) { .fd-timer[data-running] .fd-timer-dot { animation: none; } }\n/* A document shown inline: the browser's own viewer, as wide as the field. */\n.fd-embed { display: grid; gap: 8px; min-width: 0; }\n.fd-embed-bar { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.fd-embed-bar > .fd-input { flex: 1 1 auto; min-width: 0; }\n.fd-embed-open { flex: none; }\n.fd-embed-frame { display: block; width: 100%; border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 4px); background: var(--fd-page); }\n.fd-embed-none { padding: 24px 12px; text-align: center; color: var(--fd-muted); border: 1px dashed var(--fd-border); border-radius: max(var(--fd-control-radius), 4px); }\n/* An analytic distribution: lines of an account and its share, their total under them. */\n.fd-distribution { display: grid; gap: 6px; min-width: 0; }\n.fd-distribution-table .fd-distribution-share { width: 8.5em; }\n.fd-distribution-table .fd-share { text-align: end; padding-inline-end: calc(var(--fd-pad-x) + 2ch); }\n.fd-distribution-total { font-weight: 600; text-align: end; padding-inline-end: calc(var(--fd-pad-x) + 2ch + 4px); font-variant-numeric: tabular-nums; }\n.fd-distribution-add { justify-self: start; }\n/* Tax totals: words at the start, amounts at the end in even digits, the total in bold over a rule. */\n.fd-tax-totals { justify-self: end; border-collapse: collapse; min-width: min(100%, 320px); font-variant-numeric: tabular-nums; }\n.fd-tax-totals th { text-align: start; font-weight: 400; color: var(--fd-muted); padding: 3px 16px 3px 0; padding-inline: 0 16px; }\n.fd-tax-totals td { text-align: end; padding: 3px 0; white-space: nowrap; }\n.fd-tax-totals .fd-tax-subtotal th { color: var(--fd-text); }\n.fd-tax-totals .fd-tax-total :is(th, td) { font-weight: 700; color: var(--fd-text); font-size: 15px; border-top: 1px solid var(--fd-border); padding-top: 6px; }\n.fd-tax-totals .fd-input { width: 9em; text-align: end; }\n/* Payments: each one's button, \"Paid on \u2026\" and its amount; its details in a small box under it; the amount due in bold. */\n.fd-payments { display: grid; gap: 6px; justify-self: end; min-width: min(100%, 320px); font-variant-numeric: tabular-nums; }\n.fd-payments-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }\n.fd-payment { position: relative; display: flex; align-items: center; gap: 8px; }\n.fd-payment-info { flex: none; width: 20px; height: 20px; padding: 0; border: 1px solid var(--fd-border-strong); border-radius: 50%; background: var(--fd-surface); color: var(--fd-muted); font: italic 600 12px/1 Georgia, serif; cursor: pointer; }\n.fd-payment-info:hover, .fd-payment-info[aria-expanded=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-payment-date { flex: 1 1 auto; font-style: italic; color: var(--fd-muted); }\n.fd-payment-amount { white-space: nowrap; }\n.fd-payment-details { position: absolute; top: calc(100% + 4px); inset-inline-start: 0; z-index: 30; min-width: 240px; display: grid; gap: 6px; padding: 10px 12px; background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16); }\n.fd-payment-details dl { display: grid; grid-template-columns: auto 1fr; gap: 2px 12px; margin: 0; }\n.fd-payment-details dt { color: var(--fd-muted); }\n.fd-payment-details dd { margin: 0; }\n.fd-payment-open { justify-self: start; }\n.fd-payment-due { display: flex; justify-content: space-between; gap: 16px; padding-top: 6px; border-top: 1px solid var(--fd-border); font-weight: 600; }\n/* Properties: in two columns when asked, one on a narrow form; adding one in place, its name and kind in a row. */\n.fd-properties-list { display: grid; gap: 8px; min-width: 0; }\n.fd-properties[data-columns=\"2\"] > .fd-properties-list { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 24px; }\n@container (max-width: 520px) { .fd-properties[data-columns=\"2\"] > .fd-properties-list { grid-template-columns: minmax(0, 1fr); } }\n.fd-property-add { justify-self: start; }\n.fd-property-new { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }\n.fd-property-new > .fd-input { flex: 1 1 10em; width: auto; }\n";