nexus-shared 2.0.0 → 3.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.
- package/CHANGELOG.md +262 -0
- package/README.md +122 -25
- package/dist/Client.Index.d.ts +11 -0
- package/dist/Client.Index.js +11 -0
- package/dist/Components/Chats/Chat.d.ts +28 -0
- package/dist/Components/Chats/Chat.js +19 -0
- package/dist/Components/Chats/ChatButton.d.ts +26 -0
- package/dist/Components/Chats/ChatButton.js +41 -0
- package/dist/Components/Chats/ChatComposer.d.ts +41 -0
- package/dist/Components/Chats/ChatComposer.js +177 -0
- package/dist/Components/Chats/ChatConversations.d.ts +35 -0
- package/dist/Components/Chats/ChatConversations.js +38 -0
- package/dist/Components/Chats/ChatPanel.d.ts +66 -0
- package/dist/Components/Chats/ChatPanel.js +94 -0
- package/dist/Components/Chats/ChatParts.d.ts +87 -0
- package/dist/Components/Chats/ChatParts.js +100 -0
- package/dist/Components/Chats/ChatThread.d.ts +22 -0
- package/dist/Components/Chats/ChatThread.js +96 -0
- package/dist/Components/Documents/Menu.js +24 -20
- package/dist/Components/Documents/SplitButton.js +5 -3
- package/dist/Components/Documents/TabButtons.d.ts +24 -6
- package/dist/Components/Documents/TabButtons.js +23 -4
- package/dist/Components/Forms/ApiForm.d.ts +6 -4
- package/dist/Components/Forms/ApiForm.js +15 -14
- package/dist/Components/Forms/Crud.js +202 -50
- package/dist/Components/Forms/ExcelImport.d.ts +42 -0
- package/dist/Components/Forms/ExcelImport.js +190 -0
- package/dist/Components/Forms/Form.js +5 -1
- package/dist/Components/Inputs/DateTimePicker.js +2 -1
- package/dist/Components/Inputs/GroupForm.js +4 -2
- package/dist/Components/Inputs/InputRenderer.d.ts +2 -0
- package/dist/Components/Inputs/InputRenderer.js +1 -1
- package/dist/Components/Inputs/ReadOnlyNotice.js +2 -1
- package/dist/Components/Inputs/RowsInput.d.ts +12 -1
- package/dist/Components/Inputs/RowsInput.js +53 -4
- package/dist/Components/Inputs/TabularForm.d.ts +7 -3
- package/dist/Components/Inputs/TabularForm.js +85 -20
- package/dist/Components/Inputs/TimePicker.js +2 -1
- package/dist/Components/Layouts/ThemeSwitcher.d.ts +2 -2
- package/dist/Components/Layouts/ThemeSwitcher.js +35 -15
- package/dist/Components/Viewers/DataTable.js +88 -34
- package/dist/Components/Viewers/DataTableColumns.d.ts +28 -0
- package/dist/Components/Viewers/DataTableColumns.js +243 -0
- package/dist/Components/Viewers/DataTableParts.d.ts +6 -2
- package/dist/Components/Viewers/DataTableParts.js +21 -9
- package/dist/Helpers/ApiClient.d.ts +22 -0
- package/dist/Helpers/ApiClient.js +4 -1
- package/dist/Helpers/ApiFormHelpers.d.ts +27 -4
- package/dist/Helpers/ApiFormHelpers.js +73 -9
- package/dist/Helpers/ApiModules.d.ts +0 -4
- package/dist/Helpers/ApiModules.js +1 -0
- package/dist/Helpers/ApiResponses.d.ts +14 -4
- package/dist/Helpers/ApiResponses.js +116 -25
- package/dist/Helpers/ApiRoutes.d.ts +0 -10
- package/dist/Helpers/ApiRoutes.js +2 -10
- package/dist/Helpers/ChatBackend.d.ts +134 -0
- package/dist/Helpers/ChatBackend.js +332 -0
- package/dist/Helpers/ChatHelpers.d.ts +189 -0
- package/dist/Helpers/ChatHelpers.js +486 -0
- package/dist/Helpers/ChatHooks.d.ts +81 -0
- package/dist/Helpers/ChatHooks.js +175 -0
- package/dist/Helpers/ChatStore.d.ts +132 -0
- package/dist/Helpers/ChatStore.js +394 -0
- package/dist/Helpers/ChatSummaries.d.ts +39 -0
- package/dist/Helpers/ChatSummaries.js +118 -0
- package/dist/Helpers/CrudBackend.d.ts +47 -5
- package/dist/Helpers/CrudBackend.js +99 -4
- package/dist/Helpers/CrudHelpers.d.ts +39 -4
- package/dist/Helpers/CrudHelpers.js +76 -11
- package/dist/Helpers/ExcelBackend.d.ts +106 -0
- package/dist/Helpers/ExcelBackend.js +290 -0
- package/dist/Helpers/ExcelHelpers.d.ts +98 -0
- package/dist/Helpers/ExcelHelpers.js +302 -0
- package/dist/Helpers/FormStore.d.ts +2 -0
- package/dist/Helpers/FormStore.js +19 -1
- package/dist/Helpers/MessageBuilder.js +0 -2
- package/dist/Helpers/PopoverHelpers.d.ts +31 -6
- package/dist/Helpers/PopoverHelpers.js +116 -12
- package/dist/Helpers/RowsStore.d.ts +7 -1
- package/dist/Helpers/RowsStore.js +22 -0
- package/dist/Helpers/TableColumns.d.ts +7 -0
- package/dist/Helpers/TableColumns.js +41 -13
- package/dist/Helpers/TableHelpers.d.ts +9 -1
- package/dist/Helpers/TableHelpers.js +20 -0
- package/dist/Interfaces/ApiInterfaces.d.ts +29 -4
- package/dist/Interfaces/ApiInterfaces.js +16 -10
- package/dist/Interfaces/ChatInterfaces.d.ts +240 -0
- package/dist/Interfaces/ChatInterfaces.js +1 -0
- package/dist/Interfaces/CrudInterfaces.d.ts +73 -12
- package/dist/Interfaces/ExcelInterfaces.d.ts +215 -0
- package/dist/Interfaces/ExcelInterfaces.js +45 -0
- package/dist/Interfaces/FormInterfaces.d.ts +52 -2
- package/dist/Interfaces/MessageInterfaces.d.ts +1 -1
- package/dist/Interfaces/TableInterfaces.d.ts +62 -2
- package/dist/Services/BrowserApi.d.ts +18 -1
- package/dist/Services/BrowserApi.js +18 -0
- package/dist/Services/ChatApi.d.ts +37 -0
- package/dist/Services/ChatApi.js +98 -0
- package/dist/Services/ExcelApi.d.ts +46 -0
- package/dist/Services/ExcelApi.js +196 -0
- package/dist/Services/ServerApi.d.ts +6 -1
- package/dist/Services/ServerApi.js +3 -0
- package/dist/Shared.Index.d.ts +8 -0
- package/dist/Shared.Index.js +8 -0
- package/package.json +6 -3
- package/src/Styles/Nexus.Button.css +2 -0
- package/src/Styles/Nexus.Chat.css +1489 -0
- package/src/Styles/Nexus.Crud.css +77 -0
- package/src/Styles/Nexus.Excel.css +370 -0
- package/src/Styles/Nexus.Form.css +23 -0
- package/src/Styles/Nexus.Index.css +2 -0
- package/src/Styles/Nexus.Menu.css +12 -2
- package/src/Styles/Nexus.Rows.css +78 -48
- package/src/Styles/Nexus.Tab.Buttons.css +55 -0
- package/src/Styles/Nexus.Table.css +286 -4
- package/src/Styles/Nexus.Theme.Picker.css +75 -2
|
@@ -7,6 +7,18 @@
|
|
|
7
7
|
min-width: 0;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
/* A CRUD whose table fills takes the height it is given and hands all of it to the table. */
|
|
11
|
+
.nx-crud:has(.nx-table--fill) {
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
height: 100%;
|
|
15
|
+
min-height: 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.nx-crud:has(.nx-table--fill) > .nx-table--fill {
|
|
19
|
+
flex: 1 1 auto;
|
|
20
|
+
}
|
|
21
|
+
|
|
10
22
|
/* Details: label over value, two to a line where there is room. */
|
|
11
23
|
.nx-crud-details {
|
|
12
24
|
display: flex;
|
|
@@ -81,4 +93,69 @@
|
|
|
81
93
|
color: var(--nx-text-muted);
|
|
82
94
|
font-size: var(--nx-text-sm);
|
|
83
95
|
}
|
|
96
|
+
|
|
97
|
+
/*
|
|
98
|
+
* A form popup with a panel beside it (`form.aside`): a preview of what will be written, a summary, help. The form
|
|
99
|
+
* is first in the DOM, so a narrow window stacks the panel under it and the keyboard still reaches the form first.
|
|
100
|
+
*/
|
|
101
|
+
.nx-crud-aside {
|
|
102
|
+
display: grid;
|
|
103
|
+
grid-template-columns: minmax(0, 1fr);
|
|
104
|
+
gap: var(--nx-space-5);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.nx-crud-aside__main,
|
|
108
|
+
.nx-crud-aside__side {
|
|
109
|
+
min-width: 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Stacked, the panel does not take the whole window: the popup's body scrolls past it back to the form above. */
|
|
113
|
+
.nx-crud-aside__side {
|
|
114
|
+
display: flex;
|
|
115
|
+
min-height: 0;
|
|
116
|
+
max-height: 70vh;
|
|
117
|
+
flex-direction: column;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/*
|
|
121
|
+
* Side by side, where there is room for both. The popup's body stops scrolling and each column takes its own, so a
|
|
122
|
+
* long form never pushes the panel off the screen. The body is a flex row here, which is what gives its one child a
|
|
123
|
+
* height to work from: no percentage height anywhere, so it holds at every popup size.
|
|
124
|
+
*/
|
|
125
|
+
@media (min-width: 1000px) {
|
|
126
|
+
.nx-popup__body:has(> .nx-crud-aside) {
|
|
127
|
+
display: flex;
|
|
128
|
+
overflow: hidden;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.nx-crud-aside {
|
|
132
|
+
flex: 1 1 auto;
|
|
133
|
+
min-width: 0;
|
|
134
|
+
/* The panel takes a share of the width, not half of it: a form has columns to fit, and code lines are short. */
|
|
135
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, var(--nx-crud-aside-width, clamp(20rem, 38%, 44rem)));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/*
|
|
139
|
+
* A details popup's panel (`details.aside`) is what the popup is for, and the details beside it are a short list
|
|
140
|
+
* of fields, so the shares turn round: the fields take a column of their own width and the panel the rest.
|
|
141
|
+
*/
|
|
142
|
+
.nx-crud-aside.nx-crud-aside--details {
|
|
143
|
+
grid-template-columns: minmax(0, var(--nx-crud-details-width, clamp(16rem, 30%, 26rem))) minmax(0, 1fr);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.nx-crud-aside__main {
|
|
147
|
+
overflow: auto;
|
|
148
|
+
overscroll-behavior: contain;
|
|
149
|
+
/* Focus rings reach past an input's edge; without this the scroll box cuts them off. */
|
|
150
|
+
padding: 2px;
|
|
151
|
+
margin: -2px;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* A panel taller than the popup scrolls here, whatever it holds; one that fills the height scrolls inside itself. */
|
|
155
|
+
.nx-crud-aside__side {
|
|
156
|
+
max-height: none;
|
|
157
|
+
overflow: auto;
|
|
158
|
+
overscroll-behavior: contain;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
84
161
|
}
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
@layer nexus.components {
|
|
2
|
+
/*
|
|
3
|
+
* The spreadsheet import panel: the three steps, the file row, and the review as two collapsible editors.
|
|
4
|
+
*
|
|
5
|
+
* It adds no box of its own. It is shown inside a popup or a page panel, which already has one, and the editors
|
|
6
|
+
* inside bring the only frame on the panel - so nothing here draws a border around something that has one. The
|
|
7
|
+
* sections are told apart by a tint and a hairline above them, as the group form's sections are.
|
|
8
|
+
*/
|
|
9
|
+
.nx-excel {
|
|
10
|
+
--nx-excel-tint: color-mix(in oklab, var(--nx-text) 5%, var(--nx-surface));
|
|
11
|
+
--nx-excel-hover: color-mix(in oklab, var(--nx-text) 8%, var(--nx-surface));
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
gap: var(--nx-space-4);
|
|
15
|
+
min-width: 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* The three steps, numbered, as one short paragraph each. */
|
|
19
|
+
.nx-excel__steps {
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-wrap: wrap;
|
|
22
|
+
gap: var(--nx-space-2) var(--nx-space-5);
|
|
23
|
+
margin: 0;
|
|
24
|
+
padding: 0;
|
|
25
|
+
list-style: none;
|
|
26
|
+
counter-reset: nx-excel-step;
|
|
27
|
+
color: var(--nx-text-muted);
|
|
28
|
+
font-size: var(--nx-text-xs);
|
|
29
|
+
line-height: 1.45;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.nx-excel__steps > li {
|
|
33
|
+
display: flex;
|
|
34
|
+
flex: 1 1 14rem;
|
|
35
|
+
align-items: baseline;
|
|
36
|
+
gap: var(--nx-space-2);
|
|
37
|
+
counter-increment: nx-excel-step;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.nx-excel__steps > li::before {
|
|
41
|
+
content: counter(nx-excel-step);
|
|
42
|
+
flex: none;
|
|
43
|
+
min-width: 17px;
|
|
44
|
+
padding: 1px 0;
|
|
45
|
+
border-radius: var(--nx-radius-full);
|
|
46
|
+
background: var(--nx-excel-tint);
|
|
47
|
+
color: var(--nx-text);
|
|
48
|
+
font-size: var(--nx-text-xs);
|
|
49
|
+
font-weight: 600;
|
|
50
|
+
text-align: center;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Template, Choose file, the file's name, and the limit: one line that wraps as whole groups. */
|
|
54
|
+
.nx-excel__pick {
|
|
55
|
+
display: flex;
|
|
56
|
+
flex-wrap: wrap;
|
|
57
|
+
align-items: center;
|
|
58
|
+
gap: var(--nx-space-2) var(--nx-space-3);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.nx-excel__file {
|
|
62
|
+
flex: 1 1 12rem;
|
|
63
|
+
min-width: 0;
|
|
64
|
+
margin: 0;
|
|
65
|
+
overflow-wrap: anywhere;
|
|
66
|
+
color: var(--nx-text);
|
|
67
|
+
font-size: var(--nx-text-sm);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.nx-excel__muted {
|
|
71
|
+
color: var(--nx-text-muted);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.nx-excel__limits {
|
|
75
|
+
margin: 0;
|
|
76
|
+
color: var(--nx-text-muted);
|
|
77
|
+
font-size: var(--nx-text-xs);
|
|
78
|
+
white-space: nowrap;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.nx-excel__note {
|
|
82
|
+
margin: 0;
|
|
83
|
+
color: var(--nx-text);
|
|
84
|
+
font-size: var(--nx-text-sm);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* A refusal, and what the import could not write: a tint, with the words in the text color so they read on it. */
|
|
88
|
+
.nx-excel__failure,
|
|
89
|
+
.nx-excel__result {
|
|
90
|
+
display: flex;
|
|
91
|
+
gap: var(--nx-space-2);
|
|
92
|
+
margin: 0;
|
|
93
|
+
padding: var(--nx-space-3);
|
|
94
|
+
border-radius: var(--nx-radius);
|
|
95
|
+
background: var(--nx-danger-soft);
|
|
96
|
+
color: var(--nx-text);
|
|
97
|
+
font-size: var(--nx-text-sm);
|
|
98
|
+
line-height: 1.45;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.nx-excel__failure .nx-icon,
|
|
102
|
+
.nx-excel__result .nx-icon {
|
|
103
|
+
flex: none;
|
|
104
|
+
width: 18px;
|
|
105
|
+
height: 18px;
|
|
106
|
+
color: var(--nx-danger);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.nx-excel__result {
|
|
110
|
+
flex-direction: column;
|
|
111
|
+
gap: var(--nx-space-1);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.nx-excel__result--ok {
|
|
115
|
+
background: var(--nx-success-soft);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.nx-excel__result--ok .nx-icon {
|
|
119
|
+
color: var(--nx-success);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.nx-excel__result-head {
|
|
123
|
+
display: flex;
|
|
124
|
+
align-items: center;
|
|
125
|
+
gap: var(--nx-space-2);
|
|
126
|
+
margin: 0;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.nx-excel__result-note {
|
|
130
|
+
margin: 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.nx-excel__review {
|
|
134
|
+
display: flex;
|
|
135
|
+
flex-direction: column;
|
|
136
|
+
gap: var(--nx-space-3);
|
|
137
|
+
min-width: 0;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* One half of the review. The hairline above it is what separates the two, instead of a box around each. */
|
|
141
|
+
.nx-excel__section {
|
|
142
|
+
min-width: 0;
|
|
143
|
+
padding-top: var(--nx-space-2);
|
|
144
|
+
border-top: 1px solid var(--nx-border);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.nx-excel__section-head {
|
|
148
|
+
margin: 0;
|
|
149
|
+
font-size: var(--nx-text-md);
|
|
150
|
+
font-weight: 400;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.nx-excel__toggle {
|
|
154
|
+
display: flex;
|
|
155
|
+
align-items: center;
|
|
156
|
+
gap: var(--nx-space-2);
|
|
157
|
+
width: 100%;
|
|
158
|
+
min-height: 32px;
|
|
159
|
+
padding: 4px 8px 4px 6px;
|
|
160
|
+
border: 0;
|
|
161
|
+
border-radius: var(--nx-radius);
|
|
162
|
+
background: none;
|
|
163
|
+
color: var(--nx-text);
|
|
164
|
+
font: inherit;
|
|
165
|
+
text-align: start;
|
|
166
|
+
cursor: pointer;
|
|
167
|
+
transition: background-color var(--nx-duration);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.nx-excel__toggle:hover {
|
|
171
|
+
background: var(--nx-excel-hover);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.nx-excel__toggle:focus-visible {
|
|
175
|
+
outline: 2px solid var(--nx-primary);
|
|
176
|
+
outline-offset: 0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.nx-excel__chevron {
|
|
180
|
+
flex: none;
|
|
181
|
+
width: 16px;
|
|
182
|
+
height: 16px;
|
|
183
|
+
color: var(--nx-text-muted);
|
|
184
|
+
transition: transform var(--nx-duration);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.nx-excel__toggle[aria-expanded="false"] .nx-excel__chevron {
|
|
188
|
+
transform: rotate(-90deg);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.nx-excel__title {
|
|
192
|
+
flex: none;
|
|
193
|
+
font-weight: 600;
|
|
194
|
+
white-space: nowrap;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/* The count. On a tint, so it takes the text color rather than a muted one. */
|
|
198
|
+
.nx-excel__tag {
|
|
199
|
+
flex: none;
|
|
200
|
+
padding: 0 7px;
|
|
201
|
+
border-radius: var(--nx-radius-full);
|
|
202
|
+
background: var(--nx-excel-tint);
|
|
203
|
+
color: var(--nx-text);
|
|
204
|
+
font-size: var(--nx-text-xs);
|
|
205
|
+
font-variant-numeric: tabular-nums;
|
|
206
|
+
font-weight: 600;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/*
|
|
210
|
+
* The hint sits on a row that tints on hover, and muted text on a tint falls under 4.5:1 in several themes (measured:
|
|
211
|
+
* 4.23 in Catppuccin light, 4.33 in Rose Pine dark). So it moves toward the text color, as rows that tint do.
|
|
212
|
+
*/
|
|
213
|
+
.nx-excel__hint {
|
|
214
|
+
min-width: 0;
|
|
215
|
+
overflow: hidden;
|
|
216
|
+
color: color-mix(in oklab, var(--nx-text) 35%, var(--nx-text-muted));
|
|
217
|
+
font-size: var(--nx-text-xs);
|
|
218
|
+
text-overflow: ellipsis;
|
|
219
|
+
white-space: nowrap;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.nx-excel__section[data-tone="warning"] .nx-excel__tag {
|
|
223
|
+
background: var(--nx-warning-soft);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.nx-excel__section-body {
|
|
227
|
+
display: flex;
|
|
228
|
+
flex-direction: column;
|
|
229
|
+
gap: var(--nx-space-3);
|
|
230
|
+
min-width: 0;
|
|
231
|
+
padding-top: var(--nx-space-2);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* What the server found wrong. The place and the sentence sit on one grid, so the sentences line up. */
|
|
235
|
+
.nx-excel__problems {
|
|
236
|
+
padding: var(--nx-space-3);
|
|
237
|
+
border-radius: var(--nx-radius);
|
|
238
|
+
background: var(--nx-warning-soft);
|
|
239
|
+
color: var(--nx-text);
|
|
240
|
+
font-size: var(--nx-text-xs);
|
|
241
|
+
line-height: 1.5;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.nx-excel__problems--same {
|
|
245
|
+
background: var(--nx-excel-tint);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.nx-excel__problems--same .nx-excel__problems-head .nx-icon {
|
|
249
|
+
color: var(--nx-text-muted);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.nx-excel__problems-head {
|
|
253
|
+
display: flex;
|
|
254
|
+
align-items: center;
|
|
255
|
+
gap: var(--nx-space-2);
|
|
256
|
+
margin: 0 0 var(--nx-space-2);
|
|
257
|
+
font-size: var(--nx-text-sm);
|
|
258
|
+
font-weight: 600;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.nx-excel__problems-head .nx-icon {
|
|
262
|
+
width: 16px;
|
|
263
|
+
height: 16px;
|
|
264
|
+
color: var(--nx-warning);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.nx-excel__problems ul,
|
|
268
|
+
.nx-excel__refused {
|
|
269
|
+
display: grid;
|
|
270
|
+
gap: var(--nx-space-1);
|
|
271
|
+
margin: 0;
|
|
272
|
+
padding: 0;
|
|
273
|
+
list-style: none;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.nx-excel__problems li,
|
|
277
|
+
.nx-excel__refused li {
|
|
278
|
+
display: grid;
|
|
279
|
+
grid-template-columns: minmax(6rem, max-content) 1fr;
|
|
280
|
+
gap: var(--nx-space-1) var(--nx-space-3);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.nx-excel__refused {
|
|
284
|
+
font-size: var(--nx-text-xs);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.nx-excel__place {
|
|
288
|
+
font-weight: 600;
|
|
289
|
+
font-variant-numeric: tabular-nums;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/* The place is the way to the cell it names, so it is a button - with no box, since it sits in a line of text. */
|
|
293
|
+
.nx-excel__go {
|
|
294
|
+
padding: 0;
|
|
295
|
+
border: 0;
|
|
296
|
+
border-radius: 2px;
|
|
297
|
+
background: none;
|
|
298
|
+
color: inherit;
|
|
299
|
+
font: inherit;
|
|
300
|
+
font-weight: 600;
|
|
301
|
+
text-align: start;
|
|
302
|
+
text-decoration: underline;
|
|
303
|
+
text-decoration-color: color-mix(in oklab, currentcolor 40%, transparent);
|
|
304
|
+
text-underline-offset: 2px;
|
|
305
|
+
cursor: pointer;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.nx-excel__go:hover {
|
|
309
|
+
text-decoration-color: currentcolor;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.nx-excel__go:focus-visible {
|
|
313
|
+
outline: 2px solid var(--nx-primary);
|
|
314
|
+
outline-offset: 1px;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
@media (width < 36rem) {
|
|
318
|
+
.nx-excel__problems li,
|
|
319
|
+
.nx-excel__refused li {
|
|
320
|
+
grid-template-columns: 1fr;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/*
|
|
324
|
+
* The hint is the reason the section exists ("Edit a row to add it as a new record instead"), and a reason cut at
|
|
325
|
+
* the word that explains it is no reason at all. Where the line is too short for it, it drops under the title.
|
|
326
|
+
*/
|
|
327
|
+
.nx-excel__toggle {
|
|
328
|
+
flex-wrap: wrap;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.nx-excel__hint {
|
|
332
|
+
flex: 1 0 100%;
|
|
333
|
+
overflow: visible;
|
|
334
|
+
padding-left: 24px;
|
|
335
|
+
white-space: normal;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/* The sentence about what will be sent, then the buttons. */
|
|
340
|
+
.nx-excel__actions {
|
|
341
|
+
display: flex;
|
|
342
|
+
flex-wrap: wrap;
|
|
343
|
+
align-items: center;
|
|
344
|
+
gap: var(--nx-space-2) var(--nx-space-3);
|
|
345
|
+
padding-top: var(--nx-space-2);
|
|
346
|
+
border-top: 1px solid var(--nx-border);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.nx-excel__sending {
|
|
350
|
+
flex: 1 1 14rem;
|
|
351
|
+
min-width: 0;
|
|
352
|
+
margin: 0;
|
|
353
|
+
color: var(--nx-text-muted);
|
|
354
|
+
font-size: var(--nx-text-xs);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.nx-excel__buttons {
|
|
358
|
+
display: flex;
|
|
359
|
+
flex-wrap: wrap;
|
|
360
|
+
gap: var(--nx-space-2);
|
|
361
|
+
margin-left: auto;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
@media (prefers-reduced-motion: reduce) {
|
|
365
|
+
.nx-excel__toggle,
|
|
366
|
+
.nx-excel__chevron {
|
|
367
|
+
transition: none;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
@@ -19,6 +19,29 @@
|
|
|
19
19
|
gap: var(--nx-form-row-gap, var(--nx-space-5)) var(--nx-form-column-gap, var(--nx-space-4));
|
|
20
20
|
}
|
|
21
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
|
+
|
|
22
45
|
.nx-form__cell {
|
|
23
46
|
grid-column: span var(--nx-span, 12);
|
|
24
47
|
min-width: 0;
|
|
@@ -13,12 +13,14 @@
|
|
|
13
13
|
@import "./Nexus.Base.css";
|
|
14
14
|
@import "./Nexus.Button.css";
|
|
15
15
|
@import "./Nexus.Calendar.css";
|
|
16
|
+
@import "./Nexus.Chat.css";
|
|
16
17
|
@import "./Nexus.DateTime.css";
|
|
17
18
|
@import "./Nexus.Choice.css";
|
|
18
19
|
@import "./Nexus.Crud.css";
|
|
19
20
|
@import "./Nexus.Dropdown.css";
|
|
20
21
|
@import "./Nexus.Input.css";
|
|
21
22
|
@import "./Nexus.Editor.css";
|
|
23
|
+
@import "./Nexus.Excel.css";
|
|
22
24
|
@import "./Nexus.Form.css";
|
|
23
25
|
@import "./Nexus.Markdown.css";
|
|
24
26
|
@import "./Nexus.Menu.css";
|
|
@@ -14,16 +14,26 @@
|
|
|
14
14
|
min-width: 180px;
|
|
15
15
|
max-width: min(360px, calc(100% - 16px));
|
|
16
16
|
max-height: calc(100vh - 16px);
|
|
17
|
-
overflow: hidden auto;
|
|
18
|
-
overscroll-behavior: contain;
|
|
19
17
|
padding: 4px;
|
|
20
18
|
outline: none;
|
|
21
19
|
}
|
|
22
20
|
|
|
23
21
|
.nx-menu:popover-open {
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
24
|
animation: nx-menu-in 120ms ease-out;
|
|
25
25
|
}
|
|
26
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. */
|
|
29
|
+
.nx-menu__list {
|
|
30
|
+
display: block;
|
|
31
|
+
flex: 1 1 auto;
|
|
32
|
+
min-height: 0;
|
|
33
|
+
overflow: hidden auto;
|
|
34
|
+
overscroll-behavior: contain;
|
|
35
|
+
}
|
|
36
|
+
|
|
27
37
|
@keyframes nx-menu-in {
|
|
28
38
|
from {
|
|
29
39
|
opacity: 0;
|