nexus-shared 3.2.0 → 4.1.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 +2359 -0
- package/README.md +1911 -1123
- package/dist/Client.Index.d.ts +27 -0
- package/dist/Client.Index.js +27 -0
- package/dist/Components/Chats/ChatComposer.d.ts +7 -1
- package/dist/Components/Chats/ChatComposer.js +9 -6
- package/dist/Components/Chats/ChatParts.d.ts +15 -2
- package/dist/Components/Chats/ChatParts.js +15 -4
- package/dist/Components/Chats/ChatPopup.d.ts +46 -0
- package/dist/Components/Chats/ChatPopup.js +34 -0
- package/dist/Components/Chats/ChatThread.d.ts +9 -1
- package/dist/Components/Chats/ChatThread.js +54 -6
- package/dist/Components/Dashboards/DashboardBoard.d.ts +62 -0
- package/dist/Components/Dashboards/DashboardBoard.js +594 -0
- package/dist/Components/Dashboards/DashboardWidgets.d.ts +155 -0
- package/dist/Components/Dashboards/DashboardWidgets.js +159 -0
- package/dist/Components/Dashboards/WidgetFrame.d.ts +51 -0
- package/dist/Components/Dashboards/WidgetFrame.js +45 -0
- package/dist/Components/Documents/Button.d.ts +6 -1
- package/dist/Components/Documents/Button.js +2 -2
- package/dist/Components/Documents/DocumentFrame.d.ts +50 -0
- package/dist/Components/Documents/DocumentFrame.js +83 -0
- package/dist/Components/Documents/Menu.d.ts +4 -0
- package/dist/Components/Documents/Menu.js +40 -24
- package/dist/Components/Documents/PrintDocument.d.ts +95 -0
- package/dist/Components/Documents/PrintDocument.js +62 -0
- package/dist/Components/Documents/TabButtons.d.ts +6 -0
- package/dist/Components/Documents/TabButtons.js +5 -4
- package/dist/Components/Documents/Tabs.d.ts +59 -0
- package/dist/Components/Documents/Tabs.js +70 -0
- package/dist/Components/Domains/DomainCard.d.ts +98 -0
- package/dist/Components/Domains/DomainCard.js +182 -0
- package/dist/Components/Forms/ApiForm.js +24 -3
- package/dist/Components/Forms/Crud.d.ts +2 -2
- package/dist/Components/Forms/Crud.js +628 -247
- package/dist/Components/Forms/CrudActions.d.ts +137 -0
- package/dist/Components/Forms/CrudActions.js +214 -0
- package/dist/Components/Forms/CrudHistory.d.ts +6 -1
- package/dist/Components/Forms/CrudHistory.js +14 -6
- package/dist/Components/Forms/CrudNarrowPicker.d.ts +31 -0
- package/dist/Components/Forms/CrudNarrowPicker.js +180 -0
- package/dist/Components/Forms/CrudParts.d.ts +37 -2
- package/dist/Components/Forms/CrudParts.js +123 -7
- package/dist/Components/Forms/CrudRowForms.d.ts +26 -0
- package/dist/Components/Forms/CrudRowForms.js +174 -0
- package/dist/Components/Forms/CrudScopes.d.ts +28 -0
- package/dist/Components/Forms/CrudScopes.js +76 -0
- package/dist/Components/Forms/CrudTree.d.ts +90 -0
- package/dist/Components/Forms/CrudTree.js +363 -0
- package/dist/Components/Forms/CrudWorkspace.d.ts +73 -0
- package/dist/Components/Forms/CrudWorkspace.js +177 -0
- package/dist/Components/Forms/ExcelImport.js +3 -3
- package/dist/Components/Forms/Form.d.ts +6 -5
- package/dist/Components/Forms/Form.js +134 -21
- package/dist/Components/Forms/FormLeaveGuard.d.ts +44 -0
- package/dist/Components/Forms/FormLeaveGuard.js +65 -0
- package/dist/Components/Forms/FormQuestion.d.ts +6 -0
- package/dist/Components/Forms/FormQuestion.js +28 -0
- package/dist/Components/Forms/RecordFlows.d.ts +50 -0
- package/dist/Components/Forms/RecordFlows.js +282 -0
- package/dist/Components/Forms/SubmitForm.d.ts +37 -2
- package/dist/Components/Forms/SubmitForm.js +182 -10
- package/dist/Components/Inputs/CheckBox.js +1 -1
- package/dist/Components/Inputs/ChoiceField.d.ts +21 -1
- package/dist/Components/Inputs/ChoiceField.js +28 -2
- package/dist/Components/Inputs/ComputedInput.d.ts +51 -0
- package/dist/Components/Inputs/ComputedInput.js +179 -0
- package/dist/Components/Inputs/Dropdown.d.ts +13 -0
- package/dist/Components/Inputs/Dropdown.js +8 -6
- package/dist/Components/Inputs/DropdownParts.d.ts +3 -1
- package/dist/Components/Inputs/DropdownParts.js +16 -4
- package/dist/Components/Inputs/Field.d.ts +7 -1
- package/dist/Components/Inputs/Field.js +2 -2
- package/dist/Components/Inputs/GroupForm.d.ts +6 -6
- package/dist/Components/Inputs/GroupForm.js +12 -12
- package/dist/Components/Inputs/InputRenderer.d.ts +13 -6
- package/dist/Components/Inputs/InputRenderer.js +37 -32
- package/dist/Components/Inputs/MarkdownEditor.d.ts +6 -0
- package/dist/Components/Inputs/MarkdownEditor.js +32 -6
- package/dist/Components/Inputs/PictureInput.d.ts +41 -0
- package/dist/Components/Inputs/PictureInput.js +75 -0
- package/dist/Components/Inputs/RadioGroup.d.ts +16 -3
- package/dist/Components/Inputs/RadioGroup.js +8 -3
- package/dist/Components/Inputs/RowsInput.d.ts +15 -2
- package/dist/Components/Inputs/RowsInput.js +96 -8
- package/dist/Components/Inputs/TabularForm.d.ts +5 -5
- package/dist/Components/Inputs/TabularForm.js +45 -32
- package/dist/Components/Inputs/TextArea.d.ts +6 -0
- package/dist/Components/Inputs/TextArea.js +11 -2
- package/dist/Components/Inputs/TextBoxTypes.d.ts +6 -0
- package/dist/Components/Inputs/TextBoxTypes.js +17 -0
- package/dist/Components/Inputs/TreeView.d.ts +76 -2
- package/dist/Components/Inputs/TreeView.js +227 -16
- package/dist/Components/Layouts/MessageBox.d.ts +15 -2
- package/dist/Components/Layouts/MessageBox.js +56 -7
- package/dist/Components/Layouts/Popup.d.ts +34 -7
- package/dist/Components/Layouts/Popup.js +143 -13
- package/dist/Components/Layouts/PopupDock.d.ts +3 -1
- package/dist/Components/Layouts/PopupDock.js +2 -1
- package/dist/Components/Layouts/PopupHost.js +5 -4
- package/dist/Components/Messages/MailClient.d.ts +50 -0
- package/dist/Components/Messages/MailClient.js +410 -0
- package/dist/Components/Messages/MailColumns.d.ts +21 -0
- package/dist/Components/Messages/MailColumns.js +92 -0
- package/dist/Components/Messages/MailCompose.d.ts +46 -0
- package/dist/Components/Messages/MailCompose.js +154 -0
- package/dist/Components/Messages/MailReader.d.ts +43 -0
- package/dist/Components/Messages/MailReader.js +207 -0
- package/dist/Components/Messages/MailThread.d.ts +71 -0
- package/dist/Components/Messages/MailThread.js +185 -0
- package/dist/Components/Messages/MessageBell.d.ts +41 -0
- package/dist/Components/Messages/MessageBell.js +76 -0
- package/dist/Components/Viewers/DataTable.js +153 -49
- package/dist/Components/Viewers/DataTableColumns.d.ts +2 -2
- package/dist/Components/Viewers/DataTableColumns.js +2 -1
- package/dist/Components/Viewers/DataTableFilters.d.ts +1 -1
- package/dist/Components/Viewers/DataTableFilters.js +17 -2
- package/dist/Components/Viewers/DataTableParts.d.ts +23 -5
- package/dist/Components/Viewers/DataTableParts.js +26 -14
- package/dist/Components/Viewers/OwnerFiles.d.ts +227 -0
- package/dist/Components/Viewers/OwnerFiles.js +700 -0
- package/dist/Components/Viewers/QrCodeImage.d.ts +22 -0
- package/dist/Components/Viewers/QrCodeImage.js +15 -0
- package/dist/Components/Viewers/RecordCards.d.ts +16 -0
- package/dist/Components/Viewers/RecordCards.js +509 -0
- package/dist/Helpers/ApiModules.js +4 -0
- package/dist/Helpers/AuditEntries.d.ts +50 -0
- package/dist/Helpers/AuditEntries.js +96 -0
- package/dist/Helpers/BusyHooks.d.ts +6 -0
- package/dist/Helpers/BusyHooks.js +39 -0
- package/dist/Helpers/ChatBackend.d.ts +8 -1
- package/dist/Helpers/ChatBackend.js +18 -0
- package/dist/Helpers/ChatHelpers.d.ts +2 -0
- package/dist/Helpers/ChatHelpers.js +4 -1
- package/dist/Helpers/CrudBackend.d.ts +20 -2
- package/dist/Helpers/CrudBackend.js +46 -2
- package/dist/Helpers/CrudColumns.d.ts +91 -6
- package/dist/Helpers/CrudColumns.js +148 -7
- package/dist/Helpers/CrudDetailsTabs.d.ts +58 -0
- package/dist/Helpers/CrudDetailsTabs.js +126 -0
- package/dist/Helpers/CrudHelpers.d.ts +116 -2
- package/dist/Helpers/CrudHelpers.js +256 -0
- package/dist/Helpers/CrudNarrowPick.d.ts +83 -0
- package/dist/Helpers/CrudNarrowPick.js +157 -0
- package/dist/Helpers/CrudPickerPlan.d.ts +58 -0
- package/dist/Helpers/CrudPickerPlan.js +46 -0
- package/dist/Helpers/CrudRowForms.d.ts +32 -0
- package/dist/Helpers/CrudRowForms.js +76 -0
- package/dist/Helpers/CrudScopes.d.ts +32 -0
- package/dist/Helpers/CrudScopes.js +79 -0
- package/dist/Helpers/DashboardHelpers.d.ts +115 -0
- package/dist/Helpers/DashboardHelpers.js +305 -0
- package/dist/Helpers/DomainCards.d.ts +140 -0
- package/dist/Helpers/DomainCards.js +370 -0
- package/dist/Helpers/DropdownHelpers.d.ts +3 -1
- package/dist/Helpers/DropdownHelpers.js +6 -2
- package/dist/Helpers/ExcelHelpers.d.ts +1 -1
- package/dist/Helpers/ExcelHelpers.js +12 -11
- package/dist/Helpers/FileAdapter.d.ts +158 -0
- package/dist/Helpers/FileAdapter.js +173 -0
- package/dist/Helpers/FilePrimaries.d.ts +48 -0
- package/dist/Helpers/FilePrimaries.js +138 -0
- package/dist/Helpers/FormConfirm.d.ts +32 -0
- package/dist/Helpers/FormConfirm.js +40 -0
- package/dist/Helpers/FormStore.d.ts +100 -5
- package/dist/Helpers/FormStore.js +368 -25
- package/dist/Helpers/InputConditions.d.ts +56 -0
- package/dist/Helpers/InputConditions.js +192 -0
- package/dist/Helpers/InputMemory.d.ts +106 -0
- package/dist/Helpers/InputMemory.js +395 -0
- package/dist/Helpers/InputNarrowing.d.ts +50 -0
- package/dist/Helpers/InputNarrowing.js +148 -0
- package/dist/Helpers/InputParamsHelpers.d.ts +44 -1
- package/dist/Helpers/InputParamsHelpers.js +157 -74
- package/dist/Helpers/MailClientHelpers.d.ts +96 -0
- package/dist/Helpers/MailClientHelpers.js +211 -0
- package/dist/Helpers/MessageBackend.d.ts +152 -0
- package/dist/Helpers/MessageBackend.js +329 -0
- package/dist/Helpers/MessageHelpers.d.ts +160 -0
- package/dist/Helpers/MessageHelpers.js +573 -0
- package/dist/Helpers/MessageUnread.d.ts +95 -0
- package/dist/Helpers/MessageUnread.js +245 -0
- package/dist/Helpers/NexusDriveAdapter.d.ts +71 -0
- package/dist/Helpers/NexusDriveAdapter.js +236 -0
- package/dist/Helpers/NumberHelpers.d.ts +156 -0
- package/dist/Helpers/NumberHelpers.js +242 -0
- package/dist/Helpers/PagedPicker.d.ts +42 -0
- package/dist/Helpers/PagedPicker.js +85 -0
- package/dist/Helpers/Permissions.js +2 -1
- package/dist/Helpers/QrCode.d.ts +26 -0
- package/dist/Helpers/QrCode.js +463 -0
- package/dist/Helpers/RecordCards.d.ts +205 -0
- package/dist/Helpers/RecordCards.js +378 -0
- package/dist/Helpers/RequestCache.d.ts +14 -2
- package/dist/Helpers/RequestCache.js +22 -3
- package/dist/Helpers/RowsStore.d.ts +61 -2
- package/dist/Helpers/RowsStore.js +203 -16
- package/dist/Helpers/ServerPreview.d.ts +69 -0
- package/dist/Helpers/ServerPreview.js +99 -0
- package/dist/Helpers/TableColumns.js +4 -3
- package/dist/Helpers/TableExport.d.ts +7 -1
- package/dist/Helpers/TableExport.js +9 -3
- package/dist/Helpers/TableFilters.d.ts +1 -1
- package/dist/Helpers/TableFilters.js +24 -23
- package/dist/Helpers/TableHelpers.d.ts +38 -4
- package/dist/Helpers/TableHelpers.js +78 -10
- package/dist/Helpers/TableJoins.d.ts +13 -0
- package/dist/Helpers/TableJoins.js +34 -0
- package/dist/Helpers/TableStore.d.ts +28 -4
- package/dist/Helpers/TableStore.js +73 -11
- package/dist/Helpers/ToolbarFit.d.ts +23 -0
- package/dist/Helpers/ToolbarFit.js +30 -0
- package/dist/Helpers/TreeStore.d.ts +156 -6
- package/dist/Helpers/TreeStore.js +547 -18
- package/dist/Interfaces/ApiInterfaces.d.ts +10 -1
- package/dist/Interfaces/ApiInterfaces.js +10 -1
- package/dist/Interfaces/ChatInterfaces.d.ts +22 -0
- package/dist/Interfaces/CrudInterfaces.d.ts +539 -6
- package/dist/Interfaces/DashboardInterfaces.d.ts +123 -0
- package/dist/Interfaces/DashboardInterfaces.js +1 -0
- package/dist/Interfaces/DomainInterfaces.d.ts +145 -0
- package/dist/Interfaces/DomainInterfaces.js +1 -0
- package/dist/Interfaces/FileInterfaces.d.ts +183 -0
- package/dist/Interfaces/FileInterfaces.js +6 -0
- package/dist/Interfaces/FormInterfaces.d.ts +460 -32
- package/dist/Interfaces/FormInterfaces.js +79 -1
- package/dist/Interfaces/InputInterfaces.d.ts +22 -3
- package/dist/Interfaces/MailInterfaces.d.ts +192 -0
- package/dist/Interfaces/MailInterfaces.js +1 -0
- package/dist/Interfaces/RecordInterfaces.d.ts +367 -0
- package/dist/Interfaces/RecordInterfaces.js +1 -0
- package/dist/Interfaces/TableInterfaces.d.ts +102 -3
- package/dist/Services/ExcelApi.js +5 -0
- package/dist/Services/FileApi.d.ts +13 -0
- package/dist/Services/FileApi.js +29 -0
- package/dist/Services/ImageEditorLoader.d.ts +14 -0
- package/dist/Services/ImageEditorLoader.js +51 -0
- package/dist/Services/JoinSources.d.ts +79 -6
- package/dist/Services/JoinSources.js +132 -21
- package/dist/Services/MessageApi.d.ts +18 -0
- package/dist/Services/MessageApi.js +64 -0
- package/dist/Services/ModuleImport.d.ts +7 -0
- package/dist/Services/ModuleImport.js +22 -0
- package/dist/Shared.Index.d.ts +28 -0
- package/dist/Shared.Index.js +28 -0
- package/package.json +13 -2
- package/src/Styles/Nexus.Avatar.css +6 -5
- package/src/Styles/Nexus.Button.css +39 -4
- package/src/Styles/Nexus.Chat.css +114 -22
- package/src/Styles/Nexus.Choice.css +16 -0
- package/src/Styles/Nexus.Crud.css +486 -21
- package/src/Styles/Nexus.Dashboard.css +763 -0
- package/src/Styles/Nexus.Domain.css +384 -0
- package/src/Styles/Nexus.Dropdown.css +8 -0
- package/src/Styles/Nexus.Editor.css +20 -0
- package/src/Styles/Nexus.Files.css +437 -0
- package/src/Styles/Nexus.Form.css +5 -2
- package/src/Styles/Nexus.Index.css +7 -0
- package/src/Styles/Nexus.Input.css +73 -0
- package/src/Styles/Nexus.Mail.css +1062 -0
- package/src/Styles/Nexus.Menu.css +10 -1
- package/src/Styles/Nexus.Popup.css +135 -1
- package/src/Styles/Nexus.Print.css +288 -0
- package/src/Styles/Nexus.QrCode.css +12 -0
- package/src/Styles/Nexus.Record.css +430 -0
- package/src/Styles/Nexus.Tab.Buttons.css +87 -22
- package/src/Styles/Nexus.Table.css +1458 -1387
- package/src/Styles/Nexus.Theme.Picker.css +1 -0
- package/src/Styles/Nexus.Themes.css +12 -6
- package/src/Styles/Nexus.Tokens.css +8 -3
- package/src/Styles/Nexus.Tree.css +41 -1
|
@@ -19,49 +19,184 @@
|
|
|
19
19
|
flex: 1 1 auto;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
/*
|
|
22
|
+
/*
|
|
23
|
+
* A list narrowed to one record picked in another (`narrow`): whose records these are, in the table's caption, kept
|
|
24
|
+
* while nothing is picked so the rows never move. Positioned, so the words kept for screen readers stay in it.
|
|
25
|
+
*/
|
|
26
|
+
.nx-crud__scope {
|
|
27
|
+
position: relative;
|
|
28
|
+
margin: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.nx-crud__scope-name {
|
|
32
|
+
color: var(--nx-text);
|
|
33
|
+
font-weight: 600;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* A tree of records (`CrudTree`): the picked record's buttons, beside its name in the page's panel, wrapping as one group. */
|
|
37
|
+
.nx-crud-tree__actions {
|
|
38
|
+
display: flex;
|
|
39
|
+
flex-wrap: wrap;
|
|
40
|
+
align-items: center;
|
|
41
|
+
gap: var(--nx-space-2);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* Details (the 2026-06-20 look): each field a label and its value in a box - a hairline and the raised surface - two
|
|
46
|
+
* pairs to a line where the details are wide (46rem), one where they are not; under 20rem the label goes over its
|
|
47
|
+
* value. The details are their own size container, so a popup, a workspace's tab, a column beside a panel and a
|
|
48
|
+
* question's box each get the look their width allows. Every label has one width (a share of the details' width), so
|
|
49
|
+
* the values of both columns, and of a field across the line, start on one edge.
|
|
50
|
+
*/
|
|
23
51
|
.nx-crud-details {
|
|
52
|
+
container: nx-crud-details / inline-size;
|
|
24
53
|
display: flex;
|
|
25
54
|
flex-direction: column;
|
|
26
55
|
gap: var(--nx-space-3);
|
|
27
56
|
}
|
|
28
57
|
|
|
29
58
|
.nx-crud-details__list {
|
|
59
|
+
--nx-crud-details-label: clamp(6rem, 30cqi, 11rem);
|
|
60
|
+
|
|
30
61
|
display: grid;
|
|
31
|
-
grid-template-columns:
|
|
32
|
-
gap: var(--nx-space-
|
|
62
|
+
grid-template-columns: minmax(0, 1fr);
|
|
63
|
+
gap: var(--nx-space-2) var(--nx-space-6);
|
|
33
64
|
margin: 0;
|
|
65
|
+
font-size: var(--nx-text-md);
|
|
66
|
+
line-height: 1.5;
|
|
34
67
|
}
|
|
35
68
|
|
|
69
|
+
/* The label beside its value, on the line of the value's first line however many lines the value takes. */
|
|
36
70
|
.nx-crud-details__item {
|
|
37
|
-
display:
|
|
38
|
-
|
|
39
|
-
|
|
71
|
+
display: grid;
|
|
72
|
+
grid-template-columns: var(--nx-crud-details-label) minmax(0, 1fr);
|
|
73
|
+
align-items: start;
|
|
74
|
+
gap: var(--nx-space-1) var(--nx-space-3);
|
|
40
75
|
min-width: 0;
|
|
41
76
|
}
|
|
42
77
|
|
|
43
|
-
.
|
|
78
|
+
/* A long text (`wrap`, Markdown) and a list of rows (`table`) take the whole line. */
|
|
79
|
+
.nx-crud-details__item--wide,
|
|
80
|
+
.nx-crud-details__item--table {
|
|
44
81
|
grid-column: 1 / -1;
|
|
45
82
|
}
|
|
46
83
|
|
|
47
84
|
.nx-crud-details__label {
|
|
85
|
+
/* The value's box: its border and its padding, so the two first lines share a baseline. */
|
|
86
|
+
padding-block: 5px;
|
|
48
87
|
color: var(--nx-text-muted);
|
|
49
|
-
|
|
88
|
+
overflow-wrap: break-word;
|
|
50
89
|
}
|
|
51
90
|
|
|
52
91
|
.nx-crud-details__value {
|
|
53
|
-
/*
|
|
54
|
-
|
|
92
|
+
/*
|
|
93
|
+
* Positioned, so what a value draws out of the flow (a tick's words for screen readers) stays in its box and inside
|
|
94
|
+
* the box that scrolls it, never making the popup itself scroll.
|
|
95
|
+
*/
|
|
96
|
+
position: relative;
|
|
97
|
+
/* A value still to come keeps its box, so the full record lands without moving anything. */
|
|
98
|
+
min-height: calc(1lh + 10px);
|
|
55
99
|
margin: 0;
|
|
100
|
+
padding: 4px var(--nx-space-3);
|
|
101
|
+
border: 1px solid var(--nx-border);
|
|
102
|
+
border-radius: var(--nx-radius-sm);
|
|
103
|
+
background: var(--nx-surface-2);
|
|
56
104
|
overflow-wrap: anywhere;
|
|
57
|
-
font-size: var(--nx-text-md);
|
|
58
105
|
}
|
|
59
106
|
|
|
60
|
-
/* A
|
|
107
|
+
/* A list of rows: its label over its table, which is the box. */
|
|
108
|
+
.nx-crud-details__item--table {
|
|
109
|
+
grid-template-columns: minmax(0, 1fr);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.nx-crud-details__item--table > .nx-crud-details__label {
|
|
113
|
+
padding-block: 0;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.nx-crud-details__table {
|
|
117
|
+
min-width: 0;
|
|
118
|
+
margin: 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* The table's own frame: across the line, its columns scrolling sideways inside it when they are wider (a phone). */
|
|
122
|
+
.nx-crud-details__rows {
|
|
123
|
+
max-width: 100%;
|
|
124
|
+
overflow-x: auto;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.nx-crud-details__rows table {
|
|
128
|
+
width: 100%;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* The row's number: as narrow as its figures. */
|
|
132
|
+
.nx-crud-details__rows :is(th, td):first-child {
|
|
133
|
+
width: 1%;
|
|
134
|
+
font-variant-numeric: tabular-nums;
|
|
135
|
+
white-space: nowrap;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/*
|
|
139
|
+
* Details in sections (`column.group`): each run of fields under its numbered heading ("01. Contact"), the heading
|
|
140
|
+
* nearer its fields than the section before it.
|
|
141
|
+
*/
|
|
142
|
+
.nx-crud-details__section {
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
145
|
+
gap: var(--nx-space-3);
|
|
146
|
+
min-width: 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.nx-crud-details__section + .nx-crud-details__section {
|
|
150
|
+
margin-top: var(--nx-space-4);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.nx-crud-details__heading {
|
|
154
|
+
margin: 0;
|
|
155
|
+
color: var(--nx-text);
|
|
156
|
+
font-size: var(--nx-text-lg);
|
|
157
|
+
font-weight: 600;
|
|
158
|
+
line-height: 1.35;
|
|
159
|
+
font-variant-numeric: tabular-nums;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* A section's heading with its own Edit (`details.sections`): the button at the end of the heading's line. */
|
|
163
|
+
.nx-crud-details__head {
|
|
164
|
+
display: flex;
|
|
165
|
+
flex-wrap: wrap;
|
|
166
|
+
align-items: center;
|
|
167
|
+
justify-content: space-between;
|
|
168
|
+
gap: var(--nx-space-1) var(--nx-space-3);
|
|
169
|
+
min-width: 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* A field only the full record has, when that record could not be loaded; a list with no rows. */
|
|
61
173
|
.nx-crud-details__missing {
|
|
62
174
|
color: var(--nx-text-muted);
|
|
63
175
|
}
|
|
64
176
|
|
|
177
|
+
@container nx-crud-details (min-width: 46rem) {
|
|
178
|
+
.nx-crud-details__list {
|
|
179
|
+
--nx-crud-details-label: clamp(7rem, 15cqi, 11rem);
|
|
180
|
+
|
|
181
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* The fields sit in from their heading. */
|
|
185
|
+
.nx-crud-details__section > .nx-crud-details__list {
|
|
186
|
+
padding-inline-start: var(--nx-space-5);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
@container nx-crud-details (max-width: 19.98rem) {
|
|
191
|
+
.nx-crud-details__item {
|
|
192
|
+
grid-template-columns: minmax(0, 1fr);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.nx-crud-details__label {
|
|
196
|
+
padding-block: 0;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
65
200
|
/*
|
|
66
201
|
* The details popup's footer is a form's bar (Nexus.Form.css): its status line on the left - "Loading…" for a slow
|
|
67
202
|
* record, "Not all fields loaded." for one that failed - and Edit and Close on the right. The line takes only the room
|
|
@@ -124,18 +259,27 @@
|
|
|
124
259
|
flex-direction: column;
|
|
125
260
|
}
|
|
126
261
|
|
|
262
|
+
/*
|
|
263
|
+
* Under the fields, at every width (`details.asidePlace: "below"`, a record's workspace by default): the fields take
|
|
264
|
+
* the whole width, the panel the whole width under them, as tall as what it holds; what scrolls is the box around
|
|
265
|
+
* both (the workspace's panel, the popup's body), never a column of its own.
|
|
266
|
+
*/
|
|
267
|
+
.nx-crud-aside--below > .nx-crud-aside__side {
|
|
268
|
+
max-height: none;
|
|
269
|
+
}
|
|
270
|
+
|
|
127
271
|
/*
|
|
128
272
|
* Side by side, where there is room for both. The popup's body stops scrolling and each column takes its own, so a
|
|
129
273
|
* long form never pushes the panel off the screen. The body is a flex row here, which is what gives its one child a
|
|
130
274
|
* height to work from: no percentage height anywhere, so it holds at every popup size.
|
|
131
275
|
*/
|
|
132
276
|
@media (min-width: 1000px) {
|
|
133
|
-
.nx-popup__body:has(> .nx-crud-aside) {
|
|
277
|
+
.nx-popup__body:has(> .nx-crud-aside:not(.nx-crud-aside--below)) {
|
|
134
278
|
display: flex;
|
|
135
279
|
overflow: hidden;
|
|
136
280
|
}
|
|
137
281
|
|
|
138
|
-
.nx-crud-aside {
|
|
282
|
+
.nx-crud-aside:not(.nx-crud-aside--below) {
|
|
139
283
|
flex: 1 1 auto;
|
|
140
284
|
min-width: 0;
|
|
141
285
|
/* The panel takes a share of the width, not half of it: a form has columns to fit, and code lines are short. */
|
|
@@ -146,23 +290,344 @@
|
|
|
146
290
|
* A details popup's panel (`details.aside`) is what the popup is for, and the details beside it are a short list
|
|
147
291
|
* of fields, so the shares turn round: the fields take a column of their own width and the panel the rest.
|
|
148
292
|
*/
|
|
149
|
-
.nx-crud-aside.nx-crud-aside--
|
|
293
|
+
.nx-crud-aside--details:not(.nx-crud-aside--below) {
|
|
150
294
|
grid-template-columns: minmax(0, var(--nx-crud-details-width, clamp(16rem, 30%, 26rem))) minmax(0, 1fr);
|
|
151
295
|
}
|
|
152
296
|
|
|
153
|
-
|
|
297
|
+
/*
|
|
298
|
+
* Each column scrolls on its own, and a scroll box clips at its padding edge: a field first in it would lose what it
|
|
299
|
+
* draws past its box. Room inside the edges, paid back by a negative margin so nothing moves: above, an outlined
|
|
300
|
+
* field's raised label (lifted 0.6em of the xs text over the top border) and its 2px focus outline; on every side,
|
|
301
|
+
* the 3px focus ring (`--nx-focus-ring`). Focus scrolls a field's control to an edge, so `scroll-padding` keeps the
|
|
302
|
+
* same room past the control: the label above, the box's 1px border and the ring below (the popup's body too).
|
|
303
|
+
*/
|
|
304
|
+
.nx-crud-aside:not(.nx-crud-aside--below) > :is(.nx-crud-aside__main, .nx-crud-aside__side) {
|
|
154
305
|
overflow: auto;
|
|
155
306
|
overscroll-behavior: contain;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
307
|
+
padding: calc(var(--nx-text-xs) * 0.6 + 2px) 3px 3px;
|
|
308
|
+
margin: calc(var(--nx-text-xs) * -0.6 - 2px) -3px -3px;
|
|
309
|
+
scroll-padding: calc(var(--nx-text-xs) * 0.6 + 2px) 4px 4px;
|
|
159
310
|
}
|
|
160
311
|
|
|
161
312
|
/* A panel taller than the popup scrolls here, whatever it holds; one that fills the height scrolls inside itself. */
|
|
162
313
|
.nx-crud-aside__side {
|
|
163
314
|
max-height: none;
|
|
164
|
-
|
|
165
|
-
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/*
|
|
319
|
+
* A record's workspace in its details popup (`details.tabs`, `details.profile`): who the record is and its tabs in a
|
|
320
|
+
* column on the left, the chosen tab on the right. The popup's body stops scrolling and only the tab scrolls, inside
|
|
321
|
+
* itself, so the profile, the tabs and the footer stay where they are and a switch never changes the popup's size. The
|
|
322
|
+
* workspace is the container its column and the tabs' `auto` design follow: below 720px (a phone) the profile is one
|
|
323
|
+
* row and the tabs one strip, above the tab.
|
|
324
|
+
*/
|
|
325
|
+
.nx-popup__body:has(> .nx-crud-workspace) {
|
|
326
|
+
display: flex;
|
|
327
|
+
overflow: hidden;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.nx-crud-workspace {
|
|
331
|
+
container-type: inline-size;
|
|
332
|
+
flex: 1 1 auto;
|
|
333
|
+
min-width: 0;
|
|
334
|
+
/* A popup of a set width (`lg`, `xl`) gets a height of its own, so no tab changes it; `full` gives its own. */
|
|
335
|
+
height: min(40rem, calc(100dvh - 10rem));
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.nx-popup:is(.nx-popup--full, .nx-popup--maximized) .nx-crud-workspace {
|
|
339
|
+
height: auto;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.nx-crud-workspace__frame {
|
|
343
|
+
--nx-crud-profile-picture: 10rem;
|
|
344
|
+
|
|
345
|
+
display: grid;
|
|
346
|
+
grid-template-columns: minmax(0, 20rem) minmax(0, 1fr);
|
|
347
|
+
height: 100%;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* Neither a profile nor more than one tab for this person: the tab alone, the width of the popup. */
|
|
351
|
+
.nx-crud-workspace__frame--alone {
|
|
352
|
+
grid-template-columns: minmax(0, 1fr);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.nx-crud-workspace__side {
|
|
356
|
+
display: flex;
|
|
357
|
+
flex-direction: column;
|
|
358
|
+
min-height: 0;
|
|
359
|
+
border-inline-end: 1px solid var(--nx-border);
|
|
360
|
+
background: color-mix(in oklab, var(--nx-text) 3%, transparent);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.nx-crud-workspace__profile {
|
|
364
|
+
flex-shrink: 0;
|
|
365
|
+
padding: var(--nx-space-5) var(--nx-space-4);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.nx-crud-workspace__profile + .nx-crud-workspace__nav {
|
|
369
|
+
border-top: 1px solid var(--nx-border);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
.nx-crud-workspace__nav {
|
|
373
|
+
flex: 1 1 auto;
|
|
374
|
+
min-height: 0;
|
|
375
|
+
padding: var(--nx-space-3);
|
|
376
|
+
overflow-y: auto;
|
|
377
|
+
overscroll-behavior: contain;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/*
|
|
381
|
+
* Its padding is the room for a field first in it; `scroll-padding` the room round one the focus scrolls to (as the
|
|
382
|
+
* aside's). The side padding is named, so a tab's footer can reach across it.
|
|
383
|
+
*/
|
|
384
|
+
.nx-crud-workspace__panel {
|
|
385
|
+
--nx-crud-panel-pad-x: var(--nx-space-5);
|
|
386
|
+
|
|
387
|
+
/* Positioned: what a tab draws out of the flow scrolls and clips with the tab, never past the popup. */
|
|
388
|
+
position: relative;
|
|
389
|
+
min-width: 0;
|
|
390
|
+
min-height: 0;
|
|
391
|
+
padding: var(--nx-space-4) var(--nx-crud-panel-pad-x) var(--nx-space-5);
|
|
392
|
+
overflow: auto;
|
|
393
|
+
overscroll-behavior: contain;
|
|
394
|
+
/* Below: the 3px ring and 2px more, as the panel's top can sit on a half pixel and its box on another fraction. */
|
|
395
|
+
scroll-padding: calc(var(--nx-text-xs) * 0.6 + 2px) 4px 5px;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/*
|
|
399
|
+
* A tab's footer (`CrudTabFooter`): one bar, its words at the start and its buttons at the end, with the popup
|
|
400
|
+
* footer's room and hairline. On a phone the words and the buttons wrap as whole groups. Where it is not in a
|
|
401
|
+
* workspace's panel, this is all it is: a plain bar where it stands.
|
|
402
|
+
*/
|
|
403
|
+
.nx-crud-tab-footer {
|
|
404
|
+
display: flex;
|
|
405
|
+
flex-wrap: wrap;
|
|
406
|
+
align-items: center;
|
|
407
|
+
justify-content: flex-end;
|
|
408
|
+
gap: var(--nx-space-2);
|
|
409
|
+
padding-block: var(--nx-space-3);
|
|
410
|
+
border-top: 1px solid var(--nx-border);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.nx-crud-tab-footer > p {
|
|
414
|
+
flex: 1 1 auto;
|
|
415
|
+
min-width: 0;
|
|
416
|
+
margin: 0;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* A form's bar fills the rest, so its status line sits beside its buttons (as in the popup's footer). */
|
|
420
|
+
.nx-crud-tab-footer > .nx-form-buttons {
|
|
421
|
+
flex: 1 1 auto;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/*
|
|
425
|
+
* In a workspace's panel it stays in view: it sticks to the bottom of the panel while the tab scrolls and sits in its
|
|
426
|
+
* place at the end, across the panel's whole width (past its side padding) on the panel's own surface, never a box of
|
|
427
|
+
* its own (no shadow, no frame). The panel keeps no padding under it, so it meets the panel's foot at the end as
|
|
428
|
+
* while it sticks. What the focus scrolls into view (a field, a caret) clears it: the panel keeps the footer's height
|
|
429
|
+
* as `CrudTabFooter` measures it (`scroll-padding`). Above what a tab's content raises (a field's label, a table's
|
|
430
|
+
* sticky header: 5 at most).
|
|
431
|
+
*/
|
|
432
|
+
.nx-crud-workspace__panel:has(.nx-crud-tab-footer) {
|
|
433
|
+
padding-bottom: 0;
|
|
434
|
+
scroll-padding-bottom: calc(var(--nx-crud-tab-footer-size, 0px) + 4px);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/* While the focus is in the footer, which is always in view, that room goes: its Save never scrolls the tab. */
|
|
438
|
+
.nx-crud-workspace__panel:has(.nx-crud-tab-footer:focus-within) {
|
|
439
|
+
scroll-padding-bottom: 4px;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.nx-crud-workspace__panel .nx-crud-tab-footer {
|
|
443
|
+
position: sticky;
|
|
444
|
+
bottom: 0;
|
|
445
|
+
z-index: 6;
|
|
446
|
+
margin-inline: calc(-1 * var(--nx-crud-panel-pad-x));
|
|
447
|
+
padding-inline: var(--nx-crud-panel-pad-x);
|
|
448
|
+
background: var(--nx-surface);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/* The profile: the picture over the name, the line under it and the tags, in the middle of the column. */
|
|
452
|
+
.nx-crud-profile {
|
|
453
|
+
display: flex;
|
|
454
|
+
flex-direction: column;
|
|
455
|
+
align-items: center;
|
|
456
|
+
gap: var(--nx-space-3);
|
|
457
|
+
min-width: 0;
|
|
458
|
+
text-align: center;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
.nx-crud-profile__picture {
|
|
462
|
+
display: flex;
|
|
463
|
+
flex-shrink: 0;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.nx-crud-profile__text {
|
|
467
|
+
display: grid;
|
|
468
|
+
justify-items: center;
|
|
469
|
+
gap: 2px;
|
|
470
|
+
min-width: 0;
|
|
471
|
+
max-width: 100%;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.nx-crud-profile__title {
|
|
475
|
+
margin: 0;
|
|
476
|
+
font-size: var(--nx-text-lg);
|
|
477
|
+
font-weight: 600;
|
|
478
|
+
line-height: 1.35;
|
|
479
|
+
overflow-wrap: anywhere;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.nx-crud-profile__subtitle {
|
|
483
|
+
margin: 0;
|
|
484
|
+
color: var(--nx-text-muted);
|
|
485
|
+
font-size: var(--nx-text-sm);
|
|
486
|
+
overflow-wrap: anywhere;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.nx-crud-profile__tags {
|
|
490
|
+
display: flex;
|
|
491
|
+
flex-wrap: wrap;
|
|
492
|
+
justify-content: center;
|
|
493
|
+
gap: 4px;
|
|
494
|
+
margin: 4px 0 0;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/*
|
|
498
|
+
* A few of the record's fields under the tags (`profile.fields`): a small grid in the middle of the column, a label
|
|
499
|
+
* (muted) and its value (the text colour) a line, each pair on the grid's two tracks so the values line up. A long
|
|
500
|
+
* value wraps inside the column, never past it, and a column's tag follows its value, under it when the line is full.
|
|
501
|
+
*/
|
|
502
|
+
.nx-crud-profile__fields {
|
|
503
|
+
display: grid;
|
|
504
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
505
|
+
gap: var(--nx-space-1) var(--nx-space-3);
|
|
506
|
+
max-width: 100%;
|
|
507
|
+
margin: var(--nx-space-2) 0 0;
|
|
508
|
+
font-size: var(--nx-text-sm);
|
|
509
|
+
line-height: 1.5;
|
|
510
|
+
text-align: start;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
.nx-crud-profile__field {
|
|
514
|
+
display: grid;
|
|
515
|
+
grid-column: 1 / -1;
|
|
516
|
+
grid-template-columns: subgrid;
|
|
517
|
+
align-items: baseline;
|
|
518
|
+
min-width: 0;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
.nx-crud-profile__label {
|
|
522
|
+
color: var(--nx-text-muted);
|
|
523
|
+
overflow-wrap: break-word;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
.nx-crud-profile__value {
|
|
527
|
+
display: flex;
|
|
528
|
+
flex-wrap: wrap;
|
|
529
|
+
align-items: baseline;
|
|
530
|
+
gap: 2px var(--nx-space-2);
|
|
531
|
+
min-width: 0;
|
|
532
|
+
margin: 0;
|
|
533
|
+
color: var(--nx-text);
|
|
534
|
+
overflow-wrap: anywhere;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/* The gap places the tag: a word's space after the value, or the start of the next line. */
|
|
538
|
+
.nx-crud-profile__value > .nx-table__tag--after {
|
|
539
|
+
margin-inline-start: 0;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/* A field only the full record has, held while it is read: a short value's width on the value's baseline. */
|
|
543
|
+
.nx-table__bone.nx-crud-profile__bone {
|
|
544
|
+
width: 6rem;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
@container (max-width: 719.98px) {
|
|
548
|
+
.nx-crud-workspace__frame {
|
|
549
|
+
--nx-crud-profile-picture: 3rem;
|
|
550
|
+
|
|
551
|
+
display: flex;
|
|
552
|
+
flex-direction: column;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
.nx-crud-workspace__side {
|
|
556
|
+
flex-shrink: 0;
|
|
557
|
+
border-inline-end: 0;
|
|
558
|
+
border-bottom: 1px solid var(--nx-border);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
.nx-crud-workspace__profile {
|
|
562
|
+
padding: var(--nx-space-3) var(--nx-space-4);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
.nx-crud-workspace__profile + .nx-crud-workspace__nav {
|
|
566
|
+
border-top: 0;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.nx-crud-profile {
|
|
570
|
+
flex-direction: row;
|
|
571
|
+
text-align: start;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
.nx-crud-profile__text {
|
|
575
|
+
justify-items: start;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
.nx-crud-profile__tags {
|
|
579
|
+
justify-content: flex-start;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/*
|
|
583
|
+
* The fields follow the tags as one wrapped line of "label value" pairs: beside the tags when all of them fit there,
|
|
584
|
+
* else from the next line, so they take the lines their words need, not a line a field.
|
|
585
|
+
*/
|
|
586
|
+
.nx-crud-profile__text:has(> .nx-crud-profile__fields) {
|
|
587
|
+
display: flex;
|
|
588
|
+
flex-wrap: wrap;
|
|
589
|
+
align-items: baseline;
|
|
590
|
+
gap: 2px var(--nx-space-3);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
.nx-crud-profile__text:has(> .nx-crud-profile__fields) > :is(.nx-crud-profile__title, .nx-crud-profile__subtitle) {
|
|
594
|
+
flex-basis: 100%;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
.nx-crud-profile__fields {
|
|
598
|
+
display: flex;
|
|
599
|
+
flex-wrap: wrap;
|
|
600
|
+
gap: 2px var(--nx-space-3);
|
|
601
|
+
min-width: 0;
|
|
602
|
+
margin-top: 4px;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
/* A pair longer than the line wraps as words do, its label kept with the start of its value. */
|
|
606
|
+
.nx-crud-profile__field {
|
|
607
|
+
display: block;
|
|
608
|
+
min-width: 0;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
.nx-crud-profile__label,
|
|
612
|
+
.nx-crud-profile__value {
|
|
613
|
+
display: inline;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
.nx-crud-profile__value > .nx-table__tag--after {
|
|
617
|
+
margin-inline-start: var(--nx-space-2);
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
.nx-crud-workspace__nav {
|
|
621
|
+
flex: 0 0 auto;
|
|
622
|
+
padding: 0 var(--nx-space-2) var(--nx-space-1);
|
|
623
|
+
overflow: visible;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.nx-crud-workspace__panel {
|
|
627
|
+
--nx-crud-panel-pad-x: var(--nx-space-4);
|
|
628
|
+
|
|
629
|
+
flex: 1 1 auto;
|
|
630
|
+
padding: var(--nx-space-3) var(--nx-crud-panel-pad-x) var(--nx-space-4);
|
|
166
631
|
}
|
|
167
632
|
}
|
|
168
633
|
}
|