@quazardous/qdadm 2.32.0 → 2.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/styles/qdadm.css +1 -1
  2. package/package.json +9 -2
  3. package/src/components/display/EmailPreview.vue +227 -0
  4. package/src/components/display/EntityTimeline.vue +408 -0
  5. package/src/components/display/LogStream.vue +364 -0
  6. package/src/components/display/PayloadDiff.vue +236 -0
  7. package/src/components/display/PayloadViewer.vue +246 -0
  8. package/src/components/index.ts +8 -0
  9. package/src/components/layout/AppLayout.vue +8 -0
  10. package/src/components/tasks/TaskDialog.vue +95 -0
  11. package/src/components/tasks/TaskHost.vue +45 -0
  12. package/src/components/tasks/TaskTray.vue +54 -0
  13. package/src/composables/index.ts +11 -0
  14. package/src/composables/useListPage.filters.ts +26 -1
  15. package/src/composables/useLogStream.ts +264 -0
  16. package/src/email/index.ts +46 -0
  17. package/src/entity/storage/SdkStorage.ts +53 -1
  18. package/src/entity/storage/index.ts +2 -0
  19. package/src/i18n/defaults/core.en.generated.ts +85 -0
  20. package/src/i18n/defaults/core.en.yml +85 -0
  21. package/src/i18n/defaults/core.fr.generated.ts +85 -0
  22. package/src/i18n/defaults/core.fr.yml +85 -0
  23. package/src/index.ts +21 -0
  24. package/src/kernel/Kernel.vue.ts +9 -2
  25. package/src/kernel/Module.ts +3 -2
  26. package/src/modules/debug/DebugModule.ts +3 -1
  27. package/src/modules/debug/styles.generated.css +2895 -0
  28. package/src/notifications/NotificationModule.ts +1 -1
  29. package/src/notifications/{styles.scss → styles.css} +5 -5
  30. package/src/styles/_email.scss +188 -0
  31. package/src/styles/_log-stream.scss +167 -0
  32. package/src/styles/_payload.scss +312 -0
  33. package/src/styles/_tasks.scss +212 -0
  34. package/src/styles/_timeline.scss +229 -0
  35. package/src/styles/index.scss +5 -0
  36. package/src/tasks/taskStore.ts +460 -0
  37. package/src/tasks/useTaskRunner.ts +52 -0
  38. package/src/utils/ansi.ts +127 -0
  39. package/src/utils/email.ts +270 -0
  40. package/src/utils/index.ts +32 -0
  41. package/src/utils/payload.ts +480 -0
@@ -0,0 +1,212 @@
1
+ /**
2
+ * TaskRunner (#4114): follow dialog, typed confirmation, sidebar tray
3
+ */
4
+
5
+ @use 'variables' as *;
6
+
7
+ .qd-task-head {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: 0.75rem;
11
+ margin-bottom: 0.75rem;
12
+ font-size: $font-size-sm;
13
+ }
14
+
15
+ .qd-task-status {
16
+ display: inline-flex;
17
+ align-items: center;
18
+ gap: 0.375rem;
19
+ padding: 0.125rem 0.625rem;
20
+ border-radius: 999px;
21
+ font-weight: 600;
22
+ background: var(--p-blue-50);
23
+ color: var(--p-blue-700);
24
+
25
+ &--succeeded { background: var(--p-green-50); color: var(--p-green-700); }
26
+ &--failed { background: var(--p-red-50); color: var(--p-red-700); }
27
+ &--cancelled { background: var(--p-surface-100); color: var(--p-text-muted-color); }
28
+ }
29
+
30
+ .qd-task-elapsed,
31
+ .qd-task-id {
32
+ color: var(--p-text-muted-color);
33
+ font-variant-numeric: tabular-nums;
34
+ }
35
+
36
+ .qd-task-id {
37
+ margin-left: auto;
38
+ font-family: $font-family-mono;
39
+ font-size: $font-size-xs;
40
+ }
41
+
42
+ .qd-task-progress {
43
+ height: 0.75rem;
44
+ }
45
+
46
+ .qd-task-step {
47
+ margin-top: 0.375rem;
48
+ color: var(--p-text-muted-color);
49
+ font-size: $font-size-sm;
50
+ }
51
+
52
+ .qd-task-log {
53
+ margin-top: 0.75rem;
54
+ }
55
+
56
+ .qd-task-error,
57
+ .qd-task-warning {
58
+ margin-top: 0.75rem;
59
+ padding: 0.5rem 0.75rem;
60
+ border-radius: $radius-sm;
61
+ font-size: $font-size-sm;
62
+ overflow-wrap: anywhere;
63
+ }
64
+
65
+ .qd-task-error {
66
+ background: var(--p-red-50);
67
+ color: var(--p-red-800);
68
+ }
69
+
70
+ .qd-task-warning {
71
+ background: var(--p-orange-50);
72
+ color: var(--p-orange-800);
73
+ }
74
+
75
+ .qd-task-result {
76
+ margin-top: 0.75rem;
77
+ }
78
+
79
+ .qd-task-dialog .p-dialog-footer {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 0.5rem;
83
+ }
84
+
85
+ .qd-task-spacer {
86
+ flex: 1;
87
+ }
88
+
89
+ .qd-task-link {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ gap: 0.375rem;
93
+ font-size: $font-size-sm;
94
+ }
95
+
96
+ .qd-task-confirm-message {
97
+ margin: 0 0 0.75rem;
98
+ }
99
+
100
+ .qd-task-confirm-label {
101
+ display: block;
102
+ margin-bottom: 0.375rem;
103
+ font-size: $font-size-sm;
104
+ }
105
+
106
+ .qd-task-confirm-input {
107
+ width: 100%;
108
+ font-family: $font-family-mono;
109
+ }
110
+
111
+ // --- Tray (in the sidebar) ---
112
+
113
+ .qd-task-tray {
114
+ padding: 0.25rem 0.75rem;
115
+ }
116
+
117
+ .qd-task-tray-button {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 0.5rem;
121
+ width: 100%;
122
+ padding: 0.5rem 0.625rem;
123
+ border: 1px solid var(--p-surface-200);
124
+ border-radius: $radius-sm;
125
+ background: var(--p-surface-0);
126
+ color: inherit;
127
+ font: inherit;
128
+ font-size: $font-size-sm;
129
+ cursor: pointer;
130
+
131
+ &--busy {
132
+ border-color: var(--p-primary-color);
133
+ }
134
+
135
+ &:hover {
136
+ background: var(--p-surface-50);
137
+ }
138
+ }
139
+
140
+ .qd-task-tray-label {
141
+ flex: 1;
142
+ text-align: left;
143
+ min-width: 0;
144
+ overflow: hidden;
145
+ text-overflow: ellipsis;
146
+ white-space: nowrap;
147
+ }
148
+
149
+ .qd-task-tray-count {
150
+ min-width: 1.25rem;
151
+ padding: 0 0.375rem;
152
+ border-radius: 999px;
153
+ background: var(--p-primary-color);
154
+ color: var(--p-primary-contrast-color);
155
+ font-size: $font-size-xs;
156
+ font-weight: 700;
157
+ text-align: center;
158
+ }
159
+
160
+ .qd-task-list {
161
+ list-style: none;
162
+ margin: 0 0 0.25rem;
163
+ padding: 0;
164
+ min-width: 18rem;
165
+ max-width: 24rem;
166
+ }
167
+
168
+ .qd-task-item {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: 0.5rem;
172
+ width: 100%;
173
+ padding: 0.375rem 0.5rem;
174
+ border: none;
175
+ border-radius: $radius-sm;
176
+ background: transparent;
177
+ color: inherit;
178
+ font: inherit;
179
+ font-size: $font-size-sm;
180
+ text-align: left;
181
+ cursor: pointer;
182
+
183
+ &:hover {
184
+ background: var(--p-surface-100);
185
+ }
186
+
187
+ &--succeeded i { color: var(--p-green-600); }
188
+ &--failed i { color: var(--p-red-600); }
189
+ &--cancelled i { color: var(--p-text-muted-color); }
190
+ }
191
+
192
+ .qd-task-item-label {
193
+ flex: 1;
194
+ min-width: 0;
195
+ overflow: hidden;
196
+ text-overflow: ellipsis;
197
+ white-space: nowrap;
198
+ }
199
+
200
+ .qd-task-item-state {
201
+ color: var(--p-text-muted-color);
202
+ font-size: $font-size-xs;
203
+ white-space: nowrap;
204
+ }
205
+
206
+ .sidebar--collapsed .qd-task-tray {
207
+ padding: 0.25rem;
208
+
209
+ .qd-task-tray-label {
210
+ display: none;
211
+ }
212
+ }
@@ -0,0 +1,229 @@
1
+ /**
2
+ * EntityTimeline (#4111)
3
+ * One column; each event's marker carries its actor's colour (--qd-actor).
4
+ */
5
+
6
+ @use 'variables' as *;
7
+
8
+ .qd-timeline {
9
+ position: relative;
10
+ min-width: 0;
11
+ }
12
+
13
+ .qd-timeline-toolbar {
14
+ display: flex;
15
+ flex-wrap: wrap;
16
+ align-items: center;
17
+ gap: 0.5rem;
18
+ margin-bottom: 0.75rem;
19
+ }
20
+
21
+ .qd-timeline-actors,
22
+ .qd-timeline-gaps {
23
+ display: flex;
24
+ flex-wrap: wrap;
25
+ gap: 0.375rem;
26
+ }
27
+
28
+ .qd-timeline-gaps {
29
+ margin-left: auto;
30
+ }
31
+
32
+ .qd-timeline-chip {
33
+ display: inline-flex;
34
+ align-items: center;
35
+ gap: 0.375rem;
36
+ padding: 0.125rem 0.625rem;
37
+ border: 1px solid var(--qd-actor);
38
+ border-radius: 999px;
39
+ background: color-mix(in srgb, var(--qd-actor) 14%, transparent);
40
+ color: var(--p-text-color);
41
+ font-size: $font-size-xs;
42
+ cursor: pointer;
43
+
44
+ i {
45
+ color: var(--qd-actor);
46
+ font-size: 0.75rem;
47
+ }
48
+
49
+ &--off {
50
+ opacity: 0.45;
51
+ background: transparent;
52
+ text-decoration: line-through;
53
+ }
54
+ }
55
+
56
+ .qd-timeline-gap-chip {
57
+ display: inline-flex;
58
+ align-items: center;
59
+ gap: 0.375rem;
60
+ padding: 0.125rem 0.625rem;
61
+ border-radius: 999px;
62
+ background: var(--p-surface-100);
63
+ font-size: $font-size-xs;
64
+ }
65
+
66
+ .qd-timeline-error {
67
+ color: var(--p-red-500);
68
+ margin-bottom: 0.5rem;
69
+ }
70
+
71
+ .qd-timeline-empty {
72
+ color: var(--p-text-muted-color);
73
+ font-style: italic;
74
+ padding: 0.5rem 0;
75
+ }
76
+
77
+ .qd-timeline-list {
78
+ list-style: none;
79
+ margin: 0;
80
+ padding: 0;
81
+ }
82
+
83
+ .qd-timeline-day {
84
+ margin: 0.75rem 0 0.25rem;
85
+ font-size: $font-size-xs;
86
+ font-weight: 600;
87
+ text-transform: uppercase;
88
+ letter-spacing: 0.04em;
89
+ color: var(--p-text-muted-color);
90
+
91
+ &:first-child {
92
+ margin-top: 0;
93
+ }
94
+ }
95
+
96
+ .qd-timeline-event {
97
+ position: relative;
98
+ display: flex;
99
+ gap: 0.75rem;
100
+ padding: 0 0 0.75rem;
101
+
102
+ // The rail
103
+ &::before {
104
+ content: '';
105
+ position: absolute;
106
+ left: 0.875rem;
107
+ top: 1.75rem;
108
+ bottom: 0;
109
+ width: 2px;
110
+ background: var(--p-surface-200);
111
+ }
112
+
113
+ &:last-child::before {
114
+ display: none;
115
+ }
116
+
117
+ &--fresh .qd-timeline-content {
118
+ animation: qd-timeline-flash 2.5s ease-out;
119
+ }
120
+ }
121
+
122
+ @keyframes qd-timeline-flash {
123
+ 0% {
124
+ background: color-mix(in srgb, var(--p-primary-color) 22%, transparent);
125
+ }
126
+ 100% {
127
+ background: transparent;
128
+ }
129
+ }
130
+
131
+ .qd-timeline-since {
132
+ position: absolute;
133
+ left: 2.5rem;
134
+ top: -0.7rem;
135
+ font-size: 0.6875rem;
136
+ color: var(--p-text-muted-color);
137
+ }
138
+
139
+ .qd-timeline-marker {
140
+ flex: none;
141
+ display: inline-flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ width: 1.75rem;
145
+ height: 1.75rem;
146
+ border-radius: 50%;
147
+ background: var(--qd-actor);
148
+ color: #fff;
149
+ font-size: 0.8125rem;
150
+ z-index: 1;
151
+ }
152
+
153
+ .qd-timeline-content {
154
+ flex: 1;
155
+ min-width: 0;
156
+ border-radius: $radius-sm;
157
+ }
158
+
159
+ .qd-timeline-head {
160
+ display: flex;
161
+ flex-wrap: wrap;
162
+ align-items: baseline;
163
+ gap: 0.25rem 0.625rem;
164
+ width: 100%;
165
+ padding: 0.25rem 0.375rem;
166
+ border: none;
167
+ border-radius: $radius-sm;
168
+ background: transparent;
169
+ color: inherit;
170
+ font: inherit;
171
+ text-align: left;
172
+
173
+ &:is(button) {
174
+ cursor: pointer;
175
+
176
+ &:hover {
177
+ background: var(--p-surface-100);
178
+ }
179
+ }
180
+ }
181
+
182
+ .qd-timeline-title {
183
+ font-weight: 600;
184
+
185
+ .qd-timeline-event--danger & {
186
+ color: var(--p-red-600);
187
+ }
188
+ .qd-timeline-event--warn & {
189
+ color: var(--p-orange-600);
190
+ }
191
+ .qd-timeline-event--success & {
192
+ color: var(--p-green-600);
193
+ }
194
+ }
195
+
196
+ .qd-timeline-actor {
197
+ font-size: $font-size-xs;
198
+ color: var(--qd-actor);
199
+ font-weight: 500;
200
+ }
201
+
202
+ .qd-timeline-time {
203
+ margin-left: auto;
204
+ font-size: $font-size-xs;
205
+ color: var(--p-text-muted-color);
206
+ font-variant-numeric: tabular-nums;
207
+ }
208
+
209
+ .qd-timeline-chevron {
210
+ font-size: 0.75rem;
211
+ color: var(--p-text-muted-color);
212
+ }
213
+
214
+ .qd-timeline-detail {
215
+ padding: 0.5rem 0.375rem 0.25rem;
216
+ }
217
+
218
+ .qd-timeline-absolute {
219
+ font-size: $font-size-xs;
220
+ color: var(--p-text-muted-color);
221
+ margin-bottom: 0.5rem;
222
+ }
223
+
224
+ .qd-timeline-new {
225
+ position: absolute;
226
+ left: 50%;
227
+ bottom: 0.75rem;
228
+ transform: translateX(-50%);
229
+ }
@@ -29,6 +29,11 @@
29
29
  @use './buttons';
30
30
  @use './cards';
31
31
  @use './code';
32
+ @use './log-stream';
33
+ @use './timeline';
34
+ @use './payload';
35
+ @use './email';
36
+ @use './tasks';
32
37
  @use './dialogs';
33
38
  @use './markdown';
34
39
  @use './show-pages';