@fieldia/widgets 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 (243) hide show
  1. package/package.json +2 -2
  2. package/src/index.d.mts +2 -0
  3. package/src/index.d.ts +2 -0
  4. package/src/index.js +6 -1
  5. package/src/index.js.map +1 -1
  6. package/src/index.mjs +2 -0
  7. package/src/index.mjs.map +1 -1
  8. package/src/lib/badge.d.mts +8 -0
  9. package/src/lib/badge.d.ts +8 -0
  10. package/src/lib/badge.js +37 -0
  11. package/src/lib/badge.js.map +1 -0
  12. package/src/lib/badge.mjs +33 -0
  13. package/src/lib/badge.mjs.map +1 -0
  14. package/src/lib/calendar.d.mts +3 -1
  15. package/src/lib/calendar.d.ts +3 -1
  16. package/src/lib/calendar.js +17 -1
  17. package/src/lib/calendar.js.map +1 -1
  18. package/src/lib/calendar.mjs +17 -1
  19. package/src/lib/calendar.mjs.map +1 -1
  20. package/src/lib/cards.js +12 -4
  21. package/src/lib/cards.js.map +1 -1
  22. package/src/lib/cards.mjs +13 -5
  23. package/src/lib/cards.mjs.map +1 -1
  24. package/src/lib/choice-images.js +1 -1
  25. package/src/lib/choice-images.js.map +1 -1
  26. package/src/lib/choice-images.mjs +1 -1
  27. package/src/lib/choice-images.mjs.map +1 -1
  28. package/src/lib/choice-tags.js +6 -4
  29. package/src/lib/choice-tags.js.map +1 -1
  30. package/src/lib/choice-tags.mjs +6 -4
  31. package/src/lib/choice-tags.mjs.map +1 -1
  32. package/src/lib/colour.d.mts +11 -0
  33. package/src/lib/colour.d.ts +11 -0
  34. package/src/lib/colour.js +114 -0
  35. package/src/lib/colour.js.map +1 -0
  36. package/src/lib/colour.mjs +110 -0
  37. package/src/lib/colour.mjs.map +1 -0
  38. package/src/lib/copy.d.mts +8 -0
  39. package/src/lib/copy.d.ts +8 -0
  40. package/src/lib/copy.js +58 -0
  41. package/src/lib/copy.js.map +1 -0
  42. package/src/lib/copy.mjs +54 -0
  43. package/src/lib/copy.mjs.map +1 -0
  44. package/src/lib/date-range.d.mts +2 -0
  45. package/src/lib/date-range.d.ts +2 -0
  46. package/src/lib/date-range.js +220 -0
  47. package/src/lib/date-range.js.map +1 -0
  48. package/src/lib/date-range.mjs +216 -0
  49. package/src/lib/date-range.mjs.map +1 -0
  50. package/src/lib/display.d.mts +25 -1
  51. package/src/lib/display.d.ts +25 -1
  52. package/src/lib/display.js +42 -2
  53. package/src/lib/display.js.map +1 -1
  54. package/src/lib/display.mjs +39 -2
  55. package/src/lib/display.mjs.map +1 -1
  56. package/src/lib/distribution.d.mts +13 -0
  57. package/src/lib/distribution.d.ts +13 -0
  58. package/src/lib/distribution.js +159 -0
  59. package/src/lib/distribution.js.map +1 -0
  60. package/src/lib/distribution.mjs +152 -0
  61. package/src/lib/distribution.mjs.map +1 -0
  62. package/src/lib/duration.d.mts +18 -0
  63. package/src/lib/duration.d.ts +18 -0
  64. package/src/lib/duration.js +137 -0
  65. package/src/lib/duration.js.map +1 -0
  66. package/src/lib/duration.mjs +128 -0
  67. package/src/lib/duration.mjs.map +1 -0
  68. package/src/lib/embed.d.mts +3 -0
  69. package/src/lib/embed.d.ts +3 -0
  70. package/src/lib/embed.js +97 -0
  71. package/src/lib/embed.js.map +1 -0
  72. package/src/lib/embed.mjs +92 -0
  73. package/src/lib/embed.mjs.map +1 -0
  74. package/src/lib/extras.js +6 -0
  75. package/src/lib/extras.js.map +1 -1
  76. package/src/lib/extras.mjs +6 -0
  77. package/src/lib/extras.mjs.map +1 -1
  78. package/src/lib/files.d.mts +11 -0
  79. package/src/lib/files.d.ts +11 -0
  80. package/src/lib/files.js +19 -0
  81. package/src/lib/files.js.map +1 -1
  82. package/src/lib/files.mjs +18 -0
  83. package/src/lib/files.mjs.map +1 -1
  84. package/src/lib/float.d.mts +14 -0
  85. package/src/lib/float.d.ts +14 -0
  86. package/src/lib/float.js +91 -0
  87. package/src/lib/float.js.map +1 -0
  88. package/src/lib/float.mjs +88 -0
  89. package/src/lib/float.mjs.map +1 -0
  90. package/src/lib/kind-parts.d.mts +4 -3
  91. package/src/lib/kind-parts.d.ts +4 -3
  92. package/src/lib/kind-parts.js +5 -3
  93. package/src/lib/kind-parts.js.map +1 -1
  94. package/src/lib/kind-parts.mjs +5 -3
  95. package/src/lib/kind-parts.mjs.map +1 -1
  96. package/src/lib/labels.d.mts +39 -0
  97. package/src/lib/labels.d.ts +39 -0
  98. package/src/lib/labels.js +29 -0
  99. package/src/lib/labels.js.map +1 -1
  100. package/src/lib/labels.mjs +29 -0
  101. package/src/lib/labels.mjs.map +1 -1
  102. package/src/lib/layout-styles.d.mts +1 -1
  103. package/src/lib/layout-styles.d.ts +1 -1
  104. package/src/lib/layout-styles.js +12 -5
  105. package/src/lib/layout-styles.js.map +1 -1
  106. package/src/lib/layout-styles.mjs +12 -5
  107. package/src/lib/layout-styles.mjs.map +1 -1
  108. package/src/lib/lines.d.mts +12 -2
  109. package/src/lib/lines.d.ts +12 -2
  110. package/src/lib/lines.js +372 -25
  111. package/src/lib/lines.js.map +1 -1
  112. package/src/lib/lines.mjs +371 -26
  113. package/src/lib/lines.mjs.map +1 -1
  114. package/src/lib/links-table.d.mts +11 -0
  115. package/src/lib/links-table.d.ts +11 -0
  116. package/src/lib/links-table.js +116 -0
  117. package/src/lib/links-table.js.map +1 -0
  118. package/src/lib/links-table.mjs +112 -0
  119. package/src/lib/links-table.mjs.map +1 -0
  120. package/src/lib/locales/ar.js +29 -0
  121. package/src/lib/locales/ar.js.map +1 -1
  122. package/src/lib/locales/ar.mjs +29 -0
  123. package/src/lib/locales/ar.mjs.map +1 -1
  124. package/src/lib/locales/de.js +29 -0
  125. package/src/lib/locales/de.js.map +1 -1
  126. package/src/lib/locales/de.mjs +29 -0
  127. package/src/lib/locales/de.mjs.map +1 -1
  128. package/src/lib/locales/fr.js +29 -0
  129. package/src/lib/locales/fr.js.map +1 -1
  130. package/src/lib/locales/fr.mjs +29 -0
  131. package/src/lib/locales/fr.mjs.map +1 -1
  132. package/src/lib/numbers.d.mts +5 -1
  133. package/src/lib/numbers.d.ts +5 -1
  134. package/src/lib/numbers.js +15 -2
  135. package/src/lib/numbers.js.map +1 -1
  136. package/src/lib/numbers.mjs +13 -2
  137. package/src/lib/numbers.mjs.map +1 -1
  138. package/src/lib/payments.d.mts +2 -0
  139. package/src/lib/payments.d.ts +2 -0
  140. package/src/lib/payments.js +94 -0
  141. package/src/lib/payments.js.map +1 -0
  142. package/src/lib/payments.mjs +90 -0
  143. package/src/lib/payments.mjs.map +1 -0
  144. package/src/lib/popup.d.mts +11 -0
  145. package/src/lib/popup.d.ts +11 -0
  146. package/src/lib/popup.js +48 -0
  147. package/src/lib/popup.js.map +1 -0
  148. package/src/lib/popup.mjs +45 -0
  149. package/src/lib/popup.mjs.map +1 -0
  150. package/src/lib/priority.d.mts +10 -0
  151. package/src/lib/priority.d.ts +10 -0
  152. package/src/lib/priority.js +59 -0
  153. package/src/lib/priority.js.map +1 -0
  154. package/src/lib/priority.mjs +55 -0
  155. package/src/lib/priority.mjs.map +1 -0
  156. package/src/lib/progress.js +3 -0
  157. package/src/lib/progress.js.map +1 -1
  158. package/src/lib/progress.mjs +3 -0
  159. package/src/lib/progress.mjs.map +1 -1
  160. package/src/lib/properties.js +100 -9
  161. package/src/lib/properties.js.map +1 -1
  162. package/src/lib/properties.mjs +100 -9
  163. package/src/lib/properties.mjs.map +1 -1
  164. package/src/lib/read-text.d.mts +25 -0
  165. package/src/lib/read-text.d.ts +25 -0
  166. package/src/lib/read-text.js +102 -0
  167. package/src/lib/read-text.js.map +1 -0
  168. package/src/lib/read-text.mjs +98 -0
  169. package/src/lib/read-text.mjs.map +1 -0
  170. package/src/lib/relations.d.mts +12 -0
  171. package/src/lib/relations.d.ts +12 -0
  172. package/src/lib/relations.js +110 -10
  173. package/src/lib/relations.js.map +1 -1
  174. package/src/lib/relations.mjs +108 -10
  175. package/src/lib/relations.mjs.map +1 -1
  176. package/src/lib/slider.js +1 -1
  177. package/src/lib/slider.js.map +1 -1
  178. package/src/lib/slider.mjs +1 -1
  179. package/src/lib/slider.mjs.map +1 -1
  180. package/src/lib/state-dot.d.mts +2 -0
  181. package/src/lib/state-dot.d.ts +2 -0
  182. package/src/lib/state-dot.js +107 -0
  183. package/src/lib/state-dot.js.map +1 -0
  184. package/src/lib/state-dot.mjs +103 -0
  185. package/src/lib/state-dot.mjs.map +1 -0
  186. package/src/lib/statusbar.js +151 -14
  187. package/src/lib/statusbar.js.map +1 -1
  188. package/src/lib/statusbar.mjs +151 -14
  189. package/src/lib/statusbar.mjs.map +1 -1
  190. package/src/lib/styles-business.d.mts +8 -0
  191. package/src/lib/styles-business.d.ts +8 -0
  192. package/src/lib/styles-business.js +120 -0
  193. package/src/lib/styles-business.js.map +1 -0
  194. package/src/lib/styles-business.mjs +117 -0
  195. package/src/lib/styles-business.mjs.map +1 -0
  196. package/src/lib/styles-inputs.d.mts +1 -1
  197. package/src/lib/styles-inputs.d.ts +1 -1
  198. package/src/lib/styles-inputs.js +2 -0
  199. package/src/lib/styles-inputs.js.map +1 -1
  200. package/src/lib/styles-inputs.mjs +2 -0
  201. package/src/lib/styles-inputs.mjs.map +1 -1
  202. package/src/lib/styles-kinds.d.mts +1 -1
  203. package/src/lib/styles-kinds.d.ts +1 -1
  204. package/src/lib/styles-kinds.js +2 -2
  205. package/src/lib/styles-kinds.mjs +2 -2
  206. package/src/lib/styles-sheet.d.mts +6 -0
  207. package/src/lib/styles-sheet.d.ts +6 -0
  208. package/src/lib/styles-sheet.js +139 -0
  209. package/src/lib/styles-sheet.js.map +1 -0
  210. package/src/lib/styles-sheet.mjs +136 -0
  211. package/src/lib/styles-sheet.mjs.map +1 -0
  212. package/src/lib/styles.js +223 -27
  213. package/src/lib/styles.js.map +1 -1
  214. package/src/lib/styles.mjs +223 -27
  215. package/src/lib/styles.mjs.map +1 -1
  216. package/src/lib/tax-totals.d.mts +2 -0
  217. package/src/lib/tax-totals.d.ts +2 -0
  218. package/src/lib/tax-totals.js +92 -0
  219. package/src/lib/tax-totals.js.map +1 -0
  220. package/src/lib/tax-totals.mjs +88 -0
  221. package/src/lib/tax-totals.mjs.map +1 -0
  222. package/src/lib/themes.d.mts +29 -0
  223. package/src/lib/themes.d.ts +29 -0
  224. package/src/lib/themes.js +180 -0
  225. package/src/lib/themes.js.map +1 -0
  226. package/src/lib/themes.mjs +177 -0
  227. package/src/lib/themes.mjs.map +1 -0
  228. package/src/lib/timer.d.mts +4 -0
  229. package/src/lib/timer.d.ts +4 -0
  230. package/src/lib/timer.js +62 -0
  231. package/src/lib/timer.js.map +1 -0
  232. package/src/lib/timer.mjs +57 -0
  233. package/src/lib/timer.mjs.map +1 -0
  234. package/src/lib/widgets.d.mts +18 -3
  235. package/src/lib/widgets.d.ts +18 -3
  236. package/src/lib/widgets.js +89 -10
  237. package/src/lib/widgets.js.map +1 -1
  238. package/src/lib/widgets.mjs +90 -11
  239. package/src/lib/widgets.mjs.map +1 -1
  240. package/src/lib/yes-no.js +1 -1
  241. package/src/lib/yes-no.js.map +1 -1
  242. package/src/lib/yes-no.mjs +1 -1
  243. package/src/lib/yes-no.mjs.map +1 -1
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BUSINESS_CSS = void 0;
4
+ /**
5
+ * The business widgets' part of the stylesheet: priority stars, a state's
6
+ * dot and its menu, a tag colour, a copy button, a range of dates, a running
7
+ * timer, a document shown inline, an analytic distribution, tax totals and a
8
+ * list of payments. Scoped, and written with logical properties, as the rest
9
+ * of it is; it comes after the inputs' part.
10
+ */
11
+ exports.BUSINESS_CSS = `
12
+ /* ---- business widgets ------------------------------------------------------- */
13
+ /* Priority: grey stars, gold up to the one picked; hovered, they show what a click would pick. */
14
+ .fd-priority { display: inline-flex; align-items: center; gap: 1px; }
15
+ .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; }
16
+ .fd-priority-star.fd-on { color: #e8a317; }
17
+ .fd-priority:not(:has(:disabled)):hover .fd-priority-star { color: #e8a317; }
18
+ .fd-priority:not(:has(:disabled)) .fd-priority-star:hover ~ .fd-priority-star { color: var(--fd-border-strong); }
19
+ .fd-priority-star:disabled { cursor: default; }
20
+ /* 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. */
21
+ .fd-title-line { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; min-width: 0; }
22
+ /* On a phone the name takes a row of its own rather than be cut. */
23
+ .fd-title-line > .fd-title-name { flex: 1 1 18em; min-width: 0; }
24
+ .fd-title-line > .fd-title-name .fd-input { font-size: 24px; font-weight: 600; min-height: 40px; }
25
+ /* A read-only name on the title's line reads as the title too, as it does alone. */
26
+ .fd-title-line > .fd-title-name > .fd-read-text { font-size: 24px; font-weight: 600; line-height: 1.25; }
27
+ .fd-form .fd-title-line > .fd-field { grid-template-columns: minmax(0, 1fr); }
28
+ .fd-form .fd-title-line > .fd-field > * { grid-column: 1 !important; }
29
+ .fd-form .fd-title-line > .fd-title-side { display: flex; align-items: center; flex: none; }
30
+ .fd-title-line > .fd-field > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
31
+ .fd-title-line .fd-priority-star { font-size: 24px; }
32
+ /* A state's dot: grey, red, green…, in the state's tone; its menu floats under it. */
33
+ .fd-dot-box { position: relative; display: inline-flex; align-items: center; gap: 6px; }
34
+ .fd-dot-button { display: inline-grid; place-items: center; width: 24px; height: 24px; padding: 0; border: none; border-radius: 50%; background: none; cursor: pointer; }
35
+ .fd-dot-button:hover:not(:disabled) { background: var(--fd-accent-soft); }
36
+ .fd-dot-button:disabled { cursor: default; }
37
+ .fd-dot { display: inline-block; width: 12px; height: 12px; flex: none; border-radius: 50%; background: var(--fd-dot, var(--fd-border-strong)); }
38
+ .fd-dot-button[data-tone="muted"], .fd-dot-item[data-tone="muted"] { --fd-dot: var(--fd-border-strong); }
39
+ .fd-dot-button[data-tone="danger"], .fd-dot-item[data-tone="danger"] { --fd-dot: var(--fd-error); }
40
+ .fd-dot-button[data-tone="success"], .fd-dot-item[data-tone="success"] { --fd-dot: var(--fd-success); }
41
+ .fd-dot-button[data-tone="warning"], .fd-dot-item[data-tone="warning"] { --fd-dot: #d97706; }
42
+ .fd-dot-button[data-tone="info"], .fd-dot-item[data-tone="info"] { --fd-dot: var(--fd-info); }
43
+ .fd-dot-label { font-size: 13px; color: var(--fd-muted); }
44
+ .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); }
45
+ .fd-dot-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: 4px; cursor: pointer; white-space: nowrap; font-size: 14px; }
46
+ .fd-dot-item:hover, .fd-dot-item:focus { background: var(--fd-accent-soft); outline: none; }
47
+ .fd-dot-item[aria-checked="true"] { font-weight: 600; }
48
+ /* A colour: a swatch of it, and a palette of Flectra's twelve under it; none is a crossed-out square. */
49
+ .fd-colour-box { position: relative; display: inline-flex; align-items: center; gap: 8px; }
50
+ .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; }
51
+ .fd-colour-button:disabled { cursor: default; }
52
+ .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)); }
53
+ .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); }
54
+ .fd-colour[aria-checked="true"] { box-shadow: 0 0 0 2px var(--fd-surface), 0 0 0 4px var(--fd-accent); }
55
+ .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); }
56
+ .fd-colour-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px; color: var(--fd-muted); }
57
+ /* A value to copy: its box, the button after it. */
58
+ .fd-copy { display: flex; align-items: center; gap: 8px; min-width: 0; }
59
+ .fd-copy > .fd-input { flex: 1 1 auto; min-width: 0; }
60
+ .fd-copy-long { align-items: flex-start; }
61
+ .fd-copy-button { flex: none; }
62
+ /* A range of dates: two boxes, from → to, in one row that wraps on a phone, its calendar under it marking the days between. */
63
+ .fd-range { position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }
64
+ /* Too narrow for a date and the calendar's button beside it, the button goes under: a date is never cut. */
65
+ .fd-range-box { flex: 1 1 8em; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; min-width: 0; }
66
+ .fd-range-box > .fd-input { flex: 1 1 9em; min-width: 0; }
67
+ .fd-range-box > .fd-input[type="datetime-local"] { flex-basis: 13em; }
68
+ .fd-range-arrow { flex: none; display: inline-block; color: var(--fd-muted); }
69
+ .fd-range-arrow:dir(rtl) { transform: scaleX(-1); }
70
+ .fd-range-calendar .fd-calendar-grid td button.fd-in-range { background: var(--fd-accent-soft); border-radius: 0; }
71
+ /* A timer: its time in even digits, a green dot beating while it runs. */
72
+ .fd-timer { display: inline-flex; align-items: center; gap: 8px; font-variant-numeric: tabular-nums; font-weight: 600; direction: ltr; unicode-bidi: isolate; }
73
+ .fd-timer-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--fd-border-strong); }
74
+ .fd-timer[data-running] .fd-timer-dot { background: var(--fd-success); animation: fd-timer-beat 1s ease-in-out infinite alternate; }
75
+ .fd-timer[data-running] .fd-timer-time { color: var(--fd-success); }
76
+ @keyframes fd-timer-beat { to { opacity: 0.35; } }
77
+ @media (prefers-reduced-motion: reduce) { .fd-timer[data-running] .fd-timer-dot { animation: none; } }
78
+ /* A document shown inline: the browser's own viewer, as wide as the field. */
79
+ .fd-embed { display: grid; gap: 8px; min-width: 0; }
80
+ .fd-embed-bar { display: flex; align-items: center; gap: 8px; min-width: 0; }
81
+ .fd-embed-bar > .fd-input { flex: 1 1 auto; min-width: 0; }
82
+ .fd-embed-open { flex: none; }
83
+ .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); }
84
+ .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); }
85
+ /* An analytic distribution: lines of an account and its share, their total under them. */
86
+ .fd-distribution { display: grid; gap: 6px; min-width: 0; }
87
+ .fd-distribution-table .fd-distribution-share { width: 8.5em; }
88
+ .fd-distribution-table .fd-share { text-align: end; padding-inline-end: calc(var(--fd-pad-x) + 2ch); }
89
+ .fd-distribution-total { font-weight: 600; text-align: end; padding-inline-end: calc(var(--fd-pad-x) + 2ch + 4px); font-variant-numeric: tabular-nums; }
90
+ .fd-distribution-add { justify-self: start; }
91
+ /* Tax totals: words at the start, amounts at the end in even digits, the total in bold over a rule. */
92
+ .fd-tax-totals { justify-self: end; border-collapse: collapse; min-width: min(100%, 320px); font-variant-numeric: tabular-nums; }
93
+ .fd-tax-totals th { text-align: start; font-weight: 400; color: var(--fd-muted); padding: 3px 16px 3px 0; padding-inline: 0 16px; }
94
+ .fd-tax-totals td { text-align: end; padding: 3px 0; white-space: nowrap; }
95
+ .fd-tax-totals .fd-tax-subtotal th { color: var(--fd-text); }
96
+ .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; }
97
+ .fd-tax-totals .fd-input { width: 9em; text-align: end; }
98
+ /* Payments: each one's button, "Paid on …" and its amount; its details in a small box under it; the amount due in bold. */
99
+ .fd-payments { display: grid; gap: 6px; justify-self: end; min-width: min(100%, 320px); font-variant-numeric: tabular-nums; }
100
+ .fd-payments-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
101
+ .fd-payment { position: relative; display: flex; align-items: center; gap: 8px; }
102
+ .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; }
103
+ .fd-payment-info:hover, .fd-payment-info[aria-expanded="true"] { color: var(--fd-accent); border-color: var(--fd-accent); }
104
+ .fd-payment-date { flex: 1 1 auto; font-style: italic; color: var(--fd-muted); }
105
+ .fd-payment-amount { white-space: nowrap; }
106
+ .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); }
107
+ .fd-payment-details dl { display: grid; grid-template-columns: auto 1fr; gap: 2px 12px; margin: 0; }
108
+ .fd-payment-details dt { color: var(--fd-muted); }
109
+ .fd-payment-details dd { margin: 0; }
110
+ .fd-payment-open { justify-self: start; }
111
+ .fd-payment-due { display: flex; justify-content: space-between; gap: 16px; padding-top: 6px; border-top: 1px solid var(--fd-border); font-weight: 600; }
112
+ /* Properties: in two columns when asked, one on a narrow form; adding one in place, its name and kind in a row. */
113
+ .fd-properties-list { display: grid; gap: 8px; min-width: 0; }
114
+ .fd-properties[data-columns="2"] > .fd-properties-list { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--fd-gap-x, 24px); }
115
+ @container (max-width: 520px) { .fd-properties[data-columns="2"] > .fd-properties-list { grid-template-columns: minmax(0, 1fr); } }
116
+ .fd-property-add { justify-self: start; }
117
+ .fd-property-new { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
118
+ .fd-property-new > .fd-input { flex: 1 1 10em; width: auto; }
119
+ `;
120
+ //# sourceMappingURL=styles-business.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-business.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/styles-business.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACU,QAAA,YAAY,GAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4GrC,CAAC"}
@@ -0,0 +1,117 @@
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 const BUSINESS_CSS = /* css */ `
9
+ /* ---- business widgets ------------------------------------------------------- */
10
+ /* Priority: grey stars, gold up to the one picked; hovered, they show what a click would pick. */
11
+ .fd-priority { display: inline-flex; align-items: center; gap: 1px; }
12
+ .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; }
13
+ .fd-priority-star.fd-on { color: #e8a317; }
14
+ .fd-priority:not(:has(:disabled)):hover .fd-priority-star { color: #e8a317; }
15
+ .fd-priority:not(:has(:disabled)) .fd-priority-star:hover ~ .fd-priority-star { color: var(--fd-border-strong); }
16
+ .fd-priority-star:disabled { cursor: default; }
17
+ /* 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. */
18
+ .fd-title-line { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; min-width: 0; }
19
+ /* On a phone the name takes a row of its own rather than be cut. */
20
+ .fd-title-line > .fd-title-name { flex: 1 1 18em; min-width: 0; }
21
+ .fd-title-line > .fd-title-name .fd-input { font-size: 24px; font-weight: 600; min-height: 40px; }
22
+ /* A read-only name on the title's line reads as the title too, as it does alone. */
23
+ .fd-title-line > .fd-title-name > .fd-read-text { font-size: 24px; font-weight: 600; line-height: 1.25; }
24
+ .fd-form .fd-title-line > .fd-field { grid-template-columns: minmax(0, 1fr); }
25
+ .fd-form .fd-title-line > .fd-field > * { grid-column: 1 !important; }
26
+ .fd-form .fd-title-line > .fd-title-side { display: flex; align-items: center; flex: none; }
27
+ .fd-title-line > .fd-field > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
28
+ .fd-title-line .fd-priority-star { font-size: 24px; }
29
+ /* A state's dot: grey, red, green…, in the state's tone; its menu floats under it. */
30
+ .fd-dot-box { position: relative; display: inline-flex; align-items: center; gap: 6px; }
31
+ .fd-dot-button { display: inline-grid; place-items: center; width: 24px; height: 24px; padding: 0; border: none; border-radius: 50%; background: none; cursor: pointer; }
32
+ .fd-dot-button:hover:not(:disabled) { background: var(--fd-accent-soft); }
33
+ .fd-dot-button:disabled { cursor: default; }
34
+ .fd-dot { display: inline-block; width: 12px; height: 12px; flex: none; border-radius: 50%; background: var(--fd-dot, var(--fd-border-strong)); }
35
+ .fd-dot-button[data-tone="muted"], .fd-dot-item[data-tone="muted"] { --fd-dot: var(--fd-border-strong); }
36
+ .fd-dot-button[data-tone="danger"], .fd-dot-item[data-tone="danger"] { --fd-dot: var(--fd-error); }
37
+ .fd-dot-button[data-tone="success"], .fd-dot-item[data-tone="success"] { --fd-dot: var(--fd-success); }
38
+ .fd-dot-button[data-tone="warning"], .fd-dot-item[data-tone="warning"] { --fd-dot: #d97706; }
39
+ .fd-dot-button[data-tone="info"], .fd-dot-item[data-tone="info"] { --fd-dot: var(--fd-info); }
40
+ .fd-dot-label { font-size: 13px; color: var(--fd-muted); }
41
+ .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); }
42
+ .fd-dot-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: 4px; cursor: pointer; white-space: nowrap; font-size: 14px; }
43
+ .fd-dot-item:hover, .fd-dot-item:focus { background: var(--fd-accent-soft); outline: none; }
44
+ .fd-dot-item[aria-checked="true"] { font-weight: 600; }
45
+ /* A colour: a swatch of it, and a palette of Flectra's twelve under it; none is a crossed-out square. */
46
+ .fd-colour-box { position: relative; display: inline-flex; align-items: center; gap: 8px; }
47
+ .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; }
48
+ .fd-colour-button:disabled { cursor: default; }
49
+ .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)); }
50
+ .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); }
51
+ .fd-colour[aria-checked="true"] { box-shadow: 0 0 0 2px var(--fd-surface), 0 0 0 4px var(--fd-accent); }
52
+ .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); }
53
+ .fd-colour-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px; color: var(--fd-muted); }
54
+ /* A value to copy: its box, the button after it. */
55
+ .fd-copy { display: flex; align-items: center; gap: 8px; min-width: 0; }
56
+ .fd-copy > .fd-input { flex: 1 1 auto; min-width: 0; }
57
+ .fd-copy-long { align-items: flex-start; }
58
+ .fd-copy-button { flex: none; }
59
+ /* A range of dates: two boxes, from → to, in one row that wraps on a phone, its calendar under it marking the days between. */
60
+ .fd-range { position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }
61
+ /* Too narrow for a date and the calendar's button beside it, the button goes under: a date is never cut. */
62
+ .fd-range-box { flex: 1 1 8em; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; min-width: 0; }
63
+ .fd-range-box > .fd-input { flex: 1 1 9em; min-width: 0; }
64
+ .fd-range-box > .fd-input[type="datetime-local"] { flex-basis: 13em; }
65
+ .fd-range-arrow { flex: none; display: inline-block; color: var(--fd-muted); }
66
+ .fd-range-arrow:dir(rtl) { transform: scaleX(-1); }
67
+ .fd-range-calendar .fd-calendar-grid td button.fd-in-range { background: var(--fd-accent-soft); border-radius: 0; }
68
+ /* A timer: its time in even digits, a green dot beating while it runs. */
69
+ .fd-timer { display: inline-flex; align-items: center; gap: 8px; font-variant-numeric: tabular-nums; font-weight: 600; direction: ltr; unicode-bidi: isolate; }
70
+ .fd-timer-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--fd-border-strong); }
71
+ .fd-timer[data-running] .fd-timer-dot { background: var(--fd-success); animation: fd-timer-beat 1s ease-in-out infinite alternate; }
72
+ .fd-timer[data-running] .fd-timer-time { color: var(--fd-success); }
73
+ @keyframes fd-timer-beat { to { opacity: 0.35; } }
74
+ @media (prefers-reduced-motion: reduce) { .fd-timer[data-running] .fd-timer-dot { animation: none; } }
75
+ /* A document shown inline: the browser's own viewer, as wide as the field. */
76
+ .fd-embed { display: grid; gap: 8px; min-width: 0; }
77
+ .fd-embed-bar { display: flex; align-items: center; gap: 8px; min-width: 0; }
78
+ .fd-embed-bar > .fd-input { flex: 1 1 auto; min-width: 0; }
79
+ .fd-embed-open { flex: none; }
80
+ .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); }
81
+ .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); }
82
+ /* An analytic distribution: lines of an account and its share, their total under them. */
83
+ .fd-distribution { display: grid; gap: 6px; min-width: 0; }
84
+ .fd-distribution-table .fd-distribution-share { width: 8.5em; }
85
+ .fd-distribution-table .fd-share { text-align: end; padding-inline-end: calc(var(--fd-pad-x) + 2ch); }
86
+ .fd-distribution-total { font-weight: 600; text-align: end; padding-inline-end: calc(var(--fd-pad-x) + 2ch + 4px); font-variant-numeric: tabular-nums; }
87
+ .fd-distribution-add { justify-self: start; }
88
+ /* Tax totals: words at the start, amounts at the end in even digits, the total in bold over a rule. */
89
+ .fd-tax-totals { justify-self: end; border-collapse: collapse; min-width: min(100%, 320px); font-variant-numeric: tabular-nums; }
90
+ .fd-tax-totals th { text-align: start; font-weight: 400; color: var(--fd-muted); padding: 3px 16px 3px 0; padding-inline: 0 16px; }
91
+ .fd-tax-totals td { text-align: end; padding: 3px 0; white-space: nowrap; }
92
+ .fd-tax-totals .fd-tax-subtotal th { color: var(--fd-text); }
93
+ .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; }
94
+ .fd-tax-totals .fd-input { width: 9em; text-align: end; }
95
+ /* Payments: each one's button, "Paid on …" and its amount; its details in a small box under it; the amount due in bold. */
96
+ .fd-payments { display: grid; gap: 6px; justify-self: end; min-width: min(100%, 320px); font-variant-numeric: tabular-nums; }
97
+ .fd-payments-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
98
+ .fd-payment { position: relative; display: flex; align-items: center; gap: 8px; }
99
+ .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; }
100
+ .fd-payment-info:hover, .fd-payment-info[aria-expanded="true"] { color: var(--fd-accent); border-color: var(--fd-accent); }
101
+ .fd-payment-date { flex: 1 1 auto; font-style: italic; color: var(--fd-muted); }
102
+ .fd-payment-amount { white-space: nowrap; }
103
+ .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); }
104
+ .fd-payment-details dl { display: grid; grid-template-columns: auto 1fr; gap: 2px 12px; margin: 0; }
105
+ .fd-payment-details dt { color: var(--fd-muted); }
106
+ .fd-payment-details dd { margin: 0; }
107
+ .fd-payment-open { justify-self: start; }
108
+ .fd-payment-due { display: flex; justify-content: space-between; gap: 16px; padding-top: 6px; border-top: 1px solid var(--fd-border); font-weight: 600; }
109
+ /* Properties: in two columns when asked, one on a narrow form; adding one in place, its name and kind in a row. */
110
+ .fd-properties-list { display: grid; gap: 8px; min-width: 0; }
111
+ .fd-properties[data-columns="2"] > .fd-properties-list { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--fd-gap-x, 24px); }
112
+ @container (max-width: 520px) { .fd-properties[data-columns="2"] > .fd-properties-list { grid-template-columns: minmax(0, 1fr); } }
113
+ .fd-property-add { justify-self: start; }
114
+ .fd-property-new { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
115
+ .fd-property-new > .fd-input { flex: 1 1 10em; width: auto; }
116
+ `;
117
+ //# sourceMappingURL=styles-business.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-business.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/styles-business.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4GrC,CAAC"}
@@ -6,4 +6,4 @@
6
6
  * and written with logical properties as the rest of it is; it comes before
7
7
  * the question kinds' part.
8
8
  */
9
- export declare const INPUTS_CSS = "\n/* ---- inputs' details ------------------------------------------------------- */\n.fd-counted { display: grid; gap: 2px; min-width: 0; }\n/* \"12 / 100\" reads so on a right-to-left page too. */\n.fd-count { justify-self: end; direction: ltr; unicode-bidi: isolate; font-size: 12px; color: var(--fd-muted); font-variant-numeric: tabular-nums; }\n.fd-count-near { color: var(--fd-warning); font-weight: 600; }\n/* A unit inside the number's box, at its start or end; the box keeps room for it. */\n.fd-number:not(.fd-currency-picked) { position: relative; display: block; }\n.fd-number > .fd-unit { position: absolute; inset-block: 0; display: flex; align-items: center; pointer-events: none; color: var(--fd-muted); }\n.fd-number > .fd-unit:first-child { inset-inline-start: var(--fd-pad-x); }\n.fd-number > .fd-unit:last-child { inset-inline-end: var(--fd-pad-x); }\n/* A rating of hearts or thumbs up: grey until picked, then filled. */\n.fd-rating-heart button.fd-on { color: #e5484d; }\n.fd-rating-thumb button.fd-on { color: var(--fd-accent); }\n.fd-rating .fd-icon { display: block; width: 1em; height: 1em; }\n.fd-rating .fd-on .fd-icon { fill: currentColor; }\n/* Words under a slider's ends, each under its own end. */\n.fd-slider-word { display: block; max-width: 12em; }\n.fd-slider-last { text-align: end; }\n/* An NPS scale: 0\u20136, 7\u20138 and 9\u201310 tinted red, amber and green in either scheme, and set apart by a gap. */\n.fd-nps [data-tone=\"low\"] { --fd-tone: var(--fd-error); --fd-tone-soft: var(--fd-error-soft); }\n.fd-nps [data-tone=\"mid\"] { --fd-tone: var(--fd-warning); --fd-tone-soft: var(--fd-warning-soft); }\n.fd-nps [data-tone=\"high\"] { --fd-tone: var(--fd-success); --fd-tone-soft: var(--fd-success-soft); }\n.fd-nps button { background: var(--fd-tone-soft); border-color: var(--fd-tone); color: var(--fd-tone); font-weight: 600; }\n.fd-nps button.fd-on { background: var(--fd-tone); border-color: var(--fd-tone); color: var(--fd-surface); }\n.fd-nps [data-value=\"7\"], .fd-nps [data-value=\"9\"] { margin-inline-start: 8px; }\n/* A rating's or a scale's end words under its first and last points, not the field's edges. */\n.fd-choices-box > .fd-scale-box { justify-self: start; }\n";
9
+ export declare const INPUTS_CSS = "\n/* ---- inputs' details ------------------------------------------------------- */\n.fd-counted { display: grid; gap: 2px; min-width: 0; }\n/* \"12 / 100\" reads so on a right-to-left page too. */\n.fd-count { justify-self: end; direction: ltr; unicode-bidi: isolate; font-size: 12px; color: var(--fd-muted); font-variant-numeric: tabular-nums; }\n.fd-count-near { color: var(--fd-warning); font-weight: 600; }\n/* A unit inside the number's box, at its start or end; the box keeps room for it. */\n.fd-number:not(.fd-currency-picked) { position: relative; display: block; }\n/* As tall as its box, not its row: a label on two lines would stretch it, and the unit would sit below the value. */\n.fd-field > .fd-number:not(.fd-currency-picked) { align-self: start; }\n.fd-number > .fd-unit { position: absolute; inset-block: 0; display: flex; align-items: center; pointer-events: none; color: var(--fd-muted); }\n.fd-number > .fd-unit:first-child { inset-inline-start: var(--fd-pad-x); }\n.fd-number > .fd-unit:last-child { inset-inline-end: var(--fd-pad-x); }\n/* A rating of hearts or thumbs up: grey until picked, then filled. */\n.fd-rating-heart button.fd-on { color: #e5484d; }\n.fd-rating-thumb button.fd-on { color: var(--fd-accent); }\n.fd-rating .fd-icon { display: block; width: 1em; height: 1em; }\n.fd-rating .fd-on .fd-icon { fill: currentColor; }\n/* Words under a slider's ends, each under its own end. */\n.fd-slider-word { display: block; max-width: 12em; }\n.fd-slider-last { text-align: end; }\n/* An NPS scale: 0\u20136, 7\u20138 and 9\u201310 tinted red, amber and green in either scheme, and set apart by a gap. */\n.fd-nps [data-tone=\"low\"] { --fd-tone: var(--fd-error); --fd-tone-soft: var(--fd-error-soft); }\n.fd-nps [data-tone=\"mid\"] { --fd-tone: var(--fd-warning); --fd-tone-soft: var(--fd-warning-soft); }\n.fd-nps [data-tone=\"high\"] { --fd-tone: var(--fd-success); --fd-tone-soft: var(--fd-success-soft); }\n.fd-nps button { background: var(--fd-tone-soft); border-color: var(--fd-tone); color: var(--fd-tone); font-weight: 600; }\n.fd-nps button.fd-on { background: var(--fd-tone); border-color: var(--fd-tone); color: var(--fd-surface); }\n.fd-nps [data-value=\"7\"], .fd-nps [data-value=\"9\"] { margin-inline-start: 8px; }\n/* A rating's or a scale's end words under its first and last points, not the field's edges. */\n.fd-choices-box > .fd-scale-box { justify-self: start; }\n";
@@ -6,4 +6,4 @@
6
6
  * and written with logical properties as the rest of it is; it comes before
7
7
  * the question kinds' part.
8
8
  */
9
- export declare const INPUTS_CSS = "\n/* ---- inputs' details ------------------------------------------------------- */\n.fd-counted { display: grid; gap: 2px; min-width: 0; }\n/* \"12 / 100\" reads so on a right-to-left page too. */\n.fd-count { justify-self: end; direction: ltr; unicode-bidi: isolate; font-size: 12px; color: var(--fd-muted); font-variant-numeric: tabular-nums; }\n.fd-count-near { color: var(--fd-warning); font-weight: 600; }\n/* A unit inside the number's box, at its start or end; the box keeps room for it. */\n.fd-number:not(.fd-currency-picked) { position: relative; display: block; }\n.fd-number > .fd-unit { position: absolute; inset-block: 0; display: flex; align-items: center; pointer-events: none; color: var(--fd-muted); }\n.fd-number > .fd-unit:first-child { inset-inline-start: var(--fd-pad-x); }\n.fd-number > .fd-unit:last-child { inset-inline-end: var(--fd-pad-x); }\n/* A rating of hearts or thumbs up: grey until picked, then filled. */\n.fd-rating-heart button.fd-on { color: #e5484d; }\n.fd-rating-thumb button.fd-on { color: var(--fd-accent); }\n.fd-rating .fd-icon { display: block; width: 1em; height: 1em; }\n.fd-rating .fd-on .fd-icon { fill: currentColor; }\n/* Words under a slider's ends, each under its own end. */\n.fd-slider-word { display: block; max-width: 12em; }\n.fd-slider-last { text-align: end; }\n/* An NPS scale: 0\u20136, 7\u20138 and 9\u201310 tinted red, amber and green in either scheme, and set apart by a gap. */\n.fd-nps [data-tone=\"low\"] { --fd-tone: var(--fd-error); --fd-tone-soft: var(--fd-error-soft); }\n.fd-nps [data-tone=\"mid\"] { --fd-tone: var(--fd-warning); --fd-tone-soft: var(--fd-warning-soft); }\n.fd-nps [data-tone=\"high\"] { --fd-tone: var(--fd-success); --fd-tone-soft: var(--fd-success-soft); }\n.fd-nps button { background: var(--fd-tone-soft); border-color: var(--fd-tone); color: var(--fd-tone); font-weight: 600; }\n.fd-nps button.fd-on { background: var(--fd-tone); border-color: var(--fd-tone); color: var(--fd-surface); }\n.fd-nps [data-value=\"7\"], .fd-nps [data-value=\"9\"] { margin-inline-start: 8px; }\n/* A rating's or a scale's end words under its first and last points, not the field's edges. */\n.fd-choices-box > .fd-scale-box { justify-self: start; }\n";
9
+ export declare const INPUTS_CSS = "\n/* ---- inputs' details ------------------------------------------------------- */\n.fd-counted { display: grid; gap: 2px; min-width: 0; }\n/* \"12 / 100\" reads so on a right-to-left page too. */\n.fd-count { justify-self: end; direction: ltr; unicode-bidi: isolate; font-size: 12px; color: var(--fd-muted); font-variant-numeric: tabular-nums; }\n.fd-count-near { color: var(--fd-warning); font-weight: 600; }\n/* A unit inside the number's box, at its start or end; the box keeps room for it. */\n.fd-number:not(.fd-currency-picked) { position: relative; display: block; }\n/* As tall as its box, not its row: a label on two lines would stretch it, and the unit would sit below the value. */\n.fd-field > .fd-number:not(.fd-currency-picked) { align-self: start; }\n.fd-number > .fd-unit { position: absolute; inset-block: 0; display: flex; align-items: center; pointer-events: none; color: var(--fd-muted); }\n.fd-number > .fd-unit:first-child { inset-inline-start: var(--fd-pad-x); }\n.fd-number > .fd-unit:last-child { inset-inline-end: var(--fd-pad-x); }\n/* A rating of hearts or thumbs up: grey until picked, then filled. */\n.fd-rating-heart button.fd-on { color: #e5484d; }\n.fd-rating-thumb button.fd-on { color: var(--fd-accent); }\n.fd-rating .fd-icon { display: block; width: 1em; height: 1em; }\n.fd-rating .fd-on .fd-icon { fill: currentColor; }\n/* Words under a slider's ends, each under its own end. */\n.fd-slider-word { display: block; max-width: 12em; }\n.fd-slider-last { text-align: end; }\n/* An NPS scale: 0\u20136, 7\u20138 and 9\u201310 tinted red, amber and green in either scheme, and set apart by a gap. */\n.fd-nps [data-tone=\"low\"] { --fd-tone: var(--fd-error); --fd-tone-soft: var(--fd-error-soft); }\n.fd-nps [data-tone=\"mid\"] { --fd-tone: var(--fd-warning); --fd-tone-soft: var(--fd-warning-soft); }\n.fd-nps [data-tone=\"high\"] { --fd-tone: var(--fd-success); --fd-tone-soft: var(--fd-success-soft); }\n.fd-nps button { background: var(--fd-tone-soft); border-color: var(--fd-tone); color: var(--fd-tone); font-weight: 600; }\n.fd-nps button.fd-on { background: var(--fd-tone); border-color: var(--fd-tone); color: var(--fd-surface); }\n.fd-nps [data-value=\"7\"], .fd-nps [data-value=\"9\"] { margin-inline-start: 8px; }\n/* A rating's or a scale's end words under its first and last points, not the field's edges. */\n.fd-choices-box > .fd-scale-box { justify-self: start; }\n";
@@ -17,6 +17,8 @@ exports.INPUTS_CSS = `
17
17
  .fd-count-near { color: var(--fd-warning); font-weight: 600; }
18
18
  /* A unit inside the number's box, at its start or end; the box keeps room for it. */
19
19
  .fd-number:not(.fd-currency-picked) { position: relative; display: block; }
20
+ /* As tall as its box, not its row: a label on two lines would stretch it, and the unit would sit below the value. */
21
+ .fd-field > .fd-number:not(.fd-currency-picked) { align-self: start; }
20
22
  .fd-number > .fd-unit { position: absolute; inset-block: 0; display: flex; align-items: center; pointer-events: none; color: var(--fd-muted); }
21
23
  .fd-number > .fd-unit:first-child { inset-inline-start: var(--fd-pad-x); }
22
24
  .fd-number > .fd-unit:last-child { inset-inline-end: var(--fd-pad-x); }
@@ -1 +1 @@
1
- {"version":3,"file":"styles-inputs.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/styles-inputs.ts"],"names":[],"mappings":";;;AAAA;;;;;;;GAOG;AACU,QAAA,UAAU,GAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnC,CAAC"}
1
+ {"version":3,"file":"styles-inputs.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/styles-inputs.ts"],"names":[],"mappings":";;;AAAA;;;;;;;GAOG;AACU,QAAA,UAAU,GAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BnC,CAAC"}
@@ -14,6 +14,8 @@ export const INPUTS_CSS = /* css */ `
14
14
  .fd-count-near { color: var(--fd-warning); font-weight: 600; }
15
15
  /* A unit inside the number's box, at its start or end; the box keeps room for it. */
16
16
  .fd-number:not(.fd-currency-picked) { position: relative; display: block; }
17
+ /* As tall as its box, not its row: a label on two lines would stretch it, and the unit would sit below the value. */
18
+ .fd-field > .fd-number:not(.fd-currency-picked) { align-self: start; }
17
19
  .fd-number > .fd-unit { position: absolute; inset-block: 0; display: flex; align-items: center; pointer-events: none; color: var(--fd-muted); }
18
20
  .fd-number > .fd-unit:first-child { inset-inline-start: var(--fd-pad-x); }
19
21
  .fd-number > .fd-unit:last-child { inset-inline-end: var(--fd-pad-x); }
@@ -1 +1 @@
1
- {"version":3,"file":"styles-inputs.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/styles-inputs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnC,CAAC"}
1
+ {"version":3,"file":"styles-inputs.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/styles-inputs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BnC,CAAC"}
@@ -4,4 +4,4 @@
4
4
  * group of cards. Appended to Fieldia's stylesheet, scoped and written with
5
5
  * logical properties as the rest of it is.
6
6
  */
7
- export declare const KINDS_CSS = "\n/* ---- question kinds -------------------------------------------------------- */\n/* A signature: a pad with a line to sign on, a box to type a name in instead, and Clear. */\n.fd-signature { display: grid; gap: 8px; justify-items: start; width: 100%; max-width: 480px; min-width: 0; }\n.fd-signature-box {\n position: relative; width: 100%; aspect-ratio: 10 / 3; border: 1px dashed var(--fd-border-strong);\n border-radius: var(--fd-control-radius); background: #fff; overflow: hidden;\n}\n.fd-signature-box:has(.fd-signature-pad:not([hidden]):not(.fd-signature-locked)):hover { border-color: var(--fd-accent); }\n.fd-signature-pad, .fd-signature-image { display: block; width: 100%; height: 100%; }\n.fd-signature-pad { touch-action: none; cursor: crosshair; }\n.fd-signature-pad.fd-signature-locked { cursor: default; }\n.fd-signature-image { object-fit: contain; }\n.fd-signature-hint {\n position: absolute; inset-inline: 18px; inset-block-end: 16px; padding-block-start: 4px; pointer-events: none;\n border-block-start: 1px solid var(--fd-border-strong); color: var(--fd-muted); font-size: 12.5px;\n}\n.fd-signature-tools { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; width: 100%; }\n.fd-signature-typed { flex: 1 1 200px; min-width: 0; }\n.fd-signature-footer { margin-block-start: -4px; color: var(--fd-muted); font-size: 12.5px; }\n/* A slider: the value beside the track and its ends under it; dimmed until it is slid. */\n.fd-slider { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 14px; row-gap: 0; align-items: center; width: 100%; max-width: 440px; min-width: 0; }\n.fd-slider-track { display: contents; }\n.fd-slider-input { width: 100%; min-width: 0; height: 26px; margin: 0; accent-color: var(--fd-accent); cursor: pointer; }\n.fd-slider-input:disabled { cursor: default; }\n.fd-slider-value { min-width: 2.5em; text-align: start; font-variant-numeric: tabular-nums; font-weight: 600; }\n.fd-slider-ends { grid-column: 1; display: flex; justify-content: space-between; gap: 12px; font-size: 12.5px; color: var(--fd-muted); font-variant-numeric: tabular-nums; }\n/* Grey, not the accent: half filled in colour would read as an answer. */\n.fd-slider-empty .fd-slider-input { filter: grayscale(1); opacity: 0.55; }\n.fd-slider-empty .fd-slider-value { color: var(--fd-muted); font-weight: 400; }\n.fd-slider .fd-choice-clear { grid-column: 1 / -1; }\n/* Pictures to choose from: cards of a picture over its words, a ring or a box before the words, the card picked edged in the accent. */\n.fd-image-choices { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 130px), 1fr)); gap: 12px; width: 100%; min-width: 0; }\n.fd-image-card {\n position: relative; display: grid; grid-template-rows: auto 1fr; padding: 0; margin: 0; overflow: hidden; cursor: pointer;\n font: inherit; color: var(--fd-text); text-align: start; background: var(--fd-surface);\n border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n.fd-image-card:hover:not(:disabled) { border-color: var(--fd-accent); }\n.fd-image-card:disabled { cursor: default; }\n.fd-image-card:disabled:not([aria-checked=\"true\"]) { opacity: 0.6; }\n.fd-image-card[aria-checked=\"true\"] { border-color: var(--fd-accent); box-shadow: 0 0 0 1px var(--fd-accent); }\n.fd-image-card-picture { display: block; aspect-ratio: 4 / 3; background: var(--fd-page); border-block-end: 1px solid var(--fd-border); }\n.fd-image-card-picture img { display: block; width: 100%; height: 100%; object-fit: cover; }\n.fd-image-card-blank { display: grid; place-items: center; width: 100%; height: 100%; color: var(--fd-border-strong); }\n.fd-image-card-blank svg { width: 36%; height: 36%; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }\n.fd-image-card-words { display: flex; align-items: flex-start; gap: 8px; padding: 9px 10px; font-size: 13.5px; line-height: 1.35; }\n.fd-image-card-words::before {\n content: \"\"; flex: none; width: 16px; height: 16px; margin-block-start: 1px; box-sizing: border-box;\n border: 1.5px solid var(--fd-border-strong); border-radius: 50%; background: var(--fd-surface);\n}\n.fd-image-card[role=\"checkbox\"] .fd-image-card-words::before { border-radius: 4px; }\n.fd-image-card[aria-checked=\"true\"] .fd-image-card-words::before { border-color: var(--fd-accent); background: var(--fd-accent); box-shadow: inset 0 0 0 3px var(--fd-surface); }\n.fd-image-card[role=\"checkbox\"][aria-checked=\"true\"] .fd-image-card-words::before {\n box-shadow: none;\n background: var(--fd-accent) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") center / 13px no-repeat;\n}\n.fd-image-choices + .fd-choice-clear { justify-self: end; }\n/* A ranking: numbered lines dragged by their grip, or moved with their arrows; the line being dragged lifts. */\n.fd-ranking { width: 100%; max-width: 480px; min-width: 0; }\n.fd-rank-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }\n.fd-rank-item {\n display: flex; align-items: center; gap: 10px; padding-block: 5px; padding-inline: 8px 5px; min-height: 40px;\n background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius);\n cursor: grab; user-select: none; -webkit-user-select: none;\n}\n.fd-rank-item.fd-rank-lifted { position: relative; z-index: 1; cursor: grabbing; border-color: var(--fd-accent); box-shadow: 0 6px 18px rgba(15, 20, 25, 0.16); }\n.fd-ranking-locked .fd-rank-item { cursor: default; }\n.fd-rank-grip { flex: none; width: 10px; height: 16px; touch-action: none; background: radial-gradient(circle, var(--fd-border-strong) 1.3px, transparent 1.7px) 0 0 / 5px 5.33px; }\n.fd-ranking-locked .fd-rank-grip { visibility: hidden; }\n.fd-rank-place {\n flex: none; display: grid; place-items: center; min-width: 24px; height: 24px; padding-inline: 4px; border-radius: 999px;\n background: var(--fd-accent-soft); color: var(--fd-accent); font-size: 12.5px; font-weight: 600; font-variant-numeric: tabular-nums;\n}\n.fd-rank-words { flex: 1; min-width: 0; overflow-wrap: anywhere; }\n.fd-rank-tools { flex: none; display: inline-flex; gap: 2px; }\n.fd-rank-move {\n width: 30px; height: 30px; padding: 0; font: inherit; font-size: 15px; line-height: 1; color: var(--fd-muted);\n background: none; border: 1px solid transparent; border-radius: 4px; cursor: pointer;\n}\n.fd-rank-move:hover:not(:disabled) { background: var(--fd-page); border-color: var(--fd-border); color: var(--fd-text); }\n.fd-rank-move:disabled { opacity: 0.3; cursor: default; }\n/* An address: its parts in two columns, the street across both, each named above its box; one column when narrow. */\n.fd-address { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 12px; width: 100%; max-width: 560px; min-width: 0; }\n.fd-address-part { display: grid; gap: 3px; min-width: 0; align-content: start; }\n.fd-address-street, .fd-address-line2 { grid-column: 1 / -1; }\n.fd-address-part.fd-required > .fd-address-label::after { content: \" *\"; color: var(--fd-error); }\n.fd-address-label { font-size: 12.5px; color: var(--fd-muted); }\n@container (max-width: 420px) { .fd-address { grid-template-columns: minmax(0, 1fr); } }\n/* A repeating group: each line a card of its fields under its numbered title, \u00D7 at its end; \"Add another\" under the cards. */\n.fd-repeat { display: grid; gap: 10px; justify-items: start; width: 100%; min-width: 0; }\n.fd-repeat-list { display: grid; gap: 10px; width: 100%; min-width: 0; }\n.fd-repeat-list:empty { display: none; }\n.fd-repeat-card {\n display: grid; gap: 8px; min-width: 0; padding: 10px 14px 14px;\n background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: max(var(--fd-radius), 6px);\n}\n.fd-repeat-head { display: flex; align-items: center; gap: 2px; min-height: 28px; }\n.fd-repeat-title { font-weight: 600; font-size: 13.5px; margin-inline-end: auto; }\n.fd-repeat-remove, .fd-repeat-tool { border: none; background: none; cursor: pointer; color: var(--fd-muted); font-size: 18px; line-height: 1; padding: 4px 8px; border-radius: 4px; }\n.fd-repeat-remove:hover { color: var(--fd-error); background: var(--fd-error-soft); }\n.fd-repeat-tool { font-size: 15px; }\n.fd-repeat-tool:hover { color: var(--fd-accent); background: var(--fd-accent-soft); }\n.fd-repeat-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap: 10px 14px; }\n.fd-repeat-field { display: grid; gap: 3px; min-width: 0; align-content: start; }\n.fd-repeat-label { font-size: 12.5px; color: var(--fd-muted); }\n.fd-repeat-add { border-style: dashed; }\n";
7
+ export declare const KINDS_CSS = "\n/* ---- question kinds -------------------------------------------------------- */\n/* A signature: a pad with a line to sign on, a box to type a name in instead, and Clear. */\n.fd-signature { display: grid; gap: 8px; justify-items: start; width: 100%; max-width: 480px; min-width: 0; }\n.fd-signature-box {\n position: relative; width: 100%; aspect-ratio: 10 / 3; border: 1px dashed var(--fd-border-strong);\n border-radius: var(--fd-control-radius); background: #fff; overflow: hidden;\n}\n.fd-signature-box:has(.fd-signature-pad:not([hidden]):not(.fd-signature-locked)):hover { border-color: var(--fd-accent); }\n.fd-signature-pad, .fd-signature-image { display: block; width: 100%; height: 100%; }\n.fd-signature-pad { touch-action: none; cursor: crosshair; }\n.fd-signature-pad.fd-signature-locked { cursor: default; }\n.fd-signature-image { object-fit: contain; }\n.fd-signature-hint {\n position: absolute; inset-inline: 18px; inset-block-end: 16px; padding-block-start: 4px; pointer-events: none;\n border-block-start: 1px solid var(--fd-border-strong); color: var(--fd-muted); font-size: 12.5px;\n}\n.fd-signature-tools { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; width: 100%; }\n.fd-signature-typed { flex: 1 1 200px; min-width: 0; }\n.fd-signature-footer { margin-block-start: -4px; color: var(--fd-muted); font-size: 12.5px; }\n/* A slider: the value beside the track and its ends under it; dimmed until it is slid. */\n.fd-slider { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 14px; row-gap: 0; align-items: center; width: 100%; max-width: 440px; min-width: 0; }\n.fd-slider-track { display: contents; }\n.fd-slider-input { width: 100%; min-width: 0; height: 26px; margin: 0; accent-color: var(--fd-accent); cursor: pointer; }\n.fd-slider-input:disabled { cursor: default; }\n.fd-slider-value { min-width: 2.5em; text-align: start; font-variant-numeric: tabular-nums; font-weight: 600; }\n.fd-slider-ends { grid-column: 1; display: flex; justify-content: space-between; gap: 12px; font-size: 12.5px; color: var(--fd-muted); font-variant-numeric: tabular-nums; }\n/* Grey, not the accent: half filled in colour would read as an answer. */\n.fd-slider-empty .fd-slider-input { filter: grayscale(1); opacity: 0.55; }\n.fd-slider-empty .fd-slider-value { color: var(--fd-muted); font-weight: 400; }\n.fd-slider .fd-choice-clear { grid-column: 1 / -1; }\n/* Pictures to choose from: cards of a picture over its words, a ring or a box before the words, the card picked edged in the accent. */\n.fd-image-choices { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 130px), 1fr)); gap: 12px; width: 100%; min-width: 0; }\n.fd-image-card {\n position: relative; display: grid; grid-template-rows: auto 1fr; padding: 0; margin: 0; overflow: hidden; cursor: pointer;\n font: inherit; color: var(--fd-text); text-align: start; background: var(--fd-surface);\n border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n.fd-image-card:hover:not(:disabled) { border-color: var(--fd-accent); }\n.fd-image-card:disabled { cursor: default; }\n.fd-image-card:disabled:not([aria-checked=\"true\"]) { opacity: 0.6; }\n.fd-image-card[aria-checked=\"true\"] { border-color: var(--fd-accent); box-shadow: 0 0 0 1px var(--fd-accent); }\n.fd-image-card-picture { display: block; aspect-ratio: 4 / 3; background: var(--fd-page); border-block-end: 1px solid var(--fd-border); }\n.fd-image-card-picture img { display: block; width: 100%; height: 100%; object-fit: cover; }\n.fd-image-card-blank { display: grid; place-items: center; width: 100%; height: 100%; color: var(--fd-border-strong); }\n.fd-image-card-blank svg { width: 36%; height: 36%; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }\n.fd-image-card-words { display: flex; align-items: flex-start; gap: 8px; padding: 9px 10px; font-size: 13.5px; line-height: 1.35; }\n.fd-image-card-words::before {\n content: \"\"; flex: none; width: 16px; height: 16px; margin-block-start: 1px; box-sizing: border-box;\n border: 1.5px solid var(--fd-border-strong); border-radius: 50%; background: var(--fd-surface);\n}\n.fd-image-card[role=\"checkbox\"] .fd-image-card-words::before { border-radius: 4px; }\n.fd-image-card[aria-checked=\"true\"] .fd-image-card-words::before { border-color: var(--fd-accent); background: var(--fd-accent); box-shadow: inset 0 0 0 3px var(--fd-surface); }\n.fd-image-card[role=\"checkbox\"][aria-checked=\"true\"] .fd-image-card-words::before {\n box-shadow: none;\n background: var(--fd-accent) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") center / 13px no-repeat;\n}\n.fd-image-choices + .fd-choice-clear { justify-self: end; }\n/* A ranking: numbered lines dragged by their grip, or moved with their arrows; the line being dragged lifts. */\n.fd-ranking { width: 100%; max-width: 480px; min-width: 0; }\n.fd-rank-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }\n.fd-rank-item {\n display: flex; align-items: center; gap: 10px; padding-block: 5px; padding-inline: 8px 5px; min-height: 40px;\n background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius);\n cursor: grab; user-select: none; -webkit-user-select: none;\n}\n.fd-rank-item.fd-rank-lifted { position: relative; z-index: 1; cursor: grabbing; border-color: var(--fd-accent); box-shadow: 0 6px 18px rgba(15, 20, 25, 0.16); }\n.fd-ranking-locked .fd-rank-item { cursor: default; }\n.fd-rank-grip { flex: none; width: 10px; height: 16px; touch-action: none; background: radial-gradient(circle, var(--fd-border-strong) 1.3px, transparent 1.7px) 0 0 / 5px 5.33px; }\n.fd-ranking-locked .fd-rank-grip { visibility: hidden; }\n.fd-rank-place {\n flex: none; display: grid; place-items: center; min-width: 24px; height: 24px; padding-inline: 4px; border-radius: 999px;\n background: var(--fd-accent-soft); color: var(--fd-accent); font-size: 12.5px; font-weight: 600; font-variant-numeric: tabular-nums;\n}\n.fd-rank-words { flex: 1; min-width: 0; overflow-wrap: anywhere; }\n.fd-rank-tools { flex: none; display: inline-flex; gap: 2px; }\n.fd-rank-move {\n width: 30px; height: 30px; padding: 0; font: inherit; font-size: 15px; line-height: 1; color: var(--fd-muted);\n background: none; border: 1px solid transparent; border-radius: 4px; cursor: pointer;\n}\n.fd-rank-move:hover:not(:disabled) { background: var(--fd-page); border-color: var(--fd-border); color: var(--fd-text); }\n.fd-rank-move:disabled { opacity: 0.3; cursor: default; }\n/* An address: its parts in two columns, the street across both, each named above its box; one column when narrow. */\n.fd-address { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 12px; width: 100%; max-width: 560px; min-width: 0; }\n.fd-address-part { display: grid; gap: 3px; min-width: 0; align-content: start; }\n.fd-address-street, .fd-address-line2 { grid-column: 1 / -1; }\n.fd-address-part.fd-required > .fd-address-label::after { content: \"*\"; margin-inline-start: 0.25em; color: var(--fd-error); }\n.fd-address-label { font-size: 12.5px; color: var(--fd-muted); }\n@container (max-width: 420px) { .fd-address { grid-template-columns: minmax(0, 1fr); } }\n/* A repeating group: each line a card of its fields under its numbered title, \u00D7 at its end; \"Add another\" under the cards. */\n.fd-repeat { display: grid; gap: 10px; justify-items: start; width: 100%; min-width: 0; }\n.fd-repeat-list { display: grid; gap: 10px; width: 100%; min-width: 0; }\n.fd-repeat-list:empty { display: none; }\n.fd-repeat-card {\n display: grid; gap: 8px; min-width: 0; padding: 10px 14px 14px;\n background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: max(var(--fd-radius), 6px);\n}\n.fd-repeat-head { display: flex; align-items: center; gap: 2px; min-height: 28px; }\n.fd-repeat-title { font-weight: 600; font-size: 13.5px; margin-inline-end: auto; }\n.fd-repeat-remove, .fd-repeat-tool { border: none; background: none; cursor: pointer; color: var(--fd-muted); font-size: 18px; line-height: 1; padding: 4px 8px; border-radius: 4px; }\n.fd-repeat-remove:hover { color: var(--fd-error); background: var(--fd-error-soft); }\n.fd-repeat-tool { font-size: 15px; min-width: 24px; min-height: 24px; }\n.fd-repeat-tool:hover { color: var(--fd-accent); background: var(--fd-accent-soft); }\n.fd-repeat-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap: 10px 14px; }\n.fd-repeat-field { display: grid; gap: 3px; min-width: 0; align-content: start; }\n.fd-repeat-label { font-size: 12.5px; color: var(--fd-muted); }\n.fd-repeat-add { border-style: dashed; }\n";
@@ -4,4 +4,4 @@
4
4
  * group of cards. Appended to Fieldia's stylesheet, scoped and written with
5
5
  * logical properties as the rest of it is.
6
6
  */
7
- export declare const KINDS_CSS = "\n/* ---- question kinds -------------------------------------------------------- */\n/* A signature: a pad with a line to sign on, a box to type a name in instead, and Clear. */\n.fd-signature { display: grid; gap: 8px; justify-items: start; width: 100%; max-width: 480px; min-width: 0; }\n.fd-signature-box {\n position: relative; width: 100%; aspect-ratio: 10 / 3; border: 1px dashed var(--fd-border-strong);\n border-radius: var(--fd-control-radius); background: #fff; overflow: hidden;\n}\n.fd-signature-box:has(.fd-signature-pad:not([hidden]):not(.fd-signature-locked)):hover { border-color: var(--fd-accent); }\n.fd-signature-pad, .fd-signature-image { display: block; width: 100%; height: 100%; }\n.fd-signature-pad { touch-action: none; cursor: crosshair; }\n.fd-signature-pad.fd-signature-locked { cursor: default; }\n.fd-signature-image { object-fit: contain; }\n.fd-signature-hint {\n position: absolute; inset-inline: 18px; inset-block-end: 16px; padding-block-start: 4px; pointer-events: none;\n border-block-start: 1px solid var(--fd-border-strong); color: var(--fd-muted); font-size: 12.5px;\n}\n.fd-signature-tools { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; width: 100%; }\n.fd-signature-typed { flex: 1 1 200px; min-width: 0; }\n.fd-signature-footer { margin-block-start: -4px; color: var(--fd-muted); font-size: 12.5px; }\n/* A slider: the value beside the track and its ends under it; dimmed until it is slid. */\n.fd-slider { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 14px; row-gap: 0; align-items: center; width: 100%; max-width: 440px; min-width: 0; }\n.fd-slider-track { display: contents; }\n.fd-slider-input { width: 100%; min-width: 0; height: 26px; margin: 0; accent-color: var(--fd-accent); cursor: pointer; }\n.fd-slider-input:disabled { cursor: default; }\n.fd-slider-value { min-width: 2.5em; text-align: start; font-variant-numeric: tabular-nums; font-weight: 600; }\n.fd-slider-ends { grid-column: 1; display: flex; justify-content: space-between; gap: 12px; font-size: 12.5px; color: var(--fd-muted); font-variant-numeric: tabular-nums; }\n/* Grey, not the accent: half filled in colour would read as an answer. */\n.fd-slider-empty .fd-slider-input { filter: grayscale(1); opacity: 0.55; }\n.fd-slider-empty .fd-slider-value { color: var(--fd-muted); font-weight: 400; }\n.fd-slider .fd-choice-clear { grid-column: 1 / -1; }\n/* Pictures to choose from: cards of a picture over its words, a ring or a box before the words, the card picked edged in the accent. */\n.fd-image-choices { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 130px), 1fr)); gap: 12px; width: 100%; min-width: 0; }\n.fd-image-card {\n position: relative; display: grid; grid-template-rows: auto 1fr; padding: 0; margin: 0; overflow: hidden; cursor: pointer;\n font: inherit; color: var(--fd-text); text-align: start; background: var(--fd-surface);\n border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n.fd-image-card:hover:not(:disabled) { border-color: var(--fd-accent); }\n.fd-image-card:disabled { cursor: default; }\n.fd-image-card:disabled:not([aria-checked=\"true\"]) { opacity: 0.6; }\n.fd-image-card[aria-checked=\"true\"] { border-color: var(--fd-accent); box-shadow: 0 0 0 1px var(--fd-accent); }\n.fd-image-card-picture { display: block; aspect-ratio: 4 / 3; background: var(--fd-page); border-block-end: 1px solid var(--fd-border); }\n.fd-image-card-picture img { display: block; width: 100%; height: 100%; object-fit: cover; }\n.fd-image-card-blank { display: grid; place-items: center; width: 100%; height: 100%; color: var(--fd-border-strong); }\n.fd-image-card-blank svg { width: 36%; height: 36%; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }\n.fd-image-card-words { display: flex; align-items: flex-start; gap: 8px; padding: 9px 10px; font-size: 13.5px; line-height: 1.35; }\n.fd-image-card-words::before {\n content: \"\"; flex: none; width: 16px; height: 16px; margin-block-start: 1px; box-sizing: border-box;\n border: 1.5px solid var(--fd-border-strong); border-radius: 50%; background: var(--fd-surface);\n}\n.fd-image-card[role=\"checkbox\"] .fd-image-card-words::before { border-radius: 4px; }\n.fd-image-card[aria-checked=\"true\"] .fd-image-card-words::before { border-color: var(--fd-accent); background: var(--fd-accent); box-shadow: inset 0 0 0 3px var(--fd-surface); }\n.fd-image-card[role=\"checkbox\"][aria-checked=\"true\"] .fd-image-card-words::before {\n box-shadow: none;\n background: var(--fd-accent) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") center / 13px no-repeat;\n}\n.fd-image-choices + .fd-choice-clear { justify-self: end; }\n/* A ranking: numbered lines dragged by their grip, or moved with their arrows; the line being dragged lifts. */\n.fd-ranking { width: 100%; max-width: 480px; min-width: 0; }\n.fd-rank-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }\n.fd-rank-item {\n display: flex; align-items: center; gap: 10px; padding-block: 5px; padding-inline: 8px 5px; min-height: 40px;\n background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius);\n cursor: grab; user-select: none; -webkit-user-select: none;\n}\n.fd-rank-item.fd-rank-lifted { position: relative; z-index: 1; cursor: grabbing; border-color: var(--fd-accent); box-shadow: 0 6px 18px rgba(15, 20, 25, 0.16); }\n.fd-ranking-locked .fd-rank-item { cursor: default; }\n.fd-rank-grip { flex: none; width: 10px; height: 16px; touch-action: none; background: radial-gradient(circle, var(--fd-border-strong) 1.3px, transparent 1.7px) 0 0 / 5px 5.33px; }\n.fd-ranking-locked .fd-rank-grip { visibility: hidden; }\n.fd-rank-place {\n flex: none; display: grid; place-items: center; min-width: 24px; height: 24px; padding-inline: 4px; border-radius: 999px;\n background: var(--fd-accent-soft); color: var(--fd-accent); font-size: 12.5px; font-weight: 600; font-variant-numeric: tabular-nums;\n}\n.fd-rank-words { flex: 1; min-width: 0; overflow-wrap: anywhere; }\n.fd-rank-tools { flex: none; display: inline-flex; gap: 2px; }\n.fd-rank-move {\n width: 30px; height: 30px; padding: 0; font: inherit; font-size: 15px; line-height: 1; color: var(--fd-muted);\n background: none; border: 1px solid transparent; border-radius: 4px; cursor: pointer;\n}\n.fd-rank-move:hover:not(:disabled) { background: var(--fd-page); border-color: var(--fd-border); color: var(--fd-text); }\n.fd-rank-move:disabled { opacity: 0.3; cursor: default; }\n/* An address: its parts in two columns, the street across both, each named above its box; one column when narrow. */\n.fd-address { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 12px; width: 100%; max-width: 560px; min-width: 0; }\n.fd-address-part { display: grid; gap: 3px; min-width: 0; align-content: start; }\n.fd-address-street, .fd-address-line2 { grid-column: 1 / -1; }\n.fd-address-part.fd-required > .fd-address-label::after { content: \" *\"; color: var(--fd-error); }\n.fd-address-label { font-size: 12.5px; color: var(--fd-muted); }\n@container (max-width: 420px) { .fd-address { grid-template-columns: minmax(0, 1fr); } }\n/* A repeating group: each line a card of its fields under its numbered title, \u00D7 at its end; \"Add another\" under the cards. */\n.fd-repeat { display: grid; gap: 10px; justify-items: start; width: 100%; min-width: 0; }\n.fd-repeat-list { display: grid; gap: 10px; width: 100%; min-width: 0; }\n.fd-repeat-list:empty { display: none; }\n.fd-repeat-card {\n display: grid; gap: 8px; min-width: 0; padding: 10px 14px 14px;\n background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: max(var(--fd-radius), 6px);\n}\n.fd-repeat-head { display: flex; align-items: center; gap: 2px; min-height: 28px; }\n.fd-repeat-title { font-weight: 600; font-size: 13.5px; margin-inline-end: auto; }\n.fd-repeat-remove, .fd-repeat-tool { border: none; background: none; cursor: pointer; color: var(--fd-muted); font-size: 18px; line-height: 1; padding: 4px 8px; border-radius: 4px; }\n.fd-repeat-remove:hover { color: var(--fd-error); background: var(--fd-error-soft); }\n.fd-repeat-tool { font-size: 15px; }\n.fd-repeat-tool:hover { color: var(--fd-accent); background: var(--fd-accent-soft); }\n.fd-repeat-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap: 10px 14px; }\n.fd-repeat-field { display: grid; gap: 3px; min-width: 0; align-content: start; }\n.fd-repeat-label { font-size: 12.5px; color: var(--fd-muted); }\n.fd-repeat-add { border-style: dashed; }\n";
7
+ export declare const KINDS_CSS = "\n/* ---- question kinds -------------------------------------------------------- */\n/* A signature: a pad with a line to sign on, a box to type a name in instead, and Clear. */\n.fd-signature { display: grid; gap: 8px; justify-items: start; width: 100%; max-width: 480px; min-width: 0; }\n.fd-signature-box {\n position: relative; width: 100%; aspect-ratio: 10 / 3; border: 1px dashed var(--fd-border-strong);\n border-radius: var(--fd-control-radius); background: #fff; overflow: hidden;\n}\n.fd-signature-box:has(.fd-signature-pad:not([hidden]):not(.fd-signature-locked)):hover { border-color: var(--fd-accent); }\n.fd-signature-pad, .fd-signature-image { display: block; width: 100%; height: 100%; }\n.fd-signature-pad { touch-action: none; cursor: crosshair; }\n.fd-signature-pad.fd-signature-locked { cursor: default; }\n.fd-signature-image { object-fit: contain; }\n.fd-signature-hint {\n position: absolute; inset-inline: 18px; inset-block-end: 16px; padding-block-start: 4px; pointer-events: none;\n border-block-start: 1px solid var(--fd-border-strong); color: var(--fd-muted); font-size: 12.5px;\n}\n.fd-signature-tools { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; width: 100%; }\n.fd-signature-typed { flex: 1 1 200px; min-width: 0; }\n.fd-signature-footer { margin-block-start: -4px; color: var(--fd-muted); font-size: 12.5px; }\n/* A slider: the value beside the track and its ends under it; dimmed until it is slid. */\n.fd-slider { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 14px; row-gap: 0; align-items: center; width: 100%; max-width: 440px; min-width: 0; }\n.fd-slider-track { display: contents; }\n.fd-slider-input { width: 100%; min-width: 0; height: 26px; margin: 0; accent-color: var(--fd-accent); cursor: pointer; }\n.fd-slider-input:disabled { cursor: default; }\n.fd-slider-value { min-width: 2.5em; text-align: start; font-variant-numeric: tabular-nums; font-weight: 600; }\n.fd-slider-ends { grid-column: 1; display: flex; justify-content: space-between; gap: 12px; font-size: 12.5px; color: var(--fd-muted); font-variant-numeric: tabular-nums; }\n/* Grey, not the accent: half filled in colour would read as an answer. */\n.fd-slider-empty .fd-slider-input { filter: grayscale(1); opacity: 0.55; }\n.fd-slider-empty .fd-slider-value { color: var(--fd-muted); font-weight: 400; }\n.fd-slider .fd-choice-clear { grid-column: 1 / -1; }\n/* Pictures to choose from: cards of a picture over its words, a ring or a box before the words, the card picked edged in the accent. */\n.fd-image-choices { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 130px), 1fr)); gap: 12px; width: 100%; min-width: 0; }\n.fd-image-card {\n position: relative; display: grid; grid-template-rows: auto 1fr; padding: 0; margin: 0; overflow: hidden; cursor: pointer;\n font: inherit; color: var(--fd-text); text-align: start; background: var(--fd-surface);\n border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 6px);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n.fd-image-card:hover:not(:disabled) { border-color: var(--fd-accent); }\n.fd-image-card:disabled { cursor: default; }\n.fd-image-card:disabled:not([aria-checked=\"true\"]) { opacity: 0.6; }\n.fd-image-card[aria-checked=\"true\"] { border-color: var(--fd-accent); box-shadow: 0 0 0 1px var(--fd-accent); }\n.fd-image-card-picture { display: block; aspect-ratio: 4 / 3; background: var(--fd-page); border-block-end: 1px solid var(--fd-border); }\n.fd-image-card-picture img { display: block; width: 100%; height: 100%; object-fit: cover; }\n.fd-image-card-blank { display: grid; place-items: center; width: 100%; height: 100%; color: var(--fd-border-strong); }\n.fd-image-card-blank svg { width: 36%; height: 36%; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }\n.fd-image-card-words { display: flex; align-items: flex-start; gap: 8px; padding: 9px 10px; font-size: 13.5px; line-height: 1.35; }\n.fd-image-card-words::before {\n content: \"\"; flex: none; width: 16px; height: 16px; margin-block-start: 1px; box-sizing: border-box;\n border: 1.5px solid var(--fd-border-strong); border-radius: 50%; background: var(--fd-surface);\n}\n.fd-image-card[role=\"checkbox\"] .fd-image-card-words::before { border-radius: 4px; }\n.fd-image-card[aria-checked=\"true\"] .fd-image-card-words::before { border-color: var(--fd-accent); background: var(--fd-accent); box-shadow: inset 0 0 0 3px var(--fd-surface); }\n.fd-image-card[role=\"checkbox\"][aria-checked=\"true\"] .fd-image-card-words::before {\n box-shadow: none;\n background: var(--fd-accent) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") center / 13px no-repeat;\n}\n.fd-image-choices + .fd-choice-clear { justify-self: end; }\n/* A ranking: numbered lines dragged by their grip, or moved with their arrows; the line being dragged lifts. */\n.fd-ranking { width: 100%; max-width: 480px; min-width: 0; }\n.fd-rank-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }\n.fd-rank-item {\n display: flex; align-items: center; gap: 10px; padding-block: 5px; padding-inline: 8px 5px; min-height: 40px;\n background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius);\n cursor: grab; user-select: none; -webkit-user-select: none;\n}\n.fd-rank-item.fd-rank-lifted { position: relative; z-index: 1; cursor: grabbing; border-color: var(--fd-accent); box-shadow: 0 6px 18px rgba(15, 20, 25, 0.16); }\n.fd-ranking-locked .fd-rank-item { cursor: default; }\n.fd-rank-grip { flex: none; width: 10px; height: 16px; touch-action: none; background: radial-gradient(circle, var(--fd-border-strong) 1.3px, transparent 1.7px) 0 0 / 5px 5.33px; }\n.fd-ranking-locked .fd-rank-grip { visibility: hidden; }\n.fd-rank-place {\n flex: none; display: grid; place-items: center; min-width: 24px; height: 24px; padding-inline: 4px; border-radius: 999px;\n background: var(--fd-accent-soft); color: var(--fd-accent); font-size: 12.5px; font-weight: 600; font-variant-numeric: tabular-nums;\n}\n.fd-rank-words { flex: 1; min-width: 0; overflow-wrap: anywhere; }\n.fd-rank-tools { flex: none; display: inline-flex; gap: 2px; }\n.fd-rank-move {\n width: 30px; height: 30px; padding: 0; font: inherit; font-size: 15px; line-height: 1; color: var(--fd-muted);\n background: none; border: 1px solid transparent; border-radius: 4px; cursor: pointer;\n}\n.fd-rank-move:hover:not(:disabled) { background: var(--fd-page); border-color: var(--fd-border); color: var(--fd-text); }\n.fd-rank-move:disabled { opacity: 0.3; cursor: default; }\n/* An address: its parts in two columns, the street across both, each named above its box; one column when narrow. */\n.fd-address { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 12px; width: 100%; max-width: 560px; min-width: 0; }\n.fd-address-part { display: grid; gap: 3px; min-width: 0; align-content: start; }\n.fd-address-street, .fd-address-line2 { grid-column: 1 / -1; }\n.fd-address-part.fd-required > .fd-address-label::after { content: \"*\"; margin-inline-start: 0.25em; color: var(--fd-error); }\n.fd-address-label { font-size: 12.5px; color: var(--fd-muted); }\n@container (max-width: 420px) { .fd-address { grid-template-columns: minmax(0, 1fr); } }\n/* A repeating group: each line a card of its fields under its numbered title, \u00D7 at its end; \"Add another\" under the cards. */\n.fd-repeat { display: grid; gap: 10px; justify-items: start; width: 100%; min-width: 0; }\n.fd-repeat-list { display: grid; gap: 10px; width: 100%; min-width: 0; }\n.fd-repeat-list:empty { display: none; }\n.fd-repeat-card {\n display: grid; gap: 8px; min-width: 0; padding: 10px 14px 14px;\n background: var(--fd-surface); border: 1px solid var(--fd-border); border-radius: max(var(--fd-radius), 6px);\n}\n.fd-repeat-head { display: flex; align-items: center; gap: 2px; min-height: 28px; }\n.fd-repeat-title { font-weight: 600; font-size: 13.5px; margin-inline-end: auto; }\n.fd-repeat-remove, .fd-repeat-tool { border: none; background: none; cursor: pointer; color: var(--fd-muted); font-size: 18px; line-height: 1; padding: 4px 8px; border-radius: 4px; }\n.fd-repeat-remove:hover { color: var(--fd-error); background: var(--fd-error-soft); }\n.fd-repeat-tool { font-size: 15px; min-width: 24px; min-height: 24px; }\n.fd-repeat-tool:hover { color: var(--fd-accent); background: var(--fd-accent-soft); }\n.fd-repeat-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap: 10px 14px; }\n.fd-repeat-field { display: grid; gap: 3px; min-width: 0; align-content: start; }\n.fd-repeat-label { font-size: 12.5px; color: var(--fd-muted); }\n.fd-repeat-add { border-style: dashed; }\n";
@@ -94,7 +94,7 @@ exports.KINDS_CSS = `
94
94
  .fd-address { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 12px; width: 100%; max-width: 560px; min-width: 0; }
95
95
  .fd-address-part { display: grid; gap: 3px; min-width: 0; align-content: start; }
96
96
  .fd-address-street, .fd-address-line2 { grid-column: 1 / -1; }
97
- .fd-address-part.fd-required > .fd-address-label::after { content: " *"; color: var(--fd-error); }
97
+ .fd-address-part.fd-required > .fd-address-label::after { content: "*"; margin-inline-start: 0.25em; color: var(--fd-error); }
98
98
  .fd-address-label { font-size: 12.5px; color: var(--fd-muted); }
99
99
  @container (max-width: 420px) { .fd-address { grid-template-columns: minmax(0, 1fr); } }
100
100
  /* A repeating group: each line a card of its fields under its numbered title, × at its end; "Add another" under the cards. */
@@ -109,7 +109,7 @@ exports.KINDS_CSS = `
109
109
  .fd-repeat-title { font-weight: 600; font-size: 13.5px; margin-inline-end: auto; }
110
110
  .fd-repeat-remove, .fd-repeat-tool { border: none; background: none; cursor: pointer; color: var(--fd-muted); font-size: 18px; line-height: 1; padding: 4px 8px; border-radius: 4px; }
111
111
  .fd-repeat-remove:hover { color: var(--fd-error); background: var(--fd-error-soft); }
112
- .fd-repeat-tool { font-size: 15px; }
112
+ .fd-repeat-tool { font-size: 15px; min-width: 24px; min-height: 24px; }
113
113
  .fd-repeat-tool:hover { color: var(--fd-accent); background: var(--fd-accent-soft); }
114
114
  .fd-repeat-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap: 10px 14px; }
115
115
  .fd-repeat-field { display: grid; gap: 3px; min-width: 0; align-content: start; }
@@ -91,7 +91,7 @@ export const KINDS_CSS = /* css */ `
91
91
  .fd-address { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 12px; width: 100%; max-width: 560px; min-width: 0; }
92
92
  .fd-address-part { display: grid; gap: 3px; min-width: 0; align-content: start; }
93
93
  .fd-address-street, .fd-address-line2 { grid-column: 1 / -1; }
94
- .fd-address-part.fd-required > .fd-address-label::after { content: " *"; color: var(--fd-error); }
94
+ .fd-address-part.fd-required > .fd-address-label::after { content: "*"; margin-inline-start: 0.25em; color: var(--fd-error); }
95
95
  .fd-address-label { font-size: 12.5px; color: var(--fd-muted); }
96
96
  @container (max-width: 420px) { .fd-address { grid-template-columns: minmax(0, 1fr); } }
97
97
  /* A repeating group: each line a card of its fields under its numbered title, × at its end; "Add another" under the cards. */
@@ -106,7 +106,7 @@ export const KINDS_CSS = /* css */ `
106
106
  .fd-repeat-title { font-weight: 600; font-size: 13.5px; margin-inline-end: auto; }
107
107
  .fd-repeat-remove, .fd-repeat-tool { border: none; background: none; cursor: pointer; color: var(--fd-muted); font-size: 18px; line-height: 1; padding: 4px 8px; border-radius: 4px; }
108
108
  .fd-repeat-remove:hover { color: var(--fd-error); background: var(--fd-error-soft); }
109
- .fd-repeat-tool { font-size: 15px; }
109
+ .fd-repeat-tool { font-size: 15px; min-width: 24px; min-height: 24px; }
110
110
  .fd-repeat-tool:hover { color: var(--fd-accent); background: var(--fd-accent-soft); }
111
111
  .fd-repeat-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap: 10px 14px; }
112
112
  .fd-repeat-field { display: grid; gap: 3px; min-width: 0; align-content: start; }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * How a record sheet reads, as Flectra draws one: read-only values as words.
3
+ * Appended to Fieldia's stylesheet, scoped and written with logical
4
+ * properties as the rest of it is.
5
+ */
6
+ export declare const SHEET_CSS = "\n/* ---- a sheet's reading ----------------------------------------------------- */\n/* A read-only value as its words: on the line a box's words would sit on, wrapped rather than cut at the box's edge. */\n.fd-read-text {\n min-width: 0; min-height: var(--fd-control-height, 30px); padding-block: calc(var(--fd-pad-y) + 1px);\n white-space: pre-wrap; overflow-wrap: anywhere; line-height: 1.45; color: var(--fd-text);\n}\n.fd-field:is([data-type=\"integer\"], [data-type=\"float\"], [data-type=\"monetary\"]) > .fd-read-text { font-variant-numeric: tabular-nums; }\n/* A record's words read their own way \u2014 English on a page read right to left keeps its order \u2014 lined up with the page. */\n.fd-read-text { unicode-bidi: plaintext; text-align: left; }\n[dir=\"rtl\"] .fd-read-text { text-align: right; }\n/* Its words start where a box's words do, inside the box's padding (and an outlined box's border). */\n.fd-read-text { padding-inline: var(--fd-pad-x); }\n.fd-form[data-fd-skin=\"outlined\"] .fd-read-text { padding-inline: calc(var(--fd-pad-x) + 1px); }\n/* A sheet's title stays flush with the labels under it, as it was drawn. */\n.fd-form :is(.fd-title, .fd-title-line) .fd-read-text { padding-inline: 0; }\n.fd-read-text a, .fd-read-link { color: var(--fd-accent); text-decoration: none; }\n.fd-read-link { border: none; background: none; padding: 0; font: inherit; cursor: pointer; text-align: start; }\n.fd-read-text a:hover, .fd-read-link:hover { text-decoration: underline; }\n.fd-read-link:focus-visible, .fd-read-text a:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; border-radius: 2px; }\n/* A choice as a coloured pill, as wide as its words, on the line a box's words sit on. */\n.fd-field > .fd-value-badge { justify-self: start; align-self: start; width: fit-content; margin-block: calc((var(--fd-control-height, 30px) - 24px) / 2); }\n.fd-title > .fd-field > .fd-read-text { font-size: 24px; font-weight: 600; line-height: 1.25; }\n/* A ribbon with words to point at takes the pointer, though its frame lets clicks through. */\n.fd-ribbon[title] { pointer-events: auto; cursor: help; }\n/* A field's value inside an alert's or a text's words, set apart by its weight. */\n.fd-value { font-weight: 600; }\n/* An alert's own buttons, after its words: links in the alert's colour, wrapping under the words on a narrow screen. */\n.fd-alert:has(> .fd-alert-actions) { flex-wrap: wrap; align-items: baseline; }\n.fd-alert-actions { display: inline-flex; flex-wrap: wrap; gap: 4px 12px; align-items: baseline; }\n.fd-alert-actions .fd-button { min-height: 0; padding-block: 0; font-size: inherit; }\n.fd-alert-actions .fd-button-link { color: inherit; padding-inline: 0; text-decoration: underline; text-underline-offset: 2px; font-weight: 600; }\n/* An alert among a page's parts, as Flectra's in a tab: across its row. */\n.fd-text-alert { grid-column: 1 / -1; margin: 0; }\n/* The first alert on a card clears the ribbon in its corner, when no stat buttons stand between them. */\n.fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) > :is(.fd-ribbon-frame + .fd-alert, .fd-ribbon-frame + .fd-stats[hidden] + .fd-alert) { margin-inline-end: 72px; }\n/* A stat button with two values, each after its words, one over the other: \"In: 3\", \"Out: 5\". */\n.fd-stat-pair { gap: 1px; }\n.fd-stat-row { display: inline-flex; align-items: baseline; gap: 5px; }\n.fd-stat-row > .fd-stat-label::after { content: \":\"; }\n.fd-stat-pair .fd-stat-value { font-size: 13.5px; }\n/* On a phone, stat buttons two to a row, edged between them, clear of a ribbon in the corner. */\n@container (max-width: 520px) {\n .fd-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .fd-stat { min-width: 0; padding-inline: 12px; text-align: start; column-gap: 8px; }\n .fd-stat:has(> .fd-icon) { column-gap: 8px; }\n .fd-stat-value { font-size: 14px; }\n .fd-stat:nth-child(odd of :not([hidden])) { border-inline-start: none; }\n .fd-stat:nth-child(n + 3 of :not([hidden])) { border-block-start: 1px solid var(--fd-border); }\n .fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) .fd-stats { padding-inline-end: 0; }\n .fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) .fd-stat:nth-child(2 of :not([hidden])) { padding-inline-end: 64px; }\n .fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) .fd-stat:nth-child(4 of :not([hidden])) { padding-inline-end: 36px; }\n}\n/* A statusbar's time spent in a step, after its words; its folded stages under More, in a menu fixed to the page so the bar's scrolling never cuts it. */\n.fd-step-time { margin-inline-start: 6px; font-size: 11.5px; font-weight: 400; font-variant-numeric: tabular-nums; }\n.fd-statusbar li.fd-step-more > button { padding-inline: 16px 20px; letter-spacing: 1px; }\n.fd-statusbar li.fd-step-more > .fd-step-menu {\n position: fixed; z-index: 30; display: grid; min-width: 160px; margin: 0; padding: 4px 0; clip-path: none; transform: none;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 4px);\n box-shadow: 0 8px 24px rgba(15, 20, 25, 0.12); white-space: nowrap;\n}\n.fd-statusbar li.fd-step-more > .fd-step-menu[hidden] { display: none; }\n.fd-statusbar .fd-step-menu > button {\n font: inherit; font-size: 13px; text-align: start; border: none; background: none; color: inherit; padding: 6px 14px; cursor: pointer; transform: none;\n}\n.fd-statusbar .fd-step-menu > button:hover:not(:disabled), .fd-statusbar .fd-step-menu > button:focus-visible { background: var(--fd-accent-soft); outline: none; }\n.fd-statusbar .fd-step-menu > button:disabled { cursor: default; color: var(--fd-muted); }\n/* A button's key, shown on it while Alt is held, as Flectra shows its hotkeys. */\n.fd-hotkey { display: none; }\n[data-hotkeys] .fd-hotkey {\n display: inline-block; margin-inline-start: 6px; padding: 0 4px; border: 1px solid currentColor; border-radius: 3px;\n font: 600 10.5px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace; opacity: 0.85; vertical-align: 1px;\n}\n/* A link's picture, or its initials, in a circle before its name; lines of the record \u2014 an address \u2014 under the link. */\n.fd-link-avatar {\n flex: none; display: inline-grid; place-items: center; width: 22px; height: 22px; border-radius: 50%; overflow: hidden;\n background: var(--fd-accent-soft); color: var(--fd-accent); font-size: 10px; font-weight: 700; line-height: 1; vertical-align: middle;\n}\n.fd-link-avatar img { width: 100%; height: 100%; object-fit: cover; }\n.fd-combo[data-avatar] > .fd-link-avatar { position: absolute; inset-inline-start: 4px; pointer-events: none; }\n.fd-combo[data-avatar] > .fd-link-avatar[hidden] ~ .fd-combo-input { padding-inline-start: var(--fd-pad-x); }\n.fd-combo[data-avatar] > .fd-link-avatar:not([hidden]) ~ .fd-combo-input { padding-inline-start: 32px; }\n.fd-form[data-fd-skin=\"underline\"] .fd-combo[data-avatar] > .fd-link-avatar { inset-inline-start: 0; }\n.fd-form[data-fd-skin=\"underline\"] .fd-combo[data-avatar] > .fd-link-avatar:not([hidden]) ~ .fd-combo-input { padding-inline-start: 28px; }\n.fd-read-text > .fd-link-avatar { margin-inline-end: 6px; }\n.fd-chip > .fd-link-avatar { width: 18px; height: 18px; font-size: 9px; margin-inline: -4px 2px; }\n.fd-link { display: grid; gap: 2px; min-width: 0; }\n.fd-link-details { font-size: 12.5px; line-height: 1.4; color: var(--fd-muted); text-align: left; }\n[dir=\"rtl\"] .fd-link-details { text-align: right; }\n.fd-link-details > div { unicode-bidi: plaintext; }\n/* Tags in their record's colour, as Flectra numbers them, soft enough to read in either scheme. */\n.fd-chip[data-color] { background: color-mix(in srgb, var(--fd-tag) 18%, var(--fd-surface)); border-color: color-mix(in srgb, var(--fd-tag) 55%, var(--fd-surface)); }\n.fd-chip[data-color=\"1\"] { --fd-tag: #f06050; } .fd-chip[data-color=\"2\"] { --fd-tag: #f4a460; } .fd-chip[data-color=\"3\"] { --fd-tag: #f7cd1f; }\n.fd-chip[data-color=\"4\"] { --fd-tag: #6cc1ed; } .fd-chip[data-color=\"5\"] { --fd-tag: #814968; } .fd-chip[data-color=\"6\"] { --fd-tag: #eb7e7f; }\n.fd-chip[data-color=\"7\"] { --fd-tag: #2c8397; } .fd-chip[data-color=\"8\"] { --fd-tag: #475577; } .fd-chip[data-color=\"9\"] { --fd-tag: #d6145f; }\n.fd-chip[data-color=\"10\"] { --fd-tag: #30c381; } .fd-chip[data-color=\"11\"] { --fd-tag: #9365b8; }\n/* A line of parts, as Flectra's o_row: its title the line's label, its parts each as wide as they need, words and buttons among them. */\n.fd-oneline-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; min-width: 0; min-height: var(--fd-control-height, 30px); }\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; flex: 0 1 auto; width: auto; min-width: 0; grid-template-columns: none; }\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field > * { grid-column: auto !important; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:not([data-labels=\"beside\"]):not([data-labels=\"above\"]) > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field > :is(.fd-error, .fd-warning) { flex-basis: 100%; }\n.fd-oneline-row .fd-input { width: 12em; max-width: 100%; }\n/* Words and the value they go with wrap as one, never parted at a line's end; a run with nothing shown takes no room. */\n.fd-form .fd-oneline-pair { display: inline-flex; flex-wrap: nowrap; align-items: center; gap: 6px 10px; flex: 0 1 auto; max-width: 100%; min-width: 0; }\n.fd-form .fd-oneline-pair:not(:has(> :not([hidden]))) { display: none; }\n/* On a narrow screen each part gives way to the row's width rather than run past it. */\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field { max-width: 100%; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field > * { max-width: 100%; min-width: 0; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"many2one\"], [data-type=\"reference\"]) .fd-input { width: 15em; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"integer\"], [data-type=\"float\"]) .fd-input { width: 7em; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field[data-type=\"monetary\"] .fd-input { width: 8.5em; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"date\"], [data-type=\"datetime\"]) .fd-input { width: 9.5em; }\n/* A date and time needs room for \"dd.mm.yyyy, --:--\" and its calendar button, or its minutes are cut. */\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field[data-type=\"datetime\"] .fd-input { width: 14em; }\n/* A link or a date fills what its line leaves, as Flectra's o_row: as wide as the boxes above and below it,\n a button or words beside it moving to a line of their own where they do not fit. */\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"many2one\"], [data-type=\"reference\"], [data-type=\"date\"], [data-type=\"datetime\"]) { flex: 1 1 auto; }\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"many2one\"], [data-type=\"reference\"], [data-type=\"date\"], [data-type=\"datetime\"]) > :not(.fd-label) { flex: 1 1 auto; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"many2one\"], [data-type=\"reference\"], [data-type=\"date\"], [data-type=\"datetime\"]) .fd-input { width: 100%; min-width: min(100%, var(--fd-oneline-min, 9.5em)); }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field[data-type=\"datetime\"] { --fd-oneline-min: 14em; }\n.fd-form .fd-oneline-words { margin: 0; padding: 0; border: 0; background: none; color: var(--fd-text); }\n.fd-form .fd-oneline-words.fd-text-note { color: var(--fd-muted); font-size: 12.5px; }\n/* A line with no title of its own takes the whole row, its fields' labels beside them where they ask. */\n.fd-form .fd-oneline:not(:has(> .fd-label)) > .fd-oneline-row { grid-column: 1 / -1 !important; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-button-link { padding-inline: 0; min-height: 0; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field > .fd-read-text { min-height: 0; padding-block: 0; }\n/* Words over a sheet's title, as Flectra's label over its h1. */\n.fd-title-label { font-size: 12.5px; font-weight: 600; color: var(--fd-muted); }\n";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * How a record sheet reads, as Flectra draws one: read-only values as words.
3
+ * Appended to Fieldia's stylesheet, scoped and written with logical
4
+ * properties as the rest of it is.
5
+ */
6
+ export declare const SHEET_CSS = "\n/* ---- a sheet's reading ----------------------------------------------------- */\n/* A read-only value as its words: on the line a box's words would sit on, wrapped rather than cut at the box's edge. */\n.fd-read-text {\n min-width: 0; min-height: var(--fd-control-height, 30px); padding-block: calc(var(--fd-pad-y) + 1px);\n white-space: pre-wrap; overflow-wrap: anywhere; line-height: 1.45; color: var(--fd-text);\n}\n.fd-field:is([data-type=\"integer\"], [data-type=\"float\"], [data-type=\"monetary\"]) > .fd-read-text { font-variant-numeric: tabular-nums; }\n/* A record's words read their own way \u2014 English on a page read right to left keeps its order \u2014 lined up with the page. */\n.fd-read-text { unicode-bidi: plaintext; text-align: left; }\n[dir=\"rtl\"] .fd-read-text { text-align: right; }\n/* Its words start where a box's words do, inside the box's padding (and an outlined box's border). */\n.fd-read-text { padding-inline: var(--fd-pad-x); }\n.fd-form[data-fd-skin=\"outlined\"] .fd-read-text { padding-inline: calc(var(--fd-pad-x) + 1px); }\n/* A sheet's title stays flush with the labels under it, as it was drawn. */\n.fd-form :is(.fd-title, .fd-title-line) .fd-read-text { padding-inline: 0; }\n.fd-read-text a, .fd-read-link { color: var(--fd-accent); text-decoration: none; }\n.fd-read-link { border: none; background: none; padding: 0; font: inherit; cursor: pointer; text-align: start; }\n.fd-read-text a:hover, .fd-read-link:hover { text-decoration: underline; }\n.fd-read-link:focus-visible, .fd-read-text a:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; border-radius: 2px; }\n/* A choice as a coloured pill, as wide as its words, on the line a box's words sit on. */\n.fd-field > .fd-value-badge { justify-self: start; align-self: start; width: fit-content; margin-block: calc((var(--fd-control-height, 30px) - 24px) / 2); }\n.fd-title > .fd-field > .fd-read-text { font-size: 24px; font-weight: 600; line-height: 1.25; }\n/* A ribbon with words to point at takes the pointer, though its frame lets clicks through. */\n.fd-ribbon[title] { pointer-events: auto; cursor: help; }\n/* A field's value inside an alert's or a text's words, set apart by its weight. */\n.fd-value { font-weight: 600; }\n/* An alert's own buttons, after its words: links in the alert's colour, wrapping under the words on a narrow screen. */\n.fd-alert:has(> .fd-alert-actions) { flex-wrap: wrap; align-items: baseline; }\n.fd-alert-actions { display: inline-flex; flex-wrap: wrap; gap: 4px 12px; align-items: baseline; }\n.fd-alert-actions .fd-button { min-height: 0; padding-block: 0; font-size: inherit; }\n.fd-alert-actions .fd-button-link { color: inherit; padding-inline: 0; text-decoration: underline; text-underline-offset: 2px; font-weight: 600; }\n/* An alert among a page's parts, as Flectra's in a tab: across its row. */\n.fd-text-alert { grid-column: 1 / -1; margin: 0; }\n/* The first alert on a card clears the ribbon in its corner, when no stat buttons stand between them. */\n.fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) > :is(.fd-ribbon-frame + .fd-alert, .fd-ribbon-frame + .fd-stats[hidden] + .fd-alert) { margin-inline-end: 72px; }\n/* A stat button with two values, each after its words, one over the other: \"In: 3\", \"Out: 5\". */\n.fd-stat-pair { gap: 1px; }\n.fd-stat-row { display: inline-flex; align-items: baseline; gap: 5px; }\n.fd-stat-row > .fd-stat-label::after { content: \":\"; }\n.fd-stat-pair .fd-stat-value { font-size: 13.5px; }\n/* On a phone, stat buttons two to a row, edged between them, clear of a ribbon in the corner. */\n@container (max-width: 520px) {\n .fd-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .fd-stat { min-width: 0; padding-inline: 12px; text-align: start; column-gap: 8px; }\n .fd-stat:has(> .fd-icon) { column-gap: 8px; }\n .fd-stat-value { font-size: 14px; }\n .fd-stat:nth-child(odd of :not([hidden])) { border-inline-start: none; }\n .fd-stat:nth-child(n + 3 of :not([hidden])) { border-block-start: 1px solid var(--fd-border); }\n .fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) .fd-stats { padding-inline-end: 0; }\n .fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) .fd-stat:nth-child(2 of :not([hidden])) { padding-inline-end: 64px; }\n .fd-card:has(> .fd-ribbon-frame > .fd-ribbon:not([hidden])) .fd-stat:nth-child(4 of :not([hidden])) { padding-inline-end: 36px; }\n}\n/* A statusbar's time spent in a step, after its words; its folded stages under More, in a menu fixed to the page so the bar's scrolling never cuts it. */\n.fd-step-time { margin-inline-start: 6px; font-size: 11.5px; font-weight: 400; font-variant-numeric: tabular-nums; }\n.fd-statusbar li.fd-step-more > button { padding-inline: 16px 20px; letter-spacing: 1px; }\n.fd-statusbar li.fd-step-more > .fd-step-menu {\n position: fixed; z-index: 30; display: grid; min-width: 160px; margin: 0; padding: 4px 0; clip-path: none; transform: none;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: max(var(--fd-control-radius), 4px);\n box-shadow: 0 8px 24px rgba(15, 20, 25, 0.12); white-space: nowrap;\n}\n.fd-statusbar li.fd-step-more > .fd-step-menu[hidden] { display: none; }\n.fd-statusbar .fd-step-menu > button {\n font: inherit; font-size: 13px; text-align: start; border: none; background: none; color: inherit; padding: 6px 14px; cursor: pointer; transform: none;\n}\n.fd-statusbar .fd-step-menu > button:hover:not(:disabled), .fd-statusbar .fd-step-menu > button:focus-visible { background: var(--fd-accent-soft); outline: none; }\n.fd-statusbar .fd-step-menu > button:disabled { cursor: default; color: var(--fd-muted); }\n/* A button's key, shown on it while Alt is held, as Flectra shows its hotkeys. */\n.fd-hotkey { display: none; }\n[data-hotkeys] .fd-hotkey {\n display: inline-block; margin-inline-start: 6px; padding: 0 4px; border: 1px solid currentColor; border-radius: 3px;\n font: 600 10.5px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace; opacity: 0.85; vertical-align: 1px;\n}\n/* A link's picture, or its initials, in a circle before its name; lines of the record \u2014 an address \u2014 under the link. */\n.fd-link-avatar {\n flex: none; display: inline-grid; place-items: center; width: 22px; height: 22px; border-radius: 50%; overflow: hidden;\n background: var(--fd-accent-soft); color: var(--fd-accent); font-size: 10px; font-weight: 700; line-height: 1; vertical-align: middle;\n}\n.fd-link-avatar img { width: 100%; height: 100%; object-fit: cover; }\n.fd-combo[data-avatar] > .fd-link-avatar { position: absolute; inset-inline-start: 4px; pointer-events: none; }\n.fd-combo[data-avatar] > .fd-link-avatar[hidden] ~ .fd-combo-input { padding-inline-start: var(--fd-pad-x); }\n.fd-combo[data-avatar] > .fd-link-avatar:not([hidden]) ~ .fd-combo-input { padding-inline-start: 32px; }\n.fd-form[data-fd-skin=\"underline\"] .fd-combo[data-avatar] > .fd-link-avatar { inset-inline-start: 0; }\n.fd-form[data-fd-skin=\"underline\"] .fd-combo[data-avatar] > .fd-link-avatar:not([hidden]) ~ .fd-combo-input { padding-inline-start: 28px; }\n.fd-read-text > .fd-link-avatar { margin-inline-end: 6px; }\n.fd-chip > .fd-link-avatar { width: 18px; height: 18px; font-size: 9px; margin-inline: -4px 2px; }\n.fd-link { display: grid; gap: 2px; min-width: 0; }\n.fd-link-details { font-size: 12.5px; line-height: 1.4; color: var(--fd-muted); text-align: left; }\n[dir=\"rtl\"] .fd-link-details { text-align: right; }\n.fd-link-details > div { unicode-bidi: plaintext; }\n/* Tags in their record's colour, as Flectra numbers them, soft enough to read in either scheme. */\n.fd-chip[data-color] { background: color-mix(in srgb, var(--fd-tag) 18%, var(--fd-surface)); border-color: color-mix(in srgb, var(--fd-tag) 55%, var(--fd-surface)); }\n.fd-chip[data-color=\"1\"] { --fd-tag: #f06050; } .fd-chip[data-color=\"2\"] { --fd-tag: #f4a460; } .fd-chip[data-color=\"3\"] { --fd-tag: #f7cd1f; }\n.fd-chip[data-color=\"4\"] { --fd-tag: #6cc1ed; } .fd-chip[data-color=\"5\"] { --fd-tag: #814968; } .fd-chip[data-color=\"6\"] { --fd-tag: #eb7e7f; }\n.fd-chip[data-color=\"7\"] { --fd-tag: #2c8397; } .fd-chip[data-color=\"8\"] { --fd-tag: #475577; } .fd-chip[data-color=\"9\"] { --fd-tag: #d6145f; }\n.fd-chip[data-color=\"10\"] { --fd-tag: #30c381; } .fd-chip[data-color=\"11\"] { --fd-tag: #9365b8; }\n/* A line of parts, as Flectra's o_row: its title the line's label, its parts each as wide as they need, words and buttons among them. */\n.fd-oneline-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; min-width: 0; min-height: var(--fd-control-height, 30px); }\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; flex: 0 1 auto; width: auto; min-width: 0; grid-template-columns: none; }\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field > * { grid-column: auto !important; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:not([data-labels=\"beside\"]):not([data-labels=\"above\"]) > .fd-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field > :is(.fd-error, .fd-warning) { flex-basis: 100%; }\n.fd-oneline-row .fd-input { width: 12em; max-width: 100%; }\n/* Words and the value they go with wrap as one, never parted at a line's end; a run with nothing shown takes no room. */\n.fd-form .fd-oneline-pair { display: inline-flex; flex-wrap: nowrap; align-items: center; gap: 6px 10px; flex: 0 1 auto; max-width: 100%; min-width: 0; }\n.fd-form .fd-oneline-pair:not(:has(> :not([hidden]))) { display: none; }\n/* On a narrow screen each part gives way to the row's width rather than run past it. */\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field { max-width: 100%; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field > * { max-width: 100%; min-width: 0; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"many2one\"], [data-type=\"reference\"]) .fd-input { width: 15em; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"integer\"], [data-type=\"float\"]) .fd-input { width: 7em; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field[data-type=\"monetary\"] .fd-input { width: 8.5em; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"date\"], [data-type=\"datetime\"]) .fd-input { width: 9.5em; }\n/* A date and time needs room for \"dd.mm.yyyy, --:--\" and its calendar button, or its minutes are cut. */\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field[data-type=\"datetime\"] .fd-input { width: 14em; }\n/* A link or a date fills what its line leaves, as Flectra's o_row: as wide as the boxes above and below it,\n a button or words beside it moving to a line of their own where they do not fit. */\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"many2one\"], [data-type=\"reference\"], [data-type=\"date\"], [data-type=\"datetime\"]) { flex: 1 1 auto; }\n.fd-form :is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"many2one\"], [data-type=\"reference\"], [data-type=\"date\"], [data-type=\"datetime\"]) > :not(.fd-label) { flex: 1 1 auto; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field:is([data-type=\"many2one\"], [data-type=\"reference\"], [data-type=\"date\"], [data-type=\"datetime\"]) .fd-input { width: 100%; min-width: min(100%, var(--fd-oneline-min, 9.5em)); }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field[data-type=\"datetime\"] { --fd-oneline-min: 14em; }\n.fd-form .fd-oneline-words { margin: 0; padding: 0; border: 0; background: none; color: var(--fd-text); }\n.fd-form .fd-oneline-words.fd-text-note { color: var(--fd-muted); font-size: 12.5px; }\n/* A line with no title of its own takes the whole row, its fields' labels beside them where they ask. */\n.fd-form .fd-oneline:not(:has(> .fd-label)) > .fd-oneline-row { grid-column: 1 / -1 !important; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-button-link { padding-inline: 0; min-height: 0; }\n:is(.fd-oneline-row, .fd-oneline-pair) > .fd-field > .fd-read-text { min-height: 0; padding-block: 0; }\n/* Words over a sheet's title, as Flectra's label over its h1. */\n.fd-title-label { font-size: 12.5px; font-weight: 600; color: var(--fd-muted); }\n";