nexus-shared 3.1.0 → 4.0.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 (234) hide show
  1. package/CHANGELOG.md +2268 -446
  2. package/LICENSE +21 -21
  3. package/README.md +1705 -1084
  4. package/dist/Client.Index.d.ts +17 -0
  5. package/dist/Client.Index.js +17 -0
  6. package/dist/Components/Documents/DocumentFrame.d.ts +50 -0
  7. package/dist/Components/Documents/DocumentFrame.js +83 -0
  8. package/dist/Components/Documents/Menu.d.ts +4 -0
  9. package/dist/Components/Documents/Menu.js +40 -24
  10. package/dist/Components/Documents/PrintDocument.d.ts +95 -0
  11. package/dist/Components/Documents/PrintDocument.js +62 -0
  12. package/dist/Components/Documents/Tabs.d.ts +59 -0
  13. package/dist/Components/Documents/Tabs.js +70 -0
  14. package/dist/Components/Forms/ApiForm.js +19 -2
  15. package/dist/Components/Forms/Crud.d.ts +2 -2
  16. package/dist/Components/Forms/Crud.js +871 -377
  17. package/dist/Components/Forms/CrudActions.d.ts +136 -0
  18. package/dist/Components/Forms/CrudActions.js +184 -0
  19. package/dist/Components/Forms/CrudHistory.d.ts +66 -0
  20. package/dist/Components/Forms/CrudHistory.js +140 -0
  21. package/dist/Components/Forms/CrudNarrowPicker.d.ts +31 -0
  22. package/dist/Components/Forms/CrudNarrowPicker.js +180 -0
  23. package/dist/Components/Forms/CrudParts.d.ts +30 -2
  24. package/dist/Components/Forms/CrudParts.js +56 -5
  25. package/dist/Components/Forms/CrudRowForms.d.ts +26 -0
  26. package/dist/Components/Forms/CrudRowForms.js +114 -0
  27. package/dist/Components/Forms/CrudScopes.d.ts +28 -0
  28. package/dist/Components/Forms/CrudScopes.js +76 -0
  29. package/dist/Components/Forms/CrudTree.d.ts +90 -0
  30. package/dist/Components/Forms/CrudTree.js +363 -0
  31. package/dist/Components/Forms/CrudWorkspace.d.ts +63 -0
  32. package/dist/Components/Forms/CrudWorkspace.js +169 -0
  33. package/dist/Components/Forms/ExcelImport.js +3 -3
  34. package/dist/Components/Forms/Form.d.ts +4 -4
  35. package/dist/Components/Forms/Form.js +125 -16
  36. package/dist/Components/Forms/FormLeaveGuard.d.ts +44 -0
  37. package/dist/Components/Forms/FormLeaveGuard.js +65 -0
  38. package/dist/Components/Forms/RecordFlows.d.ts +50 -0
  39. package/dist/Components/Forms/RecordFlows.js +282 -0
  40. package/dist/Components/Forms/SubmitForm.d.ts +37 -2
  41. package/dist/Components/Forms/SubmitForm.js +195 -10
  42. package/dist/Components/Inputs/CheckBox.js +1 -1
  43. package/dist/Components/Inputs/ChoiceField.d.ts +21 -1
  44. package/dist/Components/Inputs/ChoiceField.js +28 -2
  45. package/dist/Components/Inputs/CodeBox.d.ts +69 -0
  46. package/dist/Components/Inputs/CodeBox.js +316 -0
  47. package/dist/Components/Inputs/DatePicker.js +4 -1
  48. package/dist/Components/Inputs/DateRangePicker.js +4 -1
  49. package/dist/Components/Inputs/DateTimePicker.js +4 -1
  50. package/dist/Components/Inputs/Dropdown.d.ts +13 -0
  51. package/dist/Components/Inputs/Dropdown.js +8 -5
  52. package/dist/Components/Inputs/DropdownParts.d.ts +3 -1
  53. package/dist/Components/Inputs/DropdownParts.js +16 -4
  54. package/dist/Components/Inputs/Field.d.ts +7 -1
  55. package/dist/Components/Inputs/Field.js +2 -2
  56. package/dist/Components/Inputs/GroupForm.d.ts +6 -6
  57. package/dist/Components/Inputs/GroupForm.js +10 -11
  58. package/dist/Components/Inputs/InputRenderer.d.ts +9 -6
  59. package/dist/Components/Inputs/InputRenderer.js +39 -31
  60. package/dist/Components/Inputs/NumberBox.js +4 -2
  61. package/dist/Components/Inputs/PictureInput.d.ts +41 -0
  62. package/dist/Components/Inputs/PictureInput.js +70 -0
  63. package/dist/Components/Inputs/RadioGroup.d.ts +16 -3
  64. package/dist/Components/Inputs/RadioGroup.js +8 -3
  65. package/dist/Components/Inputs/RowsInput.d.ts +1 -1
  66. package/dist/Components/Inputs/RowsInput.js +18 -3
  67. package/dist/Components/Inputs/TabularForm.d.ts +5 -5
  68. package/dist/Components/Inputs/TabularForm.js +29 -29
  69. package/dist/Components/Inputs/TextArea.d.ts +6 -0
  70. package/dist/Components/Inputs/TextArea.js +14 -2
  71. package/dist/Components/Inputs/TextBox.js +4 -1
  72. package/dist/Components/Inputs/TextBoxTypes.d.ts +6 -0
  73. package/dist/Components/Inputs/TextBoxTypes.js +17 -0
  74. package/dist/Components/Inputs/TimePicker.js +4 -1
  75. package/dist/Components/Inputs/TreeView.d.ts +107 -6
  76. package/dist/Components/Inputs/TreeView.js +513 -30
  77. package/dist/Components/Layouts/MessageBox.d.ts +15 -2
  78. package/dist/Components/Layouts/MessageBox.js +56 -7
  79. package/dist/Components/Layouts/Popup.d.ts +13 -6
  80. package/dist/Components/Layouts/Popup.js +37 -9
  81. package/dist/Components/Layouts/PopupDock.d.ts +3 -1
  82. package/dist/Components/Layouts/PopupDock.js +2 -1
  83. package/dist/Components/Layouts/PopupHost.js +5 -4
  84. package/dist/Components/Layouts/ThemePicker.d.ts +3 -2
  85. package/dist/Components/Layouts/ThemePicker.js +16 -4
  86. package/dist/Components/Viewers/DataTable.js +205 -61
  87. package/dist/Components/Viewers/DataTableFilters.d.ts +1 -1
  88. package/dist/Components/Viewers/DataTableFilters.js +17 -2
  89. package/dist/Components/Viewers/DataTableParts.d.ts +46 -12
  90. package/dist/Components/Viewers/DataTableParts.js +62 -21
  91. package/dist/Components/Viewers/OwnerFiles.d.ts +175 -0
  92. package/dist/Components/Viewers/OwnerFiles.js +589 -0
  93. package/dist/Components/Viewers/QrCodeImage.d.ts +22 -0
  94. package/dist/Components/Viewers/QrCodeImage.js +15 -0
  95. package/dist/Components/Viewers/RecordCards.d.ts +16 -0
  96. package/dist/Components/Viewers/RecordCards.js +509 -0
  97. package/dist/Helpers/ApiModules.d.ts +3 -34
  98. package/dist/Helpers/ApiModules.js +3 -3
  99. package/dist/Helpers/ApiRoutes.d.ts +68 -26
  100. package/dist/Helpers/ApiRoutes.js +31 -27
  101. package/dist/Helpers/ArrayHelpers.d.ts +0 -0
  102. package/dist/Helpers/ArrayHelpers.js +2 -0
  103. package/dist/Helpers/BusyHooks.d.ts +6 -0
  104. package/dist/Helpers/BusyHooks.js +39 -0
  105. package/dist/Helpers/CodeHelpers.d.ts +97 -0
  106. package/dist/Helpers/CodeHelpers.js +332 -0
  107. package/dist/Helpers/CrudBackend.d.ts +114 -6
  108. package/dist/Helpers/CrudBackend.js +214 -11
  109. package/dist/Helpers/CrudColumns.d.ts +98 -0
  110. package/dist/Helpers/CrudColumns.js +160 -0
  111. package/dist/Helpers/CrudDetailsTabs.d.ts +58 -0
  112. package/dist/Helpers/CrudDetailsTabs.js +126 -0
  113. package/dist/Helpers/CrudHelpers.d.ts +130 -6
  114. package/dist/Helpers/CrudHelpers.js +304 -12
  115. package/dist/Helpers/CrudNarrowPick.d.ts +83 -0
  116. package/dist/Helpers/CrudNarrowPick.js +157 -0
  117. package/dist/Helpers/CrudRowForms.d.ts +15 -0
  118. package/dist/Helpers/CrudRowForms.js +43 -0
  119. package/dist/Helpers/CrudScopes.d.ts +32 -0
  120. package/dist/Helpers/CrudScopes.js +79 -0
  121. package/dist/Helpers/DropdownHelpers.d.ts +3 -1
  122. package/dist/Helpers/DropdownHelpers.js +6 -2
  123. package/dist/Helpers/ExcelHelpers.d.ts +1 -1
  124. package/dist/Helpers/ExcelHelpers.js +12 -11
  125. package/dist/Helpers/FileAdapter.d.ts +78 -0
  126. package/dist/Helpers/FileAdapter.js +102 -0
  127. package/dist/Helpers/FilePrimaries.d.ts +48 -0
  128. package/dist/Helpers/FilePrimaries.js +138 -0
  129. package/dist/Helpers/FormConfirm.d.ts +32 -0
  130. package/dist/Helpers/FormConfirm.js +40 -0
  131. package/dist/Helpers/FormStore.d.ts +90 -5
  132. package/dist/Helpers/FormStore.js +318 -22
  133. package/dist/Helpers/InputConditions.d.ts +50 -0
  134. package/dist/Helpers/InputConditions.js +168 -0
  135. package/dist/Helpers/InputMemory.d.ts +106 -0
  136. package/dist/Helpers/InputMemory.js +385 -0
  137. package/dist/Helpers/InputNarrowing.d.ts +18 -0
  138. package/dist/Helpers/InputNarrowing.js +67 -0
  139. package/dist/Helpers/InputParamsHelpers.d.ts +44 -1
  140. package/dist/Helpers/InputParamsHelpers.js +162 -71
  141. package/dist/Helpers/MessageBuilder.js +2 -0
  142. package/dist/Helpers/NexusDriveAdapter.d.ts +55 -0
  143. package/dist/Helpers/NexusDriveAdapter.js +207 -0
  144. package/dist/Helpers/NexusHelpers.d.ts +0 -0
  145. package/dist/Helpers/NexusHelpers.js +1 -0
  146. package/dist/Helpers/NumberHelpers.d.ts +95 -0
  147. package/dist/Helpers/NumberHelpers.js +126 -0
  148. package/dist/Helpers/Permissions.js +2 -1
  149. package/dist/Helpers/QrCode.d.ts +26 -0
  150. package/dist/Helpers/QrCode.js +463 -0
  151. package/dist/Helpers/RecordCards.d.ts +205 -0
  152. package/dist/Helpers/RecordCards.js +378 -0
  153. package/dist/Helpers/RequestCache.d.ts +47 -0
  154. package/dist/Helpers/RequestCache.js +132 -0
  155. package/dist/Helpers/RowsStore.d.ts +37 -2
  156. package/dist/Helpers/RowsStore.js +128 -10
  157. package/dist/Helpers/ServerPreview.d.ts +69 -0
  158. package/dist/Helpers/ServerPreview.js +99 -0
  159. package/dist/Helpers/TableColumns.js +4 -3
  160. package/dist/Helpers/TableExport.d.ts +7 -1
  161. package/dist/Helpers/TableExport.js +21 -15
  162. package/dist/Helpers/TableFilters.d.ts +1 -1
  163. package/dist/Helpers/TableFilters.js +24 -23
  164. package/dist/Helpers/TableHelpers.d.ts +24 -3
  165. package/dist/Helpers/TableHelpers.js +58 -12
  166. package/dist/Helpers/TableJoins.d.ts +83 -0
  167. package/dist/Helpers/TableJoins.js +284 -0
  168. package/dist/Helpers/TableStore.d.ts +26 -1
  169. package/dist/Helpers/TableStore.js +73 -7
  170. package/dist/Helpers/TreeStore.d.ts +306 -11
  171. package/dist/Helpers/TreeStore.js +1048 -90
  172. package/dist/Helpers/UserPreferences.d.ts +8 -0
  173. package/dist/Helpers/UserPreferences.js +17 -0
  174. package/dist/Interfaces/CrudInterfaces.d.ts +512 -14
  175. package/dist/Interfaces/FileInterfaces.d.ts +162 -0
  176. package/dist/Interfaces/FileInterfaces.js +4 -0
  177. package/dist/Interfaces/FormInterfaces.d.ts +393 -29
  178. package/dist/Interfaces/FormInterfaces.js +79 -1
  179. package/dist/Interfaces/InputInterfaces.d.ts +39 -3
  180. package/dist/Interfaces/MessageInterfaces.d.ts +1 -1
  181. package/dist/Interfaces/PreferenceInterfaces.d.ts +8 -0
  182. package/dist/Interfaces/PreferenceInterfaces.js +2 -5
  183. package/dist/Interfaces/RecordInterfaces.d.ts +367 -0
  184. package/dist/Interfaces/RecordInterfaces.js +1 -0
  185. package/dist/Interfaces/TableInterfaces.d.ts +160 -5
  186. package/dist/Services/ApiProxy.d.ts +36 -1
  187. package/dist/Services/ApiProxy.js +182 -52
  188. package/dist/Services/ApiProxyRules.d.ts +203 -0
  189. package/dist/Services/ApiProxyRules.js +426 -0
  190. package/dist/Services/ExcelApi.js +5 -0
  191. package/dist/Services/FileApi.d.ts +13 -0
  192. package/dist/Services/FileApi.js +29 -0
  193. package/dist/Services/ImageEditorLoader.d.ts +14 -0
  194. package/dist/Services/ImageEditorLoader.js +51 -0
  195. package/dist/Services/JoinSources.d.ts +80 -0
  196. package/dist/Services/JoinSources.js +150 -0
  197. package/dist/Services/ModuleImport.d.ts +7 -0
  198. package/dist/Services/ModuleImport.js +22 -0
  199. package/dist/Services/ServerApi.d.ts +13 -2
  200. package/dist/Services/ServerApi.js +8 -3
  201. package/dist/Shared.Index.d.ts +20 -0
  202. package/dist/Shared.Index.js +20 -0
  203. package/package.json +92 -85
  204. package/src/Styles/Nexus.Avatar.css +80 -79
  205. package/src/Styles/Nexus.Base.css +117 -117
  206. package/src/Styles/Nexus.Button.css +186 -180
  207. package/src/Styles/Nexus.Calendar.css +273 -273
  208. package/src/Styles/Nexus.Chat.css +1443 -1443
  209. package/src/Styles/Nexus.Choice.css +359 -343
  210. package/src/Styles/Nexus.Crud.css +542 -168
  211. package/src/Styles/Nexus.DateTime.css +81 -81
  212. package/src/Styles/Nexus.Dropdown.css +733 -725
  213. package/src/Styles/Nexus.Editor.css +295 -295
  214. package/src/Styles/Nexus.Excel.css +389 -389
  215. package/src/Styles/Nexus.Files.css +410 -0
  216. package/src/Styles/Nexus.Form.css +282 -279
  217. package/src/Styles/Nexus.Index.css +41 -37
  218. package/src/Styles/Nexus.Input.css +238 -4
  219. package/src/Styles/Nexus.Markdown.css +237 -237
  220. package/src/Styles/Nexus.Menu.css +246 -237
  221. package/src/Styles/Nexus.Popup.css +800 -724
  222. package/src/Styles/Nexus.Print.css +288 -0
  223. package/src/Styles/Nexus.QrCode.css +12 -0
  224. package/src/Styles/Nexus.Record.css +430 -0
  225. package/src/Styles/Nexus.Rows.css +637 -637
  226. package/src/Styles/Nexus.Slider.css +276 -276
  227. package/src/Styles/Nexus.Tab.Buttons.css +497 -432
  228. package/src/Styles/Nexus.Table.css +98 -35
  229. package/src/Styles/Nexus.Theme.Picker.css +59 -3
  230. package/src/Styles/Nexus.Themes.css +200 -194
  231. package/src/Styles/Nexus.Time.css +144 -144
  232. package/src/Styles/Nexus.Toast.css +263 -263
  233. package/src/Styles/Nexus.Tokens.css +94 -89
  234. package/src/Styles/Nexus.Tree.css +530 -431
@@ -1,431 +1,530 @@
1
- @layer nexus.components {
2
- /*
3
- * Tree view: a panel with a toolbar and a scrolling list of rows. Rows have a fixed height (the component places
4
- * rows by it: keep --nx-tree-row and --nx-tree-pad in step with ROW_HEIGHT and PAD in TreeView.tsx). The checkbox
5
- * is the CheckBox control itself, so checked, mixed, and read-only boxes look the same as everywhere else.
6
- */
7
- .nx-tree {
8
- --nx-tree-row: 32px;
9
- --nx-tree-pad: 4px;
10
- --nx-tree-indent: 20px;
11
- --nx-tree-font: var(--nx-text-md);
12
- --nx-tree-open: 200ms;
13
- --nx-tree-close: 160ms;
14
- /* A line under every parent's chevron, soft enough to leave the rows in front. */
15
- --nx-tree-guide: color-mix(in oklab, var(--nx-border-strong) 55%, transparent);
16
-
17
- display: flex;
18
- flex-direction: column;
19
- min-width: 0;
20
- overflow: hidden;
21
- border: 1px solid var(--nx-field-border);
22
- border-radius: var(--nx-radius);
23
- background: var(--nx-field-bg);
24
- color: var(--nx-text);
25
- font-size: var(--nx-tree-font);
26
- line-height: 1.35;
27
- transition: border-color var(--nx-duration);
28
- }
29
-
30
- .nx-tree--sm {
31
- --nx-tree-row: 28px;
32
- --nx-tree-indent: 18px;
33
- --nx-tree-font: var(--nx-text-sm);
34
- }
35
-
36
- .nx-tree--lg {
37
- --nx-tree-row: 38px;
38
- --nx-tree-indent: 22px;
39
- --nx-tree-font: var(--nx-text-lg);
40
- }
41
-
42
- .nx-tree:hover {
43
- border-color: var(--nx-field-border-hover);
44
- }
45
-
46
- .nx-tree:focus-within {
47
- border-color: var(--nx-field-accent);
48
- }
49
-
50
- .nx-field:is([data-readonly], [data-disabled]) .nx-tree {
51
- border-color: var(--nx-field-border);
52
- }
53
-
54
- /* Toolbar: select all and counts at the start, tools at the end, a line under it. */
55
- .nx-tree__toolbar {
56
- display: flex;
57
- flex-wrap: wrap;
58
- align-items: center;
59
- gap: var(--nx-space-1) var(--nx-space-3);
60
- min-height: calc(var(--nx-control-sm) + 12px);
61
- padding: 6px 6px 6px var(--nx-space-3);
62
- border-bottom: 1px solid var(--nx-border);
63
- font-size: var(--nx-text-sm);
64
- }
65
-
66
- .nx-tree__all {
67
- flex: none;
68
- }
69
-
70
- .nx-tree__all .nx-choice__label {
71
- font-weight: 500;
72
- }
73
-
74
- /* A read-only tree has one lock, after its label; select all still shows the note when clicked. */
75
- .nx-tree__all .nx-field__lock {
76
- display: none;
77
- }
78
-
79
- .nx-tree__summary {
80
- display: inline-flex;
81
- align-items: center;
82
- gap: 6px;
83
- min-width: 0;
84
- margin-right: auto;
85
- color: var(--nx-text-muted);
86
- font-variant-numeric: tabular-nums;
87
- white-space: nowrap;
88
- }
89
-
90
- .nx-tree__summary .nx-icon {
91
- width: 14px;
92
- height: 14px;
93
- vertical-align: 0;
94
- }
95
-
96
- .nx-tree__tools {
97
- display: inline-flex;
98
- align-items: center;
99
- gap: 2px;
100
- }
101
-
102
- .nx-tree__tools .nx-btn--secondary {
103
- margin-left: var(--nx-space-1);
104
- }
105
-
106
- /* Rows */
107
- .nx-tree__viewport {
108
- position: relative;
109
- overflow: auto;
110
- overscroll-behavior: contain;
111
- outline: none;
112
- }
113
-
114
- .nx-tree__viewport:focus-visible {
115
- box-shadow: inset 0 0 0 2px var(--nx-primary);
116
- }
117
-
118
- .nx-tree__list {
119
- min-width: 0;
120
- padding-inline: var(--nx-tree-pad);
121
- }
122
-
123
- .nx-tree__row {
124
- --nx-tree-depth: 0;
125
- /* Muted texts of a row. On a hovered or focused row they move toward the text color, so they keep 4.5:1 on the
126
- hover tint in every theme. */
127
- --nx-tree-muted: var(--nx-text-muted);
128
- --nx-tree-count: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 25%);
129
-
130
- display: flex;
131
- align-items: center;
132
- gap: 6px;
133
- height: var(--nx-tree-row);
134
- padding: 0 4px 0 calc(var(--nx-tree-depth) * var(--nx-tree-indent));
135
- border-radius: var(--nx-radius);
136
- /* Guides: one line per level, centered under the chevron of the parent at that level. */
137
- background-image: repeating-linear-gradient(
138
- to right,
139
- transparent 0 calc(var(--nx-tree-indent) / 2 - 0.5px),
140
- var(--nx-tree-guide) calc(var(--nx-tree-indent) / 2 - 0.5px) calc(var(--nx-tree-indent) / 2 + 0.5px),
141
- transparent calc(var(--nx-tree-indent) / 2 + 0.5px) var(--nx-tree-indent)
142
- );
143
- background-repeat: no-repeat;
144
- background-size: calc(var(--nx-tree-depth) * var(--nx-tree-indent)) 100%;
145
- white-space: nowrap;
146
- cursor: pointer;
147
- user-select: none;
148
- outline: none;
149
- -webkit-tap-highlight-color: transparent;
150
- }
151
-
152
- .nx-tree__row[role="treeitem"]:hover {
153
- background-color: var(--nx-surface-hover);
154
- }
155
-
156
- .nx-tree__row:focus-visible {
157
- background-color: var(--nx-surface-hover);
158
- box-shadow: inset 0 0 0 2px var(--nx-primary);
159
- }
160
-
161
- .nx-tree__row[role="treeitem"]:is(:hover, :focus-visible) {
162
- --nx-tree-muted: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 35%);
163
- --nx-tree-count: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 50%);
164
- }
165
-
166
- .nx-tree__toggle {
167
- display: grid;
168
- flex: none;
169
- place-items: center;
170
- width: var(--nx-tree-indent);
171
- height: var(--nx-tree-indent);
172
- margin-right: -2px;
173
- border-radius: var(--nx-radius-sm);
174
- color: var(--nx-tree-muted);
175
- }
176
-
177
- .nx-tree__toggle .nx-icon {
178
- width: 14px;
179
- height: 14px;
180
- vertical-align: 0;
181
- transition: transform var(--nx-tree-open) cubic-bezier(0.2, 0, 0, 1);
182
- }
183
-
184
- .nx-tree__row[aria-expanded="true"] > .nx-tree__toggle .nx-icon {
185
- transform: rotate(90deg);
186
- }
187
-
188
- .nx-tree__toggle:has(.nx-icon):hover {
189
- background: color-mix(in oklab, var(--nx-text) 10%, transparent);
190
- color: var(--nx-text);
191
- }
192
-
193
- /* The CheckBox control, without its label's line-height offset; the row takes the clicks. */
194
- .nx-tree__check {
195
- flex: none;
196
- align-items: center;
197
- gap: 0;
198
- }
199
-
200
- .nx-tree__check .nx-choice__control {
201
- margin: 0;
202
- pointer-events: none;
203
- }
204
-
205
- .nx-tree__row:hover .nx-choice__control:not(:checked, :indeterminate, :disabled) {
206
- border-color: var(--nx-choice-border-hover);
207
- }
208
-
209
- .nx-tree__icon {
210
- display: grid;
211
- flex: none;
212
- place-items: center;
213
- color: var(--nx-tree-muted);
214
- }
215
-
216
- .nx-tree__icon .nx-icon {
217
- width: 1.15em;
218
- height: 1.15em;
219
- vertical-align: 0;
220
- }
221
-
222
- .nx-tree__text {
223
- display: flex;
224
- flex: 1 1 auto;
225
- align-items: baseline;
226
- gap: var(--nx-space-2);
227
- min-width: 0;
228
- overflow: hidden;
229
- }
230
-
231
- .nx-tree__label {
232
- flex: 0 1 auto;
233
- min-width: 2em;
234
- overflow: hidden;
235
- text-overflow: ellipsis;
236
- }
237
-
238
- .nx-tree__description {
239
- flex: 0 100 auto;
240
- min-width: 0;
241
- overflow: hidden;
242
- color: var(--nx-tree-muted);
243
- font-size: calc(var(--nx-tree-font) - 1px);
244
- text-overflow: ellipsis;
245
- }
246
-
247
- .nx-tree__count {
248
- flex: none;
249
- padding: 0 6px;
250
- border-radius: var(--nx-radius-full);
251
- background: color-mix(in oklab, var(--nx-text) 7%, transparent);
252
- color: var(--nx-tree-count);
253
- font-size: var(--nx-text-xs);
254
- font-variant-numeric: tabular-nums;
255
- line-height: 18px;
256
- }
257
-
258
- .nx-tree__lock,
259
- .nx-tree__busy {
260
- display: grid;
261
- flex: none;
262
- place-items: center;
263
- color: var(--nx-tree-muted);
264
- }
265
-
266
- .nx-tree__lock .nx-icon,
267
- .nx-tree__busy {
268
- width: 14px;
269
- height: 14px;
270
- vertical-align: 0;
271
- }
272
-
273
- /* A locked item: the read-only box (data-readonly), a muted label, and a lock. */
274
- .nx-tree__row--locked {
275
- cursor: default;
276
- }
277
-
278
- .nx-tree__row--locked .nx-tree__label {
279
- color: var(--nx-tree-muted);
280
- }
281
-
282
- /* Actions show on the row under the pointer or with focus; on touch screens, always. They keep their space, so
283
- labels do not jump when they appear. */
284
- .nx-tree__actions {
285
- display: flex;
286
- flex: none;
287
- gap: 1px;
288
- margin-left: auto;
289
- visibility: hidden;
290
- }
291
-
292
- .nx-tree__row:is(:hover, :focus-visible, :focus-within) > .nx-tree__actions {
293
- visibility: visible;
294
- }
295
-
296
- @media (hover: none) {
297
- .nx-tree__actions {
298
- visibility: visible;
299
- }
300
- }
301
-
302
- .nx-btn.nx-tree__action {
303
- --nx-btn-height: calc(var(--nx-tree-row) - 6px);
304
- }
305
-
306
- .nx-tree__action .nx-icon {
307
- width: 15px;
308
- height: 15px;
309
- }
310
-
311
- /* The name box of a row being added or renamed. */
312
- .nx-tree__edit {
313
- display: flex;
314
- flex: 1 1 auto;
315
- align-items: center;
316
- gap: 1px;
317
- min-width: 0;
318
- }
319
-
320
- .nx-tree__input {
321
- flex: 1 1 auto;
322
- width: 0;
323
- min-width: 6em;
324
- height: calc(var(--nx-tree-row) - 6px);
325
- margin: 0 2px 0 0;
326
- padding: 0 6px;
327
- border: 1px solid var(--nx-field-accent);
328
- border-radius: var(--nx-radius-sm);
329
- background: var(--nx-surface);
330
- box-shadow: var(--nx-field-ring);
331
- color: var(--nx-text);
332
- font: inherit;
333
- outline: none;
334
- }
335
-
336
- .nx-tree__input[aria-invalid="true"] {
337
- border-color: var(--nx-danger);
338
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--nx-danger) 30%, transparent);
339
- }
340
-
341
- .nx-tree__input:read-only {
342
- color: var(--nx-text-muted);
343
- }
344
-
345
- /*
346
- * Expand and collapse: the rows that come or go sit in a group whose height opens from 0, or closes to 0. Only the
347
- * rows in view are in the group, so opening 10,000 children animates about 30 rows.
348
- */
349
- .nx-tree__motion {
350
- height: var(--nx-tree-motion-height);
351
- overflow: hidden;
352
- }
353
-
354
- .nx-tree__motion--open {
355
- animation: nx-tree-open var(--nx-tree-open) cubic-bezier(0.2, 0, 0, 1);
356
- }
357
-
358
- .nx-tree__motion--close {
359
- height: 0;
360
- pointer-events: none;
361
- animation: nx-tree-close var(--nx-tree-close) cubic-bezier(0.3, 0, 0.8, 0.15);
362
- }
363
-
364
- @keyframes nx-tree-open {
365
- from {
366
- height: 0;
367
- opacity: 0.35;
368
- }
369
- }
370
-
371
- @keyframes nx-tree-close {
372
- from {
373
- height: var(--nx-tree-motion-height);
374
- opacity: 1;
375
- }
376
- to {
377
- height: 0;
378
- opacity: 0;
379
- }
380
- }
381
-
382
- /* Loading and empty */
383
- .nx-tree__row--skeleton {
384
- cursor: default;
385
- }
386
-
387
- .nx-tree__skeleton {
388
- display: inline-block;
389
- height: 0.7em;
390
- border-radius: var(--nx-radius-full);
391
- background: color-mix(in oklab, var(--nx-text) 11%, transparent);
392
- animation: nx-tree-pulse 1.2s ease-in-out infinite;
393
- }
394
-
395
- @keyframes nx-tree-pulse {
396
- 50% {
397
- opacity: 0.45;
398
- }
399
- }
400
-
401
- .nx-tree__empty {
402
- margin: 0;
403
- padding: var(--nx-space-6) var(--nx-space-4);
404
- color: var(--nx-text-muted);
405
- font-size: var(--nx-text-sm);
406
- text-align: center;
407
- }
408
-
409
- /* States of the whole tree */
410
- .nx-field[data-disabled] .nx-tree__row {
411
- cursor: not-allowed;
412
- }
413
-
414
- .nx-field[data-disabled] .nx-tree__row:hover {
415
- background-color: transparent;
416
- }
417
-
418
- .nx-field[data-readonly] .nx-tree__row {
419
- cursor: default;
420
- }
421
-
422
- [data-nx-motion="reduce"] .nx-tree__motion,
423
- [data-nx-motion="reduce"] .nx-tree__skeleton {
424
- animation: none;
425
- }
426
-
427
- [data-nx-motion="reduce"] .nx-tree,
428
- [data-nx-motion="reduce"] .nx-tree__toggle .nx-icon {
429
- transition: none;
430
- }
431
- }
1
+ @layer nexus.components {
2
+ /*
3
+ * Tree view: a panel with a toolbar and a scrolling list of rows. Rows have a fixed height (the component places
4
+ * rows by it: keep --nx-tree-row and --nx-tree-pad in step with ROW_HEIGHT and PAD in TreeView.tsx). The checkbox
5
+ * is the CheckBox control itself, so checked, mixed, and read-only boxes look the same as everywhere else.
6
+ */
7
+ .nx-tree {
8
+ --nx-tree-row: 32px;
9
+ --nx-tree-pad: 4px;
10
+ --nx-tree-indent: 20px;
11
+ --nx-tree-font: var(--nx-text-md);
12
+ --nx-tree-open: 200ms;
13
+ --nx-tree-close: 160ms;
14
+ /* A line under every parent's chevron, soft enough to leave the rows in front. */
15
+ --nx-tree-guide: color-mix(in oklab, var(--nx-border-strong) 55%, transparent);
16
+
17
+ display: flex;
18
+ flex-direction: column;
19
+ min-width: 0;
20
+ overflow: hidden;
21
+ border: 1px solid var(--nx-field-border);
22
+ border-radius: var(--nx-radius);
23
+ background: var(--nx-field-bg);
24
+ color: var(--nx-text);
25
+ font-size: var(--nx-tree-font);
26
+ line-height: 1.35;
27
+ transition: border-color var(--nx-duration);
28
+ }
29
+
30
+ .nx-tree--sm {
31
+ --nx-tree-row: 28px;
32
+ --nx-tree-indent: 18px;
33
+ --nx-tree-font: var(--nx-text-sm);
34
+ }
35
+
36
+ .nx-tree--lg {
37
+ --nx-tree-row: 38px;
38
+ --nx-tree-indent: 22px;
39
+ --nx-tree-font: var(--nx-text-lg);
40
+ }
41
+
42
+ .nx-tree:hover {
43
+ border-color: var(--nx-field-border-hover);
44
+ }
45
+
46
+ .nx-tree:focus-within {
47
+ border-color: var(--nx-field-accent);
48
+ }
49
+
50
+ .nx-field:is([data-readonly], [data-disabled]) .nx-tree {
51
+ border-color: var(--nx-field-border);
52
+ }
53
+
54
+ /* Toolbar: select all and counts at the start, tools at the end, a line under it. */
55
+ .nx-tree__toolbar {
56
+ display: flex;
57
+ flex-wrap: wrap;
58
+ align-items: center;
59
+ gap: var(--nx-space-1) var(--nx-space-3);
60
+ min-height: calc(var(--nx-control-sm) + 12px);
61
+ padding: 6px 6px 6px var(--nx-space-3);
62
+ border-bottom: 1px solid var(--nx-border);
63
+ font-size: var(--nx-text-sm);
64
+ }
65
+
66
+ .nx-tree__all {
67
+ flex: none;
68
+ }
69
+
70
+ .nx-tree__all .nx-choice__label {
71
+ font-weight: 500;
72
+ }
73
+
74
+ /* A read-only tree has one lock, after its label; select all still shows the note when clicked. */
75
+ .nx-tree__all .nx-field__lock {
76
+ display: none;
77
+ }
78
+
79
+ .nx-tree__summary {
80
+ display: inline-flex;
81
+ align-items: center;
82
+ gap: 6px;
83
+ min-width: 0;
84
+ margin-right: auto;
85
+ color: var(--nx-text-muted);
86
+ font-variant-numeric: tabular-nums;
87
+ white-space: nowrap;
88
+ }
89
+
90
+ .nx-tree__summary .nx-icon {
91
+ width: 14px;
92
+ height: 14px;
93
+ vertical-align: 0;
94
+ }
95
+
96
+ .nx-tree__tools {
97
+ display: inline-flex;
98
+ align-items: center;
99
+ gap: 2px;
100
+ }
101
+
102
+ .nx-tree__tools .nx-btn--secondary {
103
+ margin-left: var(--nx-space-1);
104
+ }
105
+
106
+ /* A tree that fills (`fill`): the height it is given, the toolbar on top and the rows scrolling under it. */
107
+ .nx-tree-field--fill {
108
+ height: 100%;
109
+ min-height: 0;
110
+ }
111
+
112
+ .nx-tree-field--fill > .nx-tree,
113
+ .nx-tree-field--fill .nx-tree__viewport {
114
+ flex: 1 1 auto;
115
+ min-height: 0;
116
+ }
117
+
118
+ /* Rows */
119
+ .nx-tree__viewport {
120
+ position: relative;
121
+ overflow: auto;
122
+ overscroll-behavior: contain;
123
+ outline: none;
124
+ }
125
+
126
+ .nx-tree__viewport:focus-visible {
127
+ box-shadow: inset 0 0 0 2px var(--nx-primary);
128
+ }
129
+
130
+ .nx-tree__list {
131
+ min-width: 0;
132
+ padding-inline: var(--nx-tree-pad);
133
+ }
134
+
135
+ .nx-tree__row {
136
+ --nx-tree-depth: 0;
137
+ /* Muted texts of a row. On a hovered or focused row they move toward the text color, so they keep 4.5:1 on the
138
+ hover tint in every theme. */
139
+ --nx-tree-muted: var(--nx-text-muted);
140
+ --nx-tree-count: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 25%);
141
+
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 6px;
145
+ height: var(--nx-tree-row);
146
+ padding: 0 4px 0 calc(var(--nx-tree-depth) * var(--nx-tree-indent));
147
+ border-radius: var(--nx-radius);
148
+ /* Guides: one line per level, centered under the chevron of the parent at that level. */
149
+ background-image: repeating-linear-gradient(
150
+ to right,
151
+ transparent 0 calc(var(--nx-tree-indent) / 2 - 0.5px),
152
+ var(--nx-tree-guide) calc(var(--nx-tree-indent) / 2 - 0.5px) calc(var(--nx-tree-indent) / 2 + 0.5px),
153
+ transparent calc(var(--nx-tree-indent) / 2 + 0.5px) var(--nx-tree-indent)
154
+ );
155
+ background-repeat: no-repeat;
156
+ background-size: calc(var(--nx-tree-depth) * var(--nx-tree-indent)) 100%;
157
+ white-space: nowrap;
158
+ cursor: pointer;
159
+ user-select: none;
160
+ outline: none;
161
+ -webkit-tap-highlight-color: transparent;
162
+ }
163
+
164
+ .nx-tree__row[role="treeitem"]:hover {
165
+ background-color: var(--nx-surface-hover);
166
+ }
167
+
168
+ .nx-tree__row:focus-visible {
169
+ background-color: var(--nx-surface-hover);
170
+ box-shadow: inset 0 0 0 2px var(--nx-primary);
171
+ }
172
+
173
+ .nx-tree__row[role="treeitem"]:is(:hover, :focus-visible),
174
+ .nx-tree__row--selected {
175
+ --nx-tree-muted: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 35%);
176
+ --nx-tree-count: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 50%);
177
+ }
178
+
179
+ /* The selected row (`selectedValue`): a single choice's tint, as a dropdown's chosen option has, and a heavier label.
180
+ It stays when focus moves on; under the pointer or with the keyboard's focus the tint deepens, and its muted texts
181
+ move further toward the text color (35% read 4.49:1 there in Catppuccin light). */
182
+ .nx-tree__row--selected {
183
+ background-color: color-mix(in oklab, var(--nx-primary) 10%, transparent);
184
+ }
185
+
186
+ .nx-tree__row--selected[role="treeitem"]:is(:hover, :focus-visible) {
187
+ --nx-tree-muted: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 50%);
188
+ --nx-tree-count: color-mix(in oklab, var(--nx-text-muted), var(--nx-text) 65%);
189
+ background-color: color-mix(in oklab, var(--nx-primary) 17%, transparent);
190
+ }
191
+
192
+ .nx-tree__row--selected .nx-tree__label {
193
+ font-weight: 500;
194
+ }
195
+
196
+ .nx-tree__toggle {
197
+ display: grid;
198
+ flex: none;
199
+ place-items: center;
200
+ width: var(--nx-tree-indent);
201
+ height: var(--nx-tree-indent);
202
+ margin-right: -2px;
203
+ border-radius: var(--nx-radius-sm);
204
+ color: var(--nx-tree-muted);
205
+ }
206
+
207
+ .nx-tree__toggle .nx-icon {
208
+ width: 14px;
209
+ height: 14px;
210
+ vertical-align: 0;
211
+ transition: transform var(--nx-tree-open) cubic-bezier(0.2, 0, 0, 1);
212
+ }
213
+
214
+ .nx-tree__row[aria-expanded="true"] > .nx-tree__toggle .nx-icon {
215
+ transform: rotate(90deg);
216
+ }
217
+
218
+ .nx-tree__toggle:has(.nx-icon):hover {
219
+ background: color-mix(in oklab, var(--nx-text) 10%, transparent);
220
+ color: var(--nx-text);
221
+ }
222
+
223
+ /* The CheckBox control, without its label's line-height offset; the row takes the clicks. */
224
+ .nx-tree__check {
225
+ flex: none;
226
+ align-items: center;
227
+ gap: 0;
228
+ }
229
+
230
+ .nx-tree__check .nx-choice__control {
231
+ margin: 0;
232
+ pointer-events: none;
233
+ }
234
+
235
+ .nx-tree__row:hover .nx-choice__control:not(:checked, :indeterminate, :disabled) {
236
+ border-color: var(--nx-choice-border-hover);
237
+ }
238
+
239
+ .nx-tree__icon {
240
+ display: grid;
241
+ flex: none;
242
+ place-items: center;
243
+ color: var(--nx-tree-muted);
244
+ }
245
+
246
+ .nx-tree__icon .nx-icon {
247
+ width: 1.15em;
248
+ height: 1.15em;
249
+ vertical-align: 0;
250
+ }
251
+
252
+ .nx-tree__text {
253
+ display: flex;
254
+ flex: 1 1 auto;
255
+ align-items: baseline;
256
+ gap: var(--nx-space-2);
257
+ min-width: 0;
258
+ overflow: hidden;
259
+ }
260
+
261
+ .nx-tree__label {
262
+ flex: 0 1 auto;
263
+ min-width: 2em;
264
+ overflow: hidden;
265
+ text-overflow: ellipsis;
266
+ }
267
+
268
+ .nx-tree__description {
269
+ flex: 0 100 auto;
270
+ min-width: 0;
271
+ overflow: hidden;
272
+ color: var(--nx-tree-muted);
273
+ font-size: calc(var(--nx-tree-font) - 1px);
274
+ text-overflow: ellipsis;
275
+ }
276
+
277
+ .nx-tree__count {
278
+ flex: none;
279
+ padding: 0 6px;
280
+ border-radius: var(--nx-radius-full);
281
+ background: color-mix(in oklab, var(--nx-text) 7%, transparent);
282
+ color: var(--nx-tree-count);
283
+ font-size: var(--nx-text-xs);
284
+ font-variant-numeric: tabular-nums;
285
+ line-height: 18px;
286
+ }
287
+
288
+ .nx-tree__lock,
289
+ .nx-tree__busy {
290
+ display: grid;
291
+ flex: none;
292
+ place-items: center;
293
+ color: var(--nx-tree-muted);
294
+ }
295
+
296
+ .nx-tree__lock .nx-icon,
297
+ .nx-tree__busy {
298
+ width: 14px;
299
+ height: 14px;
300
+ vertical-align: 0;
301
+ }
302
+
303
+ /*
304
+ * Rows that are not items, under a parent of a lazy tree (loadChildren): its page on its way, a page that failed
305
+ * with Retry, and Load more. They sit at the children's level and take no checkbox; the whole row is the button, so
306
+ * the Retry drawn in it is not a second stop for the keyboard.
307
+ */
308
+ .nx-tree__row--status {
309
+ cursor: default;
310
+ }
311
+
312
+ .nx-tree__row--more,
313
+ .nx-tree__row--error {
314
+ cursor: pointer;
315
+ }
316
+
317
+ /* Nothing to press while a page comes. */
318
+ .nx-tree__row--loading[role="treeitem"]:hover {
319
+ background-color: transparent;
320
+ }
321
+
322
+ .nx-tree__status-icon {
323
+ flex: none;
324
+ width: 14px;
325
+ height: 14px;
326
+ color: var(--nx-tree-muted);
327
+ vertical-align: 0;
328
+ }
329
+
330
+ /* The sentence keeps its own width, so Retry follows it rather than the row's far end. */
331
+ .nx-tree__row--status .nx-tree__text {
332
+ flex: 0 1 auto;
333
+ }
334
+
335
+ .nx-tree__status-text {
336
+ flex: 0 1 auto;
337
+ min-width: 0;
338
+ overflow: hidden;
339
+ color: var(--nx-tree-muted);
340
+ text-overflow: ellipsis;
341
+ }
342
+
343
+ .nx-tree__row--error .nx-tree__status-icon {
344
+ color: var(--nx-danger);
345
+ }
346
+
347
+ .nx-tree__row--error .nx-tree__status-text {
348
+ color: var(--nx-text);
349
+ }
350
+
351
+ /* The accent as text; on the hover tint it moves toward the text color, as muted texts do, to keep 4.5:1 (the plain
352
+ accent measured 3.79:1 on Dracula dark's hover tint). */
353
+ .nx-tree__row--more {
354
+ --nx-tree-link: var(--nx-primary);
355
+ }
356
+
357
+ .nx-tree__row--more:is(:hover, :focus-visible) {
358
+ --nx-tree-link: color-mix(in oklab, var(--nx-primary), var(--nx-text) 35%);
359
+ }
360
+
361
+ .nx-tree__row--more .nx-tree__status-text {
362
+ color: var(--nx-tree-link);
363
+ font-weight: 500;
364
+ }
365
+
366
+ .nx-btn.nx-tree__retry {
367
+ --nx-btn-height: calc(var(--nx-tree-row) - 6px);
368
+ flex: none;
369
+ margin-left: var(--nx-space-1);
370
+ }
371
+
372
+ /* A locked item: the read-only box (data-readonly), a muted label, and a lock. */
373
+ .nx-tree__row--locked {
374
+ cursor: default;
375
+ }
376
+
377
+ .nx-tree__row--locked .nx-tree__label {
378
+ color: var(--nx-tree-muted);
379
+ }
380
+
381
+ /* Actions show on the row under the pointer or with focus; on touch screens, always. They keep their space, so
382
+ labels do not jump when they appear. */
383
+ .nx-tree__actions {
384
+ display: flex;
385
+ flex: none;
386
+ gap: 1px;
387
+ margin-left: auto;
388
+ visibility: hidden;
389
+ }
390
+
391
+ .nx-tree__row:is(:hover, :focus-visible, :focus-within) > .nx-tree__actions {
392
+ visibility: visible;
393
+ }
394
+
395
+ @media (hover: none) {
396
+ .nx-tree__actions {
397
+ visibility: visible;
398
+ }
399
+ }
400
+
401
+ .nx-btn.nx-tree__action {
402
+ --nx-btn-height: calc(var(--nx-tree-row) - 6px);
403
+ }
404
+
405
+ .nx-tree__action .nx-icon {
406
+ width: 15px;
407
+ height: 15px;
408
+ }
409
+
410
+ /* The name box of a row being added or renamed. */
411
+ .nx-tree__edit {
412
+ display: flex;
413
+ flex: 1 1 auto;
414
+ align-items: center;
415
+ gap: 1px;
416
+ min-width: 0;
417
+ }
418
+
419
+ .nx-tree__input {
420
+ flex: 1 1 auto;
421
+ width: 0;
422
+ min-width: 6em;
423
+ height: calc(var(--nx-tree-row) - 6px);
424
+ margin: 0 2px 0 0;
425
+ padding: 0 6px;
426
+ border: 1px solid var(--nx-field-accent);
427
+ border-radius: var(--nx-radius-sm);
428
+ background: var(--nx-surface);
429
+ box-shadow: var(--nx-field-ring);
430
+ color: var(--nx-text);
431
+ font: inherit;
432
+ outline: none;
433
+ }
434
+
435
+ .nx-tree__input[aria-invalid="true"] {
436
+ border-color: var(--nx-danger);
437
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--nx-danger) 30%, transparent);
438
+ }
439
+
440
+ .nx-tree__input:read-only {
441
+ color: var(--nx-text-muted);
442
+ }
443
+
444
+ /*
445
+ * Expand and collapse: the rows that come or go sit in a group whose height opens from 0, or closes to 0. Only the
446
+ * rows in view are in the group, so opening 10,000 children animates about 30 rows.
447
+ */
448
+ .nx-tree__motion {
449
+ height: var(--nx-tree-motion-height);
450
+ overflow: hidden;
451
+ }
452
+
453
+ .nx-tree__motion--open {
454
+ animation: nx-tree-open var(--nx-tree-open) cubic-bezier(0.2, 0, 0, 1);
455
+ }
456
+
457
+ .nx-tree__motion--close {
458
+ height: 0;
459
+ pointer-events: none;
460
+ animation: nx-tree-close var(--nx-tree-close) cubic-bezier(0.3, 0, 0.8, 0.15);
461
+ }
462
+
463
+ @keyframes nx-tree-open {
464
+ from {
465
+ height: 0;
466
+ opacity: 0.35;
467
+ }
468
+ }
469
+
470
+ @keyframes nx-tree-close {
471
+ from {
472
+ height: var(--nx-tree-motion-height);
473
+ opacity: 1;
474
+ }
475
+ to {
476
+ height: 0;
477
+ opacity: 0;
478
+ }
479
+ }
480
+
481
+ /* Loading and empty */
482
+ .nx-tree__row--skeleton {
483
+ cursor: default;
484
+ }
485
+
486
+ .nx-tree__skeleton {
487
+ display: inline-block;
488
+ height: 0.7em;
489
+ border-radius: var(--nx-radius-full);
490
+ background: color-mix(in oklab, var(--nx-text) 11%, transparent);
491
+ animation: nx-tree-pulse 1.2s ease-in-out infinite;
492
+ }
493
+
494
+ @keyframes nx-tree-pulse {
495
+ 50% {
496
+ opacity: 0.45;
497
+ }
498
+ }
499
+
500
+ .nx-tree__empty {
501
+ margin: 0;
502
+ padding: var(--nx-space-6) var(--nx-space-4);
503
+ color: var(--nx-text-muted);
504
+ font-size: var(--nx-text-sm);
505
+ text-align: center;
506
+ }
507
+
508
+ /* States of the whole tree */
509
+ .nx-field[data-disabled] .nx-tree__row {
510
+ cursor: not-allowed;
511
+ }
512
+
513
+ .nx-field[data-disabled] .nx-tree__row:hover {
514
+ background-color: transparent;
515
+ }
516
+
517
+ .nx-field[data-readonly] .nx-tree__row {
518
+ cursor: default;
519
+ }
520
+
521
+ [data-nx-motion="reduce"] .nx-tree__motion,
522
+ [data-nx-motion="reduce"] .nx-tree__skeleton {
523
+ animation: none;
524
+ }
525
+
526
+ [data-nx-motion="reduce"] .nx-tree,
527
+ [data-nx-motion="reduce"] .nx-tree__toggle .nx-icon {
528
+ transition: none;
529
+ }
530
+ }