@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
@@ -34,7 +34,7 @@ export class NotificationModule extends Module {
34
34
  static override requires: string[] = []
35
35
  static override priority = 5 // Before toast-bridge (10) to intercept first
36
36
 
37
- static override styles = () => import('./styles.scss')
37
+ static override styles = () => import('./styles.css')
38
38
 
39
39
  async connect(ctx: KernelContext): Promise<void> {
40
40
  // Define notification zones
@@ -5,9 +5,9 @@
5
5
  * Panel and badge styles are scoped in their respective Vue components.
6
6
  */
7
7
 
8
- /* Timing values match _sidebar.scss sidebar-box-content-* variables */
9
- $_content-delay: 0.2s;
10
- $_content-duration: 0.1s;
8
+ /* Timing (0.1s after a 0.2s delay) matches the sidebar-box-content-* variables
9
+ of _sidebar.scss. Plain CSS (#4140): an app must not need sass for a module
10
+ the kernel injects by itself. */
11
11
 
12
12
  /* =============================================================================
13
13
  Notification Status Zone (always visible below footer in sidebar)
@@ -15,14 +15,14 @@ $_content-duration: 0.1s;
15
15
 
16
16
  .sidebar-notification-status {
17
17
  opacity: 1;
18
- transition: opacity $_content-duration ease $_content-delay;
18
+ transition: opacity 0.1s ease 0.2s;
19
19
  }
20
20
 
21
21
  /* Status label: delayed fade-in on expand, instant hide on collapse.
22
22
  Matches SidebarBox content behavior (.sidebar-box-content). */
23
23
  .sidebar-notification-status .status-label {
24
24
  opacity: 1;
25
- transition: opacity $_content-duration ease $_content-delay;
25
+ transition: opacity 0.1s ease 0.2s;
26
26
  }
27
27
 
28
28
  .sidebar--collapsed .sidebar-notification-status .status-label {
@@ -0,0 +1,188 @@
1
+ /**
2
+ * EmailPreview (#4113)
3
+ */
4
+
5
+ @use 'variables' as *;
6
+
7
+ .qd-email {
8
+ border: 1px solid var(--p-surface-200);
9
+ border-radius: $radius-sm;
10
+ overflow: hidden;
11
+ min-width: 0;
12
+ background: var(--p-surface-0);
13
+ }
14
+
15
+ .qd-email-head {
16
+ padding: 0.75rem 1rem 0.5rem;
17
+ border-bottom: 1px solid var(--p-surface-200);
18
+ }
19
+
20
+ .qd-email-subject {
21
+ margin: 0 0 0.5rem;
22
+ font-size: 1.0625rem;
23
+ font-weight: 600;
24
+ overflow-wrap: anywhere;
25
+ }
26
+
27
+ .qd-email-main {
28
+ display: grid;
29
+ grid-template-columns: max-content minmax(0, 1fr);
30
+ gap: 0.125rem 0.75rem;
31
+ margin: 0;
32
+ font-size: $font-size-sm;
33
+
34
+ dt {
35
+ color: var(--p-text-muted-color);
36
+ }
37
+
38
+ dd {
39
+ margin: 0;
40
+ overflow-wrap: anywhere;
41
+ }
42
+ }
43
+
44
+ .qd-email-headers {
45
+ margin-top: 0.5rem;
46
+ font-size: $font-size-xs;
47
+
48
+ summary {
49
+ cursor: pointer;
50
+ color: var(--p-text-muted-color);
51
+ }
52
+
53
+ table {
54
+ margin-top: 0.25rem;
55
+ border-collapse: collapse;
56
+ font-family: $font-family-mono;
57
+ }
58
+
59
+ th {
60
+ padding: 0.0625rem 1rem 0.0625rem 0;
61
+ text-align: left;
62
+ font-weight: 600;
63
+ white-space: nowrap;
64
+ vertical-align: top;
65
+ }
66
+
67
+ td {
68
+ overflow-wrap: anywhere;
69
+ }
70
+ }
71
+
72
+ .qd-email-warning {
73
+ padding: 0.375rem 1rem;
74
+ background: var(--p-orange-50);
75
+ color: var(--p-orange-800);
76
+ font-size: $font-size-sm;
77
+ }
78
+
79
+ .qd-email-tabs {
80
+ display: flex;
81
+ flex-wrap: wrap;
82
+ align-items: center;
83
+ gap: 0.25rem;
84
+ padding: 0 0.5rem;
85
+ border-bottom: 1px solid var(--p-surface-200);
86
+ font-size: $font-size-sm;
87
+ }
88
+
89
+ .qd-email-tab {
90
+ padding: 0.5rem 0.75rem;
91
+ border: none;
92
+ border-bottom: 2px solid transparent;
93
+ background: transparent;
94
+ color: var(--p-text-muted-color);
95
+ font: inherit;
96
+ cursor: pointer;
97
+
98
+ &--active {
99
+ border-bottom-color: var(--p-primary-color);
100
+ color: var(--p-text-color);
101
+ font-weight: 600;
102
+ }
103
+ }
104
+
105
+ .qd-email-spacer {
106
+ flex: 1;
107
+ }
108
+
109
+ .qd-email-blocked {
110
+ color: var(--p-text-muted-color);
111
+ font-size: $font-size-xs;
112
+ }
113
+
114
+ .qd-email-frame-wrap {
115
+ resize: vertical;
116
+ overflow: hidden;
117
+ min-height: 8rem;
118
+ background: #fff;
119
+ }
120
+
121
+ .qd-email-frame {
122
+ display: block;
123
+ width: 100%;
124
+ height: 100%;
125
+ border: 0;
126
+ }
127
+
128
+ .qd-email-text {
129
+ margin: 0;
130
+ padding: 0.75rem 1rem;
131
+ max-height: 32rem;
132
+ overflow: auto;
133
+ white-space: pre-wrap;
134
+ overflow-wrap: anywhere;
135
+ font-family: $font-family-mono;
136
+ font-size: 0.8125rem;
137
+ }
138
+
139
+ .qd-email-source {
140
+ white-space: pre;
141
+ }
142
+
143
+ .qd-email-empty {
144
+ padding: 0.75rem 1rem;
145
+ color: var(--p-text-muted-color);
146
+ font-style: italic;
147
+ }
148
+
149
+ .qd-email-attachments {
150
+ list-style: none;
151
+ margin: 0;
152
+ padding: 0.25rem 0.5rem;
153
+ border-top: 1px solid var(--p-surface-200);
154
+ }
155
+
156
+ .qd-email-attachment {
157
+ display: flex;
158
+ align-items: center;
159
+ gap: 0.5rem;
160
+ padding: 0.25rem;
161
+ font-size: $font-size-sm;
162
+ min-width: 0;
163
+ }
164
+
165
+ .qd-email-thumb {
166
+ width: 2.5rem;
167
+ height: 2.5rem;
168
+ object-fit: cover;
169
+ border-radius: $radius-sm;
170
+ border: 1px solid var(--p-surface-200);
171
+ }
172
+
173
+ .qd-email-clip {
174
+ width: 2.5rem;
175
+ text-align: center;
176
+ color: var(--p-text-muted-color);
177
+ }
178
+
179
+ .qd-email-att-name {
180
+ font-weight: 500;
181
+ overflow-wrap: anywhere;
182
+ }
183
+
184
+ .qd-email-att-meta {
185
+ flex: 1;
186
+ color: var(--p-text-muted-color);
187
+ font-size: $font-size-xs;
188
+ }
@@ -0,0 +1,167 @@
1
+ /**
2
+ * LogStream (#4110)
3
+ * A terminal-like panel: dark in both themes, as logs are read.
4
+ */
5
+
6
+ @use 'variables' as *;
7
+
8
+ .qd-log-stream {
9
+ --qd-log-bg: #1e1e1e;
10
+ --qd-log-fg: #d4d4d4;
11
+ --qd-log-muted: #858585;
12
+ --qd-log-mark: rgba(255, 213, 79, 0.45);
13
+ --qd-log-error-bg: rgba(241, 76, 76, 0.14);
14
+ --qd-log-current: rgba(59, 142, 234, 0.3);
15
+
16
+ position: relative;
17
+ display: flex;
18
+ flex-direction: column;
19
+ border: 1px solid var(--p-surface-300);
20
+ border-radius: $radius-sm;
21
+ overflow: hidden;
22
+ min-width: 0;
23
+ }
24
+
25
+ .qd-log-toolbar {
26
+ display: flex;
27
+ flex-wrap: wrap;
28
+ align-items: center;
29
+ gap: 0.25rem 0.5rem;
30
+ padding: 0.25rem 0.5rem;
31
+ background: var(--p-surface-50);
32
+ border-bottom: 1px solid var(--p-surface-200);
33
+ font-size: $font-size-sm;
34
+ }
35
+
36
+ .qd-log-spacer-x {
37
+ flex: 1;
38
+ }
39
+
40
+ .qd-log-status {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ gap: 0.375rem;
44
+ font-weight: 500;
45
+ }
46
+
47
+ .qd-log-status-dot {
48
+ width: 0.5rem;
49
+ height: 0.5rem;
50
+ border-radius: 50%;
51
+ background: var(--p-surface-400);
52
+
53
+ .qd-log-status--streaming & {
54
+ background: var(--p-green-500);
55
+ animation: qd-log-pulse 1.2s ease-in-out infinite;
56
+ }
57
+ .qd-log-status--done & {
58
+ background: var(--p-blue-500);
59
+ }
60
+ .qd-log-status--error & {
61
+ background: var(--p-red-500);
62
+ }
63
+ }
64
+
65
+ @keyframes qd-log-pulse {
66
+ 50% {
67
+ opacity: 0.3;
68
+ }
69
+ }
70
+
71
+ .qd-log-count,
72
+ .qd-log-search-count {
73
+ color: var(--p-text-muted-color);
74
+ font-size: $font-size-xs;
75
+ font-variant-numeric: tabular-nums;
76
+ }
77
+
78
+ .qd-log-search {
79
+ display: inline-flex;
80
+ align-items: center;
81
+ gap: 0.125rem;
82
+
83
+ .p-inputtext {
84
+ width: 12rem;
85
+ max-width: 40vw;
86
+ }
87
+ }
88
+
89
+ .qd-log-viewport {
90
+ overflow: auto;
91
+ background: var(--qd-log-bg);
92
+ color: var(--qd-log-fg);
93
+ font-family: $font-family-mono;
94
+ font-size: 0.8125rem;
95
+ line-height: var(--qd-log-line-height, 20px);
96
+ outline: none;
97
+ }
98
+
99
+ .qd-log-empty {
100
+ padding: 0.75rem 1rem;
101
+ color: var(--qd-log-muted);
102
+ font-style: italic;
103
+ }
104
+
105
+ .qd-log-line {
106
+ display: flex;
107
+ height: var(--qd-log-line-height, 20px);
108
+ white-space: pre;
109
+ padding-right: 0.75rem;
110
+
111
+ &--error {
112
+ background: var(--qd-log-error-bg);
113
+ }
114
+ &--current {
115
+ background: var(--qd-log-current);
116
+ }
117
+
118
+ .qd-log-stream--wrap & {
119
+ height: auto;
120
+ min-height: var(--qd-log-line-height, 20px);
121
+ white-space: pre-wrap;
122
+ word-break: break-word;
123
+ content-visibility: auto;
124
+ contain-intrinsic-size: auto var(--qd-log-line-height, 20px);
125
+ }
126
+ }
127
+
128
+ .qd-log-n {
129
+ flex: none;
130
+ min-width: 3.5rem;
131
+ padding: 0 0.75rem 0 0.5rem;
132
+ text-align: right;
133
+ color: var(--qd-log-muted);
134
+ user-select: none;
135
+ }
136
+
137
+ .qd-log-text {
138
+ flex: 1;
139
+ min-width: 0;
140
+ }
141
+
142
+ .qd-log-ts {
143
+ color: var(--qd-log-muted);
144
+ }
145
+
146
+ .qd-log-mark {
147
+ background: var(--qd-log-mark);
148
+ border-radius: 2px;
149
+ }
150
+
151
+ .qd-log-resume {
152
+ position: absolute;
153
+ bottom: 0.75rem;
154
+ left: 50%;
155
+ transform: translateX(-50%);
156
+ display: inline-flex;
157
+ align-items: center;
158
+ gap: 0.375rem;
159
+ padding: 0.25rem 0.75rem;
160
+ border: none;
161
+ border-radius: 999px;
162
+ background: var(--p-primary-color);
163
+ color: var(--p-primary-contrast-color);
164
+ font-size: $font-size-xs;
165
+ cursor: pointer;
166
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
167
+ }
@@ -0,0 +1,312 @@
1
+ /**
2
+ * PayloadViewer / PayloadDiff (#4112)
3
+ */
4
+
5
+ @use 'variables' as *;
6
+
7
+ .qd-payload {
8
+ --pl-tag: #22863a;
9
+ --pl-attr: #6f42c1;
10
+ --pl-value: #032f62;
11
+ --pl-comment: #6a737d;
12
+ --pl-ins-bg: rgba(46, 160, 67, 0.16);
13
+ --pl-del-bg: rgba(248, 81, 73, 0.16);
14
+
15
+ border: 1px solid var(--p-surface-200);
16
+ border-radius: $radius-sm;
17
+ overflow: hidden;
18
+ min-width: 0;
19
+ background: var(--p-surface-0);
20
+ }
21
+
22
+ .qd-payload-request {
23
+ padding: 0.5rem 0.75rem;
24
+ border-bottom: 1px solid var(--p-surface-200);
25
+ background: var(--p-surface-50);
26
+ font-size: $font-size-sm;
27
+ }
28
+
29
+ .qd-payload-line {
30
+ display: flex;
31
+ flex-wrap: wrap;
32
+ align-items: center;
33
+ gap: 0.5rem;
34
+ min-width: 0;
35
+ }
36
+
37
+ .pl-method {
38
+ font-weight: 700;
39
+ font-family: $font-family-mono;
40
+ }
41
+
42
+ .pl-url {
43
+ font-family: $font-family-mono;
44
+ word-break: break-all;
45
+ min-width: 0;
46
+ }
47
+
48
+ .pl-status {
49
+ padding: 0 0.5rem;
50
+ border-radius: 999px;
51
+ font-weight: 600;
52
+ font-size: $font-size-xs;
53
+ background: var(--p-surface-200);
54
+
55
+ &--ok { background: var(--p-green-100); color: var(--p-green-800); }
56
+ &--info { background: var(--p-blue-100); color: var(--p-blue-800); }
57
+ &--warn { background: var(--p-orange-100); color: var(--p-orange-800); }
58
+ &--error { background: var(--p-red-100); color: var(--p-red-800); }
59
+ }
60
+
61
+ .qd-payload-headers {
62
+ margin-top: 0.375rem;
63
+
64
+ summary {
65
+ cursor: pointer;
66
+ color: var(--p-text-muted-color);
67
+ }
68
+
69
+ table {
70
+ margin-top: 0.25rem;
71
+ border-collapse: collapse;
72
+ font-family: $font-family-mono;
73
+ font-size: $font-size-xs;
74
+ }
75
+
76
+ th {
77
+ text-align: left;
78
+ padding: 0.125rem 1rem 0.125rem 0;
79
+ font-weight: 600;
80
+ white-space: nowrap;
81
+ vertical-align: top;
82
+ }
83
+
84
+ td {
85
+ word-break: break-all;
86
+ }
87
+ }
88
+
89
+ .qd-payload-toolbar {
90
+ display: flex;
91
+ align-items: center;
92
+ flex-wrap: wrap;
93
+ gap: 0.5rem;
94
+ padding: 0.125rem 0.5rem;
95
+ border-bottom: 1px solid var(--p-surface-200);
96
+ font-size: $font-size-xs;
97
+ }
98
+
99
+ .qd-payload-format {
100
+ font-weight: 700;
101
+ letter-spacing: 0.05em;
102
+ color: var(--p-text-muted-color);
103
+ }
104
+
105
+ .qd-payload-size {
106
+ color: var(--p-text-muted-color);
107
+ }
108
+
109
+ .qd-payload-spacer {
110
+ flex: 1;
111
+ }
112
+
113
+ .qd-payload-check {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ gap: 0.25rem;
117
+ cursor: pointer;
118
+ }
119
+
120
+ .qd-payload-warning,
121
+ .qd-payload-identical {
122
+ padding: 0.375rem 0.75rem;
123
+ font-size: $font-size-sm;
124
+ }
125
+
126
+ .qd-payload-warning {
127
+ background: var(--p-orange-50);
128
+ color: var(--p-orange-800);
129
+ }
130
+
131
+ .qd-payload-identical {
132
+ background: var(--p-green-50);
133
+ color: var(--p-green-800);
134
+ }
135
+
136
+ .qd-payload-body {
137
+ overflow: auto;
138
+
139
+ .json-viewer {
140
+ border: none;
141
+ border-radius: 0;
142
+ }
143
+ }
144
+
145
+ .qd-payload-code {
146
+ margin: 0;
147
+ padding: 0.5rem 0.75rem 0.5rem 0;
148
+ font-family: $font-family-mono;
149
+ font-size: 0.8125rem;
150
+ line-height: 1.5;
151
+ white-space: pre;
152
+ }
153
+
154
+ .pl-n {
155
+ display: inline-block;
156
+ min-width: 3rem;
157
+ padding-right: 0.75rem;
158
+ text-align: right;
159
+ color: var(--p-text-muted-color);
160
+ user-select: none;
161
+ }
162
+
163
+ .pl-tag { color: var(--pl-tag); }
164
+ .pl-attr { color: var(--pl-attr); }
165
+ .pl-value { color: var(--pl-value); }
166
+ .pl-punct { color: var(--p-text-muted-color); }
167
+ .pl-comment, .pl-decl { color: var(--pl-comment); font-style: italic; }
168
+ .pl-cdata { color: var(--pl-comment); }
169
+
170
+ .qd-payload-table-wrap {
171
+ min-width: 0;
172
+ }
173
+
174
+ .qd-payload-table {
175
+ border-collapse: collapse;
176
+ font-size: $font-size-sm;
177
+ width: max-content;
178
+ min-width: 100%;
179
+
180
+ th,
181
+ td {
182
+ padding: 0.25rem 0.75rem;
183
+ border-bottom: 1px solid var(--p-surface-100);
184
+ text-align: left;
185
+ vertical-align: top;
186
+ white-space: pre-wrap;
187
+ }
188
+
189
+ thead th {
190
+ position: sticky;
191
+ top: 0;
192
+ background: var(--p-surface-50);
193
+ font-weight: 600;
194
+ }
195
+
196
+ .pl-n {
197
+ display: table-cell;
198
+ min-width: 0;
199
+ }
200
+ }
201
+
202
+ .qd-payload-kv th {
203
+ font-family: $font-family-mono;
204
+ font-weight: 600;
205
+ white-space: nowrap;
206
+ }
207
+
208
+ .qd-payload-more {
209
+ display: block;
210
+ width: 100%;
211
+ padding: 0.375rem;
212
+ border: none;
213
+ background: var(--p-surface-50);
214
+ color: var(--p-primary-color);
215
+ cursor: pointer;
216
+ }
217
+
218
+ .qd-payload-binary p {
219
+ margin: 0.5rem 0.75rem;
220
+ font-size: $font-size-sm;
221
+ }
222
+
223
+ // --- Diff ---
224
+
225
+ .pl-count {
226
+ font-weight: 700;
227
+ font-variant-numeric: tabular-nums;
228
+
229
+ &--add { color: var(--p-green-600); }
230
+ &--del { color: var(--p-red-600); }
231
+ &--chg { color: var(--p-orange-600); }
232
+ }
233
+
234
+ .pl-diff {
235
+ width: 100%;
236
+ border-collapse: collapse;
237
+ table-layout: fixed;
238
+ font-family: $font-family-mono;
239
+ font-size: 0.8125rem;
240
+ line-height: 1.5;
241
+
242
+ th {
243
+ padding: 0.25rem 0.75rem;
244
+ background: var(--p-surface-50);
245
+ font-family: var(--p-font-family, inherit);
246
+ font-size: $font-size-xs;
247
+ text-align: left;
248
+ }
249
+
250
+ td {
251
+ padding: 0 0.5rem;
252
+ white-space: pre-wrap;
253
+ word-break: break-all;
254
+ vertical-align: top;
255
+ }
256
+
257
+ td.pl-n {
258
+ display: table-cell;
259
+ width: 3rem;
260
+ min-width: 0;
261
+ }
262
+
263
+ .pl-sign {
264
+ width: 1rem;
265
+ padding: 0;
266
+ text-align: center;
267
+ }
268
+ }
269
+
270
+ .pl-diff--split td:nth-child(3) {
271
+ border-left: 1px solid var(--p-surface-200);
272
+ }
273
+
274
+ .pl-ins,
275
+ tr.pl-ins td {
276
+ background: var(--pl-ins-bg);
277
+ }
278
+
279
+ .pl-del,
280
+ tr.pl-del td {
281
+ background: var(--pl-del-bg);
282
+ }
283
+
284
+ .pl-empty {
285
+ background: repeating-linear-gradient(45deg, transparent 0 4px, var(--p-surface-100) 4px 8px);
286
+ }
287
+
288
+ .pl-fold td {
289
+ padding: 0;
290
+
291
+ button {
292
+ width: 100%;
293
+ padding: 0.125rem;
294
+ border: none;
295
+ background: var(--p-surface-100);
296
+ color: var(--p-text-muted-color);
297
+ font-size: $font-size-xs;
298
+ cursor: pointer;
299
+ }
300
+ }
301
+
302
+ .pl-csv-diff {
303
+ .pl-row--added td { background: var(--pl-ins-bg); }
304
+ .pl-row--removed td { background: var(--pl-del-bg); }
305
+
306
+ .pl-cell--changed {
307
+ background: color-mix(in srgb, var(--p-orange-400) 18%, transparent);
308
+
309
+ del { color: var(--p-red-700); }
310
+ ins { color: var(--p-green-700); text-decoration: none; font-weight: 600; }
311
+ }
312
+ }