@elevasis/ui 2.14.0 → 2.14.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.
@@ -1,7 +1,7 @@
1
- import { CollapsibleSidebarGroup } from '../chunk-4BF74JVD.js';
2
1
  import { useBreadcrumbs } from '../chunk-MG3NF7QL.js';
3
- export { AllTasksPage, HealthStatusCard, MilestoneTimeline, ProjectDetailPage, ProjectsListPage, ProjectsSidebar, ProjectsSidebarMiddle, ProjectsSidebarTop, TaskCard, UpcomingMilestonesPage, calculateProgress, deliveryManifest, formatStatusLabel, milestoneStatusColors, noteTypeColors, projectStatusColors, taskStatusColors, taskTypeColors } from '../chunk-QFEQWAPQ.js';
4
- export { LEAD_GEN_ROUTE_LINKS, LIST_TEMPLATE_OPTIONS, LeadGenCompaniesPage, LeadGenContactsPage, LeadGenDeliverabilityPage, LeadGenListDetailPage, LeadGenListsPage, LeadGenOverviewPage, LeadGenRouteShell, LeadGenSidebar, LeadGenSidebarMiddle, LeadGenSidebarTop, buildListConfig, getEnrichmentColor, getStatusColor, leadGenManifest, useDeleteLists } from '../chunk-QFBENUS2.js';
2
+ import { CollapsibleSidebarGroup } from '../chunk-4BF74JVD.js';
3
+ export { AllTasksPage, HealthStatusCard, MilestoneTimeline, ProjectDetailPage, ProjectsListPage, ProjectsSidebar, ProjectsSidebarMiddle, ProjectsSidebarTop, TaskCard, UpcomingMilestonesPage, calculateProgress, deliveryManifest, formatStatusLabel, milestoneStatusColors, noteTypeColors, projectStatusColors, taskStatusColors, taskTypeColors } from '../chunk-F2GI5TQT.js';
4
+ export { LEAD_GEN_ROUTE_LINKS, LIST_TEMPLATE_OPTIONS, LeadGenCompaniesPage, LeadGenContactsPage, LeadGenDeliverabilityPage, LeadGenListDetailPage, LeadGenListsPage, LeadGenOverviewPage, LeadGenRouteShell, LeadGenSidebar, LeadGenSidebarMiddle, LeadGenSidebarTop, buildListConfig, getEnrichmentColor, getStatusColor, leadGenManifest, useDeleteLists } from '../chunk-JL7RHMV2.js';
5
5
  export { ActionModal, AgentDefinitionDisplay, AgentExecutionLogs, BaseExecutionLogs, BaseExecutionLogsHeader, BaseExecutionLogsStates, CheckpointGroup, CollapsibleJsonSection, CommandQueueSidebar, CommandQueueSidebarMiddle, CommandQueueSidebarTop, CommandQueueTaskRow, ConfigCard, ContentSections, ContextUsageBadge, ContractDisplay, ExecutionErrorSection, LogEntry, LogGroup, NewKnowledgeMapEdge, NewKnowledgeMapGraph, NewKnowledgeMapNode, OperationsSidebar, OperationsSidebarMiddle, OperationsSidebarTop, ResourceDefinitionSection, ResourceErrorState, ResourceFilter, ResourceHeader, ResourceNotFoundState, SessionMemory, ToolsListDisplay, WorkflowDefinitionDisplay, WorkflowExecutionLogs, getExecutionStatusConfig, getIcon, getLogLevelConfig, iconMap, operationsManifest, useNewKnowledgeMapLayout } from '../chunk-C56A2MAS.js';
6
6
  import '../chunk-ROSMICXG.js';
7
7
  import { SubshellLoader } from '../chunk-ADSSLKKP.js';
@@ -11,9 +11,9 @@ export { ActivityCard, ActivityFilters as ActivityFiltersBar, ActivityTable, Bus
11
11
  export { ResourceHealthPanel } from '../chunk-ETQRV5A6.js';
12
12
  export { SEOSidebar, SEOSidebarMiddle, SEOSidebarTop, seoManifest } from '../chunk-AL23U6C3.js';
13
13
  export { CreateCredentialModal, CredentialList, CredentialSettings, MembershipFeaturePanel, MembershipStatusBadge, OAuthConnectModal, OrganizationMembershipsList, WebhookUrlDisplayModal, settingsManifest } from '../chunk-A7346I7H.js';
14
- export { ActivityFeedWidget, CrmOverview, CrmSidebar, CrmSidebarMiddle, CrmSidebarTop, DealDetailPage, DealsListPage, MetricsStrip, MyTasksPanel, PIPELINE_FUNNEL_ORDER, PipelineFunnelWidget, QuickCreateActions, SAVED_VIEW_PRESETS, SavedViewsPanel, TasksDueWidget, crmManifest, useCrmPipelineSummary, useCrmQuickMetrics, useRecentCrmActivity } from '../chunk-PPKJKM3U.js';
15
- export { SortableHeader, TableSelectionToolbar } from '../chunk-TUMSNGTX.js';
14
+ export { ActivityFeedWidget, CrmOverview, CrmSidebar, CrmSidebarMiddle, CrmSidebarTop, DealDetailPage, DealsListPage, MetricsStrip, MyTasksPanel, PIPELINE_FUNNEL_ORDER, PipelineFunnelWidget, QuickCreateActions, SAVED_VIEW_PRESETS, SavedViewsPanel, TasksDueWidget, crmManifest, useCrmPipelineSummary, useCrmQuickMetrics, useRecentCrmActivity } from '../chunk-NPWJYY4B.js';
16
15
  import { PageContainer } from '../chunk-BZZCNLT6.js';
16
+ export { SortableHeader, TableSelectionToolbar } from '../chunk-TUMSNGTX.js';
17
17
  import { SubshellNavItem } from '../chunk-CEWTOKE7.js';
18
18
  import '../chunk-IIMU5YAJ.js';
19
19
  import { FilterBar } from '../chunk-PDHTXPSF.js';
@@ -53,8 +53,8 @@ import '../chunk-ELJIFLCB.js';
53
53
  import '../chunk-L4XXM55J.js';
54
54
  import '../chunk-FL67C3WY.js';
55
55
  import { useAppearance } from '../chunk-QJ2KCHKX.js';
56
- import '../chunk-DT3QYZVU.js';
57
56
  import '../chunk-SLVC5OJ2.js';
57
+ import '../chunk-DT3QYZVU.js';
58
58
  import '../chunk-RNP5R5I3.js';
59
59
  import { getResourceIcon, getResourceColor, formatDateTime, PAGE_SIZE_DEFAULT, formatTimeAgo } from '../chunk-IOKL7BKE.js';
60
60
  import '../chunk-MTJ43R2E.js';
@@ -1,7 +1,7 @@
1
1
  import { AppShellLoader, AppShellError } from '../../chunk-M25JL54Z.js';
2
2
  import { useAppearance } from '../../chunk-QJ2KCHKX.js';
3
- import '../../chunk-DT3QYZVU.js';
4
3
  import '../../chunk-SLVC5OJ2.js';
4
+ import '../../chunk-DT3QYZVU.js';
5
5
  import '../../chunk-RNP5R5I3.js';
6
6
  import { ProtectedRoute, AdminGuard } from '../../chunk-MTJ43R2E.js';
7
7
  import { useInitialization } from '../../chunk-TUXTSEAF.js';
@@ -1,6 +1,6 @@
1
- export { ActivityFeedWidget, CRM_ITEMS, CompanyDetailPage, CrmOverview, CrmSidebar, CrmSidebarMiddle, CrmSidebarTop, DEAL_STAGE_COLORS, DEAL_STAGE_OPTIONS, DealDetailPage, DealsListPage, MetricsStrip, MyTasksPanel, PIPELINE_FUNNEL_ORDER, PipelineFunnelWidget, QuickCreateActions, SAVED_VIEW_PRESETS, SavedViewsPanel, TasksDueWidget, crmManifest, formatDealStageLabel, useCrmPipelineSummary, useCrmQuickMetrics, useRecentCrmActivity } from '../../chunk-PPKJKM3U.js';
2
- import '../../chunk-TUMSNGTX.js';
1
+ export { ActivityFeedWidget, CRM_ITEMS, CompanyDetailPage, CrmOverview, CrmSidebar, CrmSidebarMiddle, CrmSidebarTop, DEAL_STAGE_COLORS, DEAL_STAGE_OPTIONS, DealDetailPage, DealsListPage, MetricsStrip, MyTasksPanel, PIPELINE_FUNNEL_ORDER, PipelineFunnelWidget, QuickCreateActions, SAVED_VIEW_PRESETS, SavedViewsPanel, TasksDueWidget, crmManifest, formatDealStageLabel, useCrmPipelineSummary, useCrmQuickMetrics, useRecentCrmActivity } from '../../chunk-NPWJYY4B.js';
3
2
  import '../../chunk-BZZCNLT6.js';
3
+ import '../../chunk-TUMSNGTX.js';
4
4
  import '../../chunk-CEWTOKE7.js';
5
5
  import '../../chunk-IIMU5YAJ.js';
6
6
  import '../../chunk-PDHTXPSF.js';
@@ -28,8 +28,8 @@ import '../../chunk-ELJIFLCB.js';
28
28
  import '../../chunk-L4XXM55J.js';
29
29
  import '../../chunk-FL67C3WY.js';
30
30
  import '../../chunk-QJ2KCHKX.js';
31
- import '../../chunk-DT3QYZVU.js';
32
31
  import '../../chunk-SLVC5OJ2.js';
32
+ import '../../chunk-DT3QYZVU.js';
33
33
  import '../../chunk-RNP5R5I3.js';
34
34
  import '../../chunk-IOKL7BKE.js';
35
35
  import '../../chunk-MTJ43R2E.js';
@@ -26,8 +26,8 @@ import '../../chunk-ELJIFLCB.js';
26
26
  import '../../chunk-L4XXM55J.js';
27
27
  import '../../chunk-FL67C3WY.js';
28
28
  import '../../chunk-QJ2KCHKX.js';
29
- import '../../chunk-DT3QYZVU.js';
30
29
  import '../../chunk-SLVC5OJ2.js';
30
+ import '../../chunk-DT3QYZVU.js';
31
31
  import '../../chunk-RNP5R5I3.js';
32
32
  import '../../chunk-IOKL7BKE.js';
33
33
  import '../../chunk-MTJ43R2E.js';
@@ -1,7 +1,7 @@
1
- export { AllTasksPage, Checklist, CreateDeliveryEntityModal, DELIVERY_COMMUNICATION_ITEMS, DELIVERY_PROJECT_ITEMS, DELIVERY_WORK_ITEMS, HealthStatusCard, MilestoneTimeline, ProjectDetailPage, ProjectsListPage, ProjectsSidebar, ProjectsSidebarMiddle, ProjectsSidebarTop, TaskCard, UpcomingMilestonesPage, calculateProgress, deliveryManifest, formatStatusLabel, milestoneStatusColors, noteTypeColors, projectStatusColors, taskStatusColors, taskTypeColors } from '../../chunk-QFEQWAPQ.js';
1
+ export { AllTasksPage, Checklist, CreateDeliveryEntityModal, DELIVERY_COMMUNICATION_ITEMS, DELIVERY_PROJECT_ITEMS, DELIVERY_WORK_ITEMS, HealthStatusCard, MilestoneTimeline, ProjectDetailPage, ProjectsListPage, ProjectsSidebar, ProjectsSidebarMiddle, ProjectsSidebarTop, TaskCard, UpcomingMilestonesPage, calculateProgress, deliveryManifest, formatStatusLabel, milestoneStatusColors, noteTypeColors, projectStatusColors, taskStatusColors, taskTypeColors } from '../../chunk-F2GI5TQT.js';
2
2
  import '../../chunk-442LZPIR.js';
3
- import '../../chunk-TUMSNGTX.js';
4
3
  import '../../chunk-BZZCNLT6.js';
4
+ import '../../chunk-TUMSNGTX.js';
5
5
  import '../../chunk-CEWTOKE7.js';
6
6
  import '../../chunk-IIMU5YAJ.js';
7
7
  import '../../chunk-PDHTXPSF.js';
@@ -29,8 +29,8 @@ import '../../chunk-ELJIFLCB.js';
29
29
  import '../../chunk-L4XXM55J.js';
30
30
  import '../../chunk-FL67C3WY.js';
31
31
  import '../../chunk-QJ2KCHKX.js';
32
- import '../../chunk-DT3QYZVU.js';
33
32
  import '../../chunk-SLVC5OJ2.js';
33
+ import '../../chunk-DT3QYZVU.js';
34
34
  import '../../chunk-RNP5R5I3.js';
35
35
  import '../../chunk-IOKL7BKE.js';
36
36
  import '../../chunk-MTJ43R2E.js';
@@ -1,11 +1,11 @@
1
- export { CompanyDetailModal, ContactDetailModal, LEAD_GEN_ITEMS, LEAD_GEN_ROUTE_LINKS, LIST_TEMPLATE_OPTIONS, LeadGenCompaniesPage, LeadGenContactsPage, LeadGenDeliverabilityPage, LeadGenListDetailPage, LeadGenListsPage, LeadGenOverviewPage, LeadGenRouteShell, LeadGenSidebar, LeadGenSidebarMiddle, LeadGenSidebarTop, buildListConfig, formatDate, getEnrichmentColor, getEnrichmentStatus, getStatusColor, leadGenManifest, useDeleteLists } from '../../chunk-QFBENUS2.js';
1
+ export { CompanyDetailModal, ContactDetailModal, LEAD_GEN_ITEMS, LEAD_GEN_ROUTE_LINKS, LIST_TEMPLATE_OPTIONS, LeadGenCompaniesPage, LeadGenContactsPage, LeadGenDeliverabilityPage, LeadGenListDetailPage, LeadGenListsPage, LeadGenOverviewPage, LeadGenRouteShell, LeadGenSidebar, LeadGenSidebarMiddle, LeadGenSidebarTop, buildListConfig, formatDate, getEnrichmentColor, getEnrichmentStatus, getStatusColor, leadGenManifest, useDeleteLists } from '../../chunk-JL7RHMV2.js';
2
2
  import '../../chunk-C56A2MAS.js';
3
3
  import '../../chunk-ROSMICXG.js';
4
4
  import '../../chunk-ADSSLKKP.js';
5
5
  import '../../chunk-442LZPIR.js';
6
6
  import '../../chunk-ETQRV5A6.js';
7
- import '../../chunk-TUMSNGTX.js';
8
7
  import '../../chunk-BZZCNLT6.js';
8
+ import '../../chunk-TUMSNGTX.js';
9
9
  import '../../chunk-CEWTOKE7.js';
10
10
  import '../../chunk-IIMU5YAJ.js';
11
11
  import '../../chunk-PDHTXPSF.js';
@@ -38,8 +38,8 @@ import '../../chunk-ELJIFLCB.js';
38
38
  import '../../chunk-L4XXM55J.js';
39
39
  import '../../chunk-FL67C3WY.js';
40
40
  import '../../chunk-QJ2KCHKX.js';
41
- import '../../chunk-DT3QYZVU.js';
42
41
  import '../../chunk-SLVC5OJ2.js';
42
+ import '../../chunk-DT3QYZVU.js';
43
43
  import '../../chunk-RNP5R5I3.js';
44
44
  import '../../chunk-IOKL7BKE.js';
45
45
  import '../../chunk-MTJ43R2E.js';
@@ -29,8 +29,8 @@ import '../../chunk-ELJIFLCB.js';
29
29
  import '../../chunk-L4XXM55J.js';
30
30
  import '../../chunk-FL67C3WY.js';
31
31
  import '../../chunk-QJ2KCHKX.js';
32
- import '../../chunk-DT3QYZVU.js';
33
32
  import '../../chunk-SLVC5OJ2.js';
33
+ import '../../chunk-DT3QYZVU.js';
34
34
  import '../../chunk-RNP5R5I3.js';
35
35
  import '../../chunk-IOKL7BKE.js';
36
36
  import '../../chunk-MTJ43R2E.js';
@@ -0,0 +1,589 @@
1
+ /* src/components/display/StatCard.module.css */
2
+ .heroCard {
3
+ background: var(--glass-background);
4
+ backdrop-filter: var(--glass-blur);
5
+ border: 1px solid var(--color-border);
6
+ }
7
+ .iconRing {
8
+ position: relative;
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ width: 46px;
13
+ height: 46px;
14
+ border-radius: 50%;
15
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
16
+ border: 1px solid color-mix(in srgb, var(--color-primary) 25%, transparent);
17
+ color: var(--color-primary);
18
+ flex-shrink: 0;
19
+ box-shadow: 0 0 12px color-mix(in srgb, var(--color-primary) 15%, transparent);
20
+ }
21
+ .iconRingSm {
22
+ position: relative;
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ width: 36px;
27
+ height: 36px;
28
+ border-radius: 50%;
29
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
30
+ border: 1px solid color-mix(in srgb, var(--color-primary) 25%, transparent);
31
+ color: var(--color-primary);
32
+ flex-shrink: 0;
33
+ box-shadow: 0 0 8px color-mix(in srgb, var(--color-primary) 12%, transparent);
34
+ }
35
+ .heroValue {
36
+ font-family: var(--elevasis-font-family-subtitle);
37
+ font-size: 1.85rem;
38
+ font-weight: 800;
39
+ line-height: 1;
40
+ letter-spacing: -0.02em;
41
+ font-variant-numeric: tabular-nums;
42
+ }
43
+ [data-mantine-color-scheme=dark] .heroValue {
44
+ text-shadow: 0 0 20px color-mix(in srgb, var(--color-primary) 20%, transparent);
45
+ }
46
+ .heroValueSm {
47
+ font-family: var(--elevasis-font-family-subtitle);
48
+ font-size: 1.35rem;
49
+ font-weight: 700;
50
+ line-height: 1;
51
+ letter-spacing: -0.02em;
52
+ font-variant-numeric: tabular-nums;
53
+ }
54
+ .heroLabel {
55
+ font-size: 0.68rem;
56
+ font-weight: 700;
57
+ text-transform: uppercase;
58
+ letter-spacing: 0.12em;
59
+ color: var(--color-text-dimmed);
60
+ }
61
+ .heroLabelSm {
62
+ font-size: 0.62rem;
63
+ font-weight: 700;
64
+ text-transform: uppercase;
65
+ letter-spacing: 0.12em;
66
+ color: var(--color-text-dimmed);
67
+ }
68
+
69
+ /* src/components/display/ElevasisLoader.module.css */
70
+ .wrapper {
71
+ display: inline-flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ width: var(--loader-size);
75
+ height: var(--loader-size);
76
+ overflow: visible;
77
+ }
78
+ .loader {
79
+ width: 100%;
80
+ height: 100%;
81
+ display: block;
82
+ overflow: visible;
83
+ }
84
+ .chevron {
85
+ stroke: var(--loader-color);
86
+ stroke-width: 2;
87
+ stroke-linecap: square;
88
+ stroke-linejoin: miter;
89
+ fill: none;
90
+ opacity: 0.15;
91
+ animation: chevronPulse 2s ease-in-out infinite;
92
+ filter: drop-shadow(0 0 1.5px var(--loader-color));
93
+ }
94
+ [data-mantine-color-scheme=light] .chevron {
95
+ filter: none;
96
+ }
97
+ .c1 {
98
+ animation-delay: 0s;
99
+ }
100
+ .c2 {
101
+ animation-delay: 0.2s;
102
+ }
103
+ .c3 {
104
+ animation-delay: 0.4s;
105
+ }
106
+ @keyframes chevronPulse {
107
+ 0%, 100% {
108
+ opacity: 0.12;
109
+ filter: drop-shadow(0 0 1px var(--loader-color));
110
+ }
111
+ 40%, 60% {
112
+ opacity: 1;
113
+ filter: drop-shadow(0 0 3px var(--loader-color));
114
+ }
115
+ }
116
+ [data-mantine-color-scheme=light] .chevron {
117
+ animation-name: chevronPulseLight;
118
+ }
119
+ @keyframes chevronPulseLight {
120
+ 0%, 100% {
121
+ opacity: 0.2;
122
+ }
123
+ 40%, 60% {
124
+ opacity: 1;
125
+ }
126
+ }
127
+
128
+ /* src/theme/custom.css */
129
+ .mantine-Button-root[data-variant=default] {
130
+ background-color: var(--color-surface);
131
+ backdrop-filter: var(--glass-blur);
132
+ -webkit-backdrop-filter: var(--glass-blur);
133
+ border: 1px solid var(--color-border);
134
+ color: var(--color-text);
135
+ }
136
+ .mantine-Button-root[data-variant=default]:hover {
137
+ background-color: var(--color-surface-hover);
138
+ }
139
+ .mantine-Accordion-control:hover {
140
+ background-color: var(--color-surface-hover);
141
+ }
142
+ .mantine-Menu-item:hover:not([data-disabled]) {
143
+ background-color: var(--color-surface-hover);
144
+ }
145
+ .mantine-Select-option:hover {
146
+ background-color: var(--color-surface-hover) !important;
147
+ }
148
+ [data-mantine-color-scheme=dark] .mantine-Tabs-root {
149
+ --tab-border-color: var(--color-border);
150
+ }
151
+ .mantine-Tabs-tab:hover {
152
+ background-color: var(--color-surface-hover);
153
+ }
154
+ .mantine-Pagination-control:not([data-active]) {
155
+ background: var(--color-surface);
156
+ }
157
+ ::-webkit-scrollbar {
158
+ width: 5px;
159
+ height: 5px;
160
+ }
161
+ ::-webkit-scrollbar-track {
162
+ background: transparent;
163
+ }
164
+ ::-webkit-scrollbar-thumb {
165
+ background: color-mix(in srgb, var(--color-text-subtle) 50%, var(--color-border));
166
+ border-radius: 4px;
167
+ }
168
+ ::-webkit-scrollbar-thumb:hover {
169
+ background: var(--color-text-subtle);
170
+ }
171
+ .mantine-Checkbox-input {
172
+ background-color: var(--color-surface);
173
+ border-color: var(--color-border);
174
+ }
175
+ .mantine-Checkbox-input:checked {
176
+ background-color: var(--color-primary);
177
+ border-color: var(--color-primary);
178
+ }
179
+ .mantine-Switch-root:has(input:not(:checked)) .mantine-Switch-track {
180
+ background-color: var(--color-surface-hover);
181
+ border-color: var(--color-border);
182
+ }
183
+ .mantine-Timeline-root {
184
+ --tl-color: var(--color-primary);
185
+ }
186
+ .mantine-Timeline-item {
187
+ --item-border-color: var(--color-border);
188
+ }
189
+ .mantine-Timeline-itemBullet {
190
+ border-color: var(--color-border);
191
+ }
192
+ .mantine-Timeline-itemBullet:where([data-with-child]) {
193
+ background-color: var(--color-primary);
194
+ border-color: var(--color-primary);
195
+ }
196
+ .recharts-surface:focus {
197
+ outline: none;
198
+ }
199
+ .hide-scrollbar {
200
+ scrollbar-width: none;
201
+ -ms-overflow-style: none;
202
+ }
203
+ .hide-scrollbar::-webkit-scrollbar {
204
+ display: none;
205
+ }
206
+
207
+ /* src/graph/Graph.module.css */
208
+ @keyframes edgeFlow {
209
+ 0% {
210
+ stroke-dashoffset: 24;
211
+ }
212
+ 100% {
213
+ stroke-dashoffset: 0;
214
+ }
215
+ }
216
+ @keyframes edgeFlowReverse {
217
+ 0% {
218
+ stroke-dashoffset: 0;
219
+ }
220
+ 100% {
221
+ stroke-dashoffset: 24;
222
+ }
223
+ }
224
+ @keyframes pulse {
225
+ 0%, 100% {
226
+ opacity: 0.6;
227
+ }
228
+ 50% {
229
+ opacity: 1;
230
+ }
231
+ }
232
+ @keyframes livePulse {
233
+ 0%, 100% {
234
+ opacity: 1;
235
+ }
236
+ 50% {
237
+ opacity: 0.6;
238
+ }
239
+ }
240
+ .livePulse {
241
+ animation: livePulse 2s ease-in-out infinite;
242
+ }
243
+ @keyframes glowPulse {
244
+ 0%, 100% {
245
+ box-shadow: 0 0 5px var(--glow-color, color-mix(in srgb, var(--color-primary) 30%, transparent)), 0 0 15px var(--glow-color, color-mix(in srgb, var(--color-primary) 10%, transparent));
246
+ }
247
+ 50% {
248
+ box-shadow: 0 0 10px var(--glow-color, color-mix(in srgb, var(--color-primary) 50%, transparent)), 0 0 20px var(--glow-color, color-mix(in srgb, var(--color-primary) 20%, transparent));
249
+ }
250
+ }
251
+ @keyframes nodeEnter {
252
+ 0% {
253
+ opacity: 0;
254
+ transform: scale(0.8) translateY(10px);
255
+ }
256
+ 100% {
257
+ opacity: 1;
258
+ transform: scale(1) translateY(0);
259
+ }
260
+ }
261
+ @keyframes handlePulse {
262
+ 0%, 100% {
263
+ transform: scale(1);
264
+ box-shadow: 0 0 0 0 var(--handle-color, color-mix(in srgb, var(--color-primary) 40%, transparent));
265
+ }
266
+ 50% {
267
+ transform: scale(1.2);
268
+ box-shadow: 0 0 0 4px var(--handle-color, color-mix(in srgb, var(--color-primary) 0%, transparent));
269
+ }
270
+ }
271
+ @keyframes gridMove {
272
+ 0% {
273
+ background-position: 0 0;
274
+ }
275
+ 100% {
276
+ background-position: 40px 40px;
277
+ }
278
+ }
279
+ @keyframes labelFadeIn {
280
+ 0% {
281
+ opacity: 0;
282
+ transform: translate(-50%, -50%) translate(var(--label-x), var(--label-y)) scale(0.8);
283
+ }
284
+ 100% {
285
+ opacity: 1;
286
+ transform: translate(-50%, -50%) translate(var(--label-x), var(--label-y)) scale(1);
287
+ }
288
+ }
289
+ @keyframes scanLine {
290
+ 0% {
291
+ transform: translateY(-100%);
292
+ opacity: 0;
293
+ }
294
+ 50% {
295
+ opacity: 0.5;
296
+ }
297
+ 100% {
298
+ transform: translateY(100%);
299
+ opacity: 0;
300
+ }
301
+ }
302
+ .graphContainer {
303
+ position: relative;
304
+ background-image:
305
+ linear-gradient(color-mix(in srgb, var(--color-primary) 5%, transparent) 1px, transparent 1px),
306
+ linear-gradient(
307
+ 90deg,
308
+ color-mix(in srgb, var(--color-primary) 5%, transparent) 1px,
309
+ transparent 1px),
310
+ radial-gradient(
311
+ ellipse at 50% 50%,
312
+ color-mix(in srgb, var(--color-primary) 5%, transparent) 0%,
313
+ transparent 70%);
314
+ background-color: color-mix(in srgb, var(--color-background) 50%, var(--glass-background));
315
+ backdrop-filter: var(--glass-blur);
316
+ background-size:
317
+ 40px 40px,
318
+ 40px 40px,
319
+ 100% 100%;
320
+ animation: gridMove 20s linear infinite;
321
+ }
322
+ [data-mantine-color-scheme=dark] .graphContainer {
323
+ background-image:
324
+ linear-gradient(color-mix(in srgb, var(--color-primary) 9%, transparent) 1px, transparent 1px),
325
+ linear-gradient(
326
+ 90deg,
327
+ color-mix(in srgb, var(--color-primary) 9%, transparent) 1px,
328
+ transparent 1px),
329
+ radial-gradient(
330
+ ellipse at 50% 50%,
331
+ color-mix(in srgb, var(--color-primary) 9%, transparent) 0%,
332
+ transparent 70%);
333
+ background-size:
334
+ 40px 40px,
335
+ 40px 40px,
336
+ 100% 100%;
337
+ }
338
+ .node {
339
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
340
+ position: relative;
341
+ }
342
+ .node:nth-child(1) {
343
+ animation-delay: 0.05s;
344
+ }
345
+ .node:nth-child(2) {
346
+ animation-delay: 0.1s;
347
+ }
348
+ .node:nth-child(3) {
349
+ animation-delay: 0.15s;
350
+ }
351
+ .node:nth-child(4) {
352
+ animation-delay: 0.2s;
353
+ }
354
+ .node:nth-child(5) {
355
+ animation-delay: 0.25s;
356
+ }
357
+ .node:nth-child(6) {
358
+ animation-delay: 0.3s;
359
+ }
360
+ .node:nth-child(7) {
361
+ animation-delay: 0.35s;
362
+ }
363
+ .node:nth-child(8) {
364
+ animation-delay: 0.4s;
365
+ }
366
+ .node:nth-child(9) {
367
+ animation-delay: 0.45s;
368
+ }
369
+ .node:nth-child(10) {
370
+ animation-delay: 0.5s;
371
+ }
372
+ .node:nth-child(11) {
373
+ animation-delay: 0.55s;
374
+ }
375
+ .node:nth-child(12) {
376
+ animation-delay: 0.6s;
377
+ }
378
+ .nodeCard {
379
+ position: relative;
380
+ border-radius: var(--mantine-radius-md);
381
+ overflow: hidden;
382
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
383
+ }
384
+ .nodeCard::before {
385
+ content: "";
386
+ position: absolute;
387
+ inset: 0;
388
+ background:
389
+ linear-gradient(
390
+ 135deg,
391
+ var(--node-color-light, color-mix(in srgb, var(--color-primary) 10%, transparent)) 0%,
392
+ transparent 50%,
393
+ var(--node-color-light, color-mix(in srgb, var(--color-primary) 5%, transparent)) 100%);
394
+ pointer-events: none;
395
+ opacity: 0;
396
+ transition: opacity 0.3s ease;
397
+ }
398
+ .nodeCard::after {
399
+ content: "";
400
+ position: absolute;
401
+ left: 0;
402
+ right: 0;
403
+ height: 30%;
404
+ background:
405
+ linear-gradient(
406
+ 180deg,
407
+ transparent 0%,
408
+ var(--node-color-glow, color-mix(in srgb, var(--color-primary) 10%, transparent)) 50%,
409
+ transparent 100%);
410
+ pointer-events: none;
411
+ opacity: 0;
412
+ }
413
+ .nodeCard:hover::before,
414
+ .nodeCardSelected::before {
415
+ opacity: 1;
416
+ }
417
+ .nodeCard:hover::after,
418
+ .nodeCardSelected::after {
419
+ animation: scanLine 3s ease-in-out infinite;
420
+ }
421
+ .nodeCard:hover {
422
+ transform: translateY(-2px) scale(1.02);
423
+ }
424
+ .nodeCardSelected {
425
+ transform: translateY(-2px) scale(1.02);
426
+ animation: glowPulse 2s ease-in-out infinite;
427
+ }
428
+ .nodeAgent {
429
+ --glow-color: rgba(139, 92, 246, 0.4);
430
+ --node-color-light: rgba(139, 92, 246, 0.1);
431
+ --node-color-glow: rgba(139, 92, 246, 0.15);
432
+ --handle-color: rgba(139, 92, 246, 0.5);
433
+ --gradient-start: rgba(139, 92, 246, 0.15);
434
+ --gradient-end: rgba(139, 92, 246, 0.05);
435
+ }
436
+ .nodeWorkflow {
437
+ --glow-color: rgba(59, 130, 246, 0.4);
438
+ --node-color-light: rgba(59, 130, 246, 0.1);
439
+ --node-color-glow: rgba(59, 130, 246, 0.15);
440
+ --handle-color: rgba(59, 130, 246, 0.5);
441
+ --gradient-start: rgba(59, 130, 246, 0.15);
442
+ --gradient-end: rgba(59, 130, 246, 0.05);
443
+ }
444
+ .nodeTrigger {
445
+ --glow-color: rgba(249, 115, 22, 0.4);
446
+ --node-color-light: rgba(249, 115, 22, 0.1);
447
+ --node-color-glow: rgba(249, 115, 22, 0.15);
448
+ --handle-color: rgba(249, 115, 22, 0.5);
449
+ --gradient-start: rgba(249, 115, 22, 0.15);
450
+ --gradient-end: rgba(249, 115, 22, 0.05);
451
+ }
452
+ .nodeIntegration {
453
+ --glow-color: rgba(20, 184, 166, 0.4);
454
+ --node-color-light: rgba(20, 184, 166, 0.1);
455
+ --node-color-glow: rgba(20, 184, 166, 0.15);
456
+ --handle-color: rgba(20, 184, 166, 0.5);
457
+ --gradient-start: rgba(20, 184, 166, 0.15);
458
+ --gradient-end: rgba(20, 184, 166, 0.05);
459
+ }
460
+ .nodeExternal {
461
+ --glow-color: rgba(107, 114, 128, 0.4);
462
+ --node-color-light: rgba(107, 114, 128, 0.1);
463
+ --node-color-glow: rgba(107, 114, 128, 0.15);
464
+ --handle-color: rgba(107, 114, 128, 0.5);
465
+ --gradient-start: rgba(107, 114, 128, 0.15);
466
+ --gradient-end: rgba(107, 114, 128, 0.05);
467
+ }
468
+ .nodeHuman {
469
+ --glow-color: rgba(245, 158, 11, 0.4);
470
+ --node-color-light: rgba(245, 158, 11, 0.1);
471
+ --node-color-glow: rgba(245, 158, 11, 0.15);
472
+ --handle-color: rgba(245, 158, 11, 0.5);
473
+ --gradient-start: rgba(245, 158, 11, 0.15);
474
+ --gradient-end: rgba(245, 158, 11, 0.05);
475
+ }
476
+ .nodePrimary {
477
+ --glow-color: rgba(37, 99, 235, 0.4);
478
+ --node-color-light: rgba(37, 99, 235, 0.1);
479
+ --node-color-glow: rgba(37, 99, 235, 0.15);
480
+ --handle-color: rgba(37, 99, 235, 0.5);
481
+ --gradient-start: rgba(37, 99, 235, 0.15);
482
+ --gradient-end: rgba(37, 99, 235, 0.05);
483
+ }
484
+ .handle {
485
+ transition: all 0.2s ease;
486
+ }
487
+ .handle:hover {
488
+ animation: handlePulse 1s ease-in-out infinite;
489
+ }
490
+ .nodeIcon {
491
+ transition: all 0.3s ease;
492
+ }
493
+ .badge {
494
+ transition: all 0.2s ease;
495
+ backdrop-filter: blur(4px);
496
+ }
497
+ .nodeCard:hover .badge {
498
+ transform: scale(1.05);
499
+ }
500
+ .badgeProd {
501
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.3);
502
+ }
503
+ .edge {
504
+ transition: all 0.3s ease;
505
+ }
506
+ .edgeAnimated {
507
+ stroke-dasharray: 8 4;
508
+ animation: edgeFlow 1s linear infinite;
509
+ }
510
+ .edgeGlow {
511
+ filter: drop-shadow(0 0 3px var(--edge-color, color-mix(in srgb, var(--color-primary) 50%, transparent)));
512
+ }
513
+ .edgeHighlighted {
514
+ stroke-width: 3px;
515
+ }
516
+ .edgeLabel {
517
+ backdrop-filter: blur(8px);
518
+ border: 1px solid rgba(255, 255, 255, 0.1);
519
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15), 0 0 20px var(--label-glow, color-mix(in srgb, var(--color-primary) 20%, transparent));
520
+ transition: box-shadow 0.2s ease;
521
+ }
522
+ .edgeLabel:hover {
523
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2), 0 0 30px var(--label-glow, color-mix(in srgb, var(--color-primary) 30%, transparent));
524
+ }
525
+ .legend {
526
+ backdrop-filter: var(--glass-blur);
527
+ background: var(--glass-background);
528
+ border: 1px solid color-mix(in srgb, var(--color-primary) 20%, transparent);
529
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1), 0 0 40px color-mix(in srgb, var(--color-primary) 10%, transparent);
530
+ }
531
+ [data-mantine-color-scheme=dark] .legend {
532
+ border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
533
+ }
534
+ .legendDot {
535
+ transition: all 0.2s ease;
536
+ box-shadow: 0 0 8px currentColor;
537
+ }
538
+ .legendDot:hover {
539
+ transform: scale(1.3);
540
+ box-shadow: 0 0 12px currentColor;
541
+ }
542
+ .nodeHighlighted .nodeCard {
543
+ transform: translateY(-2px) scale(1.02);
544
+ }
545
+ .nodeHighlighted .nodeCard::before {
546
+ opacity: 1;
547
+ }
548
+ .nodeHighlighted .nodeCard::after {
549
+ animation: scanLine 3s ease-in-out infinite;
550
+ }
551
+ .nodeDimmed {
552
+ opacity: 0.3;
553
+ filter: grayscale(0.5);
554
+ transition: all 0.3s ease;
555
+ }
556
+ .edgeHighlighted {
557
+ stroke-width: 4px !important;
558
+ }
559
+ .edgeDimmed {
560
+ opacity: 0.15;
561
+ transition: all 0.3s ease;
562
+ }
563
+ .edgeLabelDimmed {
564
+ opacity: 0.15;
565
+ transition: opacity 0.3s ease;
566
+ }
567
+ @media (prefers-reduced-motion: reduce) {
568
+ .node,
569
+ .nodeCard::after,
570
+ .edgeAnimated,
571
+ .nodeIcon,
572
+ .handle:hover,
573
+ .graphContainer {
574
+ animation: none;
575
+ }
576
+ .nodeCard:hover {
577
+ transform: none;
578
+ }
579
+ }
580
+
581
+ /* src/graph/Graph.globals.css */
582
+ .elevasis-graph-root .react-flow__node.selected,
583
+ .elevasis-graph-root .react-flow__node:focus,
584
+ .elevasis-graph-root .react-flow__node:focus-visible {
585
+ outline: none !important;
586
+ }
587
+ .elevasis-graph-root .react-flow__node.selected > * {
588
+ box-shadow: none;
589
+ }
@@ -0,0 +1,442 @@
1
+ import '../../../chunk-TUMSNGTX.js';
2
+ import { FilterBar } from '../../../chunk-PDHTXPSF.js';
3
+ import { ConfirmationModal } from '../../../chunk-GBMNCNHX.js';
4
+ import '../../../chunk-7M2VOCYN.js';
5
+ import { usePaginationState, useRequestsList, useUpdateRequestStatus, useRequest } from '../../../chunk-JAUU6TZU.js';
6
+ import '../../../chunk-LXHZYSMQ.js';
7
+ import '../../../chunk-BRXELOHC.js';
8
+ import '../../../chunk-22UVE3RA.js';
9
+ import '../../../chunk-3ZMAGTWF.js';
10
+ import '../../../chunk-DKQQK3WX.js';
11
+ import '../../../chunk-5IBTTMWX.js';
12
+ import '../../../chunk-R73EHHPN.js';
13
+ import '../../../chunk-WLOQ4IBG.js';
14
+ import '../../../chunk-C7BX547M.js';
15
+ import '../../../chunk-RX4UWZZR.js';
16
+ import { PageTitleCaption, ContextViewer, JsonViewer } from '../../../chunk-SQQGLGHW.js';
17
+ import '../../../chunk-3KMDHCAR.js';
18
+ import '../../../chunk-NYBEU5TE.js';
19
+ import '../../../chunk-ZB5GAV7J.js';
20
+ import '../../../chunk-SZHARWKU.js';
21
+ import '../../../chunk-NVOCKXUQ.js';
22
+ import '../../../chunk-2IFYDILW.js';
23
+ import '../../../chunk-ELJIFLCB.js';
24
+ import '../../../chunk-L4XXM55J.js';
25
+ import '../../../chunk-FL67C3WY.js';
26
+ import '../../../chunk-QJ2KCHKX.js';
27
+ import '../../../chunk-SLVC5OJ2.js';
28
+ import '../../../chunk-DT3QYZVU.js';
29
+ import '../../../chunk-RNP5R5I3.js';
30
+ import { formatTimeAgo } from '../../../chunk-IOKL7BKE.js';
31
+ import '../../../chunk-MTJ43R2E.js';
32
+ import '../../../chunk-TUXTSEAF.js';
33
+ import '../../../chunk-DD3CCMCZ.js';
34
+ import '../../../chunk-QEPXAWE2.js';
35
+ import '../../../chunk-BRJ3QZ4E.js';
36
+ import '../../../chunk-Q7DJKLEN.js';
37
+ import { useState } from 'react';
38
+ import { useNavigate } from '@tanstack/react-router';
39
+ import { Badge, Menu, Button, Stack, Paper, Select, Center, Loader, Text, Table, Group, Pagination, Skeleton, SimpleGrid, Title, SegmentedControl } from '@mantine/core';
40
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
41
+ import { IconChevronDown, IconAlertTriangle, IconArrowLeft } from '@tabler/icons-react';
42
+ import { notifications } from '@mantine/notifications';
43
+
44
+ // src/features/monitoring/requests/manifest.ts
45
+ var submittedRequestsManifest = {
46
+ key: "submitted-requests",
47
+ featureId: "submitted-requests"
48
+ };
49
+ var TYPE_COLORS = {
50
+ bug: "red",
51
+ feature: "blue",
52
+ question: "yellow",
53
+ other: "gray"
54
+ };
55
+ var TYPE_LABELS = {
56
+ bug: "Bug",
57
+ feature: "Feature",
58
+ question: "Question",
59
+ other: "Other"
60
+ };
61
+ function RequestTypeBadge({ type }) {
62
+ return /* @__PURE__ */ jsx(Badge, { variant: "light", color: TYPE_COLORS[type], size: "sm", children: TYPE_LABELS[type] });
63
+ }
64
+ var SEVERITY_COLORS = {
65
+ critical: "red",
66
+ warning: "orange",
67
+ info: "blue"
68
+ };
69
+ var SEVERITY_LABELS = {
70
+ critical: "Critical",
71
+ warning: "Warning",
72
+ info: "Info"
73
+ };
74
+ function SeverityBadge({ severity }) {
75
+ return /* @__PURE__ */ jsx(Badge, { variant: "light", color: SEVERITY_COLORS[severity], size: "sm", children: SEVERITY_LABELS[severity] });
76
+ }
77
+ var STATUS_COLORS = {
78
+ open: "blue",
79
+ investigating: "yellow",
80
+ resolved: "green",
81
+ wont_fix: "gray"
82
+ };
83
+ var STATUS_LABELS = {
84
+ open: "Open",
85
+ investigating: "Investigating",
86
+ resolved: "Resolved",
87
+ wont_fix: "Won't Fix"
88
+ };
89
+ function StatusBadge({ status }) {
90
+ return /* @__PURE__ */ jsx(Badge, { variant: "light", color: STATUS_COLORS[status], size: "sm", children: STATUS_LABELS[status] });
91
+ }
92
+ var VALID_TRANSITIONS = {
93
+ open: ["investigating", "wont_fix"],
94
+ investigating: ["resolved", "wont_fix", "open"],
95
+ resolved: ["open"],
96
+ wont_fix: ["open"]
97
+ };
98
+ var ALL_STATUSES = ["open", "investigating", "resolved", "wont_fix"];
99
+ var STATUS_LABELS2 = {
100
+ open: "Open",
101
+ investigating: "Investigating",
102
+ resolved: "Resolved",
103
+ wont_fix: "Won't Fix"
104
+ };
105
+ function StatusTransitionMenu({ currentStatus, onTransition }) {
106
+ const [wontFixConfirmOpen, setWontFixConfirmOpen] = useState(false);
107
+ const validNextStatuses = VALID_TRANSITIONS[currentStatus];
108
+ function handleSelect(status) {
109
+ if (status === "wont_fix") {
110
+ setWontFixConfirmOpen(true);
111
+ } else {
112
+ onTransition(status);
113
+ }
114
+ }
115
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
116
+ /* @__PURE__ */ jsxs(Menu, { withinPortal: true, position: "bottom-end", shadow: "md", children: [
117
+ /* @__PURE__ */ jsx(Menu.Target, { children: /* @__PURE__ */ jsx(Button, { variant: "light", size: "xs", rightSection: /* @__PURE__ */ jsx(IconChevronDown, { size: 14 }), children: STATUS_LABELS2[currentStatus] }) }),
118
+ /* @__PURE__ */ jsxs(Menu.Dropdown, { children: [
119
+ /* @__PURE__ */ jsx(Menu.Label, { children: "Transition to" }),
120
+ ALL_STATUSES.filter((s) => s !== currentStatus).map((status) => {
121
+ const isValid = validNextStatuses.includes(status);
122
+ return /* @__PURE__ */ jsx(
123
+ Menu.Item,
124
+ {
125
+ disabled: !isValid,
126
+ color: status === "wont_fix" ? "red" : void 0,
127
+ onClick: () => isValid && handleSelect(status),
128
+ children: STATUS_LABELS2[status]
129
+ },
130
+ status
131
+ );
132
+ })
133
+ ] })
134
+ ] }),
135
+ /* @__PURE__ */ jsx(
136
+ ConfirmationModal,
137
+ {
138
+ opened: wontFixConfirmOpen,
139
+ onClose: () => setWontFixConfirmOpen(false),
140
+ icon: /* @__PURE__ */ jsx(IconAlertTriangle, { color: "red" }),
141
+ title: "Mark as Won't Fix",
142
+ text: "Are you sure you want to mark this request as won't fix? This signals the issue will not be addressed.",
143
+ buttonText: "Confirm Won't Fix",
144
+ buttonColor: "red",
145
+ confirmationHandler: () => {
146
+ setWontFixConfirmOpen(false);
147
+ onTransition("wont_fix");
148
+ }
149
+ }
150
+ )
151
+ ] });
152
+ }
153
+ var PAGE_SIZE = 20;
154
+ function RequestsListPage({
155
+ type: typeProp,
156
+ severity: severityProp,
157
+ status: statusProp,
158
+ source: sourceProp,
159
+ onNavigateToRequest
160
+ }) {
161
+ const navigate = useNavigate();
162
+ const [typeFilter, setTypeFilter] = useState(typeProp);
163
+ const [severityFilter, setSeverityFilter] = useState(severityProp);
164
+ const [statusFilter, setStatusFilter] = useState(statusProp ?? "open");
165
+ const [sourceFilter, setSourceFilter] = useState(sourceProp);
166
+ const { page, setPage, offset, totalPages } = usePaginationState(PAGE_SIZE, [
167
+ typeFilter,
168
+ severityFilter,
169
+ statusFilter,
170
+ sourceFilter
171
+ ]);
172
+ const { data: requests = [], isLoading } = useRequestsList({
173
+ type: typeFilter,
174
+ severity: severityFilter,
175
+ status: statusFilter,
176
+ source: sourceFilter,
177
+ limit: PAGE_SIZE,
178
+ offset
179
+ });
180
+ const { mutate: updateStatus } = useUpdateRequestStatus();
181
+ function pushSearchParam(patch) {
182
+ navigate({
183
+ // @ts-expect-error — search type is narrowed by each route wrapper
184
+ search: (prev) => ({ ...prev, ...patch })
185
+ });
186
+ }
187
+ function handleTypeChange(value) {
188
+ const next = value ?? void 0;
189
+ setTypeFilter(next);
190
+ pushSearchParam({ type: next });
191
+ }
192
+ function handleSeverityChange(value) {
193
+ const next = value ?? void 0;
194
+ setSeverityFilter(next);
195
+ pushSearchParam({ severity: next });
196
+ }
197
+ function handleStatusChange(value) {
198
+ const next = value ?? void 0;
199
+ setStatusFilter(next);
200
+ pushSearchParam({ status: next });
201
+ }
202
+ function handleSourceChange(value) {
203
+ const next = value ?? void 0;
204
+ setSourceFilter(next);
205
+ pushSearchParam({ source: next });
206
+ }
207
+ const estimatedTotal = requests.length < PAGE_SIZE ? offset + requests.length : offset + PAGE_SIZE + 1;
208
+ const pageCount = totalPages(estimatedTotal);
209
+ return /* @__PURE__ */ jsxs(Stack, { children: [
210
+ /* @__PURE__ */ jsx(
211
+ PageTitleCaption,
212
+ {
213
+ title: "Submitted Requests",
214
+ caption: "Browse and triage user-submitted bug reports, feature requests, and questions"
215
+ }
216
+ ),
217
+ /* @__PURE__ */ jsx(Paper, { children: /* @__PURE__ */ jsxs(Stack, { gap: 0, children: [
218
+ /* @__PURE__ */ jsxs(FilterBar, { children: [
219
+ /* @__PURE__ */ jsx(
220
+ Select,
221
+ {
222
+ placeholder: "All types",
223
+ value: typeFilter ?? null,
224
+ onChange: handleTypeChange,
225
+ data: [
226
+ { value: "bug", label: "Bug" },
227
+ { value: "feature", label: "Feature" },
228
+ { value: "question", label: "Question" },
229
+ { value: "other", label: "Other" }
230
+ ],
231
+ clearable: true,
232
+ size: "sm",
233
+ w: 150
234
+ }
235
+ ),
236
+ /* @__PURE__ */ jsx(
237
+ Select,
238
+ {
239
+ placeholder: "All severities",
240
+ value: severityFilter ?? null,
241
+ onChange: handleSeverityChange,
242
+ data: [
243
+ { value: "critical", label: "Critical" },
244
+ { value: "warning", label: "Warning" },
245
+ { value: "info", label: "Info" }
246
+ ],
247
+ clearable: true,
248
+ size: "sm",
249
+ w: 160
250
+ }
251
+ ),
252
+ /* @__PURE__ */ jsx(
253
+ Select,
254
+ {
255
+ placeholder: "All statuses",
256
+ value: statusFilter ?? null,
257
+ onChange: handleStatusChange,
258
+ data: [
259
+ { value: "open", label: "Open" },
260
+ { value: "investigating", label: "Investigating" },
261
+ { value: "resolved", label: "Resolved" },
262
+ { value: "wont_fix", label: "Won't Fix" }
263
+ ],
264
+ clearable: true,
265
+ size: "sm",
266
+ w: 170
267
+ }
268
+ ),
269
+ /* @__PURE__ */ jsx(
270
+ Select,
271
+ {
272
+ placeholder: "All sources",
273
+ value: sourceFilter ?? null,
274
+ onChange: handleSourceChange,
275
+ data: [
276
+ { value: "agent", label: "Agent" },
277
+ { value: "cli", label: "CLI" },
278
+ { value: "api", label: "API" },
279
+ { value: "webhook", label: "Webhook" },
280
+ { value: "user", label: "User" },
281
+ { value: "external", label: "External" }
282
+ ],
283
+ clearable: true,
284
+ size: "sm",
285
+ w: 150
286
+ }
287
+ )
288
+ ] }),
289
+ isLoading ? /* @__PURE__ */ jsx(Center, { py: "xl", children: /* @__PURE__ */ jsx(Loader, { size: "md" }) }) : requests.length === 0 ? /* @__PURE__ */ jsx(Center, { py: "xl", children: /* @__PURE__ */ jsx(Text, { c: "dimmed", children: "No requests yet" }) }) : /* @__PURE__ */ jsxs(Table, { highlightOnHover: true, style: { cursor: "pointer" }, children: [
290
+ /* @__PURE__ */ jsx(Table.Thead, { children: /* @__PURE__ */ jsxs(Table.Tr, { children: [
291
+ /* @__PURE__ */ jsx(Table.Th, { children: "Type" }),
292
+ /* @__PURE__ */ jsx(Table.Th, { children: "Severity" }),
293
+ /* @__PURE__ */ jsx(Table.Th, { children: "Title" }),
294
+ /* @__PURE__ */ jsx(Table.Th, { children: "Status" }),
295
+ /* @__PURE__ */ jsx(Table.Th, { children: "Source" }),
296
+ /* @__PURE__ */ jsx(Table.Th, { children: "Reported at" }),
297
+ /* @__PURE__ */ jsx(Table.Th, { children: "Actions" })
298
+ ] }) }),
299
+ /* @__PURE__ */ jsx(Table.Tbody, { children: requests.map((request) => /* @__PURE__ */ jsxs(Table.Tr, { onClick: () => onNavigateToRequest?.(request.id), children: [
300
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(RequestTypeBadge, { type: request.type }) }),
301
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(SeverityBadge, { severity: request.severity }) }),
302
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, { size: "sm", lineClamp: 1, children: request.title }) }),
303
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(StatusBadge, { status: request.status }) }),
304
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: request.source }) }),
305
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: formatTimeAgo(request.reported_at) }) }),
306
+ /* @__PURE__ */ jsx(Table.Td, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(
307
+ StatusTransitionMenu,
308
+ {
309
+ currentStatus: request.status,
310
+ onTransition: (newStatus) => updateStatus({ id: request.id, status: newStatus })
311
+ }
312
+ ) })
313
+ ] }, request.id)) })
314
+ ] }),
315
+ pageCount > 1 && /* @__PURE__ */ jsx(Group, { justify: "flex-start", px: "md", pb: "md", children: /* @__PURE__ */ jsx(Pagination, { size: "sm", total: pageCount, value: page, onChange: setPage, boundaries: 1 }) })
316
+ ] }) })
317
+ ] });
318
+ }
319
+ function formatDateTime(isoString) {
320
+ if (!isoString) return "N/A";
321
+ return new Date(isoString).toLocaleString(void 0, {
322
+ dateStyle: "medium",
323
+ timeStyle: "short"
324
+ });
325
+ }
326
+ function MetaField({ label, children }) {
327
+ return /* @__PURE__ */ jsxs(Stack, { gap: 2, children: [
328
+ /* @__PURE__ */ jsx(Text, { size: "xs", c: "var(--color-text-subtle)", tt: "uppercase", fw: 600, children: label }),
329
+ /* @__PURE__ */ jsx("div", { children })
330
+ ] });
331
+ }
332
+ function JsonSection({ title, data, emptyLabel }) {
333
+ const [view, setView] = useState("formatted");
334
+ return /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "md", children: [
335
+ /* @__PURE__ */ jsxs(Group, { justify: "space-between", align: "center", children: [
336
+ /* @__PURE__ */ jsx(Title, { order: 3, children: title }),
337
+ data !== null && data !== void 0 && /* @__PURE__ */ jsx(
338
+ SegmentedControl,
339
+ {
340
+ value: view,
341
+ onChange: (v) => setView(v),
342
+ size: "xs",
343
+ data: [
344
+ { label: "Formatted", value: "formatted" },
345
+ { label: "JSON", value: "json" }
346
+ ]
347
+ }
348
+ )
349
+ ] }),
350
+ data === null || data === void 0 ? /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: emptyLabel }) : view === "formatted" ? /* @__PURE__ */ jsx(ContextViewer, { data }) : /* @__PURE__ */ jsx(JsonViewer, { data })
351
+ ] }) });
352
+ }
353
+ function RequestsDetailPage({ requestId, onNavigateBack }) {
354
+ const { data: request, isLoading } = useRequest(requestId);
355
+ const { mutate: updateStatus, isPending: isUpdating } = useUpdateRequestStatus();
356
+ function handleTransition(newStatus) {
357
+ updateStatus(
358
+ { id: requestId, status: newStatus },
359
+ {
360
+ onSuccess: () => {
361
+ notifications.show({
362
+ title: "Status updated",
363
+ message: `Request status changed to "${newStatus.replace("_", " ")}".`,
364
+ color: "green",
365
+ position: "top-right",
366
+ autoClose: 4e3
367
+ });
368
+ },
369
+ onError: (error) => {
370
+ const message = error instanceof Error ? error.message : "Failed to update status.";
371
+ notifications.show({
372
+ title: "Update failed",
373
+ message,
374
+ color: "red",
375
+ position: "top-right",
376
+ autoClose: 5e3
377
+ });
378
+ }
379
+ }
380
+ );
381
+ }
382
+ const backButton = onNavigateBack ? /* @__PURE__ */ jsx(Button, { variant: "light", leftSection: /* @__PURE__ */ jsx(IconArrowLeft, { size: 16 }), onClick: onNavigateBack, size: "sm", children: "Back" }) : null;
383
+ if (isLoading) {
384
+ return /* @__PURE__ */ jsxs(Stack, { children: [
385
+ /* @__PURE__ */ jsxs(Group, { justify: "space-between", align: "end", children: [
386
+ /* @__PURE__ */ jsx(Skeleton, { height: 36, width: 240 }),
387
+ backButton
388
+ ] }),
389
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "md", children: [
390
+ /* @__PURE__ */ jsx(Skeleton, { height: 20, width: 180 }),
391
+ /* @__PURE__ */ jsx(SimpleGrid, { cols: 2, children: Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
392
+ /* @__PURE__ */ jsx(Skeleton, { height: 12, width: 80 }),
393
+ /* @__PURE__ */ jsx(Skeleton, { height: 20, width: 140 })
394
+ ] }, i)) })
395
+ ] }) }),
396
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(Skeleton, { height: 80 }) })
397
+ ] });
398
+ }
399
+ if (!request) {
400
+ return /* @__PURE__ */ jsxs(Stack, { children: [
401
+ /* @__PURE__ */ jsx(PageTitleCaption, { title: "Request Not Found", rightSection: backButton ?? void 0 }),
402
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(Text, { ta: "center", c: "dimmed", children: "This request no longer exists or could not be loaded." }) })
403
+ ] });
404
+ }
405
+ const currentStatus = request.status;
406
+ return /* @__PURE__ */ jsxs(Stack, { children: [
407
+ /* @__PURE__ */ jsx(
408
+ PageTitleCaption,
409
+ {
410
+ title: request.title,
411
+ rightSection: /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
412
+ /* @__PURE__ */ jsx(StatusTransitionMenu, { currentStatus, onTransition: handleTransition }),
413
+ backButton
414
+ ] })
415
+ }
416
+ ),
417
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "md", children: [
418
+ /* @__PURE__ */ jsx(Title, { order: 3, children: "Details" }),
419
+ /* @__PURE__ */ jsxs(SimpleGrid, { cols: 2, spacing: "md", children: [
420
+ /* @__PURE__ */ jsxs(MetaField, { label: "Status", children: [
421
+ /* @__PURE__ */ jsx(StatusBadge, { status: currentStatus }),
422
+ isUpdating && /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", ml: 4, span: true, children: "Updating\u2026" })
423
+ ] }),
424
+ /* @__PURE__ */ jsx(MetaField, { label: "Type", children: /* @__PURE__ */ jsx(RequestTypeBadge, { type: request.type }) }),
425
+ /* @__PURE__ */ jsx(MetaField, { label: "Severity", children: /* @__PURE__ */ jsx(SeverityBadge, { severity: request.severity }) }),
426
+ /* @__PURE__ */ jsx(MetaField, { label: "Category", children: /* @__PURE__ */ jsx(Text, { size: "sm", children: request.category }) }),
427
+ /* @__PURE__ */ jsx(MetaField, { label: "Source", children: /* @__PURE__ */ jsx(Text, { size: "sm", children: request.source }) }),
428
+ /* @__PURE__ */ jsx(MetaField, { label: "Reporter", children: /* @__PURE__ */ jsx(Text, { size: "sm", children: request.reporter_id ?? "Unknown" }) }),
429
+ /* @__PURE__ */ jsx(MetaField, { label: "Reported At", children: /* @__PURE__ */ jsx(Text, { size: "sm", children: formatDateTime(request.reported_at) }) }),
430
+ request.resolved_at && /* @__PURE__ */ jsx(MetaField, { label: "Resolved At", children: /* @__PURE__ */ jsx(Text, { size: "sm", children: formatDateTime(request.resolved_at) }) })
431
+ ] })
432
+ ] }) }),
433
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "md", children: [
434
+ /* @__PURE__ */ jsx(Title, { order: 3, children: "Description" }),
435
+ /* @__PURE__ */ jsx(Text, { size: "sm", style: { whiteSpace: "pre-wrap" }, children: request.description })
436
+ ] }) }),
437
+ /* @__PURE__ */ jsx(JsonSection, { title: "Evidence", data: request.evidence, emptyLabel: "No evidence recorded." }),
438
+ /* @__PURE__ */ jsx(JsonSection, { title: "Context", data: request.context, emptyLabel: "No context recorded." })
439
+ ] });
440
+ }
441
+
442
+ export { RequestTypeBadge, RequestsDetailPage, RequestsListPage, SeverityBadge, StatusBadge, StatusTransitionMenu, submittedRequestsManifest };
@@ -34,8 +34,8 @@ import '../../chunk-ELJIFLCB.js';
34
34
  import '../../chunk-L4XXM55J.js';
35
35
  import '../../chunk-FL67C3WY.js';
36
36
  import '../../chunk-QJ2KCHKX.js';
37
- import '../../chunk-DT3QYZVU.js';
38
37
  import '../../chunk-SLVC5OJ2.js';
38
+ import '../../chunk-DT3QYZVU.js';
39
39
  import '../../chunk-RNP5R5I3.js';
40
40
  import '../../chunk-IOKL7BKE.js';
41
41
  import '../../chunk-MTJ43R2E.js';
@@ -26,8 +26,8 @@ import '../../chunk-ELJIFLCB.js';
26
26
  import '../../chunk-L4XXM55J.js';
27
27
  import '../../chunk-FL67C3WY.js';
28
28
  import '../../chunk-QJ2KCHKX.js';
29
- import '../../chunk-DT3QYZVU.js';
30
29
  import '../../chunk-SLVC5OJ2.js';
30
+ import '../../chunk-DT3QYZVU.js';
31
31
  import '../../chunk-RNP5R5I3.js';
32
32
  import '../../chunk-IOKL7BKE.js';
33
33
  import '../../chunk-MTJ43R2E.js';
@@ -21,8 +21,8 @@ import '../chunk-ELJIFLCB.js';
21
21
  import '../chunk-L4XXM55J.js';
22
22
  import '../chunk-FL67C3WY.js';
23
23
  import '../chunk-QJ2KCHKX.js';
24
- import '../chunk-DT3QYZVU.js';
25
24
  import '../chunk-SLVC5OJ2.js';
25
+ import '../chunk-DT3QYZVU.js';
26
26
  import '../chunk-RNP5R5I3.js';
27
27
  export { REFETCH_INTERVAL_RUNNING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY } from '../chunk-IOKL7BKE.js';
28
28
  import '../chunk-MTJ43R2E.js';
@@ -20,8 +20,8 @@ import '../chunk-ELJIFLCB.js';
20
20
  import '../chunk-L4XXM55J.js';
21
21
  import '../chunk-FL67C3WY.js';
22
22
  import '../chunk-QJ2KCHKX.js';
23
- import '../chunk-DT3QYZVU.js';
24
23
  import '../chunk-SLVC5OJ2.js';
24
+ import '../chunk-DT3QYZVU.js';
25
25
  import '../chunk-RNP5R5I3.js';
26
26
  export { REFETCH_INTERVAL_RUNNING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY } from '../chunk-IOKL7BKE.js';
27
27
  import '../chunk-MTJ43R2E.js';
package/dist/index.js CHANGED
@@ -24,8 +24,8 @@ import './chunk-ELJIFLCB.js';
24
24
  export { OrganizationSwitcher, createOrganizationsSlice, createUseOrgInitialization, createUseOrganizations } from './chunk-L4XXM55J.js';
25
25
  export { OrganizationProvider } from './chunk-FL67C3WY.js';
26
26
  export { AppearanceProvider, useAppearance } from './chunk-QJ2KCHKX.js';
27
- import './chunk-DT3QYZVU.js';
28
27
  export { createUseAppInitialization } from './chunk-SLVC5OJ2.js';
28
+ import './chunk-DT3QYZVU.js';
29
29
  import './chunk-RNP5R5I3.js';
30
30
  export { APIClientError, API_URL, DEBOUNCE_FILTER, DEBOUNCE_SLIDER, GC_TIME_LONG, GC_TIME_MEDIUM, GC_TIME_SHORT, LIMIT_ACTIVITY_FEED, OAUTH_FLOW_TIMEOUT, OAUTH_POPUP_CHECK_INTERVAL, PAGE_SIZE_DEFAULT, REFETCH_INTERVAL_DASHBOARD, REFETCH_INTERVAL_REALTIME, REFETCH_INTERVAL_RUNNING, REFETCH_INTERVAL_RUNNING_FAST, SSE_CLOSE_GRACE_PERIOD, SSE_TOKEN_REFRESH_DELAY, STALE_TIME_ADMIN, STALE_TIME_DEFAULT, STALE_TIME_MONITORING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY, formatChartAxisDate, formatDate, formatDateTime, formatErrorMessage, formatRelativeTime, formatTimeAgo, getErrorInfo, getErrorTitle, getResourceColor, getResourceIcon, isAPIClientError, restoreConsole, suppressKnownWarnings, validateEmail } from './chunk-IOKL7BKE.js';
31
31
  export { AdminGuard, ProtectedRoute, useSessionCheck as useRefocusSessionCheck, useSessionCheck, useStableAccessToken } from './chunk-MTJ43R2E.js';
@@ -15,8 +15,8 @@ import '../chunk-ELJIFLCB.js';
15
15
  import '../chunk-L4XXM55J.js';
16
16
  import '../chunk-FL67C3WY.js';
17
17
  export { AppearanceProvider, useAppearance } from '../chunk-QJ2KCHKX.js';
18
- import '../chunk-DT3QYZVU.js';
19
18
  import '../chunk-SLVC5OJ2.js';
19
+ import '../chunk-DT3QYZVU.js';
20
20
  import '../chunk-RNP5R5I3.js';
21
21
  import '../chunk-IOKL7BKE.js';
22
22
  import '../chunk-MTJ43R2E.js';
@@ -11,8 +11,8 @@ import '../chunk-ELJIFLCB.js';
11
11
  import '../chunk-L4XXM55J.js';
12
12
  import '../chunk-FL67C3WY.js';
13
13
  export { AppearanceProvider, useAppearance } from '../chunk-QJ2KCHKX.js';
14
- import '../chunk-DT3QYZVU.js';
15
14
  import '../chunk-SLVC5OJ2.js';
15
+ import '../chunk-DT3QYZVU.js';
16
16
  import '../chunk-RNP5R5I3.js';
17
17
  import '../chunk-IOKL7BKE.js';
18
18
  import '../chunk-MTJ43R2E.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/ui",
3
- "version": "2.14.0",
3
+ "version": "2.14.1",
4
4
  "description": "UI components and platform-aware hooks for building custom frontends on the Elevasis platform",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  import { PROJECTS_VIEW_CAPABILITY_ID, PROJECTS_FEATURE_ID } from './chunk-442LZPIR.js';
2
- import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
3
2
  import { PageContainer } from './chunk-BZZCNLT6.js';
3
+ import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
4
4
  import { SubshellNavItem } from './chunk-CEWTOKE7.js';
5
5
  import { SubshellSidebarSection } from './chunk-IIMU5YAJ.js';
6
6
  import { FilterBar } from './chunk-PDHTXPSF.js';
@@ -1,6 +1,6 @@
1
1
  import { ResourceExecuteDialog } from './chunk-C56A2MAS.js';
2
- import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
3
2
  import { PageContainer } from './chunk-BZZCNLT6.js';
3
+ import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
4
4
  import { SubshellNavItem } from './chunk-CEWTOKE7.js';
5
5
  import { SubshellSidebarSection } from './chunk-IIMU5YAJ.js';
6
6
  import { FilterBar } from './chunk-PDHTXPSF.js';
@@ -1,5 +1,5 @@
1
- import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
2
1
  import { PageContainer } from './chunk-BZZCNLT6.js';
2
+ import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
3
3
  import { SubshellNavItem } from './chunk-CEWTOKE7.js';
4
4
  import { SubshellSidebarSection } from './chunk-IIMU5YAJ.js';
5
5
  import { FilterBar } from './chunk-PDHTXPSF.js';