nexus-shared 3.2.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 (271) hide show
  1. package/CHANGELOG.md +2359 -0
  2. package/README.md +1911 -1123
  3. package/dist/Client.Index.d.ts +27 -0
  4. package/dist/Client.Index.js +27 -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/DocumentFrame.d.ts +50 -0
  22. package/dist/Components/Documents/DocumentFrame.js +83 -0
  23. package/dist/Components/Documents/Menu.d.ts +4 -0
  24. package/dist/Components/Documents/Menu.js +40 -24
  25. package/dist/Components/Documents/PrintDocument.d.ts +95 -0
  26. package/dist/Components/Documents/PrintDocument.js +62 -0
  27. package/dist/Components/Documents/TabButtons.d.ts +6 -0
  28. package/dist/Components/Documents/TabButtons.js +5 -4
  29. package/dist/Components/Documents/Tabs.d.ts +59 -0
  30. package/dist/Components/Documents/Tabs.js +70 -0
  31. package/dist/Components/Domains/DomainCard.d.ts +98 -0
  32. package/dist/Components/Domains/DomainCard.js +182 -0
  33. package/dist/Components/Forms/ApiForm.js +24 -3
  34. package/dist/Components/Forms/Crud.d.ts +2 -2
  35. package/dist/Components/Forms/Crud.js +628 -247
  36. package/dist/Components/Forms/CrudActions.d.ts +137 -0
  37. package/dist/Components/Forms/CrudActions.js +214 -0
  38. package/dist/Components/Forms/CrudHistory.d.ts +6 -1
  39. package/dist/Components/Forms/CrudHistory.js +14 -6
  40. package/dist/Components/Forms/CrudNarrowPicker.d.ts +31 -0
  41. package/dist/Components/Forms/CrudNarrowPicker.js +180 -0
  42. package/dist/Components/Forms/CrudParts.d.ts +37 -2
  43. package/dist/Components/Forms/CrudParts.js +123 -7
  44. package/dist/Components/Forms/CrudRowForms.d.ts +26 -0
  45. package/dist/Components/Forms/CrudRowForms.js +174 -0
  46. package/dist/Components/Forms/CrudScopes.d.ts +28 -0
  47. package/dist/Components/Forms/CrudScopes.js +76 -0
  48. package/dist/Components/Forms/CrudTree.d.ts +90 -0
  49. package/dist/Components/Forms/CrudTree.js +363 -0
  50. package/dist/Components/Forms/CrudWorkspace.d.ts +73 -0
  51. package/dist/Components/Forms/CrudWorkspace.js +177 -0
  52. package/dist/Components/Forms/ExcelImport.js +3 -3
  53. package/dist/Components/Forms/Form.d.ts +6 -5
  54. package/dist/Components/Forms/Form.js +134 -21
  55. package/dist/Components/Forms/FormLeaveGuard.d.ts +44 -0
  56. package/dist/Components/Forms/FormLeaveGuard.js +65 -0
  57. package/dist/Components/Forms/FormQuestion.d.ts +6 -0
  58. package/dist/Components/Forms/FormQuestion.js +28 -0
  59. package/dist/Components/Forms/RecordFlows.d.ts +50 -0
  60. package/dist/Components/Forms/RecordFlows.js +282 -0
  61. package/dist/Components/Forms/SubmitForm.d.ts +37 -2
  62. package/dist/Components/Forms/SubmitForm.js +182 -10
  63. package/dist/Components/Inputs/CheckBox.js +1 -1
  64. package/dist/Components/Inputs/ChoiceField.d.ts +21 -1
  65. package/dist/Components/Inputs/ChoiceField.js +28 -2
  66. package/dist/Components/Inputs/ComputedInput.d.ts +51 -0
  67. package/dist/Components/Inputs/ComputedInput.js +179 -0
  68. package/dist/Components/Inputs/Dropdown.d.ts +13 -0
  69. package/dist/Components/Inputs/Dropdown.js +8 -6
  70. package/dist/Components/Inputs/DropdownParts.d.ts +3 -1
  71. package/dist/Components/Inputs/DropdownParts.js +16 -4
  72. package/dist/Components/Inputs/Field.d.ts +7 -1
  73. package/dist/Components/Inputs/Field.js +2 -2
  74. package/dist/Components/Inputs/GroupForm.d.ts +6 -6
  75. package/dist/Components/Inputs/GroupForm.js +12 -12
  76. package/dist/Components/Inputs/InputRenderer.d.ts +13 -6
  77. package/dist/Components/Inputs/InputRenderer.js +37 -32
  78. package/dist/Components/Inputs/MarkdownEditor.d.ts +6 -0
  79. package/dist/Components/Inputs/MarkdownEditor.js +32 -6
  80. package/dist/Components/Inputs/PictureInput.d.ts +41 -0
  81. package/dist/Components/Inputs/PictureInput.js +75 -0
  82. package/dist/Components/Inputs/RadioGroup.d.ts +16 -3
  83. package/dist/Components/Inputs/RadioGroup.js +8 -3
  84. package/dist/Components/Inputs/RowsInput.d.ts +15 -2
  85. package/dist/Components/Inputs/RowsInput.js +96 -8
  86. package/dist/Components/Inputs/TabularForm.d.ts +5 -5
  87. package/dist/Components/Inputs/TabularForm.js +45 -32
  88. package/dist/Components/Inputs/TextArea.d.ts +6 -0
  89. package/dist/Components/Inputs/TextArea.js +11 -2
  90. package/dist/Components/Inputs/TextBoxTypes.d.ts +6 -0
  91. package/dist/Components/Inputs/TextBoxTypes.js +17 -0
  92. package/dist/Components/Inputs/TreeView.d.ts +76 -2
  93. package/dist/Components/Inputs/TreeView.js +227 -16
  94. package/dist/Components/Layouts/MessageBox.d.ts +15 -2
  95. package/dist/Components/Layouts/MessageBox.js +56 -7
  96. package/dist/Components/Layouts/Popup.d.ts +34 -7
  97. package/dist/Components/Layouts/Popup.js +143 -13
  98. package/dist/Components/Layouts/PopupDock.d.ts +3 -1
  99. package/dist/Components/Layouts/PopupDock.js +2 -1
  100. package/dist/Components/Layouts/PopupHost.js +5 -4
  101. package/dist/Components/Messages/MailClient.d.ts +50 -0
  102. package/dist/Components/Messages/MailClient.js +410 -0
  103. package/dist/Components/Messages/MailColumns.d.ts +21 -0
  104. package/dist/Components/Messages/MailColumns.js +92 -0
  105. package/dist/Components/Messages/MailCompose.d.ts +46 -0
  106. package/dist/Components/Messages/MailCompose.js +154 -0
  107. package/dist/Components/Messages/MailReader.d.ts +43 -0
  108. package/dist/Components/Messages/MailReader.js +207 -0
  109. package/dist/Components/Messages/MailThread.d.ts +71 -0
  110. package/dist/Components/Messages/MailThread.js +185 -0
  111. package/dist/Components/Messages/MessageBell.d.ts +41 -0
  112. package/dist/Components/Messages/MessageBell.js +76 -0
  113. package/dist/Components/Viewers/DataTable.js +153 -49
  114. package/dist/Components/Viewers/DataTableColumns.d.ts +2 -2
  115. package/dist/Components/Viewers/DataTableColumns.js +2 -1
  116. package/dist/Components/Viewers/DataTableFilters.d.ts +1 -1
  117. package/dist/Components/Viewers/DataTableFilters.js +17 -2
  118. package/dist/Components/Viewers/DataTableParts.d.ts +23 -5
  119. package/dist/Components/Viewers/DataTableParts.js +26 -14
  120. package/dist/Components/Viewers/OwnerFiles.d.ts +227 -0
  121. package/dist/Components/Viewers/OwnerFiles.js +700 -0
  122. package/dist/Components/Viewers/QrCodeImage.d.ts +22 -0
  123. package/dist/Components/Viewers/QrCodeImage.js +15 -0
  124. package/dist/Components/Viewers/RecordCards.d.ts +16 -0
  125. package/dist/Components/Viewers/RecordCards.js +509 -0
  126. package/dist/Helpers/ApiModules.js +4 -0
  127. package/dist/Helpers/AuditEntries.d.ts +50 -0
  128. package/dist/Helpers/AuditEntries.js +96 -0
  129. package/dist/Helpers/BusyHooks.d.ts +6 -0
  130. package/dist/Helpers/BusyHooks.js +39 -0
  131. package/dist/Helpers/ChatBackend.d.ts +8 -1
  132. package/dist/Helpers/ChatBackend.js +18 -0
  133. package/dist/Helpers/ChatHelpers.d.ts +2 -0
  134. package/dist/Helpers/ChatHelpers.js +4 -1
  135. package/dist/Helpers/CrudBackend.d.ts +20 -2
  136. package/dist/Helpers/CrudBackend.js +46 -2
  137. package/dist/Helpers/CrudColumns.d.ts +91 -6
  138. package/dist/Helpers/CrudColumns.js +148 -7
  139. package/dist/Helpers/CrudDetailsTabs.d.ts +58 -0
  140. package/dist/Helpers/CrudDetailsTabs.js +126 -0
  141. package/dist/Helpers/CrudHelpers.d.ts +116 -2
  142. package/dist/Helpers/CrudHelpers.js +256 -0
  143. package/dist/Helpers/CrudNarrowPick.d.ts +83 -0
  144. package/dist/Helpers/CrudNarrowPick.js +157 -0
  145. package/dist/Helpers/CrudPickerPlan.d.ts +58 -0
  146. package/dist/Helpers/CrudPickerPlan.js +46 -0
  147. package/dist/Helpers/CrudRowForms.d.ts +32 -0
  148. package/dist/Helpers/CrudRowForms.js +76 -0
  149. package/dist/Helpers/CrudScopes.d.ts +32 -0
  150. package/dist/Helpers/CrudScopes.js +79 -0
  151. package/dist/Helpers/DashboardHelpers.d.ts +115 -0
  152. package/dist/Helpers/DashboardHelpers.js +305 -0
  153. package/dist/Helpers/DomainCards.d.ts +140 -0
  154. package/dist/Helpers/DomainCards.js +370 -0
  155. package/dist/Helpers/DropdownHelpers.d.ts +3 -1
  156. package/dist/Helpers/DropdownHelpers.js +6 -2
  157. package/dist/Helpers/ExcelHelpers.d.ts +1 -1
  158. package/dist/Helpers/ExcelHelpers.js +12 -11
  159. package/dist/Helpers/FileAdapter.d.ts +158 -0
  160. package/dist/Helpers/FileAdapter.js +173 -0
  161. package/dist/Helpers/FilePrimaries.d.ts +48 -0
  162. package/dist/Helpers/FilePrimaries.js +138 -0
  163. package/dist/Helpers/FormConfirm.d.ts +32 -0
  164. package/dist/Helpers/FormConfirm.js +40 -0
  165. package/dist/Helpers/FormStore.d.ts +100 -5
  166. package/dist/Helpers/FormStore.js +368 -25
  167. package/dist/Helpers/InputConditions.d.ts +56 -0
  168. package/dist/Helpers/InputConditions.js +192 -0
  169. package/dist/Helpers/InputMemory.d.ts +106 -0
  170. package/dist/Helpers/InputMemory.js +395 -0
  171. package/dist/Helpers/InputNarrowing.d.ts +50 -0
  172. package/dist/Helpers/InputNarrowing.js +148 -0
  173. package/dist/Helpers/InputParamsHelpers.d.ts +44 -1
  174. package/dist/Helpers/InputParamsHelpers.js +157 -74
  175. package/dist/Helpers/MailClientHelpers.d.ts +96 -0
  176. package/dist/Helpers/MailClientHelpers.js +211 -0
  177. package/dist/Helpers/MessageBackend.d.ts +152 -0
  178. package/dist/Helpers/MessageBackend.js +329 -0
  179. package/dist/Helpers/MessageHelpers.d.ts +160 -0
  180. package/dist/Helpers/MessageHelpers.js +573 -0
  181. package/dist/Helpers/MessageUnread.d.ts +95 -0
  182. package/dist/Helpers/MessageUnread.js +245 -0
  183. package/dist/Helpers/NexusDriveAdapter.d.ts +71 -0
  184. package/dist/Helpers/NexusDriveAdapter.js +236 -0
  185. package/dist/Helpers/NumberHelpers.d.ts +156 -0
  186. package/dist/Helpers/NumberHelpers.js +242 -0
  187. package/dist/Helpers/PagedPicker.d.ts +42 -0
  188. package/dist/Helpers/PagedPicker.js +85 -0
  189. package/dist/Helpers/Permissions.js +2 -1
  190. package/dist/Helpers/QrCode.d.ts +26 -0
  191. package/dist/Helpers/QrCode.js +463 -0
  192. package/dist/Helpers/RecordCards.d.ts +205 -0
  193. package/dist/Helpers/RecordCards.js +378 -0
  194. package/dist/Helpers/RequestCache.d.ts +14 -2
  195. package/dist/Helpers/RequestCache.js +22 -3
  196. package/dist/Helpers/RowsStore.d.ts +61 -2
  197. package/dist/Helpers/RowsStore.js +203 -16
  198. package/dist/Helpers/ServerPreview.d.ts +69 -0
  199. package/dist/Helpers/ServerPreview.js +99 -0
  200. package/dist/Helpers/TableColumns.js +4 -3
  201. package/dist/Helpers/TableExport.d.ts +7 -1
  202. package/dist/Helpers/TableExport.js +9 -3
  203. package/dist/Helpers/TableFilters.d.ts +1 -1
  204. package/dist/Helpers/TableFilters.js +24 -23
  205. package/dist/Helpers/TableHelpers.d.ts +38 -4
  206. package/dist/Helpers/TableHelpers.js +78 -10
  207. package/dist/Helpers/TableJoins.d.ts +13 -0
  208. package/dist/Helpers/TableJoins.js +34 -0
  209. package/dist/Helpers/TableStore.d.ts +28 -4
  210. package/dist/Helpers/TableStore.js +73 -11
  211. package/dist/Helpers/ToolbarFit.d.ts +23 -0
  212. package/dist/Helpers/ToolbarFit.js +30 -0
  213. package/dist/Helpers/TreeStore.d.ts +156 -6
  214. package/dist/Helpers/TreeStore.js +547 -18
  215. package/dist/Interfaces/ApiInterfaces.d.ts +10 -1
  216. package/dist/Interfaces/ApiInterfaces.js +10 -1
  217. package/dist/Interfaces/ChatInterfaces.d.ts +22 -0
  218. package/dist/Interfaces/CrudInterfaces.d.ts +539 -6
  219. package/dist/Interfaces/DashboardInterfaces.d.ts +123 -0
  220. package/dist/Interfaces/DashboardInterfaces.js +1 -0
  221. package/dist/Interfaces/DomainInterfaces.d.ts +145 -0
  222. package/dist/Interfaces/DomainInterfaces.js +1 -0
  223. package/dist/Interfaces/FileInterfaces.d.ts +183 -0
  224. package/dist/Interfaces/FileInterfaces.js +6 -0
  225. package/dist/Interfaces/FormInterfaces.d.ts +460 -32
  226. package/dist/Interfaces/FormInterfaces.js +79 -1
  227. package/dist/Interfaces/InputInterfaces.d.ts +22 -3
  228. package/dist/Interfaces/MailInterfaces.d.ts +192 -0
  229. package/dist/Interfaces/MailInterfaces.js +1 -0
  230. package/dist/Interfaces/RecordInterfaces.d.ts +367 -0
  231. package/dist/Interfaces/RecordInterfaces.js +1 -0
  232. package/dist/Interfaces/TableInterfaces.d.ts +102 -3
  233. package/dist/Services/ExcelApi.js +5 -0
  234. package/dist/Services/FileApi.d.ts +13 -0
  235. package/dist/Services/FileApi.js +29 -0
  236. package/dist/Services/ImageEditorLoader.d.ts +14 -0
  237. package/dist/Services/ImageEditorLoader.js +51 -0
  238. package/dist/Services/JoinSources.d.ts +79 -6
  239. package/dist/Services/JoinSources.js +132 -21
  240. package/dist/Services/MessageApi.d.ts +18 -0
  241. package/dist/Services/MessageApi.js +64 -0
  242. package/dist/Services/ModuleImport.d.ts +7 -0
  243. package/dist/Services/ModuleImport.js +22 -0
  244. package/dist/Shared.Index.d.ts +28 -0
  245. package/dist/Shared.Index.js +28 -0
  246. package/package.json +13 -2
  247. package/src/Styles/Nexus.Avatar.css +6 -5
  248. package/src/Styles/Nexus.Button.css +39 -4
  249. package/src/Styles/Nexus.Chat.css +114 -22
  250. package/src/Styles/Nexus.Choice.css +16 -0
  251. package/src/Styles/Nexus.Crud.css +486 -21
  252. package/src/Styles/Nexus.Dashboard.css +763 -0
  253. package/src/Styles/Nexus.Domain.css +384 -0
  254. package/src/Styles/Nexus.Dropdown.css +8 -0
  255. package/src/Styles/Nexus.Editor.css +20 -0
  256. package/src/Styles/Nexus.Files.css +437 -0
  257. package/src/Styles/Nexus.Form.css +5 -2
  258. package/src/Styles/Nexus.Index.css +7 -0
  259. package/src/Styles/Nexus.Input.css +73 -0
  260. package/src/Styles/Nexus.Mail.css +1062 -0
  261. package/src/Styles/Nexus.Menu.css +10 -1
  262. package/src/Styles/Nexus.Popup.css +135 -1
  263. package/src/Styles/Nexus.Print.css +288 -0
  264. package/src/Styles/Nexus.QrCode.css +12 -0
  265. package/src/Styles/Nexus.Record.css +430 -0
  266. package/src/Styles/Nexus.Tab.Buttons.css +87 -22
  267. package/src/Styles/Nexus.Table.css +1458 -1387
  268. package/src/Styles/Nexus.Theme.Picker.css +1 -0
  269. package/src/Styles/Nexus.Themes.css +12 -6
  270. package/src/Styles/Nexus.Tokens.css +8 -3
  271. package/src/Styles/Nexus.Tree.css +41 -1
@@ -0,0 +1,437 @@
1
+ /*
2
+ * An owner's pictures and documents (OwnerFiles.tsx, PictureInput.tsx): a picture of any size and shape, the picture
3
+ * input's preview and buttons, the gallery's two panes and the document list. Nothing moves under the pointer: a hovered
4
+ * picture gets a ring, never a new size, so a table's rows and the gallery's grid stay where they are.
5
+ */
6
+ @layer nexus.components {
7
+ /* A picture: its height from --nx-picture-h, its width from the shape (--nx-picture-ratio, width / height). */
8
+ .nx-picture {
9
+ position: relative;
10
+ display: inline-grid;
11
+ flex-shrink: 0;
12
+ place-items: center;
13
+ height: var(--nx-picture-h, 28px);
14
+ aspect-ratio: var(--nx-picture-ratio, 1);
15
+ padding: 0;
16
+ overflow: hidden;
17
+ border: 0;
18
+ border-radius: var(--nx-radius-sm);
19
+ background: color-mix(in oklab, var(--nx-text) 7%, var(--nx-surface));
20
+ color: var(--nx-text-subtle);
21
+ font: inherit;
22
+ vertical-align: middle;
23
+ }
24
+
25
+ .nx-picture img {
26
+ position: absolute;
27
+ inset: 0;
28
+ width: 100%;
29
+ height: 100%;
30
+ object-fit: cover;
31
+ }
32
+
33
+ .nx-picture--empty .nx-icon {
34
+ width: min(50%, 2rem);
35
+ height: auto;
36
+ }
37
+
38
+ .nx-picture--round {
39
+ border-radius: 50%;
40
+ }
41
+
42
+ /* No picture, a name: its initials, on the name's avatar tone (Nexus.Avatar.css), in the text colour. */
43
+ .nx-picture--initials {
44
+ color: var(--nx-text);
45
+ font-size: max(8px, calc(var(--nx-picture-h, 28px) * 0.4));
46
+ font-weight: 600;
47
+ line-height: 1;
48
+ }
49
+
50
+ /* Not read yet: the tint alone, so a row with a picture never flashes the no-picture icon first. */
51
+ .nx-picture--loading .nx-icon {
52
+ visibility: hidden;
53
+ }
54
+
55
+ button.nx-picture {
56
+ cursor: pointer;
57
+ }
58
+
59
+ button.nx-picture:hover {
60
+ box-shadow: 0 0 0 1px var(--nx-border-strong);
61
+ }
62
+
63
+ :is(button.nx-picture, .nx-files__name):focus-visible {
64
+ outline: none;
65
+ box-shadow: var(--nx-focus-ring);
66
+ }
67
+
68
+ /* The picture input: the preview beside its buttons, which wrap under it when the form is narrow. */
69
+ .nx-picture-input {
70
+ min-width: 0;
71
+ }
72
+
73
+ .nx-picture-input__body {
74
+ display: flex;
75
+ flex-wrap: wrap;
76
+ align-items: center;
77
+ gap: var(--nx-space-3) var(--nx-space-4);
78
+ margin-top: var(--nx-space-1);
79
+ }
80
+
81
+ .nx-picture-input__actions {
82
+ display: flex;
83
+ flex-wrap: wrap;
84
+ gap: var(--nx-space-2);
85
+ }
86
+
87
+ /* The gallery and the document list. */
88
+ .nx-files {
89
+ display: grid;
90
+ gap: var(--nx-space-4);
91
+ min-width: 0;
92
+ }
93
+
94
+ .nx-files__bar {
95
+ display: flex;
96
+ flex-wrap: wrap;
97
+ align-items: center;
98
+ justify-content: space-between;
99
+ gap: var(--nx-space-2) var(--nx-space-3);
100
+ }
101
+
102
+ .nx-files__note {
103
+ margin: 0;
104
+ color: var(--nx-text-muted);
105
+ font-size: var(--nx-text-sm);
106
+ }
107
+
108
+ .nx-files__note--error {
109
+ color: var(--nx-danger-text);
110
+ }
111
+
112
+ .nx-files__empty {
113
+ display: grid;
114
+ place-items: center;
115
+ gap: var(--nx-space-2);
116
+ padding: var(--nx-space-8) var(--nx-space-4);
117
+ border-radius: var(--nx-radius-lg);
118
+ background: color-mix(in oklab, var(--nx-text) 4%, var(--nx-surface));
119
+ color: var(--nx-text-muted);
120
+ text-align: center;
121
+ }
122
+
123
+ .nx-files__empty > .nx-icon {
124
+ width: 2rem;
125
+ height: 2rem;
126
+ }
127
+
128
+ .nx-files__empty p {
129
+ margin: 0;
130
+ }
131
+
132
+ .nx-files__grid,
133
+ .nx-files__list {
134
+ margin: 0;
135
+ padding: 0;
136
+ list-style: none;
137
+ }
138
+
139
+ /*
140
+ * Pictures in two panes (the 2026-06-20 gallery): the main picture large with its buttons and the count, a hairline,
141
+ * then the grid. The gallery is the size container: under 560px of its own width the main picture sits small beside
142
+ * its buttons, over the grid. In its window (a flush popup's body) it has a height of its own, so the grid scrolls and
143
+ * nothing else does; in a page or a tab it is as tall as its pictures.
144
+ */
145
+ .nx-files--panes {
146
+ container-type: inline-size;
147
+ width: 100%;
148
+ }
149
+
150
+ .nx-files__frame {
151
+ display: grid;
152
+ grid-template-columns: auto minmax(0, 1fr);
153
+ min-height: 0;
154
+ }
155
+
156
+ .nx-files__side {
157
+ display: flex;
158
+ flex-direction: column;
159
+ gap: var(--nx-space-4);
160
+ box-sizing: content-box;
161
+ width: 15rem;
162
+ min-height: 0;
163
+ padding-inline-end: var(--nx-space-5);
164
+ border-inline-end: 1px solid var(--nx-border);
165
+ }
166
+
167
+ /* The main picture: about 15rem on its long side, a rounded square for every shape (only an avatar is round). */
168
+ .nx-files__cover {
169
+ --nx-picture-h: calc(15rem / max(1, var(--nx-picture-ratio, 1)));
170
+
171
+ align-self: center;
172
+ border-radius: var(--nx-radius-lg);
173
+ }
174
+
175
+ .nx-files__cover.nx-picture--empty .nx-icon {
176
+ width: 3rem;
177
+ }
178
+
179
+ .nx-files__about {
180
+ display: grid;
181
+ align-content: start;
182
+ gap: var(--nx-space-3);
183
+ min-width: 0;
184
+ }
185
+
186
+ .nx-files__side-actions {
187
+ display: flex;
188
+ flex-wrap: wrap;
189
+ gap: var(--nx-space-2);
190
+ }
191
+
192
+ .nx-files__side-actions > .nx-btn {
193
+ flex: 1 1 0;
194
+ }
195
+
196
+ .nx-files__pane {
197
+ min-width: 0;
198
+ min-height: 0;
199
+ padding-inline-start: var(--nx-space-5);
200
+ }
201
+
202
+ /*
203
+ * The window: edge to edge, the panes padded inside, a height of its own (the whole window once it fills it). What is
204
+ * not the panes there - the list that could not be read, with Try again - has the window's own padding.
205
+ */
206
+ .nx-popup--flush .nx-popup__body > .nx-files:not(.nx-files--panes) {
207
+ padding: var(--nx-space-5);
208
+ }
209
+
210
+ @media (max-width: 600px) {
211
+ .nx-popup--flush .nx-popup__body > .nx-files:not(.nx-files--panes) {
212
+ padding: var(--nx-space-4);
213
+ }
214
+ }
215
+
216
+ .nx-popup--flush .nx-popup__body > .nx-files--panes {
217
+ height: min(36rem, calc(100dvh - 10rem));
218
+ }
219
+
220
+ .nx-popup:is(.nx-popup--full, .nx-popup--maximized) .nx-popup__body > .nx-files--panes {
221
+ height: 100%;
222
+ }
223
+
224
+ .nx-popup--flush .nx-popup__body > .nx-files--panes .nx-files__frame {
225
+ height: 100%;
226
+ }
227
+
228
+ .nx-popup--flush .nx-popup__body > .nx-files--panes :is(.nx-files__side, .nx-files__pane) {
229
+ padding: var(--nx-space-5);
230
+ overflow-y: auto;
231
+ overscroll-behavior: contain;
232
+ }
233
+
234
+ /* At least two pictures a row; about 11rem each where there is room. */
235
+ .nx-files__grid {
236
+ display: grid;
237
+ grid-template-columns: repeat(auto-fill, minmax(min(11rem, calc(50% - var(--nx-space-3) / 2)), 1fr));
238
+ gap: var(--nx-space-3);
239
+ }
240
+
241
+ .nx-files__tile {
242
+ position: relative;
243
+ min-width: 0;
244
+ }
245
+
246
+ /* A picture in the grid: a rounded square (or the page's shape), the picture covering it. */
247
+ .nx-files__thumb,
248
+ .nx-table__bone.nx-files__bone {
249
+ position: relative;
250
+ display: block;
251
+ width: 100%;
252
+ height: auto;
253
+ aspect-ratio: var(--nx-picture-ratio, 1);
254
+ overflow: hidden;
255
+ border-radius: var(--nx-radius-lg);
256
+ background: color-mix(in oklab, var(--nx-text) 7%, var(--nx-surface));
257
+ }
258
+
259
+ .nx-files__thumb img {
260
+ position: absolute;
261
+ inset: 0;
262
+ width: 100%;
263
+ height: 100%;
264
+ object-fit: cover;
265
+ }
266
+
267
+ .nx-files__tile:hover .nx-files__thumb {
268
+ box-shadow: 0 0 0 1px var(--nx-border-strong);
269
+ }
270
+
271
+ /* The main picture: a ring in the accent, and the Main tag in its corner. */
272
+ .nx-files__tile[data-primary] .nx-files__thumb {
273
+ box-shadow: 0 0 0 2px var(--nx-primary);
274
+ }
275
+
276
+ .nx-files__mark {
277
+ position: absolute;
278
+ top: var(--nx-space-2);
279
+ left: var(--nx-space-2);
280
+ box-shadow: var(--nx-shadow-sm);
281
+ }
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
+
310
+ /*
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
312
+ * picture; where a finger may press (a touch screen, a laptop's too) always, so no button waits behind a hover.
313
+ * Hidden, they stay in the Tab order and to a screen reader, but take no press: a tap meant for the picture never
314
+ * runs Make main or Edit unseen.
315
+ */
316
+ .nx-files__tools {
317
+ position: absolute;
318
+ inset: 0;
319
+ display: flex;
320
+ flex-wrap: wrap;
321
+ justify-content: center;
322
+ gap: 2px;
323
+ width: fit-content;
324
+ max-width: calc(100% - var(--nx-space-2));
325
+ height: fit-content;
326
+ margin: auto;
327
+ padding: 3px;
328
+ border: 1px solid var(--nx-border);
329
+ border-radius: var(--nx-radius);
330
+ background: light-dark(var(--nx-surface), var(--nx-surface-2));
331
+ box-shadow: var(--nx-shadow);
332
+ opacity: 0;
333
+ pointer-events: none;
334
+ transition: opacity var(--nx-duration) ease-out;
335
+ }
336
+
337
+ .nx-files__tile:is(:hover, :has(:focus-visible)) .nx-files__tools {
338
+ opacity: 1;
339
+ pointer-events: auto;
340
+ }
341
+
342
+ @media (hover: none), (any-hover: none), (any-pointer: coarse) {
343
+ .nx-files__tools {
344
+ opacity: 1;
345
+ pointer-events: auto;
346
+ }
347
+ }
348
+
349
+ @container (max-width: 559.98px) {
350
+ .nx-files__frame {
351
+ display: flex;
352
+ flex-direction: column;
353
+ }
354
+
355
+ .nx-files__side {
356
+ flex-direction: row;
357
+ align-items: flex-start;
358
+ flex-shrink: 0;
359
+ gap: var(--nx-space-3);
360
+ box-sizing: border-box;
361
+ width: auto;
362
+ padding: 0 0 var(--nx-space-4);
363
+ border-inline-end: 0;
364
+ border-bottom: 1px solid var(--nx-border);
365
+ }
366
+
367
+ .nx-files__cover {
368
+ --nx-picture-h: calc(7rem / max(1, var(--nx-picture-ratio, 1)));
369
+
370
+ align-self: flex-start;
371
+ }
372
+
373
+ .nx-files__cover.nx-picture--empty .nx-icon {
374
+ width: 2rem;
375
+ }
376
+
377
+ .nx-files__about {
378
+ flex: 1 1 0;
379
+ }
380
+
381
+ .nx-files__pane {
382
+ flex: 1 1 auto;
383
+ padding: var(--nx-space-4) 0 0;
384
+ }
385
+
386
+ .nx-popup--flush .nx-popup__body > .nx-files--panes .nx-files__side {
387
+ flex-shrink: 0;
388
+ padding: var(--nx-space-4);
389
+ overflow: visible;
390
+ }
391
+
392
+ .nx-popup--flush .nx-popup__body > .nx-files--panes .nx-files__pane {
393
+ padding: var(--nx-space-4);
394
+ }
395
+ }
396
+
397
+ [data-nx-motion="reduce"] .nx-files__tools {
398
+ transition: none;
399
+ }
400
+
401
+ /* The document list: a row per file, its buttons at the end. */
402
+ .nx-files__actions {
403
+ display: inline-flex;
404
+ gap: 2px;
405
+ }
406
+
407
+ .nx-files__row {
408
+ display: grid;
409
+ grid-template-columns: auto minmax(0, 1fr) auto;
410
+ align-items: center;
411
+ gap: var(--nx-space-3);
412
+ padding: var(--nx-space-2) 0;
413
+ }
414
+
415
+ .nx-files__row + .nx-files__row {
416
+ border-top: 1px solid var(--nx-border);
417
+ }
418
+
419
+ .nx-files__row-text {
420
+ display: grid;
421
+ min-width: 0;
422
+ }
423
+
424
+ .nx-files__name {
425
+ overflow: hidden;
426
+ border-radius: var(--nx-radius-sm);
427
+ color: var(--nx-text);
428
+ font-weight: 500;
429
+ text-decoration: none;
430
+ text-overflow: ellipsis;
431
+ white-space: nowrap;
432
+ }
433
+
434
+ .nx-files__name:hover {
435
+ text-decoration: underline;
436
+ }
437
+ }
@@ -180,10 +180,13 @@
180
180
  flex: 1;
181
181
  }
182
182
 
183
- /* One line kept even when empty: "Loading…", "Saving…" and "Unsaved changes" come and go, and the bar never jumps. */
183
+ /*
184
+ * One line kept even when empty: "Loading…", "Saving…" and "Unsaved changes" come and go, and the bar never jumps.
185
+ * The room kept beside the buttons is 14rem; a bar whose words are fewer asks less (`--nx-form-status-basis`).
186
+ */
184
187
  .nx-form-status {
185
188
  display: flex;
186
- flex: 1 1 14rem;
189
+ flex: 1 1 var(--nx-form-status-basis, 14rem);
187
190
  align-items: flex-start;
188
191
  gap: 6px;
189
192
  min-width: 0;
@@ -18,14 +18,21 @@
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";
27
+ @import "./Nexus.Files.css";
25
28
  @import "./Nexus.Form.css";
29
+ @import "./Nexus.Mail.css";
26
30
  @import "./Nexus.Markdown.css";
27
31
  @import "./Nexus.Menu.css";
28
32
  @import "./Nexus.Popup.css";
33
+ @import "./Nexus.Print.css";
34
+ @import "./Nexus.QrCode.css";
35
+ @import "./Nexus.Record.css";
29
36
  @import "./Nexus.RichText.css";
30
37
  @import "./Nexus.Rows.css";
31
38
  @import "./Nexus.Slider.css";
@@ -139,11 +139,38 @@
139
139
  font-variant-numeric: tabular-nums;
140
140
  }
141
141
 
142
+ /*
143
+ * A value worked out from other inputs (a form's `compute`): an <output> where an input would be, its text placed as an
144
+ * input's is (in the middle of the box, low in an inbox one) and in the text colour, a long one cut with an ellipsis.
145
+ * Never typed in, so no I-beam; the read-only tint around it comes from the field.
146
+ */
147
+ .nx-field__control--output {
148
+ display: flex;
149
+ align-items: center;
150
+ overflow: hidden;
151
+ white-space: nowrap;
152
+ cursor: default;
153
+ }
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. */
156
+ .nx-field__output-text {
157
+ flex: 1 1 auto;
158
+ min-width: 0;
159
+ overflow: hidden;
160
+ text-overflow: ellipsis;
161
+ }
162
+
142
163
  .nx-field__control::placeholder {
143
164
  color: var(--nx-text-subtle);
144
165
  opacity: 1;
145
166
  }
146
167
 
168
+ /* A read-only field's placeholder is all it shows ("None"), so it reads as text: --nx-text-subtle is under 3:1 on the
169
+ read-only box in light themes, muted text at least 4.5:1. */
170
+ .nx-field[data-readonly] .nx-field__control::placeholder {
171
+ color: var(--nx-text-muted);
172
+ }
173
+
147
174
  /* Browser extras that the field replaces with its own buttons. */
148
175
  .nx-field__control::-webkit-search-cancel-button,
149
176
  .nx-field__control::-webkit-search-decoration {
@@ -338,6 +365,12 @@
338
365
  animation: nx-field-nudge 320ms ease-in-out;
339
366
  }
340
367
 
368
+ /* A box pointed at with the same nudge: the one thing to set first, when the cursor is sent to it (a CRUD's Add pressed
369
+ while its narrowing box has nothing picked). */
370
+ .nx-field__box[data-nudge] {
371
+ animation: nx-field-nudge 320ms ease-in-out;
372
+ }
373
+
341
374
  @keyframes nx-field-nudge {
342
375
  20%,
343
376
  60% {
@@ -425,6 +458,35 @@
425
458
  font-weight: 500;
426
459
  }
427
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
+
428
490
  .nx-field__aside {
429
491
  margin-left: auto;
430
492
  color: var(--nx-text-muted);
@@ -577,6 +639,16 @@
577
639
  resize: vertical;
578
640
  }
579
641
 
642
+ /* Code (`TextArea code`): the editor's monospace, lines kept as typed, a long one scrolled sideways in the box. */
643
+ .nx-field--multiline .nx-field__control--code {
644
+ overflow-x: auto;
645
+ font-family: var(--nx-font-mono);
646
+ font-size: calc(var(--nx-field-font) - 0.5px);
647
+ white-space: pre;
648
+ overflow-wrap: normal;
649
+ tab-size: 2;
650
+ }
651
+
580
652
  /* Buttons and the read-only lock sit at the top end, centered on the first line (line height 1.4). */
581
653
  .nx-field--multiline .nx-field__actions {
582
654
  align-items: flex-start;
@@ -788,6 +860,7 @@
788
860
  }
789
861
 
790
862
  [data-nx-motion="reduce"] .nx-field__lock[data-nudge],
863
+ [data-nx-motion="reduce"] .nx-field__box[data-nudge],
791
864
  [data-nx-motion="reduce"] .nx-field-notice:popover-open {
792
865
  animation: none;
793
866
  }