nexus-shared 3.0.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 (162) hide show
  1. package/CHANGELOG.md +442 -0
  2. package/README.md +1123 -1000
  3. package/dist/Client.Index.d.ts +6 -0
  4. package/dist/Client.Index.js +6 -0
  5. package/dist/Components/Chats/ChatParts.d.ts +2 -2
  6. package/dist/Components/Chats/ChatParts.js +3 -7
  7. package/dist/Components/Chats/ChatThread.js +3 -3
  8. package/dist/Components/Documents/Button.d.ts +6 -1
  9. package/dist/Components/Documents/Button.js +2 -2
  10. package/dist/Components/Documents/Menu.js +21 -9
  11. package/dist/Components/Documents/SplitButton.d.ts +3 -1
  12. package/dist/Components/Documents/SplitButton.js +7 -5
  13. package/dist/Components/Documents/TabButtons.d.ts +5 -2
  14. package/dist/Components/Documents/TabButtons.js +2 -2
  15. package/dist/Components/Forms/ApiForm.d.ts +1 -1
  16. package/dist/Components/Forms/ApiForm.js +1 -1
  17. package/dist/Components/Forms/Crud.js +486 -206
  18. package/dist/Components/Forms/CrudHistory.d.ts +66 -0
  19. package/dist/Components/Forms/CrudHistory.js +140 -0
  20. package/dist/Components/Forms/CrudParts.d.ts +5 -1
  21. package/dist/Components/Forms/CrudParts.js +38 -5
  22. package/dist/Components/Forms/ExcelImport.d.ts +23 -7
  23. package/dist/Components/Forms/ExcelImport.js +189 -60
  24. package/dist/Components/Forms/Form.js +9 -14
  25. package/dist/Components/Forms/SubmitForm.d.ts +11 -2
  26. package/dist/Components/Forms/SubmitForm.js +23 -12
  27. package/dist/Components/Inputs/CodeBox.d.ts +69 -0
  28. package/dist/Components/Inputs/CodeBox.js +316 -0
  29. package/dist/Components/Inputs/DatePicker.js +4 -1
  30. package/dist/Components/Inputs/DateRangePicker.js +4 -1
  31. package/dist/Components/Inputs/DateTimePicker.js +4 -1
  32. package/dist/Components/Inputs/Dropdown.js +4 -1
  33. package/dist/Components/Inputs/DropdownParts.d.ts +1 -1
  34. package/dist/Components/Inputs/DropdownParts.js +4 -6
  35. package/dist/Components/Inputs/InputRenderer.js +3 -0
  36. package/dist/Components/Inputs/NumberBox.js +26 -2
  37. package/dist/Components/Inputs/RowsInput.js +2 -2
  38. package/dist/Components/Inputs/Slider.js +4 -1
  39. package/dist/Components/Inputs/TabularForm.js +42 -10
  40. package/dist/Components/Inputs/TextArea.js +4 -1
  41. package/dist/Components/Inputs/TextBox.js +4 -1
  42. package/dist/Components/Inputs/TimePanel.js +4 -3
  43. package/dist/Components/Inputs/TimePicker.js +4 -1
  44. package/dist/Components/Inputs/TreeView.d.ts +55 -5
  45. package/dist/Components/Inputs/TreeView.js +372 -23
  46. package/dist/Components/Layouts/Popup.js +1 -4
  47. package/dist/Components/Layouts/ThemePicker.d.ts +21 -3
  48. package/dist/Components/Layouts/ThemePicker.js +89 -6
  49. package/dist/Components/Layouts/ThemeScript.d.ts +4 -2
  50. package/dist/Components/Layouts/ThemeScript.js +4 -2
  51. package/dist/Components/Layouts/ThemeSwitcher.d.ts +6 -3
  52. package/dist/Components/Layouts/ThemeSwitcher.js +9 -8
  53. package/dist/Components/Viewers/Avatar.d.ts +21 -0
  54. package/dist/Components/Viewers/Avatar.js +21 -0
  55. package/dist/Components/Viewers/DataTable.js +252 -62
  56. package/dist/Components/Viewers/DataTableColumns.d.ts +7 -3
  57. package/dist/Components/Viewers/DataTableColumns.js +25 -68
  58. package/dist/Components/Viewers/DataTableFilters.d.ts +21 -0
  59. package/dist/Components/Viewers/DataTableFilters.js +68 -0
  60. package/dist/Components/Viewers/DataTableParts.d.ts +28 -10
  61. package/dist/Components/Viewers/DataTableParts.js +42 -13
  62. package/dist/Helpers/AnimationHelpers.d.ts +11 -0
  63. package/dist/Helpers/AnimationHelpers.js +20 -2
  64. package/dist/Helpers/ApiModules.d.ts +3 -34
  65. package/dist/Helpers/ApiModules.js +3 -3
  66. package/dist/Helpers/ApiRoutes.d.ts +68 -26
  67. package/dist/Helpers/ApiRoutes.js +31 -27
  68. package/dist/Helpers/ArrayHelpers.d.ts +0 -0
  69. package/dist/Helpers/ArrayHelpers.js +2 -0
  70. package/dist/Helpers/CodeHelpers.d.ts +97 -0
  71. package/dist/Helpers/CodeHelpers.js +332 -0
  72. package/dist/Helpers/CrudBackend.d.ts +101 -8
  73. package/dist/Helpers/CrudBackend.js +172 -11
  74. package/dist/Helpers/CrudColumns.d.ts +51 -0
  75. package/dist/Helpers/CrudColumns.js +69 -0
  76. package/dist/Helpers/CrudHelpers.d.ts +50 -5
  77. package/dist/Helpers/CrudHelpers.js +109 -12
  78. package/dist/Helpers/ExcelBackend.d.ts +3 -3
  79. package/dist/Helpers/ExcelBackend.js +8 -2
  80. package/dist/Helpers/ExcelHelpers.d.ts +36 -8
  81. package/dist/Helpers/ExcelHelpers.js +55 -13
  82. package/dist/Helpers/FormStore.d.ts +9 -5
  83. package/dist/Helpers/FormStore.js +25 -5
  84. package/dist/Helpers/InputParamsHelpers.js +8 -0
  85. package/dist/Helpers/MessageBuilder.js +3 -0
  86. package/dist/Helpers/NexusHelpers.d.ts +0 -0
  87. package/dist/Helpers/NexusHelpers.js +1 -0
  88. package/dist/Helpers/NumberHelpers.d.ts +7 -1
  89. package/dist/Helpers/NumberHelpers.js +41 -3
  90. package/dist/Helpers/PopoverHelpers.d.ts +17 -5
  91. package/dist/Helpers/PopoverHelpers.js +52 -17
  92. package/dist/Helpers/PopoverHooks.d.ts +24 -0
  93. package/dist/Helpers/PopoverHooks.js +62 -0
  94. package/dist/Helpers/RequestCache.d.ts +35 -0
  95. package/dist/Helpers/RequestCache.js +113 -0
  96. package/dist/Helpers/RowsStore.d.ts +7 -2
  97. package/dist/Helpers/RowsStore.js +15 -3
  98. package/dist/Helpers/TableFilters.d.ts +25 -0
  99. package/dist/Helpers/TableFilters.js +162 -0
  100. package/dist/Helpers/TableHelpers.d.ts +7 -4
  101. package/dist/Helpers/TableHelpers.js +15 -6
  102. package/dist/Helpers/TableJoins.d.ts +70 -0
  103. package/dist/Helpers/TableJoins.js +250 -0
  104. package/dist/Helpers/TableStore.d.ts +16 -3
  105. package/dist/Helpers/TableStore.js +25 -5
  106. package/dist/Helpers/ThemeHelpers.d.ts +21 -4
  107. package/dist/Helpers/ThemeHelpers.js +46 -9
  108. package/dist/Helpers/TreeStore.d.ts +225 -11
  109. package/dist/Helpers/TreeStore.js +683 -90
  110. package/dist/Helpers/UserPreferences.d.ts +22 -0
  111. package/dist/Helpers/UserPreferences.js +116 -0
  112. package/dist/Interfaces/CrudInterfaces.d.ts +67 -10
  113. package/dist/Interfaces/ExcelInterfaces.d.ts +12 -0
  114. package/dist/Interfaces/FormInterfaces.d.ts +37 -6
  115. package/dist/Interfaces/InputInterfaces.d.ts +24 -0
  116. package/dist/Interfaces/MessageInterfaces.d.ts +1 -1
  117. package/dist/Interfaces/PreferenceInterfaces.d.ts +51 -0
  118. package/dist/Interfaces/PreferenceInterfaces.js +25 -0
  119. package/dist/Interfaces/TableInterfaces.d.ts +145 -16
  120. package/dist/Interfaces/ThemeInterfaces.d.ts +25 -0
  121. package/dist/Interfaces/ThemeInterfaces.js +15 -0
  122. package/dist/Services/ApiProxy.d.ts +36 -1
  123. package/dist/Services/ApiProxy.js +182 -52
  124. package/dist/Services/ApiProxyRules.d.ts +203 -0
  125. package/dist/Services/ApiProxyRules.js +426 -0
  126. package/dist/Services/ExcelApi.d.ts +3 -1
  127. package/dist/Services/ExcelApi.js +1 -1
  128. package/dist/Services/JoinSources.d.ts +48 -0
  129. package/dist/Services/JoinSources.js +74 -0
  130. package/dist/Services/ServerApi.d.ts +13 -2
  131. package/dist/Services/ServerApi.js +8 -3
  132. package/dist/Services/ThemeService.d.ts +18 -2
  133. package/dist/Services/ThemeService.js +80 -16
  134. package/dist/Shared.Index.d.ts +6 -0
  135. package/dist/Shared.Index.js +6 -0
  136. package/package.json +4 -2
  137. package/src/Styles/Nexus.Avatar.css +79 -0
  138. package/src/Styles/Nexus.Base.css +51 -4
  139. package/src/Styles/Nexus.Button.css +27 -0
  140. package/src/Styles/Nexus.Calendar.css +4 -6
  141. package/src/Styles/Nexus.Chat.css +5 -51
  142. package/src/Styles/Nexus.Choice.css +4 -6
  143. package/src/Styles/Nexus.Crud.css +16 -9
  144. package/src/Styles/Nexus.Dropdown.css +12 -61
  145. package/src/Styles/Nexus.Editor.css +4 -6
  146. package/src/Styles/Nexus.Excel.css +34 -15
  147. package/src/Styles/Nexus.Form.css +25 -67
  148. package/src/Styles/Nexus.Index.css +1 -0
  149. package/src/Styles/Nexus.Input.css +794 -637
  150. package/src/Styles/Nexus.Markdown.css +0 -28
  151. package/src/Styles/Nexus.Menu.css +8 -30
  152. package/src/Styles/Nexus.Popup.css +22 -29
  153. package/src/Styles/Nexus.RichText.css +2 -32
  154. package/src/Styles/Nexus.Rows.css +51 -10
  155. package/src/Styles/Nexus.Slider.css +3 -5
  156. package/src/Styles/Nexus.Tab.Buttons.css +20 -7
  157. package/src/Styles/Nexus.Table.css +1387 -1296
  158. package/src/Styles/Nexus.Theme.Picker.css +342 -232
  159. package/src/Styles/Nexus.Time.css +9 -12
  160. package/src/Styles/Nexus.Toast.css +6 -8
  161. package/src/Styles/Nexus.Tokens.css +17 -0
  162. package/src/Styles/Nexus.Tree.css +76 -11
@@ -54,34 +54,6 @@
54
54
  }
55
55
  }
56
56
 
57
- /* The preview's thin scrollbar, as the text area's (Nexus.Input.css). */
58
- .nx-md__preview::-webkit-scrollbar {
59
- width: 8px;
60
- height: 8px;
61
- }
62
-
63
- .nx-md__preview::-webkit-scrollbar-track,
64
- .nx-md__preview::-webkit-scrollbar-corner {
65
- background: transparent;
66
- }
67
-
68
- .nx-md__preview::-webkit-scrollbar-thumb {
69
- border: 2px solid transparent;
70
- border-radius: var(--nx-radius-full);
71
- background: var(--nx-field-scrollbar) padding-box;
72
- }
73
-
74
- .nx-md__preview::-webkit-scrollbar-thumb:hover {
75
- background-color: var(--nx-field-scrollbar-hover);
76
- }
77
-
78
- @supports not selector(::-webkit-scrollbar) {
79
- .nx-md__preview {
80
- scrollbar-width: thin;
81
- scrollbar-color: var(--nx-field-scrollbar) transparent;
82
- }
83
- }
84
-
85
57
  /*
86
58
  * Markdown content (MarkdownView), in the editor's preview and anywhere else. Sizes are in em, so the text follows
87
59
  * the size of the element it sits in.
@@ -5,49 +5,31 @@
5
5
  * because focus follows the pointer.
6
6
  */
7
7
  .nx-menu {
8
- --nx-menu-item-height: 32px;
8
+ --nx-menu-item-height: var(--nx-row);
9
9
  --nx-menu-font: var(--nx-text-md);
10
10
  --nx-menu-pad-x: var(--nx-space-2);
11
+ --nx-popover-pad: 4px;
11
12
 
12
13
  position: fixed;
13
14
  inset: auto;
14
15
  min-width: 180px;
15
16
  max-width: min(360px, calc(100% - 16px));
16
- max-height: calc(100vh - 16px);
17
- padding: 4px;
18
17
  outline: none;
19
18
  }
20
19
 
21
- .nx-menu:popover-open {
22
- display: flex;
23
- flex-direction: column;
24
- animation: nx-menu-in 120ms ease-out;
25
- }
26
-
27
- /* The items scroll, not the panel: a panel that scrolls its own box would cut its arrow off. A block inside the
28
- panel's column, so a long menu scrolls instead of squeezing its items the way flex children would. */
20
+ /* The items scroll inside the panel (`.nx-popover__scroll`): a block, so a long menu scrolls instead of squeezing
21
+ its items the way flex children would. */
29
22
  .nx-menu__list {
30
23
  display: block;
31
- flex: 1 1 auto;
32
- min-height: 0;
33
- overflow: hidden auto;
34
- overscroll-behavior: contain;
35
- }
36
-
37
- @keyframes nx-menu-in {
38
- from {
39
- opacity: 0;
40
- transform: translateY(-4px);
41
- }
42
24
  }
43
25
 
44
26
  .nx-menu--sm {
45
- --nx-menu-item-height: 28px;
27
+ --nx-menu-item-height: calc(var(--nx-row) - 4px);
46
28
  --nx-menu-font: var(--nx-text-sm);
47
29
  }
48
30
 
49
31
  .nx-menu--lg {
50
- --nx-menu-item-height: 38px;
32
+ --nx-menu-item-height: calc(var(--nx-row) + 6px);
51
33
  --nx-menu-font: var(--nx-text-lg);
52
34
  --nx-menu-pad-x: 10px;
53
35
  }
@@ -249,11 +231,7 @@
249
231
  min-width: 240px;
250
232
  }
251
233
 
252
- @media (prefers-reduced-motion: reduce) {
253
- .nx-menu:popover-open,
254
- .nx-split .nx-split__toggle .nx-icon {
255
- animation: none;
256
- transition: none;
257
- }
234
+ [data-nx-motion="reduce"] .nx-split .nx-split__toggle .nx-icon {
235
+ transition: none;
258
236
  }
259
237
  }
@@ -23,48 +23,38 @@
23
23
  translate: var(--nx-popup-x, 0px) var(--nx-popup-y, 0px);
24
24
  }
25
25
 
26
+ /*
27
+ * Opening and closing are a plain fade, the popup and its backdrop together: it appears where it stays, at the size
28
+ * it keeps, so nothing in it moves while it fades. Closing waits for its fade (`afterAnimation`), and takes no clicks
29
+ * meanwhile, so a double-click on Save does not submit twice; with animations off there is no fade to wait for.
30
+ */
26
31
  .nx-popup[open] {
27
32
  display: flex;
28
33
  flex-direction: column;
29
- animation: nx-popup-in 180ms cubic-bezier(0.2, 0, 0, 1);
34
+ animation: nx-popup-in 160ms ease-out;
30
35
  }
31
36
 
32
37
  .nx-popup::backdrop {
33
38
  background: rgb(0 0 0 / 0.5);
34
- animation: nx-popup-fade-in 180ms ease-out;
39
+ animation: nx-popup-in 160ms ease-out;
35
40
  }
36
41
 
37
- /* A closing popup takes no more clicks, so a double-click on Save does not submit twice. */
38
42
  .nx-popup--closing[open] {
39
- animation: nx-popup-out 140ms ease-in forwards;
43
+ animation: nx-popup-out 120ms ease-in forwards;
40
44
  pointer-events: none;
41
45
  }
42
46
 
43
47
  .nx-popup--closing::backdrop {
44
- animation: nx-popup-fade-out 140ms ease-in forwards;
48
+ animation: nx-popup-out 120ms ease-in forwards;
45
49
  }
46
50
 
47
51
  @keyframes nx-popup-in {
48
52
  from {
49
53
  opacity: 0;
50
- transform: translateY(10px) scale(0.98);
51
54
  }
52
55
  }
53
56
 
54
57
  @keyframes nx-popup-out {
55
- to {
56
- opacity: 0;
57
- transform: translateY(6px) scale(0.98);
58
- }
59
- }
60
-
61
- @keyframes nx-popup-fade-in {
62
- from {
63
- opacity: 0;
64
- }
65
- }
66
-
67
- @keyframes nx-popup-fade-out {
68
58
  to {
69
59
  opacity: 0;
70
60
  }
@@ -116,7 +106,7 @@
116
106
  }
117
107
 
118
108
  .nx-popup[data-nx-minimizing]::backdrop {
119
- animation: nx-popup-fade-out 200ms ease-in forwards;
109
+ animation: nx-popup-out 200ms ease-in forwards;
120
110
  }
121
111
 
122
112
  /* Header, either design: the title bar moves the popup, so it selects no text and a touch drags instead of scrolling. */
@@ -394,6 +384,11 @@
394
384
  border-top: 1px solid var(--nx-border);
395
385
  }
396
386
 
387
+ /* A form's bar fills the foot, so its status line sits beside the buttons instead of on a row of its own. */
388
+ .nx-popup__foot > .nx-form-buttons {
389
+ flex: 1 1 auto;
390
+ }
391
+
397
392
  /* Message boxes: a small popup whose icon carries the tone. */
398
393
  .nx-popup--message .nx-popup__body {
399
394
  padding-top: var(--nx-space-2);
@@ -718,14 +713,12 @@
718
713
  }
719
714
  }
720
715
 
721
- @media (prefers-reduced-motion: reduce) {
722
- .nx-popup[open],
723
- .nx-popup--closing[open],
724
- .nx-popup::backdrop,
725
- .nx-popup--closing::backdrop,
726
- .nx-popup[data-nx-minimizing]::backdrop,
727
- .nx-dock__item {
728
- animation: none;
729
- }
716
+ [data-nx-motion="reduce"] .nx-popup[open],
717
+ [data-nx-motion="reduce"] .nx-popup--closing[open],
718
+ [data-nx-motion="reduce"] .nx-popup::backdrop,
719
+ [data-nx-motion="reduce"] .nx-popup--closing::backdrop,
720
+ [data-nx-motion="reduce"] .nx-popup[data-nx-minimizing]::backdrop,
721
+ [data-nx-motion="reduce"] .nx-dock__item {
722
+ animation: none;
730
723
  }
731
724
  }
@@ -287,34 +287,6 @@
287
287
  resize: none;
288
288
  }
289
289
 
290
- /* The text's thin scrollbar, as the text area's (Nexus.Input.css). */
291
- .nx-rte__content::-webkit-scrollbar {
292
- width: 8px;
293
- height: 8px;
294
- }
295
-
296
- .nx-rte__content::-webkit-scrollbar-track,
297
- .nx-rte__content::-webkit-scrollbar-corner {
298
- background: transparent;
299
- }
300
-
301
- .nx-rte__content::-webkit-scrollbar-thumb {
302
- border: 2px solid transparent;
303
- border-radius: var(--nx-radius-full);
304
- background: var(--nx-field-scrollbar) padding-box;
305
- }
306
-
307
- .nx-rte__content::-webkit-scrollbar-thumb:hover {
308
- background-color: var(--nx-field-scrollbar-hover);
309
- }
310
-
311
- @supports not selector(::-webkit-scrollbar) {
312
- .nx-rte__content {
313
- scrollbar-width: thin;
314
- scrollbar-color: var(--nx-field-scrollbar) transparent;
315
- }
316
- }
317
-
318
290
  /* Tokens: values a template fills in, edited as one piece. */
319
291
  .nx-rte__token {
320
292
  padding: 0.05em 0.45em;
@@ -455,9 +427,7 @@
455
427
  flex: 1 1 auto;
456
428
  }
457
429
 
458
- @media (prefers-reduced-motion: reduce) {
459
- .nx-rte-colors__swatch {
460
- transition: none;
461
- }
430
+ [data-nx-motion="reduce"] .nx-rte-colors__swatch {
431
+ transition: none;
462
432
  }
463
433
  }
@@ -95,8 +95,6 @@
95
95
  outline: none;
96
96
  /* A focused cell scrolls clear of the header and the fixed columns. */
97
97
  scroll-padding: var(--nx-tabular-row) 0 0 var(--nx-tabular-num, 48px);
98
- scrollbar-width: thin;
99
- scrollbar-color: color-mix(in oklab, var(--nx-text-subtle) 75%, transparent) transparent;
100
98
  transition: border-color var(--nx-duration);
101
99
  }
102
100
 
@@ -351,16 +349,61 @@
351
349
  height: 15px;
352
350
  }
353
351
 
354
- .nx-tabular__num-button:is(:hover, :focus-visible, [aria-expanded="true"]) {
352
+ .nx-tabular__num-button:not(:disabled):is(:hover, :focus-visible, [aria-expanded="true"]) {
355
353
  background: var(--nx-surface-hover);
356
354
  color: var(--nx-text);
357
355
  }
358
356
 
357
+ .nx-tabular__num-button[data-tone="danger"]:not(:disabled):is(:hover, :focus-visible) {
358
+ color: var(--nx-danger);
359
+ }
360
+
361
+ /* A locked row's lock is drawn in the text colour, so the locked rows can be told apart down the column. */
362
+ .nx-tabular__num-button[aria-pressed="true"] {
363
+ color: var(--nx-text);
364
+ }
365
+
366
+ .nx-tabular__num-button:disabled {
367
+ cursor: default;
368
+ opacity: 0.4;
369
+ }
370
+
359
371
  .nx-tabular__num-button:focus-visible {
360
372
  outline: 2px solid var(--nx-primary);
361
373
  outline-offset: -2px;
362
374
  }
363
375
 
376
+ /* With the actions at the end, the number column is the number alone. */
377
+ .nx-tabular[data-actions-at="end"] .nx-tabular__num {
378
+ grid-template-columns: minmax(0, 1fr);
379
+ padding-right: 10px;
380
+ }
381
+
382
+ /*
383
+ * The row's actions at its end (`actionsAt="end"`), as a data table has them: fixed at the right edge while the
384
+ * columns scroll, each action its own small button, every one always in its place.
385
+ */
386
+ .nx-tabular__actions {
387
+ position: sticky;
388
+ right: 0;
389
+ z-index: 1;
390
+ display: flex;
391
+ align-items: center;
392
+ justify-content: flex-end;
393
+ gap: 2px;
394
+ padding-inline: 4px;
395
+ border-left: 1px solid var(--nx-tabular-line);
396
+ background: inherit;
397
+ }
398
+
399
+ /*
400
+ * The line under the table keeps its height in a tabular form, said or not: it holds the hint or the message of the
401
+ * input with focus, and a line that came and went with the focus made the whole panel jump on every click.
402
+ */
403
+ .nx-tabular > .nx-rows__footer {
404
+ min-height: calc(var(--nx-text-xs) * 1.35);
405
+ }
406
+
364
407
  /* A row with a problem, after a check: a red edge at its start, and a red number. */
365
408
  .nx-tabular__row[data-problem] > .nx-tabular__num {
366
409
  box-shadow: inset 3px 0 0 var(--nx-danger);
@@ -585,12 +628,10 @@
585
628
  text-align: center;
586
629
  }
587
630
 
588
- @media (prefers-reduced-motion: reduce) {
589
- .nx-tabular__viewport,
590
- .nx-tabular__num-button,
591
- .nx-group-form__toggle,
592
- .nx-group-form__chevron {
593
- transition: none;
594
- }
631
+ [data-nx-motion="reduce"] .nx-tabular__viewport,
632
+ [data-nx-motion="reduce"] .nx-tabular__num-button,
633
+ [data-nx-motion="reduce"] .nx-group-form__toggle,
634
+ [data-nx-motion="reduce"] .nx-group-form__chevron {
635
+ transition: none;
595
636
  }
596
637
  }
@@ -269,10 +269,8 @@
269
269
  cursor: default;
270
270
  }
271
271
 
272
- @media (prefers-reduced-motion: reduce) {
273
- .nx-slider__tooltip,
274
- .nx-slider__input::-webkit-slider-thumb {
275
- transition: none;
276
- }
272
+ [data-nx-motion="reduce"] .nx-slider__tooltip,
273
+ [data-nx-motion="reduce"] .nx-slider__input::-webkit-slider-thumb {
274
+ transition: none;
277
275
  }
278
276
  }
@@ -212,6 +212,21 @@
212
212
  grid-template-columns: 1fr;
213
213
  }
214
214
 
215
+ /*
216
+ * `auto`: in a container wide enough for them, every option says what it is, as the chosen one does. 900px is a data
217
+ * table's bar with its Add, four lists, Reload, ⋮ and a full search on one line, and room to spare.
218
+ */
219
+ @container (min-width: 900px) {
220
+ .nx-tabs--labels-auto .nx-tabs__option {
221
+ padding: 0 var(--nx-space-3);
222
+ }
223
+
224
+ .nx-tabs--labels-auto .nx-tabs__label {
225
+ grid-template-columns: 1fr;
226
+ margin-inline-start: 6px;
227
+ }
228
+ }
229
+
215
230
  .nx-tabs--labels-selected .nx-tabs__text {
216
231
  min-width: 0;
217
232
  overflow: hidden;
@@ -408,12 +423,10 @@
408
423
  --nx-tabs-list-gap: 12px;
409
424
  }
410
425
 
411
- @media (prefers-reduced-motion: reduce) {
412
- .nx-tabs__indicator,
413
- .nx-tabs--multiple .nx-tabs__option,
414
- .nx-tabs--labels-selected :is(.nx-tabs__option, .nx-tabs__label),
415
- .nx-tabs--list .nx-tabs__option::before {
416
- transition: none;
417
- }
426
+ [data-nx-motion="reduce"] .nx-tabs__indicator,
427
+ [data-nx-motion="reduce"] .nx-tabs--multiple .nx-tabs__option,
428
+ [data-nx-motion="reduce"] .nx-tabs--labels-selected :is(.nx-tabs__option, .nx-tabs__label),
429
+ [data-nx-motion="reduce"] .nx-tabs--list .nx-tabs__option::before {
430
+ transition: none;
418
431
  }
419
432
  }