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,237 +1,246 @@
1
- @layer nexus.components {
2
- /*
3
- * Menu: a list of actions in a native popover. It shares the .nx-popover panel (border, raised background, shadow)
4
- * with tight padding, so items sit close to the edge. Hover and keyboard focus highlight an item the same way,
5
- * because focus follows the pointer.
6
- */
7
- .nx-menu {
8
- --nx-menu-item-height: var(--nx-row);
9
- --nx-menu-font: var(--nx-text-md);
10
- --nx-menu-pad-x: var(--nx-space-2);
11
- --nx-popover-pad: 4px;
12
-
13
- position: fixed;
14
- inset: auto;
15
- min-width: 180px;
16
- max-width: min(360px, calc(100% - 16px));
17
- outline: none;
18
- }
19
-
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. */
22
- .nx-menu__list {
23
- display: block;
24
- }
25
-
26
- .nx-menu--sm {
27
- --nx-menu-item-height: calc(var(--nx-row) - 4px);
28
- --nx-menu-font: var(--nx-text-sm);
29
- }
30
-
31
- .nx-menu--lg {
32
- --nx-menu-item-height: calc(var(--nx-row) + 6px);
33
- --nx-menu-font: var(--nx-text-lg);
34
- --nx-menu-pad-x: 10px;
35
- }
36
-
37
- .nx-menu__item {
38
- display: flex;
39
- align-items: center;
40
- gap: var(--nx-space-2);
41
- width: 100%;
42
- min-height: var(--nx-menu-item-height);
43
- margin: 0;
44
- padding: 5px var(--nx-menu-pad-x);
45
- border: 0;
46
- border-radius: var(--nx-radius);
47
- background: none;
48
- color: var(--nx-text);
49
- font: inherit;
50
- font-size: var(--nx-menu-font);
51
- line-height: 1.35;
52
- text-align: left;
53
- text-decoration: none;
54
- cursor: pointer;
55
- user-select: none;
56
- outline: none;
57
- }
58
-
59
- .nx-menu__item:is(:hover, :focus) {
60
- background: var(--nx-surface-hover);
61
- }
62
-
63
- .nx-menu__item[aria-disabled="true"] {
64
- background: none;
65
- opacity: 0.5;
66
- cursor: not-allowed;
67
- }
68
-
69
- /* The icon column: the same width on every item, empty on items without an icon. */
70
- .nx-menu__icon {
71
- display: grid;
72
- flex-shrink: 0;
73
- place-items: center;
74
- width: 1.15em;
75
- height: 1.15em;
76
- }
77
-
78
- .nx-menu__item .nx-icon {
79
- width: 1.15em;
80
- height: 1.15em;
81
- color: var(--nx-text-muted);
82
- vertical-align: 0;
83
- }
84
-
85
- .nx-menu__item--danger {
86
- color: var(--nx-danger);
87
- }
88
-
89
- .nx-menu__item--danger .nx-icon {
90
- color: inherit;
91
- }
92
-
93
- .nx-menu__item--danger:is(:hover, :focus) {
94
- background: var(--nx-danger-soft);
95
- }
96
-
97
- /* The check column of radio and checkbox menus: every item keeps the space, the checked one shows the mark. */
98
- .nx-menu__check {
99
- display: grid;
100
- flex-shrink: 0;
101
- place-items: center;
102
- width: 16px;
103
- color: var(--nx-primary);
104
- }
105
-
106
- .nx-menu__check .nx-icon {
107
- color: inherit;
108
- }
109
-
110
- .nx-menu__body {
111
- display: grid;
112
- flex: 1 1 auto;
113
- min-width: 0;
114
- }
115
-
116
- .nx-menu__label {
117
- overflow: hidden;
118
- text-overflow: ellipsis;
119
- white-space: nowrap;
120
- }
121
-
122
- .nx-menu__description {
123
- color: var(--nx-text-muted);
124
- font-size: var(--nx-text-xs);
125
- line-height: 1.4;
126
- }
127
-
128
- .nx-menu__shortcut {
129
- flex-shrink: 0;
130
- margin-left: auto;
131
- padding-left: var(--nx-space-4);
132
- color: var(--nx-text-subtle);
133
- font-family: var(--nx-font);
134
- font-size: var(--nx-text-xs);
135
- font-weight: 500;
136
- }
137
-
138
- .nx-menu__separator {
139
- height: 1px;
140
- margin: 4px 0;
141
- background: var(--nx-border);
142
- }
143
-
144
- .nx-menu__heading {
145
- padding: 6px var(--nx-menu-pad-x) 2px;
146
- color: var(--nx-text-subtle);
147
- font-size: var(--nx-text-xs);
148
- font-weight: 600;
149
- letter-spacing: 0.06em;
150
- text-transform: uppercase;
151
- }
152
-
153
- /* The context menu's wrapper takes no space, so it can wrap a table or a grid cell. */
154
- .nx-context-target {
155
- display: contents;
156
- }
157
-
158
- /*
159
- * Split button: the main action and an arrow that opens the alternatives. Two buttons joined at the middle,
160
- * with one shared edge; on primary and danger, whose borders are invisible, a faint line marks the split.
161
- */
162
- .nx-split {
163
- --nx-split-divider: transparent;
164
-
165
- display: inline-flex;
166
- align-items: stretch;
167
- vertical-align: middle;
168
- }
169
-
170
- .nx-split--block {
171
- display: flex;
172
- width: 100%;
173
- }
174
-
175
- .nx-split--block .nx-split__main {
176
- flex: 1 1 auto;
177
- }
178
-
179
- .nx-split--primary {
180
- --nx-split-divider: color-mix(in oklab, var(--nx-primary-text) 30%, transparent);
181
- }
182
-
183
- .nx-split--danger {
184
- --nx-split-divider: color-mix(in oklab, var(--nx-danger-text) 30%, transparent);
185
- }
186
-
187
- .nx-split .nx-split__main {
188
- border-start-end-radius: 0;
189
- border-end-end-radius: 0;
190
- }
191
-
192
- .nx-split .nx-split__toggle {
193
- width: calc(var(--nx-btn-height) - 6px);
194
- margin-left: -1px;
195
- padding: 0;
196
- border-start-start-radius: 0;
197
- border-end-start-radius: 0;
198
- box-shadow:
199
- inset 1px 0 0 var(--nx-split-divider),
200
- var(--nx-shadow-sm);
201
- }
202
-
203
- .nx-split .nx-split__toggle:disabled {
204
- box-shadow: inset 1px 0 0 var(--nx-split-divider);
205
- }
206
-
207
- /* Ghost halves have no shadow; a faint line still marks the split. */
208
- .nx-split--ghost {
209
- --nx-split-divider: var(--nx-border);
210
- }
211
-
212
- .nx-split--ghost .nx-split__toggle {
213
- box-shadow: inset 1px 0 0 var(--nx-split-divider);
214
- }
215
-
216
- /* The hovered or focused half paints over the shared edge. */
217
- .nx-split .nx-btn:is(:hover, :focus-visible) {
218
- position: relative;
219
- z-index: 1;
220
- }
221
-
222
- .nx-split .nx-split__toggle .nx-icon {
223
- transition: transform 160ms ease;
224
- }
225
-
226
- .nx-split .nx-split__toggle[aria-expanded="true"] .nx-icon {
227
- transform: rotate(180deg);
228
- }
229
-
230
- .nx-split__menu {
231
- min-width: 240px;
232
- }
233
-
234
- [data-nx-motion="reduce"] .nx-split .nx-split__toggle .nx-icon {
235
- transition: none;
236
- }
237
- }
1
+ @layer nexus.components {
2
+ /*
3
+ * Menu: a list of actions in a native popover. It shares the .nx-popover panel (border, raised background, shadow)
4
+ * with tight padding, so items sit close to the edge. Hover and keyboard focus highlight an item the same way,
5
+ * because focus follows the pointer.
6
+ */
7
+ .nx-menu {
8
+ --nx-menu-item-height: var(--nx-row);
9
+ --nx-menu-font: var(--nx-text-md);
10
+ --nx-menu-pad-x: var(--nx-space-2);
11
+ --nx-popover-pad: 4px;
12
+
13
+ position: fixed;
14
+ inset: auto;
15
+ min-width: 180px;
16
+ max-width: min(360px, calc(100% - 16px));
17
+ outline: none;
18
+ /* A row's menu sits inside the table's actions cell, which does not wrap; an item's second line has to. */
19
+ white-space: normal;
20
+ }
21
+
22
+ /* The items scroll inside the panel (`.nx-popover__scroll`): a block, so a long menu scrolls instead of squeezing
23
+ its items the way flex children would. */
24
+ .nx-menu__list {
25
+ display: block;
26
+ }
27
+
28
+ .nx-menu--sm {
29
+ --nx-menu-item-height: calc(var(--nx-row) - 4px);
30
+ --nx-menu-font: var(--nx-text-sm);
31
+ }
32
+
33
+ .nx-menu--lg {
34
+ --nx-menu-item-height: calc(var(--nx-row) + 6px);
35
+ --nx-menu-font: var(--nx-text-lg);
36
+ --nx-menu-pad-x: 10px;
37
+ }
38
+
39
+ .nx-menu__item {
40
+ display: flex;
41
+ align-items: center;
42
+ gap: var(--nx-space-2);
43
+ width: 100%;
44
+ min-height: var(--nx-menu-item-height);
45
+ margin: 0;
46
+ padding: 5px var(--nx-menu-pad-x);
47
+ border: 0;
48
+ border-radius: var(--nx-radius);
49
+ background: none;
50
+ color: var(--nx-text);
51
+ font: inherit;
52
+ font-size: var(--nx-menu-font);
53
+ line-height: 1.35;
54
+ text-align: left;
55
+ text-decoration: none;
56
+ cursor: pointer;
57
+ user-select: none;
58
+ outline: none;
59
+ }
60
+
61
+ .nx-menu__item:is(:hover, :focus) {
62
+ background: var(--nx-surface-hover);
63
+ }
64
+
65
+ /*
66
+ * A switched-off item fades its icon, check, label and shortcut, not its second line: that line is why it is off
67
+ * (a locked record's reason, what an action waits for), and at half strength it measured 2.0 to 3.1:1 in every theme.
68
+ */
69
+ .nx-menu__item[aria-disabled="true"] {
70
+ background: none;
71
+ cursor: not-allowed;
72
+ }
73
+
74
+ .nx-menu__item[aria-disabled="true"] :is(.nx-menu__icon, .nx-menu__check, .nx-menu__label, .nx-menu__shortcut) {
75
+ opacity: 0.5;
76
+ }
77
+
78
+ /* The icon column: the same width on every item, empty on items without an icon. */
79
+ .nx-menu__icon {
80
+ display: grid;
81
+ flex-shrink: 0;
82
+ place-items: center;
83
+ width: 1.15em;
84
+ height: 1.15em;
85
+ }
86
+
87
+ .nx-menu__item .nx-icon {
88
+ width: 1.15em;
89
+ height: 1.15em;
90
+ color: var(--nx-text-muted);
91
+ vertical-align: 0;
92
+ }
93
+
94
+ .nx-menu__item--danger {
95
+ color: var(--nx-danger);
96
+ }
97
+
98
+ .nx-menu__item--danger .nx-icon {
99
+ color: inherit;
100
+ }
101
+
102
+ .nx-menu__item--danger:is(:hover, :focus) {
103
+ background: var(--nx-danger-soft);
104
+ }
105
+
106
+ /* The check column of radio and checkbox menus: every item keeps the space, the checked one shows the mark. */
107
+ .nx-menu__check {
108
+ display: grid;
109
+ flex-shrink: 0;
110
+ place-items: center;
111
+ width: 16px;
112
+ color: var(--nx-primary);
113
+ }
114
+
115
+ .nx-menu__check .nx-icon {
116
+ color: inherit;
117
+ }
118
+
119
+ .nx-menu__body {
120
+ display: grid;
121
+ flex: 1 1 auto;
122
+ min-width: 0;
123
+ }
124
+
125
+ .nx-menu__label {
126
+ overflow: hidden;
127
+ text-overflow: ellipsis;
128
+ white-space: nowrap;
129
+ }
130
+
131
+ .nx-menu__description {
132
+ color: var(--nx-text-muted);
133
+ font-size: var(--nx-text-xs);
134
+ line-height: 1.4;
135
+ }
136
+
137
+ .nx-menu__shortcut {
138
+ flex-shrink: 0;
139
+ margin-left: auto;
140
+ padding-left: var(--nx-space-4);
141
+ color: var(--nx-text-subtle);
142
+ font-family: var(--nx-font);
143
+ font-size: var(--nx-text-xs);
144
+ font-weight: 500;
145
+ }
146
+
147
+ .nx-menu__separator {
148
+ height: 1px;
149
+ margin: 4px 0;
150
+ background: var(--nx-border);
151
+ }
152
+
153
+ .nx-menu__heading {
154
+ padding: 6px var(--nx-menu-pad-x) 2px;
155
+ color: var(--nx-text-subtle);
156
+ font-size: var(--nx-text-xs);
157
+ font-weight: 600;
158
+ letter-spacing: 0.06em;
159
+ text-transform: uppercase;
160
+ }
161
+
162
+ /* The context menu's wrapper takes no space, so it can wrap a table or a grid cell. */
163
+ .nx-context-target {
164
+ display: contents;
165
+ }
166
+
167
+ /*
168
+ * Split button: the main action and an arrow that opens the alternatives. Two buttons joined at the middle,
169
+ * with one shared edge; on primary and danger, whose borders are invisible, a faint line marks the split.
170
+ */
171
+ .nx-split {
172
+ --nx-split-divider: transparent;
173
+
174
+ display: inline-flex;
175
+ align-items: stretch;
176
+ vertical-align: middle;
177
+ }
178
+
179
+ .nx-split--block {
180
+ display: flex;
181
+ width: 100%;
182
+ }
183
+
184
+ .nx-split--block .nx-split__main {
185
+ flex: 1 1 auto;
186
+ }
187
+
188
+ .nx-split--primary {
189
+ --nx-split-divider: color-mix(in oklab, var(--nx-primary-text) 30%, transparent);
190
+ }
191
+
192
+ .nx-split--danger {
193
+ --nx-split-divider: color-mix(in oklab, var(--nx-danger-text) 30%, transparent);
194
+ }
195
+
196
+ .nx-split .nx-split__main {
197
+ border-start-end-radius: 0;
198
+ border-end-end-radius: 0;
199
+ }
200
+
201
+ .nx-split .nx-split__toggle {
202
+ width: calc(var(--nx-btn-height) - 6px);
203
+ margin-left: -1px;
204
+ padding: 0;
205
+ border-start-start-radius: 0;
206
+ border-end-start-radius: 0;
207
+ box-shadow:
208
+ inset 1px 0 0 var(--nx-split-divider),
209
+ var(--nx-shadow-sm);
210
+ }
211
+
212
+ .nx-split .nx-split__toggle:disabled {
213
+ box-shadow: inset 1px 0 0 var(--nx-split-divider);
214
+ }
215
+
216
+ /* Ghost halves have no shadow; a faint line still marks the split. */
217
+ .nx-split--ghost {
218
+ --nx-split-divider: var(--nx-border);
219
+ }
220
+
221
+ .nx-split--ghost .nx-split__toggle {
222
+ box-shadow: inset 1px 0 0 var(--nx-split-divider);
223
+ }
224
+
225
+ /* The hovered or focused half paints over the shared edge. */
226
+ .nx-split .nx-btn:is(:hover, :focus-visible) {
227
+ position: relative;
228
+ z-index: 1;
229
+ }
230
+
231
+ .nx-split .nx-split__toggle .nx-icon {
232
+ transition: transform 160ms ease;
233
+ }
234
+
235
+ .nx-split .nx-split__toggle[aria-expanded="true"] .nx-icon {
236
+ transform: rotate(180deg);
237
+ }
238
+
239
+ .nx-split__menu {
240
+ min-width: 240px;
241
+ }
242
+
243
+ [data-nx-motion="reduce"] .nx-split .nx-split__toggle .nx-icon {
244
+ transition: none;
245
+ }
246
+ }