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,763 @@
1
+ @layer nexus.components {
2
+ /*
3
+ * DashboardBoard: a bar, then a 12-column grid whose rows are a fixed height (three controls tall, so density moves
4
+ * it), each widget spanning its size's columns and rows, the grid filling every gap. The board is a size container:
5
+ * under 48rem of its own width a small widget takes half and a medium or large one the whole; under 30rem (a phone)
6
+ * every widget takes the whole width, in the layout's order.
7
+ */
8
+ .nx-dash {
9
+ --nx-dash-row: calc(var(--nx-control-md) * 3);
10
+ --nx-dash-gap: var(--nx-space-4);
11
+
12
+ container: nx-dash / inline-size;
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: var(--nx-space-3);
16
+ min-width: 0;
17
+ }
18
+
19
+ .nx-dash__bar {
20
+ display: flex;
21
+ flex-wrap: wrap;
22
+ align-items: center;
23
+ gap: var(--nx-space-2);
24
+ min-height: var(--nx-control-md);
25
+ }
26
+
27
+ .nx-dash__title {
28
+ flex: 1 1 auto;
29
+ min-width: 0;
30
+ font-weight: 600;
31
+ }
32
+
33
+ .nx-dash__actions {
34
+ display: flex;
35
+ flex-wrap: wrap;
36
+ align-items: center;
37
+ gap: var(--nx-space-1);
38
+ margin-inline-start: auto;
39
+ }
40
+
41
+ /* What a save answered: a tint of its tone with an edge, the words in the text colour. */
42
+ .nx-dash__notice {
43
+ --nx-dash-tone: var(--nx-info);
44
+
45
+ display: flex;
46
+ align-items: center;
47
+ gap: var(--nx-space-2);
48
+ margin: 0;
49
+ padding: 2px 2px 2px var(--nx-space-3);
50
+ border-inline-start: 3px solid var(--nx-dash-tone);
51
+ border-radius: var(--nx-radius);
52
+ background: color-mix(in oklab, var(--nx-dash-tone) 12%, var(--nx-surface));
53
+ color: var(--nx-text);
54
+ font-size: var(--nx-text-sm);
55
+ }
56
+
57
+ .nx-dash__notice[data-tone="danger"] {
58
+ --nx-dash-tone: var(--nx-danger);
59
+ }
60
+
61
+ .nx-dash__notice[data-tone="success"] {
62
+ --nx-dash-tone: var(--nx-success);
63
+ }
64
+
65
+ .nx-dash__grid {
66
+ position: relative;
67
+ display: grid;
68
+ grid-template-columns: repeat(12, minmax(0, 1fr));
69
+ grid-auto-rows: var(--nx-dash-row);
70
+ grid-auto-flow: row dense;
71
+ gap: var(--nx-dash-gap);
72
+ }
73
+
74
+ .nx-dash__grid[data-dragging] {
75
+ cursor: grabbing;
76
+ user-select: none;
77
+ }
78
+
79
+ .nx-dash__empty {
80
+ display: grid;
81
+ justify-items: center;
82
+ gap: var(--nx-space-2);
83
+ padding: var(--nx-space-8) var(--nx-space-4);
84
+ border: 1px dashed var(--nx-border-strong);
85
+ border-radius: var(--nx-radius-lg);
86
+ color: var(--nx-text-muted);
87
+ text-align: center;
88
+ }
89
+
90
+ .nx-dash__empty p {
91
+ margin: 0;
92
+ }
93
+
94
+ .nx-dash__empty .nx-icon {
95
+ width: 24px;
96
+ height: 24px;
97
+ }
98
+
99
+ @container nx-dash (max-width: 48rem) {
100
+ .nx-widget[data-size="S"] {
101
+ grid-column: span 6;
102
+ }
103
+
104
+ .nx-widget:is([data-size="M"], [data-size="L"]) {
105
+ grid-column: span 12;
106
+ }
107
+ }
108
+
109
+ @container nx-dash (max-width: 30rem) {
110
+ .nx-dash__grid {
111
+ --nx-dash-gap: var(--nx-space-3);
112
+ }
113
+
114
+ .nx-widget[data-size] {
115
+ grid-column: span 12;
116
+ }
117
+ }
118
+
119
+ /*
120
+ * WidgetFrame: one panel - a low heading (title, link, refresh or the edit tools) over a body that scrolls inside the
121
+ * frame. Its size is the grid's, never its content's, so the bones, the data and a failure are all the same box.
122
+ */
123
+ .nx-widget {
124
+ display: flex;
125
+ flex-direction: column;
126
+ grid-column: span var(--nx-widget-columns, 6);
127
+ grid-row: span var(--nx-widget-rows, 2);
128
+ min-width: 0;
129
+ min-height: 0;
130
+ overflow: hidden;
131
+ border: 1px solid var(--nx-border);
132
+ border-radius: var(--nx-radius-lg);
133
+ background: var(--nx-surface);
134
+ }
135
+
136
+ .nx-widget__head {
137
+ display: flex;
138
+ flex-shrink: 0;
139
+ align-items: center;
140
+ gap: var(--nx-space-1);
141
+ min-height: calc(var(--nx-control-sm) + 8px);
142
+ padding: 4px 4px 0 var(--nx-space-3);
143
+ }
144
+
145
+ .nx-widget__title {
146
+ flex: 1 1 auto;
147
+ min-width: 0;
148
+ margin: 0;
149
+ overflow: hidden;
150
+ font-size: var(--nx-text-sm);
151
+ font-weight: 600;
152
+ white-space: nowrap;
153
+ text-overflow: ellipsis;
154
+ }
155
+
156
+ .nx-btn.nx-widget__refresh {
157
+ flex-shrink: 0;
158
+ color: var(--nx-text-muted);
159
+ }
160
+
161
+ /* A link in a widget: the heading's View all, a list's more, Read more, What's new. */
162
+ .nx-widget__link,
163
+ .nx-wlist__more,
164
+ .nx-wnews__more,
165
+ .nx-wversion__link {
166
+ display: inline-flex;
167
+ flex-shrink: 0;
168
+ align-items: center;
169
+ gap: 2px;
170
+ padding: 2px 6px;
171
+ border: 0;
172
+ border-radius: var(--nx-radius);
173
+ background: none;
174
+ color: var(--nx-primary);
175
+ font: inherit;
176
+ font-size: var(--nx-text-xs);
177
+ font-weight: 500;
178
+ white-space: nowrap;
179
+ text-decoration: none;
180
+ cursor: pointer;
181
+ }
182
+
183
+ :is(.nx-widget__link, .nx-wlist__more, .nx-wnews__more, .nx-wversion__link):hover {
184
+ text-decoration: underline;
185
+ }
186
+
187
+ :is(.nx-widget__link, .nx-wlist__more, .nx-wnews__more, .nx-wversion__link, .nx-wstat__figure--link, .nx-wlist__item--link):focus-visible {
188
+ outline: none;
189
+ box-shadow: var(--nx-focus-ring);
190
+ }
191
+
192
+ .nx-widget__body {
193
+ position: relative;
194
+ flex: 1 1 auto;
195
+ min-height: 0;
196
+ overflow: auto;
197
+ padding: var(--nx-space-2) var(--nx-space-3) var(--nx-space-3);
198
+ }
199
+
200
+ /* A small widget is one line of heading over one figure: its body keeps the room. */
201
+ .nx-widget[data-size="S"] .nx-widget__body {
202
+ padding-block: 0 var(--nx-space-2);
203
+ }
204
+
205
+ .nx-widget__bones {
206
+ display: grid;
207
+ gap: 10px;
208
+ padding-top: 4px;
209
+ }
210
+
211
+ .nx-table__bone.nx-widget__bone {
212
+ height: 0.9em;
213
+ }
214
+
215
+ .nx-widget__bone:nth-child(3n + 2) {
216
+ width: 82%;
217
+ }
218
+
219
+ .nx-widget__bone:nth-child(3n) {
220
+ width: 64%;
221
+ }
222
+
223
+ .nx-widget[data-size="S"] .nx-widget__bone {
224
+ width: 45%;
225
+ height: 1.6em;
226
+ }
227
+
228
+ .nx-widget__empty,
229
+ .nx-widget__failure {
230
+ display: grid;
231
+ place-content: center;
232
+ min-height: 100%;
233
+ margin: 0;
234
+ }
235
+
236
+ .nx-widget__empty {
237
+ color: var(--nx-text-muted);
238
+ font-size: var(--nx-text-sm);
239
+ text-align: center;
240
+ }
241
+
242
+ /* Edit mode: a dashed edge says the board is being arranged; the heading is the handle. */
243
+ .nx-dash[data-editing] .nx-widget {
244
+ border-style: dashed;
245
+ border-color: var(--nx-border-strong);
246
+ }
247
+
248
+ .nx-dash[data-editing] .nx-widget__head {
249
+ cursor: grab;
250
+ touch-action: none;
251
+ user-select: none;
252
+ }
253
+
254
+ .nx-widget:focus-visible {
255
+ outline: none;
256
+ box-shadow: var(--nx-focus-ring);
257
+ }
258
+
259
+ .nx-dash .nx-widget[data-dragging] {
260
+ position: relative;
261
+ z-index: 2;
262
+ border-style: solid;
263
+ border-color: var(--nx-primary);
264
+ box-shadow: var(--nx-shadow);
265
+ cursor: grabbing;
266
+ }
267
+
268
+ .nx-widget__tools {
269
+ display: inline-flex;
270
+ flex-shrink: 0;
271
+ align-items: center;
272
+ gap: 2px;
273
+ }
274
+
275
+ .nx-widget__grip {
276
+ display: grid;
277
+ flex-shrink: 0;
278
+ place-items: center;
279
+ width: 20px;
280
+ height: var(--nx-control-sm);
281
+ margin-inline-start: -8px;
282
+ padding: 0;
283
+ border: 0;
284
+ border-radius: var(--nx-radius-sm);
285
+ background: none;
286
+ color: var(--nx-text-muted);
287
+ cursor: inherit;
288
+ }
289
+
290
+ .nx-btn.nx-widget__size {
291
+ font-variant-numeric: tabular-nums;
292
+ }
293
+
294
+ /* The Add drawer: by module, each widget its shape, its words, and Add. */
295
+ .nx-dash-add__group + .nx-dash-add__group {
296
+ margin-top: var(--nx-space-4);
297
+ }
298
+
299
+ .nx-dash-add__module {
300
+ margin: 0 0 var(--nx-space-1);
301
+ color: var(--nx-text-muted);
302
+ font-size: var(--nx-text-xs);
303
+ font-weight: 600;
304
+ letter-spacing: 0.04em;
305
+ text-transform: uppercase;
306
+ }
307
+
308
+ .nx-dash-add__list {
309
+ display: grid;
310
+ gap: var(--nx-space-1);
311
+ margin: 0;
312
+ padding: 0;
313
+ list-style: none;
314
+ }
315
+
316
+ .nx-dash-add__item {
317
+ display: grid;
318
+ grid-template-columns: auto minmax(0, 1fr) auto;
319
+ align-items: center;
320
+ gap: var(--nx-space-3);
321
+ padding: var(--nx-space-2) 0;
322
+ }
323
+
324
+ .nx-dash-add__preview {
325
+ display: grid;
326
+ grid-template-columns: repeat(12, 4px);
327
+ grid-auto-rows: 8px;
328
+ gap: 1px;
329
+ align-content: start;
330
+ width: 63px;
331
+ height: 39px;
332
+ padding: 2px;
333
+ border-radius: var(--nx-radius-sm);
334
+ background: color-mix(in oklab, var(--nx-text) 7%, transparent);
335
+ }
336
+
337
+ .nx-dash-add__shape {
338
+ border-radius: 2px;
339
+ background: color-mix(in oklab, var(--nx-primary) 55%, var(--nx-surface));
340
+ }
341
+
342
+ .nx-dash-add__text {
343
+ display: grid;
344
+ gap: 1px;
345
+ min-width: 0;
346
+ }
347
+
348
+ .nx-dash-add__title {
349
+ display: flex;
350
+ align-items: center;
351
+ gap: 6px;
352
+ font-weight: 500;
353
+ }
354
+
355
+ .nx-dash-add__title .nx-icon {
356
+ flex-shrink: 0;
357
+ color: var(--nx-text-muted);
358
+ }
359
+
360
+ .nx-dash-add__description,
361
+ .nx-dash-add__sizes,
362
+ .nx-dash-add__on {
363
+ color: var(--nx-text-muted);
364
+ font-size: var(--nx-text-xs);
365
+ }
366
+
367
+ .nx-dash-add__on {
368
+ display: inline-flex;
369
+ align-items: center;
370
+ gap: 4px;
371
+ white-space: nowrap;
372
+ }
373
+
374
+ .nx-dash-add__all {
375
+ margin: 0 0 var(--nx-space-3);
376
+ color: var(--nx-text-muted);
377
+ }
378
+
379
+ /* A dot of a tone: a figure's, a calendar mark's. */
380
+ .nx-wstat__dot,
381
+ .nx-wcal__dot {
382
+ --nx-dot-tone: var(--nx-text-muted);
383
+
384
+ flex-shrink: 0;
385
+ width: 8px;
386
+ height: 8px;
387
+ border-radius: 50%;
388
+ background: var(--nx-dot-tone);
389
+ }
390
+
391
+ :is(.nx-wstat__dot, .nx-wcal__dot)[data-tone="primary"] {
392
+ --nx-dot-tone: var(--nx-primary);
393
+ }
394
+
395
+ :is(.nx-wstat__dot, .nx-wcal__dot)[data-tone="success"] {
396
+ --nx-dot-tone: var(--nx-success);
397
+ }
398
+
399
+ :is(.nx-wstat__dot, .nx-wcal__dot)[data-tone="warning"] {
400
+ --nx-dot-tone: var(--nx-warning);
401
+ }
402
+
403
+ :is(.nx-wstat__dot, .nx-wcal__dot)[data-tone="danger"] {
404
+ --nx-dot-tone: var(--nx-danger);
405
+ }
406
+
407
+ :is(.nx-wstat__dot, .nx-wcal__dot)[data-tone="info"] {
408
+ --nx-dot-tone: var(--nx-info);
409
+ }
410
+
411
+ /* StatWidget: figures side by side as they fit, plain on the panel; a linked one tints under the pointer. */
412
+ .nx-wstat {
413
+ display: grid;
414
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 6.5rem), 1fr));
415
+ gap: var(--nx-space-1) var(--nx-space-2);
416
+ align-content: start;
417
+ margin: 0 calc(var(--nx-space-2) * -1);
418
+ padding: 0;
419
+ list-style: none;
420
+ }
421
+
422
+ .nx-wstat__item {
423
+ min-width: 0;
424
+ }
425
+
426
+ .nx-wstat__figure {
427
+ display: grid;
428
+ gap: 2px;
429
+ padding: var(--nx-space-1) var(--nx-space-2);
430
+ border-radius: var(--nx-radius);
431
+ color: inherit;
432
+ text-decoration: none;
433
+ }
434
+
435
+ .nx-widget[data-size="S"] .nx-wstat__figure {
436
+ padding-block: 0;
437
+ }
438
+
439
+ .nx-wstat__figure--link:hover {
440
+ background: var(--nx-surface-hover);
441
+ }
442
+
443
+ .nx-wstat__label {
444
+ display: flex;
445
+ align-items: center;
446
+ gap: 6px;
447
+ min-width: 0;
448
+ overflow: hidden;
449
+ color: var(--nx-text-muted);
450
+ font-size: var(--nx-text-sm);
451
+ font-weight: 500;
452
+ white-space: nowrap;
453
+ text-overflow: ellipsis;
454
+ }
455
+
456
+ .nx-wstat__value {
457
+ font-size: 1.5rem;
458
+ font-weight: 650;
459
+ font-variant-numeric: tabular-nums;
460
+ letter-spacing: -0.02em;
461
+ line-height: 1.15;
462
+ }
463
+
464
+ .nx-wstat__note {
465
+ color: var(--nx-text-muted);
466
+ font-size: var(--nx-text-xs);
467
+ }
468
+
469
+ /* Muted words on a hover tint move toward the text colour, so they still read at 4.5:1. */
470
+ .nx-wstat__figure--link:hover :is(.nx-wstat__label, .nx-wstat__note),
471
+ .nx-wlist__item--link:hover :is(.nx-wlist__secondary, .nx-wlist__time) {
472
+ color: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 35%);
473
+ }
474
+
475
+ /* ListWidget: rows of one height, a picture or icon, the words, a time and a tag at the end. */
476
+ .nx-wlist {
477
+ display: flex;
478
+ flex-direction: column;
479
+ min-height: 100%;
480
+ margin: 0 calc(var(--nx-space-2) * -1);
481
+ }
482
+
483
+ .nx-wlist__rows {
484
+ display: grid;
485
+ margin: 0;
486
+ padding: 0;
487
+ list-style: none;
488
+ }
489
+
490
+ .nx-wlist__item {
491
+ display: grid;
492
+ grid-template-columns: auto minmax(0, 1fr) auto;
493
+ align-items: center;
494
+ gap: var(--nx-space-2);
495
+ min-height: calc(var(--nx-row) + 12px);
496
+ padding: 3px var(--nx-space-2);
497
+ border-radius: var(--nx-radius);
498
+ color: inherit;
499
+ text-decoration: none;
500
+ }
501
+
502
+ .nx-wlist__row:not([data-lead]) .nx-wlist__item {
503
+ grid-template-columns: minmax(0, 1fr) auto;
504
+ }
505
+
506
+ .nx-wlist__item--link:hover {
507
+ background: var(--nx-surface-hover);
508
+ }
509
+
510
+ .nx-wlist__icon {
511
+ display: grid;
512
+ place-items: center;
513
+ width: 28px;
514
+ height: 28px;
515
+ border-radius: var(--nx-radius);
516
+ background: color-mix(in oklab, var(--nx-text) 7%, transparent);
517
+ color: var(--nx-text-muted);
518
+ }
519
+
520
+ .nx-wlist__text,
521
+ .nx-wlist__end {
522
+ display: grid;
523
+ gap: 1px;
524
+ min-width: 0;
525
+ line-height: 1.35;
526
+ }
527
+
528
+ .nx-wlist__end {
529
+ justify-items: end;
530
+ }
531
+
532
+ .nx-wlist__title,
533
+ .nx-wlist__secondary {
534
+ overflow: hidden;
535
+ white-space: nowrap;
536
+ text-overflow: ellipsis;
537
+ }
538
+
539
+ .nx-wlist__title {
540
+ font-size: var(--nx-text-sm);
541
+ }
542
+
543
+ .nx-wlist__title[data-unread] {
544
+ font-weight: 600;
545
+ }
546
+
547
+ .nx-wlist__secondary,
548
+ .nx-wlist__time {
549
+ color: var(--nx-text-muted);
550
+ font-size: var(--nx-text-xs);
551
+ }
552
+
553
+ .nx-wlist__time {
554
+ font-variant-numeric: tabular-nums;
555
+ white-space: nowrap;
556
+ }
557
+
558
+ .nx-table__tag.nx-wlist__chip {
559
+ max-width: 8rem;
560
+ overflow: hidden;
561
+ white-space: nowrap;
562
+ text-overflow: ellipsis;
563
+ }
564
+
565
+ .nx-wlist__more {
566
+ align-self: flex-start;
567
+ margin: auto var(--nx-space-1) 0;
568
+ }
569
+
570
+ /* CalendarWidget: the month beside the legend and the picked day's marks, under them when narrow. */
571
+ .nx-wcal {
572
+ display: flex;
573
+ flex-wrap: wrap;
574
+ align-items: flex-start;
575
+ gap: var(--nx-space-3) var(--nx-space-5);
576
+ }
577
+
578
+ .nx-cal.nx-wcal__month {
579
+ flex: none;
580
+ margin-inline-start: calc(var(--nx-space-2) * -1);
581
+ padding-block: 0;
582
+ }
583
+
584
+ .nx-wcal__day {
585
+ display: grid;
586
+ justify-items: center;
587
+ gap: 2px;
588
+ line-height: 1;
589
+ }
590
+
591
+ .nx-cal__day:not([aria-selected="true"]) .nx-wcal__day[data-holiday] .nx-cal__num {
592
+ color: var(--nx-danger);
593
+ }
594
+
595
+ .nx-wcal__dots {
596
+ display: flex;
597
+ gap: 2px;
598
+ height: 5px;
599
+ }
600
+
601
+ .nx-wcal__dots .nx-wcal__dot {
602
+ width: 5px;
603
+ height: 5px;
604
+ }
605
+
606
+ /* On the picked day's solid fill, a dot takes the fill's label colour. */
607
+ .nx-cal__day[aria-selected="true"] .nx-wcal__dot {
608
+ background: currentColor;
609
+ }
610
+
611
+ .nx-wcal__side {
612
+ display: grid;
613
+ flex: 1 1 12rem;
614
+ align-content: start;
615
+ gap: var(--nx-space-3);
616
+ min-width: 0;
617
+ }
618
+
619
+ .nx-wcal__legend {
620
+ display: flex;
621
+ flex-wrap: wrap;
622
+ gap: 4px var(--nx-space-3);
623
+ margin: 0;
624
+ padding: 0;
625
+ font-size: var(--nx-text-xs);
626
+ list-style: none;
627
+ }
628
+
629
+ .nx-wcal__key {
630
+ display: inline-flex;
631
+ align-items: center;
632
+ gap: 6px;
633
+ }
634
+
635
+ .nx-wcal__count {
636
+ color: var(--nx-text-muted);
637
+ font-variant-numeric: tabular-nums;
638
+ }
639
+
640
+ .nx-wcal__date {
641
+ margin: 0;
642
+ font-size: var(--nx-text-sm);
643
+ font-weight: 600;
644
+ }
645
+
646
+ .nx-wcal__marks {
647
+ display: grid;
648
+ gap: 6px;
649
+ margin: 6px 0 0;
650
+ padding: 0;
651
+ list-style: none;
652
+ }
653
+
654
+ .nx-wcal__mark {
655
+ display: flex;
656
+ align-items: baseline;
657
+ gap: var(--nx-space-2);
658
+ min-width: 0;
659
+ font-size: var(--nx-text-sm);
660
+ }
661
+
662
+ .nx-wcal__label {
663
+ min-width: 0;
664
+ overflow-wrap: anywhere;
665
+ }
666
+
667
+ .nx-wcal__none {
668
+ margin: 6px 0 0;
669
+ color: var(--nx-text-muted);
670
+ font-size: var(--nx-text-sm);
671
+ }
672
+
673
+ /* NewsWidget: notes one under another, a hairline between, the notes cut at their lines with Read more. */
674
+ .nx-wnews {
675
+ display: grid;
676
+ gap: var(--nx-space-3);
677
+ margin: 0;
678
+ padding: 0;
679
+ list-style: none;
680
+ }
681
+
682
+ .nx-wnews__item {
683
+ display: grid;
684
+ gap: 4px;
685
+ min-width: 0;
686
+ }
687
+
688
+ .nx-wnews__item + .nx-wnews__item {
689
+ padding-top: var(--nx-space-3);
690
+ border-top: 1px solid var(--nx-border);
691
+ }
692
+
693
+ .nx-wnews__head {
694
+ display: flex;
695
+ flex-wrap: wrap;
696
+ align-items: center;
697
+ gap: 6px;
698
+ }
699
+
700
+ .nx-wnews__title {
701
+ margin-inline-end: 2px;
702
+ font-size: var(--nx-text-sm);
703
+ font-weight: 600;
704
+ }
705
+
706
+ .nx-wnews__meta {
707
+ margin: 0;
708
+ color: var(--nx-text-muted);
709
+ font-size: var(--nx-text-xs);
710
+ }
711
+
712
+ .nx-markdown.nx-wnews__notes {
713
+ display: -webkit-box;
714
+ overflow: hidden;
715
+ font-size: var(--nx-text-sm);
716
+ -webkit-box-orient: vertical;
717
+ }
718
+
719
+ .nx-wnews__notes > * {
720
+ margin-block: 0;
721
+ }
722
+
723
+ .nx-wnews__more {
724
+ justify-self: start;
725
+ margin-inline-start: -6px;
726
+ }
727
+
728
+ /* VersionWidget: the version large, the application and build day under it. */
729
+ .nx-wversion {
730
+ display: grid;
731
+ align-content: start;
732
+ gap: 2px;
733
+ }
734
+
735
+ .nx-wversion__line {
736
+ display: flex;
737
+ flex-wrap: wrap;
738
+ align-items: center;
739
+ gap: var(--nx-space-2);
740
+ }
741
+
742
+ .nx-wversion__version {
743
+ font-size: 1.5rem;
744
+ font-weight: 650;
745
+ font-variant-numeric: tabular-nums;
746
+ letter-spacing: -0.01em;
747
+ line-height: 1.15;
748
+ }
749
+
750
+ .nx-wversion__meta {
751
+ color: var(--nx-text-muted);
752
+ font-size: var(--nx-text-xs);
753
+ }
754
+
755
+ .nx-wversion__link {
756
+ justify-self: start;
757
+ margin: 4px 0 0 -6px;
758
+ }
759
+
760
+ .nx-widget[data-size="S"] .nx-wversion__link {
761
+ display: none;
762
+ }
763
+ }