nexus-shared 3.1.0 → 3.2.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 (104) hide show
  1. package/CHANGELOG.md +704 -446
  2. package/LICENSE +21 -21
  3. package/README.md +44 -5
  4. package/dist/Client.Index.d.ts +3 -0
  5. package/dist/Client.Index.js +3 -0
  6. package/dist/Components/Forms/Crud.js +322 -161
  7. package/dist/Components/Forms/CrudHistory.d.ts +66 -0
  8. package/dist/Components/Forms/CrudHistory.js +140 -0
  9. package/dist/Components/Forms/CrudParts.js +2 -1
  10. package/dist/Components/Forms/Form.js +4 -1
  11. package/dist/Components/Inputs/CodeBox.d.ts +69 -0
  12. package/dist/Components/Inputs/CodeBox.js +316 -0
  13. package/dist/Components/Inputs/DatePicker.js +4 -1
  14. package/dist/Components/Inputs/DateRangePicker.js +4 -1
  15. package/dist/Components/Inputs/DateTimePicker.js +4 -1
  16. package/dist/Components/Inputs/Dropdown.js +4 -1
  17. package/dist/Components/Inputs/InputRenderer.js +3 -0
  18. package/dist/Components/Inputs/NumberBox.js +4 -2
  19. package/dist/Components/Inputs/TextArea.js +4 -1
  20. package/dist/Components/Inputs/TextBox.js +4 -1
  21. package/dist/Components/Inputs/TimePicker.js +4 -1
  22. package/dist/Components/Inputs/TreeView.d.ts +55 -5
  23. package/dist/Components/Inputs/TreeView.js +372 -23
  24. package/dist/Components/Layouts/ThemePicker.d.ts +3 -2
  25. package/dist/Components/Layouts/ThemePicker.js +16 -4
  26. package/dist/Components/Viewers/DataTable.js +63 -21
  27. package/dist/Components/Viewers/DataTableParts.d.ts +26 -8
  28. package/dist/Components/Viewers/DataTableParts.js +39 -10
  29. package/dist/Helpers/ApiModules.d.ts +3 -34
  30. package/dist/Helpers/ApiModules.js +3 -3
  31. package/dist/Helpers/ApiRoutes.d.ts +68 -26
  32. package/dist/Helpers/ApiRoutes.js +31 -27
  33. package/dist/Helpers/ArrayHelpers.d.ts +0 -0
  34. package/dist/Helpers/ArrayHelpers.js +2 -0
  35. package/dist/Helpers/CodeHelpers.d.ts +97 -0
  36. package/dist/Helpers/CodeHelpers.js +332 -0
  37. package/dist/Helpers/CrudBackend.d.ts +94 -4
  38. package/dist/Helpers/CrudBackend.js +168 -9
  39. package/dist/Helpers/CrudColumns.d.ts +51 -0
  40. package/dist/Helpers/CrudColumns.js +69 -0
  41. package/dist/Helpers/CrudHelpers.d.ts +50 -5
  42. package/dist/Helpers/CrudHelpers.js +109 -12
  43. package/dist/Helpers/InputParamsHelpers.js +8 -0
  44. package/dist/Helpers/MessageBuilder.js +2 -0
  45. package/dist/Helpers/NexusHelpers.d.ts +0 -0
  46. package/dist/Helpers/NexusHelpers.js +1 -0
  47. package/dist/Helpers/RequestCache.d.ts +35 -0
  48. package/dist/Helpers/RequestCache.js +113 -0
  49. package/dist/Helpers/TableExport.js +12 -12
  50. package/dist/Helpers/TableHelpers.d.ts +1 -1
  51. package/dist/Helpers/TableHelpers.js +7 -2
  52. package/dist/Helpers/TableJoins.d.ts +70 -0
  53. package/dist/Helpers/TableJoins.js +250 -0
  54. package/dist/Helpers/TableStore.d.ts +5 -0
  55. package/dist/Helpers/TableStore.js +9 -0
  56. package/dist/Helpers/TreeStore.d.ts +225 -11
  57. package/dist/Helpers/TreeStore.js +683 -90
  58. package/dist/Helpers/UserPreferences.d.ts +8 -0
  59. package/dist/Helpers/UserPreferences.js +17 -0
  60. package/dist/Interfaces/CrudInterfaces.d.ts +47 -9
  61. package/dist/Interfaces/FormInterfaces.d.ts +4 -1
  62. package/dist/Interfaces/InputInterfaces.d.ts +24 -0
  63. package/dist/Interfaces/MessageInterfaces.d.ts +1 -1
  64. package/dist/Interfaces/PreferenceInterfaces.d.ts +8 -0
  65. package/dist/Interfaces/PreferenceInterfaces.js +2 -5
  66. package/dist/Interfaces/TableInterfaces.d.ts +86 -4
  67. package/dist/Services/ApiProxy.d.ts +36 -1
  68. package/dist/Services/ApiProxy.js +182 -52
  69. package/dist/Services/ApiProxyRules.d.ts +203 -0
  70. package/dist/Services/ApiProxyRules.js +426 -0
  71. package/dist/Services/JoinSources.d.ts +48 -0
  72. package/dist/Services/JoinSources.js +74 -0
  73. package/dist/Services/ServerApi.d.ts +13 -2
  74. package/dist/Services/ServerApi.js +8 -3
  75. package/dist/Shared.Index.d.ts +4 -0
  76. package/dist/Shared.Index.js +4 -0
  77. package/package.json +87 -85
  78. package/src/Styles/Nexus.Avatar.css +79 -79
  79. package/src/Styles/Nexus.Base.css +117 -117
  80. package/src/Styles/Nexus.Button.css +180 -180
  81. package/src/Styles/Nexus.Calendar.css +273 -273
  82. package/src/Styles/Nexus.Chat.css +1443 -1443
  83. package/src/Styles/Nexus.Choice.css +343 -343
  84. package/src/Styles/Nexus.Crud.css +168 -168
  85. package/src/Styles/Nexus.DateTime.css +81 -81
  86. package/src/Styles/Nexus.Dropdown.css +725 -725
  87. package/src/Styles/Nexus.Editor.css +295 -295
  88. package/src/Styles/Nexus.Excel.css +389 -389
  89. package/src/Styles/Nexus.Form.css +279 -279
  90. package/src/Styles/Nexus.Index.css +37 -37
  91. package/src/Styles/Nexus.Input.css +196 -4
  92. package/src/Styles/Nexus.Markdown.css +237 -237
  93. package/src/Styles/Nexus.Menu.css +237 -237
  94. package/src/Styles/Nexus.Popup.css +724 -724
  95. package/src/Styles/Nexus.Rows.css +637 -637
  96. package/src/Styles/Nexus.Slider.css +276 -276
  97. package/src/Styles/Nexus.Tab.Buttons.css +432 -432
  98. package/src/Styles/Nexus.Table.css +31 -30
  99. package/src/Styles/Nexus.Theme.Picker.css +59 -3
  100. package/src/Styles/Nexus.Themes.css +194 -194
  101. package/src/Styles/Nexus.Time.css +144 -144
  102. package/src/Styles/Nexus.Toast.css +263 -263
  103. package/src/Styles/Nexus.Tokens.css +89 -89
  104. package/src/Styles/Nexus.Tree.css +500 -431
@@ -1,279 +1,279 @@
1
- /*
2
- * Forms: inputs on a 12-column grid, the note of a restored draft, placeholders while the values load, and the bar with
3
- * the status line and the buttons.
4
- */
5
- @layer nexus.components {
6
- .nx-form {
7
- position: relative;
8
- display: flex;
9
- flex-direction: column;
10
- gap: var(--nx-space-4);
11
- min-width: 0;
12
- }
13
-
14
- .nx-form__grid {
15
- container-type: inline-size;
16
- display: grid;
17
- grid-template-columns: repeat(12, minmax(0, 1fr));
18
- align-items: start;
19
- gap: var(--nx-form-row-gap, var(--nx-space-5)) var(--nx-form-column-gap, var(--nx-space-4));
20
- }
21
-
22
- /* A heading that names the inputs under it. It takes a row of its own, across the whole grid. */
23
- .nx-form__section {
24
- grid-column: 1 / -1;
25
- margin: 0;
26
- color: var(--nx-text);
27
- font-size: var(--nx-text-sm);
28
- font-weight: 600;
29
- line-height: 1.3;
30
- }
31
-
32
- /* One that follows inputs stands away from them; the first one keeps the form's own top. */
33
- .nx-form__section:not(:first-child) {
34
- margin-top: var(--nx-space-2);
35
- }
36
-
37
- .nx-form--sm .nx-form__section {
38
- font-size: var(--nx-text-xs);
39
- }
40
-
41
- .nx-form--lg .nx-form__section {
42
- font-size: var(--nx-text-md);
43
- }
44
-
45
- .nx-form__cell {
46
- grid-column: span var(--nx-span, 12);
47
- min-width: 0;
48
- }
49
-
50
- /* A checkbox, switch, or radio lines up with the boxes beside it. */
51
- .nx-form__cell--choice {
52
- display: flex;
53
- align-self: end;
54
- align-items: center;
55
- min-height: var(--nx-control-md);
56
- }
57
-
58
- .nx-form--sm .nx-form__cell--choice {
59
- min-height: var(--nx-control-sm);
60
- }
61
-
62
- .nx-form--lg .nx-form__cell--choice {
63
- min-height: var(--nx-control-lg);
64
- }
65
-
66
- /*
67
- * Beside labeled boxes, a choice starts under the room of their labels and centers on their boxes, so a message under a
68
- * box beside it does not move it. The label's line is 1.3 times its font, and 6px separate it from the box.
69
- */
70
- .nx-form__cell--choice[data-beside] {
71
- --nx-form-label-room: calc(var(--nx-text-sm) * 1.3 + 6px);
72
- align-self: start;
73
- min-height: calc(var(--nx-form-label-room) + var(--nx-control-md));
74
- padding-top: var(--nx-form-label-room);
75
- }
76
-
77
- .nx-form--sm .nx-form__cell--choice[data-beside] {
78
- --nx-form-label-room: calc(var(--nx-text-xs) * 1.3 + 6px);
79
- min-height: calc(var(--nx-form-label-room) + var(--nx-control-sm));
80
- }
81
-
82
- .nx-form--lg .nx-form__cell--choice[data-beside] {
83
- --nx-form-label-room: calc(var(--nx-text-md) * 1.3 + 6px);
84
- min-height: calc(var(--nx-form-label-room) + var(--nx-control-lg));
85
- }
86
-
87
- /* Three or four inputs to a row become two on a medium form, and every input takes the whole width on a narrow one. */
88
- @container (max-width: 48rem) {
89
- .nx-form__cell:is([data-span="1"], [data-span="2"], [data-span="3"]) {
90
- grid-column: span 6;
91
- }
92
- }
93
-
94
- @container (max-width: 34rem) {
95
- .nx-form__cell,
96
- .nx-form__cell:is([data-span="1"], [data-span="2"], [data-span="3"]) {
97
- grid-column: span 12;
98
- }
99
-
100
- .nx-form__cell--choice,
101
- .nx-form__cell--choice[data-beside] {
102
- min-height: 0;
103
- padding-top: 0;
104
- }
105
- }
106
-
107
- .nx-form__message {
108
- margin: 0;
109
- font-size: var(--nx-text-sm);
110
- }
111
-
112
- /* A restored draft */
113
- .nx-form__notice {
114
- display: flex;
115
- flex-wrap: wrap;
116
- align-items: center;
117
- gap: var(--nx-space-1) var(--nx-space-2);
118
- padding: var(--nx-space-2) var(--nx-space-2) var(--nx-space-2) var(--nx-space-3);
119
- border-radius: var(--nx-radius);
120
- background: var(--nx-info-soft);
121
- color: var(--nx-text);
122
- font-size: var(--nx-text-sm);
123
- line-height: 1.4;
124
- }
125
-
126
- .nx-form__notice > .nx-icon {
127
- width: 1.3em;
128
- height: 1.3em;
129
- color: var(--nx-info);
130
- }
131
-
132
- .nx-form__notice-text {
133
- flex: 1 1 16rem;
134
- min-width: 0;
135
- margin: 0;
136
- }
137
-
138
- .nx-form__notice-text strong {
139
- font-weight: 600;
140
- }
141
-
142
- .nx-form__notice .nx-btn {
143
- margin-block: -4px;
144
- }
145
-
146
- /* SubmitForm */
147
- .nx-submit-form {
148
- display: flex;
149
- flex-direction: column;
150
- gap: var(--nx-space-6);
151
- min-width: 0;
152
- }
153
-
154
- /* The bar: the status line and the buttons, which wrap under it on a narrow form. */
155
- .nx-form-buttons {
156
- display: flex;
157
- flex-wrap: wrap;
158
- align-items: center;
159
- gap: var(--nx-space-3) var(--nx-space-4);
160
- }
161
-
162
- .nx-form-buttons__actions {
163
- display: flex;
164
- flex-wrap: wrap;
165
- align-items: center;
166
- gap: var(--nx-space-2);
167
- }
168
-
169
- .nx-form-buttons--end .nx-form-buttons__actions {
170
- margin-left: auto;
171
- }
172
-
173
- /* `block`: the buttons share the bar's whole width, as a sign-in's one button fills its card. */
174
- .nx-form-buttons--block .nx-form-buttons__actions {
175
- width: 100%;
176
- margin-left: 0;
177
- }
178
-
179
- .nx-form-buttons--block .nx-form-buttons__actions > .nx-btn {
180
- flex: 1;
181
- }
182
-
183
- /* One line kept even when empty: "Loading…", "Saving…" and "Unsaved changes" come and go, and the bar never jumps. */
184
- .nx-form-status {
185
- display: flex;
186
- flex: 1 1 14rem;
187
- align-items: flex-start;
188
- gap: 6px;
189
- min-width: 0;
190
- min-height: 1lh;
191
- margin: 0;
192
- color: var(--nx-text-muted);
193
- font-size: var(--nx-text-sm);
194
- line-height: 1.45;
195
- }
196
-
197
- .nx-form-status .nx-icon {
198
- flex-shrink: 0;
199
- width: 1.3em;
200
- height: 1.3em;
201
- margin-top: 0.075em;
202
- }
203
-
204
- .nx-form-status--error {
205
- color: var(--nx-danger);
206
- font-weight: 500;
207
- }
208
-
209
- .nx-form-status--success {
210
- color: var(--nx-success);
211
- }
212
-
213
- /*
214
- * An `errors` line has nothing to say until something goes wrong, so it keeps no room until then. It is clipped,
215
- * not removed: a live region has to be there before its words arrive for a screen reader to read them.
216
- */
217
- .nx-form-status--errors:empty {
218
- position: absolute;
219
- width: 1px;
220
- height: 1px;
221
- min-height: 0;
222
- overflow: hidden;
223
- clip-path: inset(50%);
224
- }
225
-
226
- /* An input's name in the status line: a link-like button that goes to it. */
227
- .nx-form-status__jump {
228
- padding: 0;
229
- border: 0;
230
- border-radius: 2px;
231
- background: none;
232
- color: inherit;
233
- font: inherit;
234
- text-decoration: underline;
235
- text-decoration-thickness: 1px;
236
- text-underline-offset: 2px;
237
- cursor: pointer;
238
- }
239
-
240
- .nx-form-status__jump:hover {
241
- text-decoration-thickness: 2px;
242
- }
243
-
244
- /* ApiForm: the values could not load */
245
- .nx-form-load-failed {
246
- display: flex;
247
- flex-wrap: wrap;
248
- align-items: center;
249
- gap: var(--nx-space-2) var(--nx-space-3);
250
- padding: var(--nx-space-3) var(--nx-space-3) var(--nx-space-3) var(--nx-space-4);
251
- border-radius: var(--nx-radius);
252
- background: var(--nx-danger-soft);
253
- color: var(--nx-text);
254
- font-size: var(--nx-text-sm);
255
- line-height: 1.45;
256
- }
257
-
258
- .nx-form-load-failed > .nx-icon {
259
- width: 1.35em;
260
- height: 1.35em;
261
- color: var(--nx-danger);
262
- }
263
-
264
- .nx-form-load-failed p {
265
- flex: 1 1 16rem;
266
- min-width: 0;
267
- margin: 0;
268
- }
269
-
270
- .nx-form-load-failed strong {
271
- font-weight: 600;
272
- }
273
-
274
- .nx-form-load-failed__actions {
275
- display: flex;
276
- gap: var(--nx-space-2);
277
- margin-left: auto;
278
- }
279
- }
1
+ /*
2
+ * Forms: inputs on a 12-column grid, the note of a restored draft, placeholders while the values load, and the bar with
3
+ * the status line and the buttons.
4
+ */
5
+ @layer nexus.components {
6
+ .nx-form {
7
+ position: relative;
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: var(--nx-space-4);
11
+ min-width: 0;
12
+ }
13
+
14
+ .nx-form__grid {
15
+ container-type: inline-size;
16
+ display: grid;
17
+ grid-template-columns: repeat(12, minmax(0, 1fr));
18
+ align-items: start;
19
+ gap: var(--nx-form-row-gap, var(--nx-space-5)) var(--nx-form-column-gap, var(--nx-space-4));
20
+ }
21
+
22
+ /* A heading that names the inputs under it. It takes a row of its own, across the whole grid. */
23
+ .nx-form__section {
24
+ grid-column: 1 / -1;
25
+ margin: 0;
26
+ color: var(--nx-text);
27
+ font-size: var(--nx-text-sm);
28
+ font-weight: 600;
29
+ line-height: 1.3;
30
+ }
31
+
32
+ /* One that follows inputs stands away from them; the first one keeps the form's own top. */
33
+ .nx-form__section:not(:first-child) {
34
+ margin-top: var(--nx-space-2);
35
+ }
36
+
37
+ .nx-form--sm .nx-form__section {
38
+ font-size: var(--nx-text-xs);
39
+ }
40
+
41
+ .nx-form--lg .nx-form__section {
42
+ font-size: var(--nx-text-md);
43
+ }
44
+
45
+ .nx-form__cell {
46
+ grid-column: span var(--nx-span, 12);
47
+ min-width: 0;
48
+ }
49
+
50
+ /* A checkbox, switch, or radio lines up with the boxes beside it. */
51
+ .nx-form__cell--choice {
52
+ display: flex;
53
+ align-self: end;
54
+ align-items: center;
55
+ min-height: var(--nx-control-md);
56
+ }
57
+
58
+ .nx-form--sm .nx-form__cell--choice {
59
+ min-height: var(--nx-control-sm);
60
+ }
61
+
62
+ .nx-form--lg .nx-form__cell--choice {
63
+ min-height: var(--nx-control-lg);
64
+ }
65
+
66
+ /*
67
+ * Beside labeled boxes, a choice starts under the room of their labels and centers on their boxes, so a message under a
68
+ * box beside it does not move it. The label's line is 1.3 times its font, and 6px separate it from the box.
69
+ */
70
+ .nx-form__cell--choice[data-beside] {
71
+ --nx-form-label-room: calc(var(--nx-text-sm) * 1.3 + 6px);
72
+ align-self: start;
73
+ min-height: calc(var(--nx-form-label-room) + var(--nx-control-md));
74
+ padding-top: var(--nx-form-label-room);
75
+ }
76
+
77
+ .nx-form--sm .nx-form__cell--choice[data-beside] {
78
+ --nx-form-label-room: calc(var(--nx-text-xs) * 1.3 + 6px);
79
+ min-height: calc(var(--nx-form-label-room) + var(--nx-control-sm));
80
+ }
81
+
82
+ .nx-form--lg .nx-form__cell--choice[data-beside] {
83
+ --nx-form-label-room: calc(var(--nx-text-md) * 1.3 + 6px);
84
+ min-height: calc(var(--nx-form-label-room) + var(--nx-control-lg));
85
+ }
86
+
87
+ /* Three or four inputs to a row become two on a medium form, and every input takes the whole width on a narrow one. */
88
+ @container (max-width: 48rem) {
89
+ .nx-form__cell:is([data-span="1"], [data-span="2"], [data-span="3"]) {
90
+ grid-column: span 6;
91
+ }
92
+ }
93
+
94
+ @container (max-width: 34rem) {
95
+ .nx-form__cell,
96
+ .nx-form__cell:is([data-span="1"], [data-span="2"], [data-span="3"]) {
97
+ grid-column: span 12;
98
+ }
99
+
100
+ .nx-form__cell--choice,
101
+ .nx-form__cell--choice[data-beside] {
102
+ min-height: 0;
103
+ padding-top: 0;
104
+ }
105
+ }
106
+
107
+ .nx-form__message {
108
+ margin: 0;
109
+ font-size: var(--nx-text-sm);
110
+ }
111
+
112
+ /* A restored draft */
113
+ .nx-form__notice {
114
+ display: flex;
115
+ flex-wrap: wrap;
116
+ align-items: center;
117
+ gap: var(--nx-space-1) var(--nx-space-2);
118
+ padding: var(--nx-space-2) var(--nx-space-2) var(--nx-space-2) var(--nx-space-3);
119
+ border-radius: var(--nx-radius);
120
+ background: var(--nx-info-soft);
121
+ color: var(--nx-text);
122
+ font-size: var(--nx-text-sm);
123
+ line-height: 1.4;
124
+ }
125
+
126
+ .nx-form__notice > .nx-icon {
127
+ width: 1.3em;
128
+ height: 1.3em;
129
+ color: var(--nx-info);
130
+ }
131
+
132
+ .nx-form__notice-text {
133
+ flex: 1 1 16rem;
134
+ min-width: 0;
135
+ margin: 0;
136
+ }
137
+
138
+ .nx-form__notice-text strong {
139
+ font-weight: 600;
140
+ }
141
+
142
+ .nx-form__notice .nx-btn {
143
+ margin-block: -4px;
144
+ }
145
+
146
+ /* SubmitForm */
147
+ .nx-submit-form {
148
+ display: flex;
149
+ flex-direction: column;
150
+ gap: var(--nx-space-6);
151
+ min-width: 0;
152
+ }
153
+
154
+ /* The bar: the status line and the buttons, which wrap under it on a narrow form. */
155
+ .nx-form-buttons {
156
+ display: flex;
157
+ flex-wrap: wrap;
158
+ align-items: center;
159
+ gap: var(--nx-space-3) var(--nx-space-4);
160
+ }
161
+
162
+ .nx-form-buttons__actions {
163
+ display: flex;
164
+ flex-wrap: wrap;
165
+ align-items: center;
166
+ gap: var(--nx-space-2);
167
+ }
168
+
169
+ .nx-form-buttons--end .nx-form-buttons__actions {
170
+ margin-left: auto;
171
+ }
172
+
173
+ /* `block`: the buttons share the bar's whole width, as a sign-in's one button fills its card. */
174
+ .nx-form-buttons--block .nx-form-buttons__actions {
175
+ width: 100%;
176
+ margin-left: 0;
177
+ }
178
+
179
+ .nx-form-buttons--block .nx-form-buttons__actions > .nx-btn {
180
+ flex: 1;
181
+ }
182
+
183
+ /* One line kept even when empty: "Loading…", "Saving…" and "Unsaved changes" come and go, and the bar never jumps. */
184
+ .nx-form-status {
185
+ display: flex;
186
+ flex: 1 1 14rem;
187
+ align-items: flex-start;
188
+ gap: 6px;
189
+ min-width: 0;
190
+ min-height: 1lh;
191
+ margin: 0;
192
+ color: var(--nx-text-muted);
193
+ font-size: var(--nx-text-sm);
194
+ line-height: 1.45;
195
+ }
196
+
197
+ .nx-form-status .nx-icon {
198
+ flex-shrink: 0;
199
+ width: 1.3em;
200
+ height: 1.3em;
201
+ margin-top: 0.075em;
202
+ }
203
+
204
+ .nx-form-status--error {
205
+ color: var(--nx-danger);
206
+ font-weight: 500;
207
+ }
208
+
209
+ .nx-form-status--success {
210
+ color: var(--nx-success);
211
+ }
212
+
213
+ /*
214
+ * An `errors` line has nothing to say until something goes wrong, so it keeps no room until then. It is clipped,
215
+ * not removed: a live region has to be there before its words arrive for a screen reader to read them.
216
+ */
217
+ .nx-form-status--errors:empty {
218
+ position: absolute;
219
+ width: 1px;
220
+ height: 1px;
221
+ min-height: 0;
222
+ overflow: hidden;
223
+ clip-path: inset(50%);
224
+ }
225
+
226
+ /* An input's name in the status line: a link-like button that goes to it. */
227
+ .nx-form-status__jump {
228
+ padding: 0;
229
+ border: 0;
230
+ border-radius: 2px;
231
+ background: none;
232
+ color: inherit;
233
+ font: inherit;
234
+ text-decoration: underline;
235
+ text-decoration-thickness: 1px;
236
+ text-underline-offset: 2px;
237
+ cursor: pointer;
238
+ }
239
+
240
+ .nx-form-status__jump:hover {
241
+ text-decoration-thickness: 2px;
242
+ }
243
+
244
+ /* ApiForm: the values could not load */
245
+ .nx-form-load-failed {
246
+ display: flex;
247
+ flex-wrap: wrap;
248
+ align-items: center;
249
+ gap: var(--nx-space-2) var(--nx-space-3);
250
+ padding: var(--nx-space-3) var(--nx-space-3) var(--nx-space-3) var(--nx-space-4);
251
+ border-radius: var(--nx-radius);
252
+ background: var(--nx-danger-soft);
253
+ color: var(--nx-text);
254
+ font-size: var(--nx-text-sm);
255
+ line-height: 1.45;
256
+ }
257
+
258
+ .nx-form-load-failed > .nx-icon {
259
+ width: 1.35em;
260
+ height: 1.35em;
261
+ color: var(--nx-danger);
262
+ }
263
+
264
+ .nx-form-load-failed p {
265
+ flex: 1 1 16rem;
266
+ min-width: 0;
267
+ margin: 0;
268
+ }
269
+
270
+ .nx-form-load-failed strong {
271
+ font-weight: 600;
272
+ }
273
+
274
+ .nx-form-load-failed__actions {
275
+ display: flex;
276
+ gap: var(--nx-space-2);
277
+ margin-left: auto;
278
+ }
279
+ }
@@ -1,37 +1,37 @@
1
- /*
2
- * nexus-shared styles: import once, at the root of the app.
3
- * import "nexus-shared/styles.css";
4
- *
5
- * Everything sits in cascade layers, so any style the app writes outside a layer wins without !important.
6
- * Themes: set data-nx-theme on <html> (nexus, github, nord, dracula, solarized, catppuccin, rose-pine),
7
- * and data-nx-mode="light" or "dark" to override the system setting. ThemeScript and ThemeSwitcher do both.
8
- */
9
- @layer nexus.tokens, nexus.themes, nexus.base, nexus.components;
10
-
11
- @import "./Nexus.Tokens.css";
12
- @import "./Nexus.Themes.css";
13
- @import "./Nexus.Base.css";
14
- @import "./Nexus.Avatar.css";
15
- @import "./Nexus.Button.css";
16
- @import "./Nexus.Calendar.css";
17
- @import "./Nexus.Chat.css";
18
- @import "./Nexus.DateTime.css";
19
- @import "./Nexus.Choice.css";
20
- @import "./Nexus.Crud.css";
21
- @import "./Nexus.Dropdown.css";
22
- @import "./Nexus.Input.css";
23
- @import "./Nexus.Editor.css";
24
- @import "./Nexus.Excel.css";
25
- @import "./Nexus.Form.css";
26
- @import "./Nexus.Markdown.css";
27
- @import "./Nexus.Menu.css";
28
- @import "./Nexus.Popup.css";
29
- @import "./Nexus.RichText.css";
30
- @import "./Nexus.Rows.css";
31
- @import "./Nexus.Slider.css";
32
- @import "./Nexus.Tab.Buttons.css";
33
- @import "./Nexus.Table.css";
34
- @import "./Nexus.Theme.Picker.css";
35
- @import "./Nexus.Time.css";
36
- @import "./Nexus.Toast.css";
37
- @import "./Nexus.Tree.css";
1
+ /*
2
+ * nexus-shared styles: import once, at the root of the app.
3
+ * import "nexus-shared/styles.css";
4
+ *
5
+ * Everything sits in cascade layers, so any style the app writes outside a layer wins without !important.
6
+ * Themes: set data-nx-theme on <html> (nexus, github, nord, dracula, solarized, catppuccin, rose-pine),
7
+ * and data-nx-mode="light" or "dark" to override the system setting. ThemeScript and ThemeSwitcher do both.
8
+ */
9
+ @layer nexus.tokens, nexus.themes, nexus.base, nexus.components;
10
+
11
+ @import "./Nexus.Tokens.css";
12
+ @import "./Nexus.Themes.css";
13
+ @import "./Nexus.Base.css";
14
+ @import "./Nexus.Avatar.css";
15
+ @import "./Nexus.Button.css";
16
+ @import "./Nexus.Calendar.css";
17
+ @import "./Nexus.Chat.css";
18
+ @import "./Nexus.DateTime.css";
19
+ @import "./Nexus.Choice.css";
20
+ @import "./Nexus.Crud.css";
21
+ @import "./Nexus.Dropdown.css";
22
+ @import "./Nexus.Input.css";
23
+ @import "./Nexus.Editor.css";
24
+ @import "./Nexus.Excel.css";
25
+ @import "./Nexus.Form.css";
26
+ @import "./Nexus.Markdown.css";
27
+ @import "./Nexus.Menu.css";
28
+ @import "./Nexus.Popup.css";
29
+ @import "./Nexus.RichText.css";
30
+ @import "./Nexus.Rows.css";
31
+ @import "./Nexus.Slider.css";
32
+ @import "./Nexus.Tab.Buttons.css";
33
+ @import "./Nexus.Table.css";
34
+ @import "./Nexus.Theme.Picker.css";
35
+ @import "./Nexus.Time.css";
36
+ @import "./Nexus.Toast.css";
37
+ @import "./Nexus.Tree.css";