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
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* An owner's pictures and documents (OwnerFiles.tsx, PictureInput.tsx): a picture of any size and shape, the picture
|
|
3
|
+
* input's preview and buttons, the gallery's two panes and the document list. Nothing moves under the pointer: a hovered
|
|
4
|
+
* picture gets a ring, never a new size, so a table's rows and the gallery's grid stay where they are.
|
|
5
|
+
*/
|
|
6
|
+
@layer nexus.components {
|
|
7
|
+
/* A picture: its height from --nx-picture-h, its width from the shape (--nx-picture-ratio, width / height). */
|
|
8
|
+
.nx-picture {
|
|
9
|
+
position: relative;
|
|
10
|
+
display: inline-grid;
|
|
11
|
+
flex-shrink: 0;
|
|
12
|
+
place-items: center;
|
|
13
|
+
height: var(--nx-picture-h, 28px);
|
|
14
|
+
aspect-ratio: var(--nx-picture-ratio, 1);
|
|
15
|
+
padding: 0;
|
|
16
|
+
overflow: hidden;
|
|
17
|
+
border: 0;
|
|
18
|
+
border-radius: var(--nx-radius-sm);
|
|
19
|
+
background: color-mix(in oklab, var(--nx-text) 7%, var(--nx-surface));
|
|
20
|
+
color: var(--nx-text-subtle);
|
|
21
|
+
font: inherit;
|
|
22
|
+
vertical-align: middle;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.nx-picture img {
|
|
26
|
+
position: absolute;
|
|
27
|
+
inset: 0;
|
|
28
|
+
width: 100%;
|
|
29
|
+
height: 100%;
|
|
30
|
+
object-fit: cover;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.nx-picture--empty .nx-icon {
|
|
34
|
+
width: min(50%, 2rem);
|
|
35
|
+
height: auto;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.nx-picture--round {
|
|
39
|
+
border-radius: 50%;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* No picture, a name: its initials, on the name's avatar tone (Nexus.Avatar.css), in the text colour. */
|
|
43
|
+
.nx-picture--initials {
|
|
44
|
+
color: var(--nx-text);
|
|
45
|
+
font-size: max(8px, calc(var(--nx-picture-h, 28px) * 0.4));
|
|
46
|
+
font-weight: 600;
|
|
47
|
+
line-height: 1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Not read yet: the tint alone, so a row with a picture never flashes the no-picture icon first. */
|
|
51
|
+
.nx-picture--loading .nx-icon {
|
|
52
|
+
visibility: hidden;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
button.nx-picture {
|
|
56
|
+
cursor: pointer;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
button.nx-picture:hover {
|
|
60
|
+
box-shadow: 0 0 0 1px var(--nx-border-strong);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
:is(button.nx-picture, .nx-files__name):focus-visible {
|
|
64
|
+
outline: none;
|
|
65
|
+
box-shadow: var(--nx-focus-ring);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* The picture input: the preview beside its buttons, which wrap under it when the form is narrow. */
|
|
69
|
+
.nx-picture-input {
|
|
70
|
+
min-width: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.nx-picture-input__body {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-wrap: wrap;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: var(--nx-space-3) var(--nx-space-4);
|
|
78
|
+
margin-top: var(--nx-space-1);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.nx-picture-input__actions {
|
|
82
|
+
display: flex;
|
|
83
|
+
flex-wrap: wrap;
|
|
84
|
+
gap: var(--nx-space-2);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* The gallery and the document list. */
|
|
88
|
+
.nx-files {
|
|
89
|
+
display: grid;
|
|
90
|
+
gap: var(--nx-space-4);
|
|
91
|
+
min-width: 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.nx-files__bar {
|
|
95
|
+
display: flex;
|
|
96
|
+
flex-wrap: wrap;
|
|
97
|
+
align-items: center;
|
|
98
|
+
justify-content: space-between;
|
|
99
|
+
gap: var(--nx-space-2) var(--nx-space-3);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.nx-files__note {
|
|
103
|
+
margin: 0;
|
|
104
|
+
color: var(--nx-text-muted);
|
|
105
|
+
font-size: var(--nx-text-sm);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.nx-files__note--error {
|
|
109
|
+
color: var(--nx-danger-text);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.nx-files__empty {
|
|
113
|
+
display: grid;
|
|
114
|
+
place-items: center;
|
|
115
|
+
gap: var(--nx-space-2);
|
|
116
|
+
padding: var(--nx-space-8) var(--nx-space-4);
|
|
117
|
+
border-radius: var(--nx-radius-lg);
|
|
118
|
+
background: color-mix(in oklab, var(--nx-text) 4%, var(--nx-surface));
|
|
119
|
+
color: var(--nx-text-muted);
|
|
120
|
+
text-align: center;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.nx-files__empty > .nx-icon {
|
|
124
|
+
width: 2rem;
|
|
125
|
+
height: 2rem;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.nx-files__empty p {
|
|
129
|
+
margin: 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.nx-files__grid,
|
|
133
|
+
.nx-files__list {
|
|
134
|
+
margin: 0;
|
|
135
|
+
padding: 0;
|
|
136
|
+
list-style: none;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/*
|
|
140
|
+
* Pictures in two panes (the 2026-06-20 gallery): the main picture large with its buttons and the count, a hairline,
|
|
141
|
+
* then the grid. The gallery is the size container: under 560px of its own width the main picture sits small beside
|
|
142
|
+
* its buttons, over the grid. In its window (a flush popup's body) it has a height of its own, so the grid scrolls and
|
|
143
|
+
* nothing else does; in a page or a tab it is as tall as its pictures.
|
|
144
|
+
*/
|
|
145
|
+
.nx-files--panes {
|
|
146
|
+
container-type: inline-size;
|
|
147
|
+
width: 100%;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.nx-files__frame {
|
|
151
|
+
display: grid;
|
|
152
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
153
|
+
min-height: 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.nx-files__side {
|
|
157
|
+
display: flex;
|
|
158
|
+
flex-direction: column;
|
|
159
|
+
gap: var(--nx-space-4);
|
|
160
|
+
box-sizing: content-box;
|
|
161
|
+
width: 15rem;
|
|
162
|
+
min-height: 0;
|
|
163
|
+
padding-inline-end: var(--nx-space-5);
|
|
164
|
+
border-inline-end: 1px solid var(--nx-border);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* The main picture: about 15rem on its long side, a rounded square for every shape (only an avatar is round). */
|
|
168
|
+
.nx-files__cover {
|
|
169
|
+
--nx-picture-h: calc(15rem / max(1, var(--nx-picture-ratio, 1)));
|
|
170
|
+
|
|
171
|
+
align-self: center;
|
|
172
|
+
border-radius: var(--nx-radius-lg);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.nx-files__cover.nx-picture--empty .nx-icon {
|
|
176
|
+
width: 3rem;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.nx-files__about {
|
|
180
|
+
display: grid;
|
|
181
|
+
align-content: start;
|
|
182
|
+
gap: var(--nx-space-3);
|
|
183
|
+
min-width: 0;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.nx-files__side-actions {
|
|
187
|
+
display: flex;
|
|
188
|
+
flex-wrap: wrap;
|
|
189
|
+
gap: var(--nx-space-2);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.nx-files__side-actions > .nx-btn {
|
|
193
|
+
flex: 1 1 0;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.nx-files__pane {
|
|
197
|
+
min-width: 0;
|
|
198
|
+
min-height: 0;
|
|
199
|
+
padding-inline-start: var(--nx-space-5);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* The window: edge to edge, the panes padded inside, a height of its own (the whole window once it fills it). What is
|
|
204
|
+
* not the panes there - the list that could not be read, with Try again - has the window's own padding.
|
|
205
|
+
*/
|
|
206
|
+
.nx-popup--flush .nx-popup__body > .nx-files:not(.nx-files--panes) {
|
|
207
|
+
padding: var(--nx-space-5);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
@media (max-width: 600px) {
|
|
211
|
+
.nx-popup--flush .nx-popup__body > .nx-files:not(.nx-files--panes) {
|
|
212
|
+
padding: var(--nx-space-4);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.nx-popup--flush .nx-popup__body > .nx-files--panes {
|
|
217
|
+
height: min(36rem, calc(100dvh - 10rem));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.nx-popup:is(.nx-popup--full, .nx-popup--maximized) .nx-popup__body > .nx-files--panes {
|
|
221
|
+
height: 100%;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.nx-popup--flush .nx-popup__body > .nx-files--panes .nx-files__frame {
|
|
225
|
+
height: 100%;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.nx-popup--flush .nx-popup__body > .nx-files--panes :is(.nx-files__side, .nx-files__pane) {
|
|
229
|
+
padding: var(--nx-space-5);
|
|
230
|
+
overflow-y: auto;
|
|
231
|
+
overscroll-behavior: contain;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* At least two pictures a row; about 11rem each where there is room. */
|
|
235
|
+
.nx-files__grid {
|
|
236
|
+
display: grid;
|
|
237
|
+
grid-template-columns: repeat(auto-fill, minmax(min(11rem, calc(50% - var(--nx-space-3) / 2)), 1fr));
|
|
238
|
+
gap: var(--nx-space-3);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.nx-files__tile {
|
|
242
|
+
position: relative;
|
|
243
|
+
min-width: 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/* A picture in the grid: a rounded square (or the page's shape), the picture covering it. */
|
|
247
|
+
.nx-files__thumb,
|
|
248
|
+
.nx-table__bone.nx-files__bone {
|
|
249
|
+
position: relative;
|
|
250
|
+
display: block;
|
|
251
|
+
width: 100%;
|
|
252
|
+
height: auto;
|
|
253
|
+
aspect-ratio: var(--nx-picture-ratio, 1);
|
|
254
|
+
overflow: hidden;
|
|
255
|
+
border-radius: var(--nx-radius-lg);
|
|
256
|
+
background: color-mix(in oklab, var(--nx-text) 7%, var(--nx-surface));
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.nx-files__thumb img {
|
|
260
|
+
position: absolute;
|
|
261
|
+
inset: 0;
|
|
262
|
+
width: 100%;
|
|
263
|
+
height: 100%;
|
|
264
|
+
object-fit: cover;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.nx-files__tile:hover .nx-files__thumb {
|
|
268
|
+
box-shadow: 0 0 0 1px var(--nx-border-strong);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* The main picture: a ring in the accent, and the Main tag in its corner. */
|
|
272
|
+
.nx-files__tile[data-primary] .nx-files__thumb {
|
|
273
|
+
box-shadow: 0 0 0 2px var(--nx-primary);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.nx-files__mark {
|
|
277
|
+
position: absolute;
|
|
278
|
+
top: var(--nx-space-2);
|
|
279
|
+
left: var(--nx-space-2);
|
|
280
|
+
box-shadow: var(--nx-shadow-sm);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/*
|
|
284
|
+
* A picture whose removal waits for a review: still shown, faded, with the warning tag as a band across its foot,
|
|
285
|
+
* wrapping in a narrow tile. The tag says why in words, so the fade is never the only cue.
|
|
286
|
+
*/
|
|
287
|
+
.nx-files__tile[data-pending] .nx-files__thumb img {
|
|
288
|
+
opacity: 0.55;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.nx-table__tag.nx-files__pending {
|
|
292
|
+
position: absolute;
|
|
293
|
+
inset-inline: 0;
|
|
294
|
+
bottom: 0;
|
|
295
|
+
justify-content: center;
|
|
296
|
+
max-width: none;
|
|
297
|
+
padding: 3px var(--nx-space-2);
|
|
298
|
+
border-radius: 0;
|
|
299
|
+
line-height: 1.35;
|
|
300
|
+
text-align: center;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/* Its tag in a document's row and beside the main picture: under the words, as wide as it says. */
|
|
304
|
+
:is(.nx-files__row-text, .nx-files__about) > .nx-table__tag {
|
|
305
|
+
justify-self: start;
|
|
306
|
+
width: fit-content;
|
|
307
|
+
line-height: 1.45;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/*
|
|
311
|
+
* The picture's buttons, inside it and centred, on a popover's panel. Shown on hover and on a keyboard's focus in the
|
|
312
|
+
* picture; where a finger may press (a touch screen, a laptop's too) always, so no button waits behind a hover.
|
|
313
|
+
* Hidden, they stay in the Tab order and to a screen reader, but take no press: a tap meant for the picture never
|
|
314
|
+
* runs Make main or Edit unseen.
|
|
315
|
+
*/
|
|
316
|
+
.nx-files__tools {
|
|
317
|
+
position: absolute;
|
|
318
|
+
inset: 0;
|
|
319
|
+
display: flex;
|
|
320
|
+
flex-wrap: wrap;
|
|
321
|
+
justify-content: center;
|
|
322
|
+
gap: 2px;
|
|
323
|
+
width: fit-content;
|
|
324
|
+
max-width: calc(100% - var(--nx-space-2));
|
|
325
|
+
height: fit-content;
|
|
326
|
+
margin: auto;
|
|
327
|
+
padding: 3px;
|
|
328
|
+
border: 1px solid var(--nx-border);
|
|
329
|
+
border-radius: var(--nx-radius);
|
|
330
|
+
background: light-dark(var(--nx-surface), var(--nx-surface-2));
|
|
331
|
+
box-shadow: var(--nx-shadow);
|
|
332
|
+
opacity: 0;
|
|
333
|
+
pointer-events: none;
|
|
334
|
+
transition: opacity var(--nx-duration) ease-out;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.nx-files__tile:is(:hover, :has(:focus-visible)) .nx-files__tools {
|
|
338
|
+
opacity: 1;
|
|
339
|
+
pointer-events: auto;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
@media (hover: none), (any-hover: none), (any-pointer: coarse) {
|
|
343
|
+
.nx-files__tools {
|
|
344
|
+
opacity: 1;
|
|
345
|
+
pointer-events: auto;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
@container (max-width: 559.98px) {
|
|
350
|
+
.nx-files__frame {
|
|
351
|
+
display: flex;
|
|
352
|
+
flex-direction: column;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.nx-files__side {
|
|
356
|
+
flex-direction: row;
|
|
357
|
+
align-items: flex-start;
|
|
358
|
+
flex-shrink: 0;
|
|
359
|
+
gap: var(--nx-space-3);
|
|
360
|
+
box-sizing: border-box;
|
|
361
|
+
width: auto;
|
|
362
|
+
padding: 0 0 var(--nx-space-4);
|
|
363
|
+
border-inline-end: 0;
|
|
364
|
+
border-bottom: 1px solid var(--nx-border);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.nx-files__cover {
|
|
368
|
+
--nx-picture-h: calc(7rem / max(1, var(--nx-picture-ratio, 1)));
|
|
369
|
+
|
|
370
|
+
align-self: flex-start;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.nx-files__cover.nx-picture--empty .nx-icon {
|
|
374
|
+
width: 2rem;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.nx-files__about {
|
|
378
|
+
flex: 1 1 0;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.nx-files__pane {
|
|
382
|
+
flex: 1 1 auto;
|
|
383
|
+
padding: var(--nx-space-4) 0 0;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.nx-popup--flush .nx-popup__body > .nx-files--panes .nx-files__side {
|
|
387
|
+
flex-shrink: 0;
|
|
388
|
+
padding: var(--nx-space-4);
|
|
389
|
+
overflow: visible;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.nx-popup--flush .nx-popup__body > .nx-files--panes .nx-files__pane {
|
|
393
|
+
padding: var(--nx-space-4);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
[data-nx-motion="reduce"] .nx-files__tools {
|
|
398
|
+
transition: none;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/* The document list: a row per file, its buttons at the end. */
|
|
402
|
+
.nx-files__actions {
|
|
403
|
+
display: inline-flex;
|
|
404
|
+
gap: 2px;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.nx-files__row {
|
|
408
|
+
display: grid;
|
|
409
|
+
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
410
|
+
align-items: center;
|
|
411
|
+
gap: var(--nx-space-3);
|
|
412
|
+
padding: var(--nx-space-2) 0;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.nx-files__row + .nx-files__row {
|
|
416
|
+
border-top: 1px solid var(--nx-border);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.nx-files__row-text {
|
|
420
|
+
display: grid;
|
|
421
|
+
min-width: 0;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.nx-files__name {
|
|
425
|
+
overflow: hidden;
|
|
426
|
+
border-radius: var(--nx-radius-sm);
|
|
427
|
+
color: var(--nx-text);
|
|
428
|
+
font-weight: 500;
|
|
429
|
+
text-decoration: none;
|
|
430
|
+
text-overflow: ellipsis;
|
|
431
|
+
white-space: nowrap;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.nx-files__name:hover {
|
|
435
|
+
text-decoration: underline;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
@@ -180,10 +180,13 @@
|
|
|
180
180
|
flex: 1;
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
/*
|
|
183
|
+
/*
|
|
184
|
+
* One line kept even when empty: "Loading…", "Saving…" and "Unsaved changes" come and go, and the bar never jumps.
|
|
185
|
+
* The room kept beside the buttons is 14rem; a bar whose words are fewer asks less (`--nx-form-status-basis`).
|
|
186
|
+
*/
|
|
184
187
|
.nx-form-status {
|
|
185
188
|
display: flex;
|
|
186
|
-
flex: 1 1 14rem;
|
|
189
|
+
flex: 1 1 var(--nx-form-status-basis, 14rem);
|
|
187
190
|
align-items: flex-start;
|
|
188
191
|
gap: 6px;
|
|
189
192
|
min-width: 0;
|
|
@@ -18,14 +18,21 @@
|
|
|
18
18
|
@import "./Nexus.DateTime.css";
|
|
19
19
|
@import "./Nexus.Choice.css";
|
|
20
20
|
@import "./Nexus.Crud.css";
|
|
21
|
+
@import "./Nexus.Dashboard.css";
|
|
22
|
+
@import "./Nexus.Domain.css";
|
|
21
23
|
@import "./Nexus.Dropdown.css";
|
|
22
24
|
@import "./Nexus.Input.css";
|
|
23
25
|
@import "./Nexus.Editor.css";
|
|
24
26
|
@import "./Nexus.Excel.css";
|
|
27
|
+
@import "./Nexus.Files.css";
|
|
25
28
|
@import "./Nexus.Form.css";
|
|
29
|
+
@import "./Nexus.Mail.css";
|
|
26
30
|
@import "./Nexus.Markdown.css";
|
|
27
31
|
@import "./Nexus.Menu.css";
|
|
28
32
|
@import "./Nexus.Popup.css";
|
|
33
|
+
@import "./Nexus.Print.css";
|
|
34
|
+
@import "./Nexus.QrCode.css";
|
|
35
|
+
@import "./Nexus.Record.css";
|
|
29
36
|
@import "./Nexus.RichText.css";
|
|
30
37
|
@import "./Nexus.Rows.css";
|
|
31
38
|
@import "./Nexus.Slider.css";
|
|
@@ -139,11 +139,38 @@
|
|
|
139
139
|
font-variant-numeric: tabular-nums;
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
/*
|
|
143
|
+
* A value worked out from other inputs (a form's `compute`): an <output> where an input would be, its text placed as an
|
|
144
|
+
* input's is (in the middle of the box, low in an inbox one) and in the text colour, a long one cut with an ellipsis.
|
|
145
|
+
* Never typed in, so no I-beam; the read-only tint around it comes from the field.
|
|
146
|
+
*/
|
|
147
|
+
.nx-field__control--output {
|
|
148
|
+
display: flex;
|
|
149
|
+
align-items: center;
|
|
150
|
+
overflow: hidden;
|
|
151
|
+
white-space: nowrap;
|
|
152
|
+
cursor: default;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* It fills the box, so the box's `text-align` places it: at the end of a table's number column, as a typed figure is. */
|
|
156
|
+
.nx-field__output-text {
|
|
157
|
+
flex: 1 1 auto;
|
|
158
|
+
min-width: 0;
|
|
159
|
+
overflow: hidden;
|
|
160
|
+
text-overflow: ellipsis;
|
|
161
|
+
}
|
|
162
|
+
|
|
142
163
|
.nx-field__control::placeholder {
|
|
143
164
|
color: var(--nx-text-subtle);
|
|
144
165
|
opacity: 1;
|
|
145
166
|
}
|
|
146
167
|
|
|
168
|
+
/* A read-only field's placeholder is all it shows ("None"), so it reads as text: --nx-text-subtle is under 3:1 on the
|
|
169
|
+
read-only box in light themes, muted text at least 4.5:1. */
|
|
170
|
+
.nx-field[data-readonly] .nx-field__control::placeholder {
|
|
171
|
+
color: var(--nx-text-muted);
|
|
172
|
+
}
|
|
173
|
+
|
|
147
174
|
/* Browser extras that the field replaces with its own buttons. */
|
|
148
175
|
.nx-field__control::-webkit-search-cancel-button,
|
|
149
176
|
.nx-field__control::-webkit-search-decoration {
|
|
@@ -338,6 +365,12 @@
|
|
|
338
365
|
animation: nx-field-nudge 320ms ease-in-out;
|
|
339
366
|
}
|
|
340
367
|
|
|
368
|
+
/* A box pointed at with the same nudge: the one thing to set first, when the cursor is sent to it (a CRUD's Add pressed
|
|
369
|
+
while its narrowing box has nothing picked). */
|
|
370
|
+
.nx-field__box[data-nudge] {
|
|
371
|
+
animation: nx-field-nudge 320ms ease-in-out;
|
|
372
|
+
}
|
|
373
|
+
|
|
341
374
|
@keyframes nx-field-nudge {
|
|
342
375
|
20%,
|
|
343
376
|
60% {
|
|
@@ -425,6 +458,35 @@
|
|
|
425
458
|
font-weight: 500;
|
|
426
459
|
}
|
|
427
460
|
|
|
461
|
+
/*
|
|
462
|
+
* A worked-out input that can be typed in (`compute.solve`): its hint and the line that says what the typed figure set
|
|
463
|
+
* share one place, as tall as the taller of the two and at least a line, so nothing below moves as the line comes and goes.
|
|
464
|
+
*/
|
|
465
|
+
.nx-field__notes {
|
|
466
|
+
display: grid;
|
|
467
|
+
min-width: 0;
|
|
468
|
+
min-height: 1.35em;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.nx-field__notes > * {
|
|
472
|
+
grid-area: 1 / 1;
|
|
473
|
+
min-width: 0;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
.nx-field__note--off {
|
|
477
|
+
visibility: hidden;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.nx-field__note--refused {
|
|
481
|
+
color: var(--nx-danger);
|
|
482
|
+
font-weight: 500;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.nx-field__note .nx-icon {
|
|
486
|
+
margin-inline-end: 5px;
|
|
487
|
+
vertical-align: -0.25em;
|
|
488
|
+
}
|
|
489
|
+
|
|
428
490
|
.nx-field__aside {
|
|
429
491
|
margin-left: auto;
|
|
430
492
|
color: var(--nx-text-muted);
|
|
@@ -577,6 +639,16 @@
|
|
|
577
639
|
resize: vertical;
|
|
578
640
|
}
|
|
579
641
|
|
|
642
|
+
/* Code (`TextArea code`): the editor's monospace, lines kept as typed, a long one scrolled sideways in the box. */
|
|
643
|
+
.nx-field--multiline .nx-field__control--code {
|
|
644
|
+
overflow-x: auto;
|
|
645
|
+
font-family: var(--nx-font-mono);
|
|
646
|
+
font-size: calc(var(--nx-field-font) - 0.5px);
|
|
647
|
+
white-space: pre;
|
|
648
|
+
overflow-wrap: normal;
|
|
649
|
+
tab-size: 2;
|
|
650
|
+
}
|
|
651
|
+
|
|
580
652
|
/* Buttons and the read-only lock sit at the top end, centered on the first line (line height 1.4). */
|
|
581
653
|
.nx-field--multiline .nx-field__actions {
|
|
582
654
|
align-items: flex-start;
|
|
@@ -788,6 +860,7 @@
|
|
|
788
860
|
}
|
|
789
861
|
|
|
790
862
|
[data-nx-motion="reduce"] .nx-field__lock[data-nudge],
|
|
863
|
+
[data-nx-motion="reduce"] .nx-field__box[data-nudge],
|
|
791
864
|
[data-nx-motion="reduce"] .nx-field-notice:popover-open {
|
|
792
865
|
animation: none;
|
|
793
866
|
}
|