nexus-shared 4.0.0 → 4.1.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 (163) hide show
  1. package/CHANGELOG.md +795 -0
  2. package/README.md +220 -14
  3. package/dist/Client.Index.d.ts +13 -0
  4. package/dist/Client.Index.js +13 -0
  5. package/dist/Components/Chats/ChatComposer.d.ts +7 -1
  6. package/dist/Components/Chats/ChatComposer.js +9 -6
  7. package/dist/Components/Chats/ChatParts.d.ts +15 -2
  8. package/dist/Components/Chats/ChatParts.js +15 -4
  9. package/dist/Components/Chats/ChatPopup.d.ts +46 -0
  10. package/dist/Components/Chats/ChatPopup.js +34 -0
  11. package/dist/Components/Chats/ChatThread.d.ts +9 -1
  12. package/dist/Components/Chats/ChatThread.js +54 -6
  13. package/dist/Components/Dashboards/DashboardBoard.d.ts +62 -0
  14. package/dist/Components/Dashboards/DashboardBoard.js +594 -0
  15. package/dist/Components/Dashboards/DashboardWidgets.d.ts +155 -0
  16. package/dist/Components/Dashboards/DashboardWidgets.js +159 -0
  17. package/dist/Components/Dashboards/WidgetFrame.d.ts +51 -0
  18. package/dist/Components/Dashboards/WidgetFrame.js +45 -0
  19. package/dist/Components/Documents/Button.d.ts +6 -1
  20. package/dist/Components/Documents/Button.js +2 -2
  21. package/dist/Components/Documents/TabButtons.d.ts +6 -0
  22. package/dist/Components/Documents/TabButtons.js +5 -4
  23. package/dist/Components/Domains/DomainCard.d.ts +98 -0
  24. package/dist/Components/Domains/DomainCard.js +182 -0
  25. package/dist/Components/Forms/ApiForm.js +5 -1
  26. package/dist/Components/Forms/Crud.js +72 -24
  27. package/dist/Components/Forms/CrudActions.d.ts +5 -4
  28. package/dist/Components/Forms/CrudActions.js +42 -12
  29. package/dist/Components/Forms/CrudHistory.d.ts +6 -1
  30. package/dist/Components/Forms/CrudHistory.js +14 -6
  31. package/dist/Components/Forms/CrudParts.d.ts +11 -4
  32. package/dist/Components/Forms/CrudParts.js +76 -10
  33. package/dist/Components/Forms/CrudRowForms.js +65 -5
  34. package/dist/Components/Forms/CrudTree.js +7 -7
  35. package/dist/Components/Forms/CrudWorkspace.d.ts +15 -5
  36. package/dist/Components/Forms/CrudWorkspace.js +19 -11
  37. package/dist/Components/Forms/Form.d.ts +3 -2
  38. package/dist/Components/Forms/Form.js +33 -26
  39. package/dist/Components/Forms/FormQuestion.d.ts +6 -0
  40. package/dist/Components/Forms/FormQuestion.js +28 -0
  41. package/dist/Components/Forms/SubmitForm.js +2 -15
  42. package/dist/Components/Inputs/ComputedInput.d.ts +51 -0
  43. package/dist/Components/Inputs/ComputedInput.js +179 -0
  44. package/dist/Components/Inputs/Dropdown.js +4 -2
  45. package/dist/Components/Inputs/GroupForm.js +3 -2
  46. package/dist/Components/Inputs/InputRenderer.d.ts +5 -1
  47. package/dist/Components/Inputs/MarkdownEditor.d.ts +6 -0
  48. package/dist/Components/Inputs/MarkdownEditor.js +32 -6
  49. package/dist/Components/Inputs/PictureInput.js +8 -3
  50. package/dist/Components/Inputs/RowsInput.d.ts +14 -1
  51. package/dist/Components/Inputs/RowsInput.js +78 -5
  52. package/dist/Components/Inputs/TabularForm.js +16 -3
  53. package/dist/Components/Inputs/TreeView.d.ts +24 -1
  54. package/dist/Components/Inputs/TreeView.js +84 -7
  55. package/dist/Components/Layouts/Popup.d.ts +22 -2
  56. package/dist/Components/Layouts/Popup.js +108 -6
  57. package/dist/Components/Messages/MailClient.d.ts +50 -0
  58. package/dist/Components/Messages/MailClient.js +410 -0
  59. package/dist/Components/Messages/MailColumns.d.ts +21 -0
  60. package/dist/Components/Messages/MailColumns.js +92 -0
  61. package/dist/Components/Messages/MailCompose.d.ts +46 -0
  62. package/dist/Components/Messages/MailCompose.js +154 -0
  63. package/dist/Components/Messages/MailReader.d.ts +43 -0
  64. package/dist/Components/Messages/MailReader.js +207 -0
  65. package/dist/Components/Messages/MailThread.d.ts +71 -0
  66. package/dist/Components/Messages/MailThread.js +185 -0
  67. package/dist/Components/Messages/MessageBell.d.ts +41 -0
  68. package/dist/Components/Messages/MessageBell.js +76 -0
  69. package/dist/Components/Viewers/DataTable.js +7 -5
  70. package/dist/Components/Viewers/DataTableColumns.d.ts +2 -2
  71. package/dist/Components/Viewers/DataTableColumns.js +2 -1
  72. package/dist/Components/Viewers/DataTableParts.d.ts +3 -1
  73. package/dist/Components/Viewers/DataTableParts.js +2 -2
  74. package/dist/Components/Viewers/OwnerFiles.d.ts +57 -5
  75. package/dist/Components/Viewers/OwnerFiles.js +142 -31
  76. package/dist/Helpers/ApiModules.js +4 -0
  77. package/dist/Helpers/AuditEntries.d.ts +50 -0
  78. package/dist/Helpers/AuditEntries.js +96 -0
  79. package/dist/Helpers/ChatBackend.d.ts +8 -1
  80. package/dist/Helpers/ChatBackend.js +18 -0
  81. package/dist/Helpers/ChatHelpers.d.ts +2 -0
  82. package/dist/Helpers/ChatHelpers.js +4 -1
  83. package/dist/Helpers/CrudColumns.d.ts +44 -6
  84. package/dist/Helpers/CrudColumns.js +63 -13
  85. package/dist/Helpers/CrudHelpers.d.ts +36 -1
  86. package/dist/Helpers/CrudHelpers.js +61 -0
  87. package/dist/Helpers/CrudPickerPlan.d.ts +58 -0
  88. package/dist/Helpers/CrudPickerPlan.js +46 -0
  89. package/dist/Helpers/CrudRowForms.d.ts +18 -1
  90. package/dist/Helpers/CrudRowForms.js +35 -2
  91. package/dist/Helpers/DashboardHelpers.d.ts +115 -0
  92. package/dist/Helpers/DashboardHelpers.js +305 -0
  93. package/dist/Helpers/DomainCards.d.ts +140 -0
  94. package/dist/Helpers/DomainCards.js +370 -0
  95. package/dist/Helpers/FileAdapter.d.ts +82 -2
  96. package/dist/Helpers/FileAdapter.js +72 -1
  97. package/dist/Helpers/FormStore.d.ts +11 -1
  98. package/dist/Helpers/FormStore.js +66 -19
  99. package/dist/Helpers/InputConditions.d.ts +6 -0
  100. package/dist/Helpers/InputConditions.js +24 -0
  101. package/dist/Helpers/InputMemory.js +40 -30
  102. package/dist/Helpers/InputNarrowing.d.ts +38 -6
  103. package/dist/Helpers/InputNarrowing.js +102 -21
  104. package/dist/Helpers/MailClientHelpers.d.ts +96 -0
  105. package/dist/Helpers/MailClientHelpers.js +211 -0
  106. package/dist/Helpers/MessageBackend.d.ts +152 -0
  107. package/dist/Helpers/MessageBackend.js +329 -0
  108. package/dist/Helpers/MessageHelpers.d.ts +160 -0
  109. package/dist/Helpers/MessageHelpers.js +573 -0
  110. package/dist/Helpers/MessageUnread.d.ts +95 -0
  111. package/dist/Helpers/MessageUnread.js +245 -0
  112. package/dist/Helpers/NexusDriveAdapter.d.ts +17 -1
  113. package/dist/Helpers/NexusDriveAdapter.js +32 -3
  114. package/dist/Helpers/NumberHelpers.d.ts +61 -0
  115. package/dist/Helpers/NumberHelpers.js +124 -8
  116. package/dist/Helpers/PagedPicker.d.ts +42 -0
  117. package/dist/Helpers/PagedPicker.js +85 -0
  118. package/dist/Helpers/RowsStore.d.ts +24 -0
  119. package/dist/Helpers/RowsStore.js +79 -10
  120. package/dist/Helpers/TableHelpers.d.ts +15 -2
  121. package/dist/Helpers/TableHelpers.js +28 -1
  122. package/dist/Helpers/TableStore.d.ts +7 -3
  123. package/dist/Helpers/TableStore.js +9 -4
  124. package/dist/Helpers/ToolbarFit.d.ts +23 -0
  125. package/dist/Helpers/ToolbarFit.js +30 -0
  126. package/dist/Helpers/TreeStore.d.ts +75 -6
  127. package/dist/Helpers/TreeStore.js +182 -18
  128. package/dist/Interfaces/ApiInterfaces.d.ts +10 -1
  129. package/dist/Interfaces/ApiInterfaces.js +10 -1
  130. package/dist/Interfaces/ChatInterfaces.d.ts +22 -0
  131. package/dist/Interfaces/CrudInterfaces.d.ts +78 -5
  132. package/dist/Interfaces/DashboardInterfaces.d.ts +123 -0
  133. package/dist/Interfaces/DashboardInterfaces.js +1 -0
  134. package/dist/Interfaces/DomainInterfaces.d.ts +145 -0
  135. package/dist/Interfaces/DomainInterfaces.js +1 -0
  136. package/dist/Interfaces/FileInterfaces.d.ts +21 -0
  137. package/dist/Interfaces/FileInterfaces.js +2 -0
  138. package/dist/Interfaces/FormInterfaces.d.ts +78 -11
  139. package/dist/Interfaces/InputInterfaces.d.ts +12 -5
  140. package/dist/Interfaces/MailInterfaces.d.ts +192 -0
  141. package/dist/Interfaces/MailInterfaces.js +1 -0
  142. package/dist/Interfaces/TableInterfaces.d.ts +28 -2
  143. package/dist/Services/JoinSources.d.ts +47 -6
  144. package/dist/Services/JoinSources.js +68 -33
  145. package/dist/Services/MessageApi.d.ts +18 -0
  146. package/dist/Services/MessageApi.js +64 -0
  147. package/dist/Shared.Index.d.ts +12 -0
  148. package/dist/Shared.Index.js +12 -0
  149. package/package.json +7 -1
  150. package/src/Styles/Nexus.Button.css +29 -0
  151. package/src/Styles/Nexus.Chat.css +114 -22
  152. package/src/Styles/Nexus.Crud.css +119 -28
  153. package/src/Styles/Nexus.Dashboard.css +763 -0
  154. package/src/Styles/Nexus.Domain.css +384 -0
  155. package/src/Styles/Nexus.Editor.css +20 -0
  156. package/src/Styles/Nexus.Files.css +27 -0
  157. package/src/Styles/Nexus.Index.css +3 -0
  158. package/src/Styles/Nexus.Input.css +31 -0
  159. package/src/Styles/Nexus.Mail.css +1062 -0
  160. package/src/Styles/Nexus.Popup.css +58 -0
  161. package/src/Styles/Nexus.Table.css +1458 -1449
  162. package/src/Styles/Nexus.Theme.Picker.css +1 -0
  163. package/src/Styles/Nexus.Tree.css +10 -0
@@ -0,0 +1,384 @@
1
+ @layer nexus.components {
2
+ /*
3
+ * A record's card (`DomainCard`, `DomainCardFrame`): its title line - the kind as a tag, the title, the code, the state
4
+ * - then its fields, figures, lines and link. A band of whatever holds it (a mail thread's head draws a line above it),
5
+ * never a bordered box of its own. Its placeholder is the same parts with a bone on each line, so the card holds its
6
+ * height when the record lands. A record named with no card (`DomainLine`) is its kind and its words on one line.
7
+ * Table.css loads after this sheet: a rule on a table tag or bone takes two classes.
8
+ */
9
+
10
+ /* A band: as wide as what holds it, also where a grid or a column lines its items up at the start. */
11
+ .nx-domain-card {
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: var(--nx-space-2);
15
+ align-self: stretch;
16
+ justify-self: stretch;
17
+ min-width: 0;
18
+ }
19
+
20
+ /*
21
+ * The head: the title takes the room; the marks, the state and the fold button sit at the end; the quiet line under.
22
+ * Its own width lays it out (the status beside the title, or under it when narrow), so it is the size container.
23
+ */
24
+ .nx-domain-card__head {
25
+ container: nx-domain-card / inline-size;
26
+ display: flex;
27
+ flex-wrap: wrap;
28
+ gap: var(--nx-space-1) var(--nx-space-2);
29
+ align-items: center;
30
+ }
31
+
32
+ /*
33
+ * The title takes the room the status leaves. The width of the card, never the length of its words, decides whether
34
+ * the status sits beside it, so the placeholder and the card it stands for lay out alike at every width.
35
+ */
36
+ .nx-domain-card__title {
37
+ flex: 1 1 0;
38
+ min-width: 0;
39
+ margin: 0;
40
+ font-size: var(--nx-text-md);
41
+ font-weight: 600;
42
+ line-height: 1.5;
43
+ overflow-wrap: anywhere;
44
+ }
45
+
46
+ @container nx-domain-card (max-width: 24rem) {
47
+ .nx-domain-card__title {
48
+ flex-basis: 100%;
49
+ }
50
+ }
51
+
52
+ .nx-table__tag.nx-domain-card__kind {
53
+ margin-inline-end: var(--nx-space-1);
54
+ vertical-align: 1px;
55
+ }
56
+
57
+ /*
58
+ * The quiet line under the title, one line at any width: the code, then the subtitle, cut with "..." when the link at
59
+ * its end needs the room (their whole words on hover), so the card is as tall on a phone as its placeholder.
60
+ */
61
+ .nx-domain-card__subtitle {
62
+ display: flex;
63
+ flex-basis: 100%;
64
+ gap: var(--nx-space-3);
65
+ align-items: baseline;
66
+ min-width: 0;
67
+ color: var(--nx-text-muted);
68
+ font-size: var(--nx-text-sm);
69
+ line-height: 1.5;
70
+ }
71
+
72
+ .nx-domain-card__subtitle > :first-child {
73
+ min-width: 0;
74
+ overflow: hidden;
75
+ text-overflow: ellipsis;
76
+ white-space: nowrap;
77
+ }
78
+
79
+ .nx-domain-card__code {
80
+ font-variant-numeric: tabular-nums;
81
+ }
82
+
83
+ .nx-domain-card__status {
84
+ display: inline-flex;
85
+ flex-shrink: 0;
86
+ gap: var(--nx-space-2);
87
+ align-items: center;
88
+ margin-inline-start: auto;
89
+ }
90
+
91
+ .nx-table__tag.nx-domain-card__state {
92
+ flex-shrink: 0;
93
+ }
94
+
95
+ /* The fold button keeps the title line as tall as its text: a small control laid over the line's own height. */
96
+ .nx-btn.nx-domain-card__toggle {
97
+ margin-block: calc((var(--nx-text-md) * 1.5 - var(--nx-control-sm)) / 2);
98
+ }
99
+
100
+ /* A mark beside the state: read again just now, being read, not up to date. */
101
+ .nx-domain-card__meta {
102
+ display: inline-flex;
103
+ gap: 4px;
104
+ align-items: center;
105
+ color: var(--nx-text-muted);
106
+ font-size: var(--nx-text-xs);
107
+ font-variant-numeric: tabular-nums;
108
+ white-space: nowrap;
109
+ }
110
+
111
+ .nx-domain-card__meta .nx-icon {
112
+ width: 14px;
113
+ height: 14px;
114
+ }
115
+
116
+ .nx-domain-card__meta--failed {
117
+ color: var(--nx-danger);
118
+ }
119
+
120
+ .nx-domain-card__retry {
121
+ padding: 0;
122
+ border: 0;
123
+ border-radius: var(--nx-radius-sm);
124
+ background: none;
125
+ color: inherit;
126
+ font: inherit;
127
+ font-weight: 600;
128
+ text-decoration: underline;
129
+ cursor: pointer;
130
+ }
131
+
132
+ .nx-domain-card__retry:focus-visible {
133
+ outline: none;
134
+ box-shadow: var(--nx-focus-ring);
135
+ }
136
+
137
+ .nx-domain-card__body {
138
+ display: flex;
139
+ flex-direction: column;
140
+ gap: var(--nx-space-2);
141
+ min-width: 0;
142
+ }
143
+
144
+ /* Folded: the class's display would otherwise beat the browser's own [hidden]. */
145
+ /*
146
+ * The details - fields, lines, what a kind adds - fold under the figures, which always show: folded, a leave's card is
147
+ * its title, its code and its balance. Their display would otherwise beat the browser's own [hidden].
148
+ */
149
+ .nx-domain-card__details {
150
+ display: flex;
151
+ flex-direction: column;
152
+ gap: var(--nx-space-2);
153
+ min-width: 0;
154
+ }
155
+
156
+ .nx-domain-card__body[hidden],
157
+ .nx-domain-card__details[hidden] {
158
+ display: none;
159
+ }
160
+
161
+ /* Fields: a label over its value, as many to a row as fit. */
162
+ .nx-domain-card__fields {
163
+ display: grid;
164
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 9rem), 1fr));
165
+ gap: var(--nx-space-2) var(--nx-space-4);
166
+ margin: 0;
167
+ }
168
+
169
+ .nx-domain-card__field {
170
+ min-width: 0;
171
+ }
172
+
173
+ .nx-domain-card__field > dt,
174
+ .nx-domain-card__figure > dt {
175
+ color: var(--nx-text-muted);
176
+ font-size: var(--nx-text-xs);
177
+ line-height: 1.5;
178
+ }
179
+
180
+ .nx-domain-card__field > dd {
181
+ margin: 0;
182
+ font-size: var(--nx-text-sm);
183
+ line-height: 1.5;
184
+ overflow-wrap: anywhere;
185
+ }
186
+
187
+ .nx-domain-card__field[data-empty] > dd,
188
+ .nx-domain-card__note {
189
+ color: var(--nx-text-muted);
190
+ }
191
+
192
+ /*
193
+ * Figures: each a label over a large value, marked at its start by its tone (a second cue beside the words), on one
194
+ * track width so a row of them does not move as their values arrive; two to a row on a phone.
195
+ */
196
+ .nx-domain-card__figures {
197
+ display: grid;
198
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 7.5rem), 1fr));
199
+ gap: var(--nx-space-2) var(--nx-space-4);
200
+ margin: 0;
201
+ }
202
+
203
+ .nx-domain-card__figure {
204
+ --nx-figure-tone: var(--nx-border-strong);
205
+ min-width: 0;
206
+ padding-inline-start: var(--nx-space-2);
207
+ border-inline-start: 3px solid var(--nx-figure-tone);
208
+ }
209
+
210
+ .nx-domain-card__figure[data-tone="primary"] {
211
+ --nx-figure-tone: var(--nx-primary);
212
+ }
213
+
214
+ .nx-domain-card__figure[data-tone="info"] {
215
+ --nx-figure-tone: var(--nx-info);
216
+ }
217
+
218
+ .nx-domain-card__figure[data-tone="success"] {
219
+ --nx-figure-tone: var(--nx-success);
220
+ }
221
+
222
+ .nx-domain-card__figure[data-tone="warning"] {
223
+ --nx-figure-tone: var(--nx-warning);
224
+ }
225
+
226
+ .nx-domain-card__figure[data-tone="danger"] {
227
+ --nx-figure-tone: var(--nx-danger);
228
+ }
229
+
230
+ .nx-domain-card__figure > dd {
231
+ margin: 0;
232
+ white-space: nowrap;
233
+ }
234
+
235
+ .nx-domain-card__value {
236
+ font-size: var(--nx-text-xl);
237
+ font-weight: 600;
238
+ line-height: 1.3;
239
+ font-variant-numeric: tabular-nums;
240
+ }
241
+
242
+ .nx-domain-card__unit {
243
+ color: var(--nx-text-muted);
244
+ font-size: var(--nx-text-sm);
245
+ }
246
+
247
+ /*
248
+ * A hint keeps two lines, in the placeholder and the card alike, so a figure keeps one size whether its words take one
249
+ * line or wrap to two ("1.5 paid, 0.5 unpaid (1 day's pay)" in a narrow column).
250
+ */
251
+ .nx-domain-card__figure > dd.nx-domain-card__hint {
252
+ min-height: 3em;
253
+ color: var(--nx-text-muted);
254
+ font-size: var(--nx-text-xs);
255
+ line-height: 1.5;
256
+ white-space: normal;
257
+ }
258
+
259
+ /* Lines: a short table with no frame, lines between rows, numbers at the end. */
260
+ .nx-domain-card__lines {
261
+ width: 100%;
262
+ border-collapse: collapse;
263
+ font-size: var(--nx-text-sm);
264
+ font-variant-numeric: tabular-nums;
265
+ line-height: 1.5;
266
+ }
267
+
268
+ /* Every cell one line: the values are short, and the first column gives way for the rest. */
269
+ .nx-domain-card__lines th {
270
+ padding: 2px var(--nx-space-2);
271
+ white-space: nowrap;
272
+ border-bottom: 1px solid var(--nx-border);
273
+ color: var(--nx-text-muted);
274
+ font-size: var(--nx-text-xs);
275
+ font-weight: 500;
276
+ text-align: start;
277
+ }
278
+
279
+ .nx-domain-card__lines td {
280
+ padding: 3px var(--nx-space-2);
281
+ border-bottom: 1px solid color-mix(in oklab, var(--nx-border) 60%, transparent);
282
+ white-space: nowrap;
283
+ }
284
+
285
+ .nx-domain-card__lines :is(th, td):first-child {
286
+ padding-inline-start: 0;
287
+ }
288
+
289
+ .nx-domain-card__lines :is(th, td):last-child {
290
+ padding-inline-end: 0;
291
+ }
292
+
293
+ .nx-domain-card__lines :is(th, td)[data-align="end"] {
294
+ text-align: end;
295
+ }
296
+
297
+ /* The first column takes the room the others leave and keeps to one line, so a row is one line tall at any width. */
298
+ .nx-domain-card__lines td:first-child {
299
+ width: 100%;
300
+ max-width: 0;
301
+ overflow: hidden;
302
+ text-overflow: ellipsis;
303
+ }
304
+
305
+ .nx-domain-card__more {
306
+ margin: 0;
307
+ color: var(--nx-text-muted);
308
+ font-size: var(--nx-text-xs);
309
+ line-height: 1.5;
310
+ }
311
+
312
+ .nx-domain-card__link {
313
+ display: inline-flex;
314
+ gap: 4px;
315
+ align-items: center;
316
+ margin-inline-start: auto;
317
+ white-space: nowrap;
318
+ border-radius: var(--nx-radius-sm);
319
+ color: var(--nx-primary);
320
+ font-size: var(--nx-text-sm);
321
+ font-weight: 500;
322
+ line-height: 1.5;
323
+ text-decoration: none;
324
+ }
325
+
326
+ a.nx-domain-card__link:hover {
327
+ text-decoration: underline;
328
+ }
329
+
330
+ .nx-domain-card__link:focus-visible {
331
+ outline: none;
332
+ box-shadow: var(--nx-focus-ring);
333
+ }
334
+
335
+ .nx-domain-card__link .nx-icon {
336
+ width: 14px;
337
+ height: 14px;
338
+ }
339
+
340
+ /* A record the reader cannot open: one quiet sentence under its words, the lock as its second cue. */
341
+ .nx-domain-card__notice {
342
+ display: flex;
343
+ gap: 6px;
344
+ align-items: center;
345
+ margin: 0;
346
+ color: var(--nx-text-muted);
347
+ font-size: var(--nx-text-sm);
348
+ }
349
+
350
+ .nx-domain-card__notice .nx-icon {
351
+ flex-shrink: 0;
352
+ width: 14px;
353
+ height: 14px;
354
+ }
355
+
356
+ /* The placeholder: a bone on the line of the text it stands for, and a tag's size for the state. */
357
+ .nx-table__bone.nx-domain-card__bone {
358
+ display: inline-block;
359
+ max-width: 100%;
360
+ height: 0.9em;
361
+ vertical-align: -0.1em;
362
+ }
363
+
364
+ .nx-table__tag.nx-domain-card__bone-tag {
365
+ width: 6.5rem;
366
+ height: calc(var(--nx-text-xs) * 1.6 + 2px);
367
+ background: color-mix(in oklab, var(--nx-text) 9%, transparent);
368
+ }
369
+
370
+ /* A record with no card: its kind as a tag, then its words. */
371
+ .nx-domain-line {
372
+ display: flex;
373
+ flex-wrap: wrap;
374
+ gap: var(--nx-space-1) var(--nx-space-2);
375
+ align-items: center;
376
+ margin: 0;
377
+ font-size: var(--nx-text-sm);
378
+ }
379
+
380
+ .nx-domain-line__label {
381
+ min-width: 0;
382
+ overflow-wrap: anywhere;
383
+ }
384
+ }
@@ -49,6 +49,26 @@
49
49
  margin-left: auto;
50
50
  }
51
51
 
52
+ /*
53
+ * One row (`toolbarOverflow="menu"`): at any width the buttons take the room the views and the end leave them, never a
54
+ * row of their own, and those that do not fit are in the "More formatting" menu at their end. Two classes, so the
55
+ * narrow rule below that gives the buttons a row of their own does not reach them.
56
+ */
57
+ .nx-editor__bar--one-row {
58
+ flex-wrap: nowrap;
59
+ }
60
+
61
+ .nx-editor__bar--one-row > .nx-editor__tools {
62
+ flex: 1 1 0;
63
+ flex-wrap: nowrap;
64
+ order: 0;
65
+ overflow: hidden;
66
+ }
67
+
68
+ .nx-editor__bar--one-row > .nx-editor__end {
69
+ order: 0;
70
+ }
71
+
52
72
  .nx-editor__tool {
53
73
  display: grid;
54
74
  place-items: center;
@@ -280,6 +280,33 @@
280
280
  box-shadow: var(--nx-shadow-sm);
281
281
  }
282
282
 
283
+ /*
284
+ * A picture whose removal waits for a review: still shown, faded, with the warning tag as a band across its foot,
285
+ * wrapping in a narrow tile. The tag says why in words, so the fade is never the only cue.
286
+ */
287
+ .nx-files__tile[data-pending] .nx-files__thumb img {
288
+ opacity: 0.55;
289
+ }
290
+
291
+ .nx-table__tag.nx-files__pending {
292
+ position: absolute;
293
+ inset-inline: 0;
294
+ bottom: 0;
295
+ justify-content: center;
296
+ max-width: none;
297
+ padding: 3px var(--nx-space-2);
298
+ border-radius: 0;
299
+ line-height: 1.35;
300
+ text-align: center;
301
+ }
302
+
303
+ /* Its tag in a document's row and beside the main picture: under the words, as wide as it says. */
304
+ :is(.nx-files__row-text, .nx-files__about) > .nx-table__tag {
305
+ justify-self: start;
306
+ width: fit-content;
307
+ line-height: 1.45;
308
+ }
309
+
283
310
  /*
284
311
  * The picture's buttons, inside it and centred, on a popover's panel. Shown on hover and on a keyboard's focus in the
285
312
  * picture; where a finger may press (a touch screen, a laptop's too) always, so no button waits behind a hover.
@@ -18,12 +18,15 @@
18
18
  @import "./Nexus.DateTime.css";
19
19
  @import "./Nexus.Choice.css";
20
20
  @import "./Nexus.Crud.css";
21
+ @import "./Nexus.Dashboard.css";
22
+ @import "./Nexus.Domain.css";
21
23
  @import "./Nexus.Dropdown.css";
22
24
  @import "./Nexus.Input.css";
23
25
  @import "./Nexus.Editor.css";
24
26
  @import "./Nexus.Excel.css";
25
27
  @import "./Nexus.Files.css";
26
28
  @import "./Nexus.Form.css";
29
+ @import "./Nexus.Mail.css";
27
30
  @import "./Nexus.Markdown.css";
28
31
  @import "./Nexus.Menu.css";
29
32
  @import "./Nexus.Popup.css";
@@ -152,7 +152,9 @@
152
152
  cursor: default;
153
153
  }
154
154
 
155
+ /* It fills the box, so the box's `text-align` places it: at the end of a table's number column, as a typed figure is. */
155
156
  .nx-field__output-text {
157
+ flex: 1 1 auto;
156
158
  min-width: 0;
157
159
  overflow: hidden;
158
160
  text-overflow: ellipsis;
@@ -456,6 +458,35 @@
456
458
  font-weight: 500;
457
459
  }
458
460
 
461
+ /*
462
+ * A worked-out input that can be typed in (`compute.solve`): its hint and the line that says what the typed figure set
463
+ * share one place, as tall as the taller of the two and at least a line, so nothing below moves as the line comes and goes.
464
+ */
465
+ .nx-field__notes {
466
+ display: grid;
467
+ min-width: 0;
468
+ min-height: 1.35em;
469
+ }
470
+
471
+ .nx-field__notes > * {
472
+ grid-area: 1 / 1;
473
+ min-width: 0;
474
+ }
475
+
476
+ .nx-field__note--off {
477
+ visibility: hidden;
478
+ }
479
+
480
+ .nx-field__note--refused {
481
+ color: var(--nx-danger);
482
+ font-weight: 500;
483
+ }
484
+
485
+ .nx-field__note .nx-icon {
486
+ margin-inline-end: 5px;
487
+ vertical-align: -0.25em;
488
+ }
489
+
459
490
  .nx-field__aside {
460
491
  margin-left: auto;
461
492
  color: var(--nx-text-muted);