@agentiffai/design 0.1.2 → 0.1.4

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,2219 +0,0 @@
1
- 'use strict';
2
-
3
- var styled8 = require('styled-components');
4
- var jsxRuntime = require('react/jsx-runtime');
5
- var button = require('@react-aria/button');
6
- var react = require('react');
7
- var meter = require('@react-aria/meter');
8
- var tabs$1 = require('@react-aria/tabs');
9
- var collections = require('@react-stately/collections');
10
- var tabs = require('@react-stately/tabs');
11
- var reactAriaComponents = require('react-aria-components');
12
-
13
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
-
15
- var styled8__default = /*#__PURE__*/_interopDefault(styled8);
16
-
17
- // src/components/layout/Icon/Icon.styles.ts
18
- var IconWrapper = styled8__default.default.span`
19
- display: inline-flex;
20
- align-items: center;
21
- justify-content: center;
22
- width: ${({ $size }) => $size}px;
23
- height: ${({ $size }) => $size}px;
24
- color: ${({ $color }) => $color};
25
- line-height: 1;
26
-
27
- img {
28
- width: 100%;
29
- height: 100%;
30
- filter: ${({ $color }) => {
31
- if ($color === "currentColor" || !$color) return "inherit";
32
- if ($color === "white" || $color === "#ffffff" || $color === "#fff") {
33
- return "brightness(0) saturate(100%) invert(100%)";
34
- }
35
- if ($color === "#b9bbbe") {
36
- return "brightness(0) saturate(100%) invert(75%) sepia(8%) saturate(223%) hue-rotate(180deg) brightness(94%) contrast(86%)";
37
- }
38
- if ($color === "#ed4245" || $color === "#f04747") {
39
- return "brightness(0) saturate(100%) invert(38%) sepia(97%) saturate(1459%) hue-rotate(334deg) brightness(95%) contrast(93%)";
40
- }
41
- return "none";
42
- }};
43
- }
44
- `;
45
-
46
- // src/components/layout/Icon/icons.ts
47
- var ICON_BASE_PATH = "/assets/icon-set";
48
- var IconNames = {
49
- MIC: "mic-fill",
50
- MIC_OFF: "mic-off-fill",
51
- HEADPHONE: "headphone-fill",
52
- VOLUME_MUTE: "volume-mute-fill",
53
- SETTINGS: "settings-3-fill",
54
- SETTINGS_FILL: "settings-fill",
55
- SETTINGS_LINE: "settings-line",
56
- HOME: "home-fill",
57
- ADD_CIRCLE: "add-circle-fill",
58
- COMPASS_DISCOVER: "compass-discover-fill",
59
- DOWNLOAD: "download-2-fill",
60
- ARROW_LEFT: "arrow-left-fill",
61
- CALENDAR: "calendar-fill",
62
- CHAT: "chat-1-fill"
63
- };
64
- var iconFiles = {
65
- "mic-fill": "Icon-mic-fill.svg",
66
- "mic-off-fill": "Icon-mic-off-fill.svg",
67
- "headphone-fill": "Icon-headphone-fill.svg",
68
- "volume-mute-fill": "Icon-volume-mute-fill.svg",
69
- "settings-3-fill": "Icon-settings-3-fill.svg",
70
- "settings-fill": "Icon-settings-fill.svg",
71
- "settings-line": "Icon-settings-line.svg",
72
- "home-fill": "Icon-home-fill.svg",
73
- "add-circle-fill": "Icon-add-circle-fill.svg",
74
- "compass-discover-fill": "Icon-compass-discover-fill.svg",
75
- "download-2-fill": "Icon-download-2-fill.svg",
76
- "arrow-left-fill": "Icon-arrow-left-fill.svg",
77
- "calendar-fill": "Icon-calendar-fill.svg",
78
- "chat-1-fill": "Icon-chat-1-fill.svg"
79
- };
80
- function getIconPath(name) {
81
- return `${ICON_BASE_PATH}/${iconFiles[name]}`;
82
- }
83
- function Icon({
84
- name,
85
- size = 20,
86
- color = "currentColor",
87
- className,
88
- ...imgProps
89
- }) {
90
- const iconPath = getIconPath(name);
91
- return /* @__PURE__ */ jsxRuntime.jsx(IconWrapper, { $size: size, $color: color, className, "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: iconPath, alt: "", width: size, height: size, ...imgProps }) });
92
- }
93
- Icon.displayName = "Icon";
94
- var NAV_BG = "#232428";
95
- var NAV_BORDER = "#1E1F22";
96
- var Container = styled8__default.default.nav`
97
- position: absolute;
98
- bottom: 0;
99
- left: 0;
100
- right: 0;
101
- background-color: ${NAV_BG};
102
- border-top: 1px solid ${NAV_BORDER};
103
- height: 52px;
104
- z-index: 10;
105
-
106
- /* Dark theme support */
107
- @media (prefers-color-scheme: dark) {
108
- background-color: #1a1b1e;
109
- }
110
- `;
111
- var ContentWrapper = styled8__default.default.div`
112
- display: flex;
113
- justify-content: space-between;
114
- align-items: center;
115
- height: 100%;
116
- padding: 0 8px;
117
- max-width: 100%;
118
-
119
- /* Responsive padding */
120
- @media (min-width: 768px) {
121
- padding: 0 16px;
122
- }
123
- `;
124
- var UserStatusSlot = styled8__default.default.div`
125
- display: flex;
126
- align-items: center;
127
- min-width: 0; /* Allow flex item to shrink */
128
- flex: 0 1 auto;
129
-
130
- /* Handle overflow for long usernames */
131
- > * {
132
- overflow: hidden;
133
- text-overflow: ellipsis;
134
- white-space: nowrap;
135
- }
136
- `;
137
- var ActionButtonsSlot = styled8__default.default.div`
138
- display: flex;
139
- align-items: center;
140
- gap: 4px;
141
- flex-shrink: 0;
142
-
143
- /* Ensure buttons stay visible */
144
- @media (min-width: 480px) {
145
- gap: 8px;
146
- }
147
- `;
148
- function NavHorizontal({
149
- userStatusSlot,
150
- actionsSlot,
151
- className,
152
- "aria-label": ariaLabel = "Horizontal navigation bar"
153
- }) {
154
- return /* @__PURE__ */ jsxRuntime.jsx(Container, { className, role: "navigation", "aria-label": ariaLabel, children: /* @__PURE__ */ jsxRuntime.jsxs(ContentWrapper, { children: [
155
- /* @__PURE__ */ jsxRuntime.jsx(UserStatusSlot, { children: userStatusSlot }),
156
- /* @__PURE__ */ jsxRuntime.jsx(ActionButtonsSlot, { children: actionsSlot })
157
- ] }) });
158
- }
159
- NavHorizontal.displayName = "NavHorizontal";
160
- var NAV_BG2 = "#202225";
161
- var NAV_SEPARATOR = "#36393F";
162
- var Container2 = styled8__default.default.nav`
163
- position: absolute;
164
- top: 0;
165
- left: 0;
166
- bottom: 52px; /* Account for horizontal nav height */
167
- width: 72px;
168
- background-color: ${NAV_BG2};
169
- display: flex;
170
- flex-direction: column;
171
- z-index: 9; /* Below horizontal nav and chat sidebar */
172
- overflow-y: auto;
173
- overflow-x: hidden;
174
- scrollbar-width: none; /* Firefox */
175
-
176
- /* Hide scrollbar for Chrome, Safari and Opera */
177
- &::-webkit-scrollbar {
178
- display: none;
179
- }
180
-
181
- /* Dark theme support */
182
- @media (prefers-color-scheme: dark) {
183
- background-color: #1a1b1e;
184
- }
185
-
186
- /* Responsive adjustments */
187
- @media (max-width: 768px) {
188
- width: 60px; /* Match MainPane left offset on mobile */
189
- }
190
- `;
191
- var TopSection = styled8__default.default.div`
192
- display: flex;
193
- flex-direction: column;
194
- align-items: center;
195
- height: 56px; /* Same as PaneSectionHeader on mobile */
196
- padding: 0;
197
- flex-shrink: 0;
198
- position: relative;
199
-
200
- @media (min-width: 768px) {
201
- height: 64px; /* Same as PaneSectionHeader on desktop */
202
- }
203
- `;
204
- var BackButton = styled8__default.default.button`
205
- position: absolute;
206
- top: 50%;
207
- left: 50%;
208
- transform: translate(-50%, -50%);
209
- width: 40px;
210
- height: 40px;
211
- border-radius: 50%;
212
- border: none;
213
- background-color: ${NAV_SEPARATOR};
214
- color: #ffffff;
215
- cursor: pointer;
216
- display: flex;
217
- align-items: center;
218
- justify-content: center;
219
- transition: all 0.2s ease-in-out;
220
-
221
- &:hover {
222
- background-color: #5865F2;
223
- }
224
-
225
- &:active {
226
- transform: translate(-50%, -50%) scale(0.95);
227
- }
228
-
229
- &:focus {
230
- outline: none;
231
- }
232
-
233
- &:focus-visible {
234
- outline: 2px solid #5865F2;
235
- outline-offset: 2px;
236
- }
237
- `;
238
- styled8__default.default.span`
239
- font-size: 20px;
240
- line-height: 1;
241
- font-weight: bold;
242
- `;
243
- var Separator = styled8__default.default.div`
244
- width: 32px;
245
- height: 2px;
246
- background-color: ${NAV_SEPARATOR};
247
- align-self: center;
248
- margin: 8px auto 12px;
249
- border-radius: 1px;
250
- `;
251
- var FolderGroupsSlot = styled8__default.default.div`
252
- display: flex;
253
- flex-direction: column;
254
- align-items: center;
255
- gap: 8px;
256
- padding: 0 12px 12px;
257
- flex: 1;
258
-
259
- /* Server/workspace icons styling */
260
- > * {
261
- width: 48px;
262
- height: 48px;
263
- border-radius: 50%;
264
- transition: border-radius 0.15s ease-out;
265
- cursor: pointer;
266
-
267
- &:hover {
268
- border-radius: 16px;
269
- }
270
- }
271
-
272
- /* Responsive adjustments */
273
- @media (max-width: 768px) {
274
- padding: 0 6px 12px; /* Reduce horizontal padding on mobile */
275
- }
276
- `;
277
- function NavVertical({
278
- onBackClick,
279
- onHomeClick,
280
- folderGroupsSlot,
281
- className,
282
- "aria-label": ariaLabel = "Vertical navigation sidebar"
283
- }) {
284
- const backButtonRef = react.useRef(null);
285
- const homeButtonRef = react.useRef(null);
286
- const { buttonProps: backButtonProps } = button.useButton(
287
- {
288
- onPress: onBackClick,
289
- "aria-label": "Go back"
290
- },
291
- backButtonRef
292
- );
293
- const { buttonProps: homeButtonProps } = button.useButton(
294
- {
295
- onPress: onHomeClick,
296
- "aria-label": "Home"
297
- },
298
- homeButtonRef
299
- );
300
- return /* @__PURE__ */ jsxRuntime.jsxs(Container2, { className, role: "navigation", "aria-label": ariaLabel, children: [
301
- /* @__PURE__ */ jsxRuntime.jsx(TopSection, { children: onBackClick ? /* @__PURE__ */ jsxRuntime.jsx(BackButton, { ...backButtonProps, ref: backButtonRef, children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-left-fill", size: 20, color: "white" }) }) : onHomeClick ? /* @__PURE__ */ jsxRuntime.jsx(BackButton, { ...homeButtonProps, ref: homeButtonRef, children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "home-fill", size: 24, color: "white" }) }) : null }),
302
- /* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
303
- /* @__PURE__ */ jsxRuntime.jsx(FolderGroupsSlot, { children: folderGroupsSlot })
304
- ] });
305
- }
306
- NavVertical.displayName = "NavVertical";
307
- var Container3 = styled8__default.default.div`
308
- position: relative;
309
- width: 100%;
310
- height: 100vh;
311
- background-color: #36393f;
312
- overflow: hidden;
313
-
314
- /* Dark theme support */
315
- @media (prefers-color-scheme: dark) {
316
- background-color: #2f3136;
317
- }
318
- `;
319
- var MainPane = styled8__default.default.main`
320
- position: absolute;
321
- top: 0;
322
- left: 72px; /* Width of vertical nav */
323
- right: 0;
324
- bottom: 52px; /* Height of horizontal nav */
325
- background-color: #36393f;
326
- overflow: auto;
327
-
328
- /* Custom scrollbar styling */
329
- &::-webkit-scrollbar {
330
- width: 8px;
331
- height: 8px;
332
- }
333
-
334
- &::-webkit-scrollbar-track {
335
- background: transparent;
336
- }
337
-
338
- &::-webkit-scrollbar-thumb {
339
- background-color: #202225;
340
- border-radius: 4px;
341
- }
342
-
343
- &::-webkit-scrollbar-thumb:hover {
344
- background-color: #18191c;
345
- }
346
-
347
- /* Firefox scrollbar */
348
- scrollbar-width: thin;
349
- scrollbar-color: #202225 transparent;
350
-
351
- /* Dark theme support */
352
- @media (prefers-color-scheme: dark) {
353
- background-color: #2f3136;
354
- }
355
-
356
- /* Responsive adjustments */
357
- @media (max-width: 768px) {
358
- left: 60px; /* Smaller nav on mobile */
359
- }
360
- `;
361
- function Layout({
362
- mainPaneSlot,
363
- navVerticalSlot,
364
- navHorizontalUserSlot,
365
- navHorizontalActionsSlot,
366
- onNavBackClick,
367
- className
368
- }) {
369
- return /* @__PURE__ */ jsxRuntime.jsxs(Container3, { className, children: [
370
- /* @__PURE__ */ jsxRuntime.jsx(NavVertical, { folderGroupsSlot: navVerticalSlot, onBackClick: onNavBackClick }),
371
- /* @__PURE__ */ jsxRuntime.jsx(MainPane, { children: mainPaneSlot }),
372
- /* @__PURE__ */ jsxRuntime.jsx(
373
- NavHorizontal,
374
- {
375
- userStatusSlot: navHorizontalUserSlot,
376
- actionsSlot: navHorizontalActionsSlot
377
- }
378
- )
379
- ] });
380
- }
381
- Layout.displayName = "Layout";
382
- var Container4 = styled8__default.default.div`
383
- display: flex;
384
- align-items: center;
385
- justify-content: flex-end;
386
- gap: 4px;
387
- `;
388
- var ActionButton = styled8__default.default.button`
389
- width: ${({ $size = 32 }) => $size}px;
390
- height: ${({ $size = 32 }) => $size}px;
391
- min-width: ${({ $size = 32 }) => $size}px;
392
- min-height: ${({ $size = 32 }) => $size}px;
393
- border-radius: ${({ $isPrimary }) => $isPrimary ? "50%" : "4px"};
394
- border: none;
395
- background-color: ${({ $isPrimary }) => $isPrimary ? "#5865F2" : "transparent"};
396
- color: ${({ $isPrimary }) => $isPrimary ? "#FFFFFF" : "#b9bbbe"};
397
- cursor: pointer;
398
- display: flex;
399
- align-items: center;
400
- justify-content: center;
401
- transition: all 0.15s ease;
402
- font-size: 16px;
403
-
404
- &:hover {
405
- background-color: ${({ $isPrimary }) => $isPrimary ? "#4752C4" : "rgba(255, 255, 255, 0.1)"};
406
- color: ${({ $isPrimary }) => $isPrimary ? "#FFFFFF" : "#dcddde"};
407
- }
408
-
409
- &:active {
410
- transform: scale(0.95);
411
- }
412
-
413
- ${({ $isActive, $isPrimary }) => $isActive && !$isPrimary && styled8.css`
414
- background-color: rgba(255, 255, 255, 0.08);
415
- color: #ffffff;
416
- `}
417
-
418
- ${({ $isActive, $isPrimary }) => $isActive && $isPrimary && styled8.css`
419
- background-color: #4752C4;
420
- color: #ffffff;
421
- `}
422
-
423
- &:focus {
424
- outline: none;
425
- }
426
-
427
- &:focus-visible {
428
- outline: 2px solid #5865f2;
429
- outline-offset: 2px;
430
- }
431
- `;
432
- function ActionButtonItem({ icon, label, onClick, isActive, size, isPrimary }) {
433
- const ref = react.useRef(null);
434
- const { buttonProps } = button.useButton(
435
- {
436
- onPress: onClick,
437
- "aria-label": label,
438
- "aria-pressed": isActive
439
- },
440
- ref
441
- );
442
- return /* @__PURE__ */ jsxRuntime.jsx(
443
- ActionButton,
444
- {
445
- ...buttonProps,
446
- ref,
447
- $isActive: isActive,
448
- $size: size,
449
- $isPrimary: isPrimary,
450
- children: icon
451
- }
452
- );
453
- }
454
- function ActionButtons({
455
- onCalendarClick,
456
- onSettingsClick,
457
- onChatClick,
458
- isCalendarActive = false,
459
- isSettingsActive = false,
460
- isChatActive = false,
461
- className
462
- }) {
463
- return /* @__PURE__ */ jsxRuntime.jsxs(Container4, { className, children: [
464
- /* @__PURE__ */ jsxRuntime.jsx(
465
- ActionButtonItem,
466
- {
467
- icon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "calendar-fill", size: 16, color: "#b9bbbe" }),
468
- label: "Calendar",
469
- onClick: onCalendarClick,
470
- isActive: isCalendarActive,
471
- size: 32
472
- }
473
- ),
474
- /* @__PURE__ */ jsxRuntime.jsx(
475
- ActionButtonItem,
476
- {
477
- icon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "settings-3-fill", size: 16, color: "#b9bbbe" }),
478
- label: "Settings",
479
- onClick: onSettingsClick,
480
- isActive: isSettingsActive,
481
- size: 32
482
- }
483
- ),
484
- /* @__PURE__ */ jsxRuntime.jsx(
485
- ActionButtonItem,
486
- {
487
- icon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chat-1-fill", size: 16, color: "#b9bbbe" }),
488
- label: "Chat",
489
- onClick: onChatClick,
490
- isActive: isChatActive,
491
- size: 32
492
- }
493
- )
494
- ] });
495
- }
496
- ActionButtons.displayName = "ActionButtons";
497
- var statusColors = {
498
- online: "#43B581",
499
- idle: "#FAA61A",
500
- busy: "#F04747",
501
- offline: "#747F8D"
502
- };
503
- var Container5 = styled8__default.default.button`
504
- display: flex;
505
- align-items: center;
506
- gap: 8px;
507
- padding: 4px 6px;
508
- border-radius: 4px;
509
- border: none;
510
- background: transparent;
511
- color: inherit;
512
- font: inherit;
513
- transition: background-color 0.2s ease, opacity 0.2s ease;
514
- cursor: ${(props) => props.$isDisabled ? "not-allowed" : "pointer"};
515
- opacity: ${(props) => props.$isDisabled ? 0.5 : 1};
516
- text-align: left;
517
- width: 100%;
518
-
519
- &:hover:not(:disabled) {
520
- background-color: rgba(255, 255, 255, 0.05);
521
- }
522
-
523
- &:focus-visible {
524
- outline: 2px solid #5865F2;
525
- outline-offset: 2px;
526
- }
527
-
528
- &:active:not(:disabled) {
529
- background-color: rgba(255, 255, 255, 0.08);
530
- }
531
- `;
532
- var IconWrapper2 = styled8__default.default.div`
533
- position: relative;
534
- width: 32px;
535
- height: 32px;
536
- border-radius: 8px;
537
- background-color: #36393f;
538
- display: flex;
539
- align-items: center;
540
- justify-content: center;
541
- flex-shrink: 0;
542
- overflow: hidden;
543
- `;
544
- var WorkflowInfo = styled8__default.default.div`
545
- display: flex;
546
- flex-direction: column;
547
- min-width: 0;
548
- `;
549
- var WorkflowName = styled8__default.default.span`
550
- color: #ffffff;
551
- font-size: 13px;
552
- font-weight: 600;
553
- line-height: 1.2;
554
- overflow: hidden;
555
- text-overflow: ellipsis;
556
- white-space: nowrap;
557
- `;
558
- var WorkflowStatus = styled8__default.default.div`
559
- display: flex;
560
- align-items: center;
561
- gap: 4px;
562
- color: #b9bbbe;
563
- font-size: 11px;
564
- line-height: 1.2;
565
- `;
566
- var StatusIndicatorOuter = styled8__default.default.span`
567
- position: absolute;
568
- bottom: -2px;
569
- right: -2px;
570
- width: 10px;
571
- height: 10px;
572
- border-radius: 50%;
573
- background-color: #232428;
574
- display: flex;
575
- align-items: center;
576
- justify-content: center;
577
- flex-shrink: 0;
578
- `;
579
- var StatusIndicatorInner = styled8__default.default.span`
580
- width: 6px;
581
- height: 6px;
582
- border-radius: 50%;
583
- background-color: ${({ $status }) => statusColors[$status]};
584
- flex-shrink: 0;
585
- `;
586
- function WorkflowStatusCard({
587
- icon,
588
- workflowName,
589
- status = "offline",
590
- statusText,
591
- className,
592
- onClick,
593
- onPress,
594
- isDisabled,
595
- ...ariaProps
596
- }) {
597
- const displayStatus = statusText || status;
598
- const ref = react.useRef(null);
599
- const handlePress = () => {
600
- if (onClick) onClick();
601
- if (onPress) onPress({});
602
- };
603
- const { buttonProps } = button.useButton(
604
- {
605
- ...ariaProps,
606
- onPress: handlePress,
607
- isDisabled,
608
- "aria-label": ariaProps["aria-label"] || `${workflowName} workflow, status: ${displayStatus}`
609
- },
610
- ref
611
- );
612
- return /* @__PURE__ */ jsxRuntime.jsxs(Container5, { ...buttonProps, ref, className, $isDisabled: isDisabled, children: [
613
- /* @__PURE__ */ jsxRuntime.jsxs(IconWrapper2, { children: [
614
- icon,
615
- /* @__PURE__ */ jsxRuntime.jsx(StatusIndicatorOuter, { $status: status, children: /* @__PURE__ */ jsxRuntime.jsx(StatusIndicatorInner, { $status: status }) })
616
- ] }),
617
- /* @__PURE__ */ jsxRuntime.jsxs(WorkflowInfo, { children: [
618
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowName, { children: workflowName }),
619
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowStatus, { children: displayStatus })
620
- ] })
621
- ] });
622
- }
623
- WorkflowStatusCard.displayName = "WorkflowStatusCard";
624
- var BG_TERTIARY = "#36393F";
625
- var TEXT_PRIMARY = "#FFFFFF";
626
- var TEXT_SECONDARY = "#B9BBBE";
627
- var TEXT_MUTED = "#72767D";
628
- var ACCENT_COLOR = "#5865F2";
629
- var HOVER_BG = "rgba(255, 255, 255, 0.05)";
630
- var DarkNotificationCardContainer = styled8__default.default.div`
631
- display: flex;
632
- flex-direction: column;
633
- padding: 6px;
634
- background: ${BG_TERTIARY};
635
- border-radius: 8px;
636
- gap: 4px;
637
- flex: 1;
638
- min-width: 0;
639
- overflow: hidden;
640
- `;
641
- var DarkSectionHeader = styled8__default.default.button`
642
- display: flex;
643
- align-items: center;
644
- justify-content: space-between;
645
- width: 100%;
646
- padding: 4px 2px;
647
- border: none;
648
- background: transparent;
649
- font-family: ${(props) => props.theme?.fonts?.body || "system-ui, sans-serif"};
650
- font-size: 11px;
651
- font-weight: 600;
652
- color: ${TEXT_SECONDARY};
653
- text-align: left;
654
- cursor: pointer;
655
- transition: all 0.2s ease;
656
-
657
- &:hover {
658
- color: ${TEXT_PRIMARY};
659
- }
660
-
661
- &:focus-visible {
662
- outline: 2px solid ${ACCENT_COLOR};
663
- outline-offset: 2px;
664
- border-radius: 4px;
665
- }
666
- `;
667
- var DarkChevronIcon = styled8__default.default.span`
668
- display: inline-flex;
669
- align-items: center;
670
- justify-content: center;
671
- transition: transform 0.2s ease;
672
- color: ${TEXT_MUTED};
673
-
674
- ${(props) => props.$isExpanded ? `
675
- transform: rotate(0deg);
676
- ` : `
677
- transform: rotate(-90deg);
678
- `}
679
-
680
- svg {
681
- width: 12px;
682
- height: 12px;
683
- }
684
- `;
685
- var DarkSectionContent = styled8__default.default.div`
686
- display: flex;
687
- flex-direction: column;
688
- gap: 2px;
689
- padding-left: 4px;
690
- margin-top: 2px;
691
- min-width: 0;
692
- overflow: hidden;
693
- `;
694
- var DarkNotificationItemWrapper = styled8__default.default.button`
695
- display: flex;
696
- align-items: center;
697
- gap: 6px;
698
- width: 100%;
699
- padding: 4px 6px;
700
- border: none;
701
- cursor: pointer;
702
- text-align: left;
703
- transition: all 0.2s ease;
704
- border-radius: 4px;
705
- min-width: 0;
706
- overflow: hidden;
707
-
708
- /* Default state - transparent background */
709
- background-color: ${(props) => props.$isSelected ? ACCENT_COLOR : "transparent"};
710
-
711
- /* Hover state */
712
- &:hover:not(:disabled) {
713
- background-color: ${(props) => props.$isSelected ? "#4752C4" : HOVER_BG};
714
- }
715
-
716
- /* Active state */
717
- &:active:not(:disabled) {
718
- transform: scale(0.99);
719
- }
720
-
721
- /* Focus state */
722
- &:focus-visible {
723
- outline: 2px solid ${ACCENT_COLOR};
724
- outline-offset: 2px;
725
- }
726
-
727
- /* Disabled state */
728
- &:disabled {
729
- cursor: not-allowed;
730
- opacity: 0.5;
731
- }
732
- `;
733
- var DarkItemIcon = styled8__default.default.span`
734
- display: inline-flex;
735
- align-items: center;
736
- justify-content: center;
737
- width: 16px;
738
- height: 16px;
739
- flex-shrink: 0;
740
- border-radius: ${(props) => props.$hasCustomIcon ? "4px" : "50%"};
741
- background-color: ${(props) => props.$iconColor || "transparent"};
742
- color: ${(props) => props.$hasCustomIcon ? TEXT_PRIMARY : TEXT_MUTED};
743
- font-size: 12px;
744
-
745
- /* Default circle icon styling */
746
- ${(props) => !props.$hasCustomIcon && `
747
- svg {
748
- width: 14px;
749
- height: 14px;
750
- }
751
- `}
752
-
753
- /* Custom icon (emoji or colored icon) styling */
754
- ${(props) => props.$hasCustomIcon && `
755
- padding: 2px;
756
- `}
757
- `;
758
- var DarkItemText = styled8__default.default.span`
759
- flex: 1;
760
- font-family: ${(props) => props.theme?.fonts?.body || "system-ui, sans-serif"};
761
- font-size: 11px;
762
- font-weight: ${(props) => props.$isSelected ? "500" : "400"};
763
- color: ${(props) => props.$isSelected ? TEXT_PRIMARY : TEXT_SECONDARY};
764
- line-height: 1.3;
765
- word-wrap: break-word;
766
- min-width: 0;
767
- overflow: hidden;
768
- text-overflow: ellipsis;
769
- `;
770
- var DarkMenuButton = styled8__default.default.button`
771
- display: inline-flex;
772
- align-items: center;
773
- justify-content: center;
774
- width: 20px;
775
- height: 20px;
776
- padding: 0;
777
- border: none;
778
- border-radius: 4px;
779
- background-color: transparent;
780
- color: ${TEXT_PRIMARY};
781
- cursor: pointer;
782
- transition: all 0.2s ease;
783
- flex-shrink: 0;
784
-
785
- &:hover:not(:disabled) {
786
- background-color: rgba(255, 255, 255, 0.1);
787
- }
788
-
789
- &:active:not(:disabled) {
790
- background-color: rgba(255, 255, 255, 0.15);
791
- transform: scale(0.95);
792
- }
793
-
794
- &:focus-visible {
795
- outline: 2px solid ${ACCENT_COLOR};
796
- outline-offset: 2px;
797
- }
798
-
799
- svg {
800
- width: 14px;
801
- height: 14px;
802
- }
803
- `;
804
- var DarkTimestamp = styled8__default.default.span`
805
- font-size: 10px;
806
- color: ${TEXT_MUTED};
807
- white-space: normal;
808
- word-wrap: break-word;
809
- text-align: right;
810
- max-width: 60px;
811
- `;
812
- var DarkNotificationCard = ({
813
- sections,
814
- onItemClick,
815
- selectedItemId,
816
- onMenuClick,
817
- className,
818
- "aria-label": ariaLabel = "Action log history"
819
- }) => {
820
- const [collapsedSections, setCollapsedSections] = react.useState(() => {
821
- const initial = {};
822
- for (const section of sections) {
823
- initial[section.title] = section.isCollapsed || false;
824
- }
825
- return initial;
826
- });
827
- const toggleSection = (sectionTitle) => {
828
- setCollapsedSections((prev) => ({
829
- ...prev,
830
- [sectionTitle]: !prev[sectionTitle]
831
- }));
832
- };
833
- return /* @__PURE__ */ jsxRuntime.jsx(DarkNotificationCardContainer, { className, "aria-label": ariaLabel, role: "region", children: sections.map((section) => /* @__PURE__ */ jsxRuntime.jsx(
834
- DarkSectionComponent,
835
- {
836
- section,
837
- isCollapsed: collapsedSections[section.title] ?? false,
838
- onToggle: () => toggleSection(section.title),
839
- onItemClick,
840
- selectedItemId,
841
- onMenuClick
842
- },
843
- section.title
844
- )) });
845
- };
846
- var DarkSectionComponent = ({
847
- section,
848
- isCollapsed,
849
- onToggle,
850
- onItemClick,
851
- selectedItemId,
852
- onMenuClick
853
- }) => {
854
- const headerRef = react.useRef(null);
855
- const { buttonProps } = button.useButton(
856
- {
857
- onPress: onToggle,
858
- "aria-label": `${section.title} section, ${isCollapsed ? "collapsed" : "expanded"}`,
859
- "aria-expanded": !isCollapsed
860
- },
861
- headerRef
862
- );
863
- return /* @__PURE__ */ jsxRuntime.jsxs("section", { "aria-label": `${section.title} actions`, children: [
864
- /* @__PURE__ */ jsxRuntime.jsxs(DarkSectionHeader, { ...buttonProps, ref: headerRef, children: [
865
- section.title,
866
- /* @__PURE__ */ jsxRuntime.jsx(DarkChevronIcon, { $isExpanded: !isCollapsed, "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsxs(
867
- "svg",
868
- {
869
- width: "14",
870
- height: "14",
871
- viewBox: "0 0 14 14",
872
- fill: "none",
873
- xmlns: "http://www.w3.org/2000/svg",
874
- role: "img",
875
- "aria-label": "Expand/collapse icon",
876
- children: [
877
- /* @__PURE__ */ jsxRuntime.jsx("title", { children: "Expand/collapse icon" }),
878
- /* @__PURE__ */ jsxRuntime.jsx(
879
- "path",
880
- {
881
- d: "M4 5L7 8L10 5",
882
- stroke: "currentColor",
883
- strokeWidth: "1.5",
884
- strokeLinecap: "round",
885
- strokeLinejoin: "round"
886
- }
887
- )
888
- ]
889
- }
890
- ) })
891
- ] }),
892
- !isCollapsed && /* @__PURE__ */ jsxRuntime.jsx(DarkSectionContent, { role: "list", children: section.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
893
- DarkNotificationItemComponent,
894
- {
895
- item,
896
- isSelected: item.id === selectedItemId,
897
- onItemClick,
898
- onMenuClick
899
- },
900
- item.id
901
- )) })
902
- ] });
903
- };
904
- var DarkNotificationItemComponent = ({
905
- item,
906
- isSelected,
907
- onItemClick,
908
- onMenuClick
909
- }) => {
910
- const itemRef = react.useRef(null);
911
- const menuRef = react.useRef(null);
912
- const { buttonProps: itemButtonProps } = button.useButton(
913
- {
914
- onPress: () => onItemClick?.(item),
915
- "aria-label": `Action: ${item.text}`,
916
- "aria-current": isSelected ? "true" : void 0
917
- },
918
- itemRef
919
- );
920
- const { buttonProps: menuButtonProps } = button.useButton(
921
- {
922
- onPress: () => onMenuClick?.(item),
923
- "aria-label": `Options for ${item.text}`
924
- },
925
- menuRef
926
- );
927
- const handleItemKeyDown = (e) => {
928
- if (isSelected && e.key === "Tab" && !e.shiftKey) {
929
- return;
930
- }
931
- };
932
- return /* @__PURE__ */ jsxRuntime.jsxs(
933
- DarkNotificationItemWrapper,
934
- {
935
- ...itemButtonProps,
936
- ref: itemRef,
937
- $isSelected: isSelected,
938
- $hasIcon: !!item.icon,
939
- role: "listitem",
940
- onKeyDown: handleItemKeyDown,
941
- children: [
942
- /* @__PURE__ */ jsxRuntime.jsx(DarkItemIcon, { $iconColor: item.iconColor, $hasCustomIcon: !!item.icon, children: item.icon || /* @__PURE__ */ jsxRuntime.jsx(
943
- "svg",
944
- {
945
- width: "16",
946
- height: "16",
947
- viewBox: "0 0 16 16",
948
- fill: "none",
949
- xmlns: "http://www.w3.org/2000/svg",
950
- "aria-hidden": "true",
951
- children: /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6", stroke: "currentColor", strokeWidth: "1.5" })
952
- }
953
- ) }),
954
- /* @__PURE__ */ jsxRuntime.jsx(DarkItemText, { $isSelected: isSelected, children: item.text }),
955
- item.timestamp && /* @__PURE__ */ jsxRuntime.jsx(DarkTimestamp, { children: item.timestamp }),
956
- isSelected && onMenuClick && /* @__PURE__ */ jsxRuntime.jsx(
957
- DarkMenuButton,
958
- {
959
- ...menuButtonProps,
960
- ref: menuRef,
961
- onClick: (e) => {
962
- e.stopPropagation();
963
- menuButtonProps.onClick?.(e);
964
- },
965
- children: /* @__PURE__ */ jsxRuntime.jsxs(
966
- "svg",
967
- {
968
- width: "16",
969
- height: "16",
970
- viewBox: "0 0 16 16",
971
- fill: "none",
972
- xmlns: "http://www.w3.org/2000/svg",
973
- "aria-hidden": "true",
974
- children: [
975
- /* @__PURE__ */ jsxRuntime.jsx("title", { children: "More options" }),
976
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "3", r: "1", fill: "currentColor" }),
977
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "1", fill: "currentColor" }),
978
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "13", r: "1", fill: "currentColor" })
979
- ]
980
- }
981
- )
982
- }
983
- )
984
- ]
985
- }
986
- );
987
- };
988
- DarkNotificationCard.displayName = "DarkNotificationCard";
989
- var BG_PRIMARY = "#2F3136";
990
- var BG_SECONDARY = "#202225";
991
- var BG_TERTIARY2 = "#36393F";
992
- var TEXT_PRIMARY2 = "#FFFFFF";
993
- var TEXT_SECONDARY2 = "#B9BBBE";
994
- var TEXT_MUTED2 = "#72767D";
995
- var ACCENT_COLOR2 = "#5865F2";
996
- var HOVER_BG2 = "rgba(255, 255, 255, 0.05)";
997
- var Container6 = styled8__default.default.div`
998
- width: 100%;
999
- height: 100%;
1000
- background-color: ${BG_PRIMARY};
1001
- color: ${TEXT_PRIMARY2};
1002
- display: flex;
1003
- flex-direction: column;
1004
- font-family: ${(props) => props.theme?.fonts?.body || "system-ui, sans-serif"};
1005
- overflow: hidden; // Prevent content from escaping container bounds
1006
- `;
1007
- var TabListWrapper = styled8__default.default.div`
1008
- display: flex;
1009
- border-bottom: 2px solid ${BG_TERTIARY2};
1010
- background-color: ${BG_SECONDARY};
1011
- padding: 0 16px;
1012
- gap: 8px;
1013
- overflow-x: auto;
1014
- scrollbar-width: none;
1015
- -ms-overflow-style: none;
1016
- flex-shrink: 0; // Prevent shrinking when content overflows
1017
-
1018
- &::-webkit-scrollbar {
1019
- display: none;
1020
- }
1021
-
1022
- @media (max-width: 640px) {
1023
- padding: 0 8px;
1024
- gap: 4px;
1025
- }
1026
- `;
1027
- var TabButton = styled8__default.default.button`
1028
- padding: 12px 20px;
1029
- background: none;
1030
- border: none;
1031
- color: ${(props) => props.$isSelected ? TEXT_PRIMARY2 : TEXT_SECONDARY2};
1032
- font-size: 14px;
1033
- font-weight: 600;
1034
- cursor: pointer;
1035
- position: relative;
1036
- transition: color 0.2s ease;
1037
- white-space: nowrap;
1038
- flex-shrink: 0;
1039
-
1040
- @media (max-width: 640px) {
1041
- padding: 10px 12px;
1042
- font-size: 12px;
1043
- }
1044
-
1045
- &:hover {
1046
- color: ${TEXT_PRIMARY2};
1047
- }
1048
-
1049
- &:focus {
1050
- outline: none;
1051
- }
1052
-
1053
- &:focus-visible {
1054
- outline: 2px solid ${ACCENT_COLOR2};
1055
- outline-offset: -2px;
1056
- border-radius: 4px;
1057
- }
1058
-
1059
- ${(props) => props.$isSelected && `
1060
- &::after {
1061
- content: '';
1062
- position: absolute;
1063
- bottom: -2px;
1064
- left: 0;
1065
- right: 0;
1066
- height: 2px;
1067
- background-color: ${ACCENT_COLOR2};
1068
- }
1069
- `}
1070
- `;
1071
- var TabPanelWrapper = styled8__default.default.div`
1072
- flex: 1;
1073
- padding: 24px;
1074
- overflow-y: auto;
1075
- overflow-x: hidden; // Prevent horizontal overflow
1076
- background-color: ${BG_PRIMARY};
1077
- min-height: 0; // Enable proper flex shrinking and scrolling
1078
-
1079
- @media (max-width: 640px) {
1080
- padding: 16px;
1081
- }
1082
-
1083
- @media (max-width: 480px) {
1084
- padding: 12px;
1085
- }
1086
-
1087
- /* Custom scrollbar */
1088
- scrollbar-width: thin;
1089
- scrollbar-color: ${BG_TERTIARY2} ${BG_PRIMARY};
1090
-
1091
- &::-webkit-scrollbar {
1092
- width: 8px;
1093
- }
1094
-
1095
- &::-webkit-scrollbar-track {
1096
- background: ${BG_PRIMARY};
1097
- }
1098
-
1099
- &::-webkit-scrollbar-thumb {
1100
- background: ${BG_TERTIARY2};
1101
- border-radius: 4px;
1102
- }
1103
-
1104
- &::-webkit-scrollbar-thumb:hover {
1105
- background: #4a4d52;
1106
- }
1107
- `;
1108
- var RunsContainer = styled8__default.default.div`
1109
- display: flex;
1110
- flex-direction: column;
1111
- gap: 20px;
1112
- width: 100%;
1113
- flex: 1;
1114
- min-width: 0;
1115
- overflow: hidden;
1116
-
1117
- @media (max-width: 640px) {
1118
- gap: 16px;
1119
- }
1120
- `;
1121
- var BrowseButton = styled8__default.default.button`
1122
- display: flex;
1123
- align-items: center;
1124
- gap: 12px;
1125
- width: 100%;
1126
- padding: 12px 16px;
1127
- background-color: ${BG_SECONDARY};
1128
- border: 1px solid ${BG_TERTIARY2};
1129
- border-radius: 8px;
1130
- color: ${TEXT_SECONDARY2};
1131
- font-size: 14px;
1132
- font-weight: 500;
1133
- cursor: pointer;
1134
- transition: all 0.2s ease;
1135
- white-space: nowrap;
1136
- overflow: hidden;
1137
-
1138
- @media (max-width: 640px) {
1139
- padding: 10px 12px;
1140
- font-size: 13px;
1141
- gap: 8px;
1142
- }
1143
-
1144
- &:hover {
1145
- background-color: ${HOVER_BG2};
1146
- color: ${TEXT_PRIMARY2};
1147
- }
1148
-
1149
- &:focus {
1150
- outline: none;
1151
- }
1152
-
1153
- &:focus-visible {
1154
- outline: 2px solid ${ACCENT_COLOR2};
1155
- outline-offset: 2px;
1156
- }
1157
- `;
1158
- var StyledDisclosureGroup = styled8__default.default(reactAriaComponents.DisclosureGroup)`
1159
- display: flex;
1160
- flex-direction: column;
1161
- gap: 8px;
1162
- width: 100%;
1163
- flex: 1;
1164
- min-width: 0;
1165
- overflow: hidden;
1166
- `;
1167
- var CategoryDisclosure = styled8__default.default(reactAriaComponents.Disclosure)`
1168
- background-color: transparent;
1169
- display: flex;
1170
- flex-direction: column;
1171
- width: 100%;
1172
- flex: 1;
1173
- min-width: 0;
1174
- overflow: hidden;
1175
-
1176
- &[data-expanded] {
1177
- /* Styles when expanded */
1178
- }
1179
-
1180
- &[data-disabled] {
1181
- opacity: 0.5;
1182
- cursor: not-allowed;
1183
- }
1184
- `;
1185
- var CategoryHeader = styled8__default.default(reactAriaComponents.Button)`
1186
- width: 100%;
1187
- padding: 4px 0;
1188
- background: none;
1189
- border: none;
1190
- color: ${TEXT_SECONDARY2};
1191
- display: flex;
1192
- justify-content: space-between;
1193
- align-items: center;
1194
- cursor: pointer;
1195
- transition: color 0.2s ease;
1196
- font-size: 12px;
1197
- font-weight: 600;
1198
- text-transform: uppercase;
1199
- letter-spacing: 0.5px;
1200
-
1201
- &:hover {
1202
- color: ${TEXT_PRIMARY2};
1203
- }
1204
-
1205
- &:focus {
1206
- outline: none;
1207
- }
1208
-
1209
- &[data-focus-visible] {
1210
- outline: 2px solid ${ACCENT_COLOR2};
1211
- outline-offset: 2px;
1212
- border-radius: 4px;
1213
- }
1214
- `;
1215
- var CategoryTitle = styled8__default.default.div`
1216
- display: flex;
1217
- align-items: center;
1218
- gap: 8px;
1219
-
1220
- @media (max-width: 640px) {
1221
- gap: 6px;
1222
- }
1223
- `;
1224
- styled8__default.default.img`
1225
- width: 16px;
1226
- height: 16px;
1227
- opacity: 0.6;
1228
- flex-shrink: 0;
1229
-
1230
- @media (max-width: 640px) {
1231
- width: 14px;
1232
- height: 14px;
1233
- }
1234
- `;
1235
- var HashtagIcon = styled8__default.default.img`
1236
- width: 14px;
1237
- height: 14px;
1238
- opacity: 0.6;
1239
- flex-shrink: 0;
1240
-
1241
- @media (max-width: 640px) {
1242
- width: 12px;
1243
- height: 12px;
1244
- }
1245
- `;
1246
- var ChevronIcon = styled8__default.default.div`
1247
- display: flex;
1248
- align-items: center;
1249
- transition: transform 0.2s ease;
1250
- transform: ${(props) => props.$isExpanded ? "rotate(0deg)" : "rotate(-90deg)"};
1251
- flex-shrink: 0;
1252
- margin-left: 4px;
1253
-
1254
- img {
1255
- width: 16px;
1256
- height: 16px;
1257
- opacity: 0.6;
1258
- }
1259
-
1260
- @media (max-width: 640px) {
1261
- img {
1262
- width: 14px;
1263
- height: 14px;
1264
- }
1265
- }
1266
- `;
1267
- var CategoryDisclosurePanel = styled8__default.default(reactAriaComponents.DisclosurePanel)`
1268
- display: flex;
1269
- flex-direction: column;
1270
- gap: 2px;
1271
- padding-left: 4px;
1272
- width: 100%;
1273
- flex: 1;
1274
- min-width: 0;
1275
- overflow: hidden;
1276
-
1277
- @media (max-width: 640px) {
1278
- padding-left: 2px;
1279
- }
1280
-
1281
- &[data-entering] {
1282
- animation: slideDown 0.2s ease;
1283
- }
1284
-
1285
- @keyframes slideDown {
1286
- from {
1287
- opacity: 0;
1288
- transform: translateY(-8px);
1289
- }
1290
- to {
1291
- opacity: 1;
1292
- transform: translateY(0);
1293
- }
1294
- }
1295
- `;
1296
- var ItemContainer = styled8__default.default.div`
1297
- display: flex;
1298
- align-items: center;
1299
- gap: 8px;
1300
- padding: 4px 8px;
1301
- border-radius: 4px;
1302
- cursor: pointer;
1303
- transition: background-color 0.1s ease;
1304
- min-width: 0;
1305
- overflow: hidden;
1306
-
1307
- @media (max-width: 640px) {
1308
- gap: 6px;
1309
- padding: 4px 6px;
1310
- }
1311
-
1312
- &:hover {
1313
- background-color: ${HOVER_BG2};
1314
- }
1315
- `;
1316
- var ItemDisclosure = styled8__default.default(reactAriaComponents.Disclosure)`
1317
- background-color: transparent;
1318
- margin-bottom: 4px;
1319
- display: flex;
1320
- flex-direction: column;
1321
- width: 100%;
1322
- flex: 1;
1323
- min-width: 0;
1324
- overflow: hidden;
1325
-
1326
- &[data-expanded] {
1327
- background-color: ${BG_SECONDARY};
1328
- border-radius: 8px;
1329
- }
1330
- `;
1331
- var ItemHeader = styled8__default.default(reactAriaComponents.Button)`
1332
- width: 100%;
1333
- padding: 0;
1334
- background: none;
1335
- border: none;
1336
- cursor: pointer;
1337
- transition: all 0.1s ease;
1338
-
1339
- &:focus {
1340
- outline: none;
1341
- }
1342
-
1343
- &[data-focus-visible] {
1344
- outline: 2px solid ${ACCENT_COLOR2};
1345
- outline-offset: 2px;
1346
- border-radius: 4px;
1347
- }
1348
- `;
1349
- var ItemDisclosurePanel = styled8__default.default(reactAriaComponents.DisclosurePanel)`
1350
- padding: 6px;
1351
- background-color: ${BG_SECONDARY};
1352
- border-radius: 0 0 8px 8px;
1353
- margin-top: -4px;
1354
- display: flex;
1355
- flex-direction: column;
1356
- flex: 1;
1357
- min-width: 0;
1358
- overflow: hidden;
1359
-
1360
- @media (max-width: 640px) {
1361
- padding: 6px;
1362
- }
1363
-
1364
- &[data-entering] {
1365
- animation: slideDown 0.2s ease;
1366
- }
1367
-
1368
- @keyframes slideDown {
1369
- from {
1370
- opacity: 0;
1371
- transform: translateY(-8px);
1372
- }
1373
- to {
1374
- opacity: 1;
1375
- transform: translateY(0);
1376
- }
1377
- }
1378
- `;
1379
- var ItemIcon = styled8__default.default.img`
1380
- width: 20px;
1381
- height: 20px;
1382
- opacity: 0.6;
1383
- flex-shrink: 0;
1384
-
1385
- @media (max-width: 640px) {
1386
- width: 18px;
1387
- height: 18px;
1388
- }
1389
- `;
1390
- var ItemName = styled8__default.default.span`
1391
- flex: 1;
1392
- font-size: 14px;
1393
- color: ${(props) => props.$dimmed ? TEXT_MUTED2 : TEXT_SECONDARY2};
1394
- font-weight: ${(props) => props.$dimmed ? "normal" : "500"};
1395
- overflow: hidden;
1396
- text-overflow: ellipsis;
1397
- white-space: nowrap;
1398
- min-width: 0;
1399
-
1400
- @media (max-width: 640px) {
1401
- font-size: 13px;
1402
- }
1403
-
1404
- ${ItemContainer}:hover & {
1405
- color: ${(props) => props.$dimmed ? TEXT_SECONDARY2 : TEXT_PRIMARY2};
1406
- }
1407
- `;
1408
- var RunStatus = styled8__default.default.span`
1409
- font-size: 14px;
1410
- font-weight: 500;
1411
- flex-shrink: 0;
1412
- margin-left: auto;
1413
- color: ${(props) => {
1414
- switch (props.$status) {
1415
- case "completed":
1416
- return "#10b981";
1417
- // green
1418
- case "running":
1419
- return "#f59e0b";
1420
- // yellow
1421
- case "failed":
1422
- return "#ef4444";
1423
- // red
1424
- default:
1425
- return TEXT_SECONDARY2;
1426
- }
1427
- }};
1428
-
1429
- @media (max-width: 640px) {
1430
- font-size: 12px;
1431
- }
1432
- `;
1433
- styled8__default.default.div`
1434
- margin-bottom: 12px;
1435
- border-radius: 12px;
1436
- background-color: ${BG_SECONDARY};
1437
- overflow: hidden;
1438
- `;
1439
- styled8__default.default.button`
1440
- width: 100%;
1441
- padding: 16px;
1442
- background: ${BG_SECONDARY};
1443
- border: none;
1444
- color: ${TEXT_PRIMARY2};
1445
- display: flex;
1446
- justify-content: space-between;
1447
- align-items: center;
1448
- cursor: pointer;
1449
- transition: background-color 0.2s ease;
1450
- text-align: left;
1451
-
1452
- &:hover {
1453
- background-color: ${HOVER_BG2};
1454
- }
1455
-
1456
- &:focus {
1457
- outline: none;
1458
- }
1459
-
1460
- &:focus-visible {
1461
- outline: 2px solid ${ACCENT_COLOR2};
1462
- outline-offset: -2px;
1463
- }
1464
-
1465
- > div {
1466
- flex: 1;
1467
- }
1468
-
1469
- strong {
1470
- display: block;
1471
- font-size: 14px;
1472
- margin-bottom: 4px;
1473
- }
1474
- `;
1475
- styled8__default.default.span`
1476
- font-size: 12px;
1477
- color: ${TEXT_SECONDARY2};
1478
- transition: transform 0.2s ease;
1479
- transform: ${(props) => props.$isExpanded ? "rotate(180deg)" : "rotate(0deg)"};
1480
- `;
1481
- styled8__default.default.div`
1482
- padding: 16px;
1483
- padding-top: 0;
1484
- background-color: ${BG_TERTIARY2};
1485
- color: ${TEXT_SECONDARY2};
1486
- font-size: 13px;
1487
- line-height: 1.6;
1488
- animation: slideDown 0.2s ease;
1489
-
1490
- @keyframes slideDown {
1491
- from {
1492
- opacity: 0;
1493
- transform: translateY(-8px);
1494
- }
1495
- to {
1496
- opacity: 1;
1497
- transform: translateY(0);
1498
- }
1499
- }
1500
- `;
1501
- var MeterContainer = styled8__default.default.div`
1502
- max-width: 600px;
1503
- margin: 0 auto;
1504
- `;
1505
- var MeterLabel = styled8__default.default.div`
1506
- font-size: 16px;
1507
- font-weight: 600;
1508
- margin-bottom: 16px;
1509
- color: ${TEXT_PRIMARY2};
1510
- `;
1511
- var MeterBar = styled8__default.default.div`
1512
- width: 100%;
1513
- height: 24px;
1514
- background-color: ${BG_SECONDARY};
1515
- border-radius: 12px;
1516
- overflow: hidden;
1517
- position: relative;
1518
- margin-bottom: 12px;
1519
- `;
1520
- var MeterFill = styled8__default.default.div`
1521
- height: 100%;
1522
- width: ${(props) => props.$percentage}%;
1523
- background: linear-gradient(90deg, ${(props) => props.$color}dd, ${(props) => props.$color});
1524
- border-radius: 12px;
1525
- transition: width 0.3s ease, background 0.3s ease;
1526
- position: relative;
1527
-
1528
- &::after {
1529
- content: '';
1530
- position: absolute;
1531
- top: 0;
1532
- left: 0;
1533
- right: 0;
1534
- bottom: 0;
1535
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
1536
- animation: shimmer 2s infinite;
1537
- }
1538
-
1539
- @keyframes shimmer {
1540
- 0% {
1541
- transform: translateX(-100%);
1542
- }
1543
- 100% {
1544
- transform: translateX(100%);
1545
- }
1546
- }
1547
- `;
1548
- var MeterStats = styled8__default.default.div`
1549
- font-size: 14px;
1550
- color: ${TEXT_SECONDARY2};
1551
- text-align: center;
1552
-
1553
- small {
1554
- font-size: 12px;
1555
- color: ${TEXT_SECONDARY2};
1556
- opacity: 0.8;
1557
- }
1558
- `;
1559
- var ConnectionsContainer = styled8__default.default.div`
1560
- max-width: 500px;
1561
- margin: 0 auto;
1562
- text-align: center;
1563
- `;
1564
- var ConnectionDescription = styled8__default.default.p`
1565
- font-size: 14px;
1566
- color: ${TEXT_SECONDARY2};
1567
- line-height: 1.6;
1568
- margin-bottom: 24px;
1569
- `;
1570
- var GoogleButton = styled8__default.default.button`
1571
- width: 100%;
1572
- padding: 16px 24px;
1573
- font-size: 15px;
1574
- font-weight: 600;
1575
- color: ${(props) => props.$isConnected ? TEXT_PRIMARY2 : "#FFFFFF"};
1576
- background: ${(props) => props.$isConnected ? BG_TERTIARY2 : "linear-gradient(135deg, #4285F4, #34A853)"};
1577
- border: none;
1578
- border-radius: 8px;
1579
- cursor: pointer;
1580
- transition: all 0.2s ease;
1581
- display: flex;
1582
- align-items: center;
1583
- justify-content: center;
1584
- gap: 8px;
1585
-
1586
- &:hover {
1587
- transform: translateY(-2px);
1588
- box-shadow: 0 4px 12px rgba(66, 133, 244, 0.3);
1589
- }
1590
-
1591
- &:active {
1592
- transform: translateY(0);
1593
- }
1594
-
1595
- &:focus {
1596
- outline: none;
1597
- }
1598
-
1599
- &:focus-visible {
1600
- outline: 2px solid ${ACCENT_COLOR2};
1601
- outline-offset: 2px;
1602
- }
1603
-
1604
- ${(props) => props.$isConnected && `
1605
- &:hover {
1606
- background-color: #ef4444;
1607
- box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
1608
- }
1609
- `}
1610
- `;
1611
- var ICONS = {
1612
- hashtag: "/assets/icon-set/Icon-hashtag.svg",
1613
- bell: "/assets/icon-set/Icon-bell-fill.svg",
1614
- file: "/assets/icon-set/Icon-file-3-fill.svg",
1615
- link: "/assets/icon-set/Icon-external-link-fill.svg",
1616
- chat: "/assets/icon-set/Icon-chat-1-fill.svg",
1617
- community: "/assets/icon-set/Icon-community-fill.svg",
1618
- cpu: "/assets/icon-set/Icon-cpu-fill.svg",
1619
- chevronDown: "/assets/icon-set/Icon-arrow-down-s-fill.svg",
1620
- warning: "/assets/icon-set/Icon-error-warning-fill.svg"
1621
- };
1622
- function ItemWithLogs({ run }) {
1623
- const [isExpanded, setIsExpanded] = react.useState(false);
1624
- const logSections = run.logs ? [
1625
- {
1626
- title: "Action History",
1627
- items: run.logs.map((log) => ({
1628
- id: log.id,
1629
- text: log.text,
1630
- icon: log.icon,
1631
- iconColor: log.iconColor,
1632
- timestamp: log.timestamp
1633
- }))
1634
- }
1635
- ] : [];
1636
- return /* @__PURE__ */ jsxRuntime.jsxs(ItemDisclosure, { id: run.id, children: [
1637
- /* @__PURE__ */ jsxRuntime.jsx(
1638
- ItemHeader,
1639
- {
1640
- slot: "trigger",
1641
- onClick: () => setIsExpanded(!isExpanded),
1642
- $isExpanded: isExpanded,
1643
- children: /* @__PURE__ */ jsxRuntime.jsxs(ItemContainer, { as: "div", children: [
1644
- /* @__PURE__ */ jsxRuntime.jsx(ItemIcon, { src: ICONS[run.icon || "bell"], alt: "" }),
1645
- /* @__PURE__ */ jsxRuntime.jsx(ItemName, { children: run.name }),
1646
- /* @__PURE__ */ jsxRuntime.jsxs(RunStatus, { $status: run.status, children: [
1647
- run.status === "completed" && "\u2713",
1648
- run.status === "running" && "\u27F3",
1649
- run.status === "failed" && "\u2715"
1650
- ] }),
1651
- /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { $isExpanded: isExpanded, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: ICONS.chevronDown, alt: "" }) })
1652
- ] })
1653
- }
1654
- ),
1655
- isExpanded && /* @__PURE__ */ jsxRuntime.jsx(ItemDisclosurePanel, { children: run.logs && run.logs.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(DarkNotificationCard, { sections: logSections }) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: "#72767D", fontSize: "13px", padding: "8px" }, children: "No action logs available" }) })
1656
- ] });
1657
- }
1658
- function RunsTabContent({
1659
- runs,
1660
- onBrowseAutomations
1661
- }) {
1662
- const [expandedKeys, setExpandedKeys] = react.useState(
1663
- /* @__PURE__ */ new Set(["scheduled", "completed", "issues"])
1664
- // All sections open by default
1665
- );
1666
- const scheduledRuns = runs.filter((r) => r.category === "scheduled");
1667
- const completedRuns = runs.filter((r) => r.category === "completed");
1668
- const issuesRuns = runs.filter((r) => r.category === "issues");
1669
- const buttonRef = react.useRef(null);
1670
- const { buttonProps } = button.useButton(
1671
- {
1672
- onPress: onBrowseAutomations
1673
- },
1674
- buttonRef
1675
- );
1676
- return /* @__PURE__ */ jsxRuntime.jsxs(RunsContainer, { children: [
1677
- /* @__PURE__ */ jsxRuntime.jsxs(BrowseButton, { ...buttonProps, ref: buttonRef, children: [
1678
- /* @__PURE__ */ jsxRuntime.jsx(ItemIcon, { src: ICONS.cpu, alt: "" }),
1679
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Browse Automations" })
1680
- ] }),
1681
- /* @__PURE__ */ jsxRuntime.jsxs(
1682
- StyledDisclosureGroup,
1683
- {
1684
- expandedKeys,
1685
- onExpandedChange: setExpandedKeys,
1686
- allowsMultipleExpanded: true,
1687
- "aria-label": "Run sections",
1688
- children: [
1689
- /* @__PURE__ */ jsxRuntime.jsxs(CategoryDisclosure, { id: "scheduled", children: [
1690
- /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Heading, { level: 3, children: /* @__PURE__ */ jsxRuntime.jsxs(CategoryHeader, { slot: "trigger", children: [
1691
- /* @__PURE__ */ jsxRuntime.jsxs(CategoryTitle, { children: [
1692
- /* @__PURE__ */ jsxRuntime.jsx(HashtagIcon, { src: ICONS.hashtag, alt: "" }),
1693
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "SCHEDULED" })
1694
- ] }),
1695
- /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { $isExpanded: expandedKeys.has("scheduled"), children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: ICONS.chevronDown, alt: "" }) })
1696
- ] }) }),
1697
- /* @__PURE__ */ jsxRuntime.jsx(CategoryDisclosurePanel, { children: scheduledRuns.length > 0 ? scheduledRuns.map((run) => /* @__PURE__ */ jsxRuntime.jsx(ItemWithLogs, { run }, run.id)) : /* @__PURE__ */ jsxRuntime.jsx(ItemContainer, { children: /* @__PURE__ */ jsxRuntime.jsx(ItemName, { $dimmed: true, children: "No scheduled items" }) }) })
1698
- ] }),
1699
- /* @__PURE__ */ jsxRuntime.jsxs(CategoryDisclosure, { id: "completed", children: [
1700
- /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Heading, { level: 3, children: /* @__PURE__ */ jsxRuntime.jsxs(CategoryHeader, { slot: "trigger", children: [
1701
- /* @__PURE__ */ jsxRuntime.jsxs(CategoryTitle, { children: [
1702
- /* @__PURE__ */ jsxRuntime.jsx(HashtagIcon, { src: ICONS.hashtag, alt: "" }),
1703
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "COMPLETED" })
1704
- ] }),
1705
- /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { $isExpanded: expandedKeys.has("completed"), children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: ICONS.chevronDown, alt: "" }) })
1706
- ] }) }),
1707
- /* @__PURE__ */ jsxRuntime.jsx(CategoryDisclosurePanel, { children: completedRuns.length > 0 ? completedRuns.map((run) => /* @__PURE__ */ jsxRuntime.jsx(ItemWithLogs, { run }, run.id)) : /* @__PURE__ */ jsxRuntime.jsx(ItemContainer, { children: /* @__PURE__ */ jsxRuntime.jsx(ItemName, { $dimmed: true, children: "No completed items" }) }) })
1708
- ] }),
1709
- /* @__PURE__ */ jsxRuntime.jsxs(CategoryDisclosure, { id: "issues", children: [
1710
- /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Heading, { level: 3, children: /* @__PURE__ */ jsxRuntime.jsxs(CategoryHeader, { slot: "trigger", children: [
1711
- /* @__PURE__ */ jsxRuntime.jsxs(CategoryTitle, { children: [
1712
- /* @__PURE__ */ jsxRuntime.jsx(HashtagIcon, { src: ICONS.hashtag, alt: "" }),
1713
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "ISSUES" })
1714
- ] }),
1715
- /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { $isExpanded: expandedKeys.has("issues"), children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: ICONS.chevronDown, alt: "" }) })
1716
- ] }) }),
1717
- /* @__PURE__ */ jsxRuntime.jsx(CategoryDisclosurePanel, { children: issuesRuns.length > 0 ? issuesRuns.map((run) => /* @__PURE__ */ jsxRuntime.jsx(ItemWithLogs, { run }, run.id)) : /* @__PURE__ */ jsxRuntime.jsx(ItemContainer, { children: /* @__PURE__ */ jsxRuntime.jsx(ItemName, { $dimmed: true, children: "No issues" }) }) })
1718
- ] })
1719
- ]
1720
- }
1721
- )
1722
- ] });
1723
- }
1724
- function UsageTabContent({
1725
- currentUsage = 0,
1726
- maxUsage = 1e5
1727
- }) {
1728
- const ref = react.useRef(null);
1729
- const { meterProps, labelProps } = meter.useMeter({
1730
- label: "Token Usage",
1731
- value: currentUsage,
1732
- minValue: 0,
1733
- maxValue: maxUsage
1734
- });
1735
- const percentage = Math.round(currentUsage / maxUsage * 100);
1736
- let color = "#10b981";
1737
- if (percentage >= 75)
1738
- color = "#ef4444";
1739
- else if (percentage >= 50) color = "#f59e0b";
1740
- return /* @__PURE__ */ jsxRuntime.jsxs(MeterContainer, { children: [
1741
- /* @__PURE__ */ jsxRuntime.jsx(MeterLabel, { ...labelProps, children: "Token Usage" }),
1742
- /* @__PURE__ */ jsxRuntime.jsx(MeterBar, { ...meterProps, ref, children: /* @__PURE__ */ jsxRuntime.jsx(MeterFill, { $percentage: percentage, $color: color }) }),
1743
- /* @__PURE__ */ jsxRuntime.jsxs(MeterStats, { children: [
1744
- percentage,
1745
- "% of ",
1746
- maxUsage.toLocaleString(),
1747
- " tokens used",
1748
- /* @__PURE__ */ jsxRuntime.jsx("br", {}),
1749
- /* @__PURE__ */ jsxRuntime.jsxs("small", { children: [
1750
- currentUsage.toLocaleString(),
1751
- " / ",
1752
- maxUsage.toLocaleString(),
1753
- " tokens"
1754
- ] })
1755
- ] })
1756
- ] });
1757
- }
1758
- function ConnectionsTabContent({
1759
- isGoogleConnected = false,
1760
- onGoogleConnect,
1761
- onGoogleDisconnect,
1762
- oauthConnections,
1763
- onOAuthConnect,
1764
- onOAuthDisconnect,
1765
- isOAuthConnecting = false,
1766
- isOAuthLoading = false
1767
- }) {
1768
- const ref = react.useRef(null);
1769
- const useRealOAuthData = oauthConnections && onOAuthConnect && onOAuthDisconnect;
1770
- const googleConnection = useRealOAuthData ? oauthConnections.find((c) => c.provider === "google") : void 0;
1771
- const isConnected = useRealOAuthData ? googleConnection?.connected || false : isGoogleConnected;
1772
- const handlePress = () => {
1773
- if (useRealOAuthData) {
1774
- if (isConnected && googleConnection) {
1775
- onOAuthDisconnect(googleConnection.id);
1776
- } else {
1777
- onOAuthConnect("google");
1778
- }
1779
- } else {
1780
- if (isConnected && onGoogleDisconnect) {
1781
- onGoogleDisconnect();
1782
- } else if (!isConnected && onGoogleConnect) {
1783
- onGoogleConnect();
1784
- }
1785
- }
1786
- };
1787
- const isButtonDisabled = isOAuthLoading || isOAuthConnecting;
1788
- const { buttonProps } = button.useButton(
1789
- {
1790
- onPress: handlePress,
1791
- isDisabled: isButtonDisabled
1792
- },
1793
- ref
1794
- );
1795
- if (isOAuthLoading) {
1796
- return /* @__PURE__ */ jsxRuntime.jsx(ConnectionsContainer, { children: /* @__PURE__ */ jsxRuntime.jsx(ConnectionDescription, { children: "Loading connections..." }) });
1797
- }
1798
- const buttonText = isOAuthConnecting ? "Connecting..." : isConnected ? "\u2713 Disconnect from Google" : "Connect with Google";
1799
- const descriptionText = isConnected ? googleConnection?.displayName ? `Connected as ${googleConnection.displayName}. You can access Google services and data.` : "Your Google account is connected. You can access Google services and data." : "Connect your Google account to access Google services and integrate with your workflows.";
1800
- return /* @__PURE__ */ jsxRuntime.jsxs(ConnectionsContainer, { children: [
1801
- /* @__PURE__ */ jsxRuntime.jsx(ConnectionDescription, { children: descriptionText }),
1802
- /* @__PURE__ */ jsxRuntime.jsx(
1803
- GoogleButton,
1804
- {
1805
- ...buttonProps,
1806
- ref,
1807
- $isConnected: isConnected,
1808
- children: buttonText
1809
- }
1810
- ),
1811
- isConnected && googleConnection?.scopes && googleConnection.scopes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "16px", fontSize: "13px", color: "#B9BBBE" }, children: [
1812
- "Connected services: ",
1813
- googleConnection.scopes.join(", ")
1814
- ] })
1815
- ] });
1816
- }
1817
- function Tab({ item, state }) {
1818
- const ref = react.useRef(null);
1819
- const { tabProps } = tabs$1.useTab({ key: item.key }, state, ref);
1820
- return /* @__PURE__ */ jsxRuntime.jsx(TabButton, { ...tabProps, ref, $isSelected: state.selectedKey === item.key, children: item.rendered });
1821
- }
1822
- function TabList({
1823
- state,
1824
- ...props
1825
- }) {
1826
- const ref = react.useRef(null);
1827
- const { tabListProps } = tabs$1.useTabList(props, state, ref);
1828
- return /* @__PURE__ */ jsxRuntime.jsx(TabListWrapper, { ...tabListProps, ref, children: [...state.collection].map((item) => /* @__PURE__ */ jsxRuntime.jsx(Tab, { item, state }, item.key)) });
1829
- }
1830
- function TabPanel({
1831
- state,
1832
- ...props
1833
- }) {
1834
- const ref = react.useRef(null);
1835
- const { tabPanelProps } = tabs$1.useTabPanel(props, state, ref);
1836
- return /* @__PURE__ */ jsxRuntime.jsx(TabPanelWrapper, { ...tabPanelProps, ref, children: state.selectedItem?.props.children });
1837
- }
1838
- function PaneMenus({
1839
- activeTab = "runs",
1840
- onTabChange,
1841
- runs = [],
1842
- currentUsage = 0,
1843
- maxUsage = 1e5,
1844
- isGoogleConnected = false,
1845
- onGoogleConnect,
1846
- onGoogleDisconnect,
1847
- oauthConnections,
1848
- onOAuthConnect,
1849
- onOAuthDisconnect,
1850
- isOAuthConnecting = false,
1851
- isOAuthLoading = false,
1852
- onBrowseAutomations
1853
- }) {
1854
- const state = tabs.useTabListState({
1855
- defaultSelectedKey: activeTab,
1856
- onSelectionChange: (key) => {
1857
- if (onTabChange) {
1858
- onTabChange(key);
1859
- }
1860
- },
1861
- children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1862
- /* @__PURE__ */ jsxRuntime.jsx(collections.Item, { title: "Runs", children: /* @__PURE__ */ jsxRuntime.jsx(RunsTabContent, { runs, onBrowseAutomations }) }, "runs"),
1863
- /* @__PURE__ */ jsxRuntime.jsx(collections.Item, { title: "Usage", children: /* @__PURE__ */ jsxRuntime.jsx(UsageTabContent, { currentUsage, maxUsage }) }, "usage"),
1864
- /* @__PURE__ */ jsxRuntime.jsx(collections.Item, { title: "Connections", children: /* @__PURE__ */ jsxRuntime.jsx(
1865
- ConnectionsTabContent,
1866
- {
1867
- isGoogleConnected,
1868
- onGoogleConnect,
1869
- onGoogleDisconnect,
1870
- oauthConnections,
1871
- onOAuthConnect,
1872
- onOAuthDisconnect,
1873
- isOAuthConnecting,
1874
- isOAuthLoading
1875
- }
1876
- ) }, "connections")
1877
- ] })
1878
- });
1879
- return /* @__PURE__ */ jsxRuntime.jsxs(Container6, { children: [
1880
- /* @__PURE__ */ jsxRuntime.jsx(TabList, { state, "aria-label": "Main pane menu" }),
1881
- /* @__PURE__ */ jsxRuntime.jsx(TabPanel, { state }, state.selectedItem?.key)
1882
- ] });
1883
- }
1884
- var HEADER_BG = "#202225";
1885
- var HEADER_BG_DARK = "#18191c";
1886
- var BUTTON_BG = "#36393f";
1887
- var BUTTON_BG_HOVER = "#40444b";
1888
- var breakpoints = {
1889
- xs: "640px",
1890
- sm: "768px",
1891
- md: "1024px",
1892
- lg: "1280px"
1893
- };
1894
- var Container7 = styled8__default.default.header`
1895
- position: relative;
1896
- width: 100%;
1897
- height: 56px;
1898
- background-color: ${HEADER_BG};
1899
- overflow: hidden;
1900
- display: flex;
1901
- align-items: center;
1902
- justify-content: center;
1903
-
1904
- /* Background pattern - responsive sizes */
1905
- &::before {
1906
- content: '';
1907
- position: absolute;
1908
- top: 0;
1909
- left: 0;
1910
- right: 0;
1911
- bottom: 0;
1912
- background-image: url('/assets/bg-set/pattern/Size=xs, Type=Waves Rays2.svg');
1913
- background-size: cover;
1914
- background-position: center;
1915
- background-repeat: no-repeat;
1916
- opacity: 0.6;
1917
- z-index: 0;
1918
- }
1919
-
1920
- /* Small screens */
1921
- @media (min-width: ${breakpoints.xs}) {
1922
- &::before {
1923
- background-image: url('/assets/bg-set/pattern/Size=sm, Type=Waves Rays2.svg');
1924
- }
1925
- }
1926
-
1927
- /* Medium screens */
1928
- @media (min-width: ${breakpoints.sm}) {
1929
- height: 64px;
1930
-
1931
- &::before {
1932
- background-image: url('/assets/bg-set/pattern/Size=md, Type=Waves Rays2.svg');
1933
- }
1934
- }
1935
-
1936
- /* Large screens */
1937
- @media (min-width: ${breakpoints.md}) {
1938
- &::before {
1939
- background-image: url('/assets/bg-set/pattern/Size=lg, Type=Waves Rays2.svg');
1940
- }
1941
- }
1942
-
1943
- /* Extra large screens */
1944
- @media (min-width: ${breakpoints.lg}) {
1945
- &::before {
1946
- background-image: url('/assets/bg-set/pattern/Size=xl, Type=Waves Rays2.svg');
1947
- }
1948
- }
1949
-
1950
- /* Dark theme support */
1951
- @media (prefers-color-scheme: dark) {
1952
- background-color: ${HEADER_BG_DARK};
1953
- }
1954
- `;
1955
- var BrandLogo = styled8__default.default.img`
1956
- position: relative;
1957
- z-index: 1;
1958
- max-height: 28px;
1959
- height: auto;
1960
- width: auto;
1961
- object-fit: contain;
1962
- pointer-events: none;
1963
- user-select: none;
1964
-
1965
- /* Slightly larger on desktop */
1966
- @media (min-width: ${breakpoints.sm}) {
1967
- max-height: 32px;
1968
- }
1969
- `;
1970
- var SettingsButton = styled8__default.default.button`
1971
- position: absolute;
1972
- top: 50%;
1973
- right: 12px;
1974
- transform: translateY(-50%);
1975
- z-index: 2;
1976
-
1977
- /* Button appearance */
1978
- width: 40px;
1979
- height: 40px;
1980
- border-radius: 50%;
1981
- border: none;
1982
- background-color: ${BUTTON_BG};
1983
- cursor: pointer;
1984
-
1985
- /* Center the icon */
1986
- display: flex;
1987
- align-items: center;
1988
- justify-content: center;
1989
-
1990
- /* Smooth transitions */
1991
- transition: background-color 0.2s ease, transform 0.1s ease;
1992
-
1993
- /* Hover state */
1994
- &:hover {
1995
- background-color: ${BUTTON_BG_HOVER};
1996
- }
1997
-
1998
- /* Active state */
1999
- &:active {
2000
- transform: translateY(-50%) scale(0.95);
2001
- }
2002
-
2003
- /* Focus visible state for accessibility */
2004
- &:focus-visible {
2005
- outline: 2px solid #5865f2;
2006
- outline-offset: 2px;
2007
- }
2008
-
2009
- /* Disabled state */
2010
- &:disabled {
2011
- opacity: 0.5;
2012
- cursor: not-allowed;
2013
- }
2014
-
2015
- /* Responsive positioning */
2016
- @media (min-width: ${breakpoints.sm}) {
2017
- right: 16px;
2018
- }
2019
-
2020
- @media (min-width: ${breakpoints.md}) {
2021
- right: 24px;
2022
- }
2023
- `;
2024
- var BackButton2 = styled8__default.default.button`
2025
- position: absolute;
2026
- top: 50%;
2027
- left: 12px;
2028
- transform: translateY(-50%);
2029
- z-index: 2;
2030
-
2031
- /* Button appearance */
2032
- width: 40px;
2033
- height: 40px;
2034
- border-radius: 50%;
2035
- border: none;
2036
- background-color: ${BUTTON_BG};
2037
- cursor: pointer;
2038
-
2039
- /* Center the icon */
2040
- display: flex;
2041
- align-items: center;
2042
- justify-content: center;
2043
-
2044
- /* Smooth transitions */
2045
- transition: background-color 0.2s ease, transform 0.1s ease;
2046
-
2047
- /* Hover state */
2048
- &:hover {
2049
- background-color: ${BUTTON_BG_HOVER};
2050
- }
2051
-
2052
- /* Active state */
2053
- &:active {
2054
- transform: translateY(-50%) scale(0.95);
2055
- }
2056
-
2057
- /* Focus visible state for accessibility */
2058
- &:focus-visible {
2059
- outline: 2px solid #5865f2;
2060
- outline-offset: 2px;
2061
- }
2062
-
2063
- /* Disabled state */
2064
- &:disabled {
2065
- opacity: 0.5;
2066
- cursor: not-allowed;
2067
- }
2068
-
2069
- /* Responsive positioning */
2070
- @media (min-width: ${breakpoints.sm}) {
2071
- left: 16px;
2072
- }
2073
-
2074
- @media (min-width: ${breakpoints.md}) {
2075
- left: 24px;
2076
- }
2077
- `;
2078
- function PaneSectionHeader({
2079
- brand = "Google",
2080
- onBackClick,
2081
- onSettingsClick,
2082
- className,
2083
- "aria-label": ariaLabel = "Pane section header"
2084
- }) {
2085
- const [isBackHovered, setIsBackHovered] = react.useState(false);
2086
- const [isSettingsHovered, setIsSettingsHovered] = react.useState(false);
2087
- const backButtonRef = react.useRef(null);
2088
- const settingsButtonRef = react.useRef(null);
2089
- const { buttonProps: backButtonProps } = button.useButton(
2090
- {
2091
- onPress: onBackClick,
2092
- "aria-label": "Go back"
2093
- },
2094
- backButtonRef
2095
- );
2096
- const { buttonProps: settingsButtonProps } = button.useButton(
2097
- {
2098
- onPress: onSettingsClick,
2099
- "aria-label": "Settings"
2100
- },
2101
- settingsButtonRef
2102
- );
2103
- return /* @__PURE__ */ jsxRuntime.jsxs(Container7, { className, role: "banner", "aria-label": ariaLabel, children: [
2104
- onBackClick && /* @__PURE__ */ jsxRuntime.jsx(
2105
- BackButton2,
2106
- {
2107
- ...backButtonProps,
2108
- ref: backButtonRef,
2109
- onMouseEnter: () => setIsBackHovered(true),
2110
- onMouseLeave: () => setIsBackHovered(false),
2111
- $isHovered: isBackHovered,
2112
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "arrow-left-fill", size: 20, color: "#b9bbbe" })
2113
- }
2114
- ),
2115
- /* @__PURE__ */ jsxRuntime.jsx(BrandLogo, { src: `/assets/bg-set/brand-logos/${brand}2.svg`, alt: brand }),
2116
- /* @__PURE__ */ jsxRuntime.jsx(
2117
- SettingsButton,
2118
- {
2119
- ...settingsButtonProps,
2120
- ref: settingsButtonRef,
2121
- onMouseEnter: () => setIsSettingsHovered(true),
2122
- onMouseLeave: () => setIsSettingsHovered(false),
2123
- $isHovered: isSettingsHovered,
2124
- children: /* @__PURE__ */ jsxRuntime.jsx(
2125
- Icon,
2126
- {
2127
- name: isSettingsHovered ? "settings-line" : "settings-fill",
2128
- size: 20,
2129
- color: "#b9bbbe"
2130
- }
2131
- )
2132
- }
2133
- )
2134
- ] });
2135
- }
2136
- PaneSectionHeader.displayName = "PaneSectionHeader";
2137
- var NAV_BG3 = "#36393F";
2138
- var NAV_BG_HOVER = "#40444b";
2139
- var Container8 = styled8__default.default.button`
2140
- /* Base button styling */
2141
- width: 48px;
2142
- height: 48px;
2143
- border: none;
2144
- padding: 4px;
2145
- border-radius: ${({ $active }) => $active ? "16px" : "50%"};
2146
- background-color: ${NAV_BG3};
2147
- display: flex;
2148
- align-items: center;
2149
- justify-content: center;
2150
- cursor: pointer;
2151
- transition: all 0.15s ease-out;
2152
- position: relative;
2153
- overflow: hidden;
2154
-
2155
- /* Hover state */
2156
- &:hover {
2157
- border-radius: 16px;
2158
- background-color: ${NAV_BG_HOVER};
2159
- }
2160
-
2161
- /* Focus visible state for accessibility */
2162
- &:focus-visible {
2163
- outline: 2px solid #5865f2;
2164
- outline-offset: 2px;
2165
- }
2166
-
2167
- /* Active indicator */
2168
- ${({ $active }) => $active && `
2169
- &::before {
2170
- content: '';
2171
- position: absolute;
2172
- left: -16px;
2173
- top: 50%;
2174
- transform: translateY(-50%);
2175
- width: 4px;
2176
- height: 40px;
2177
- background-color: #ffffff;
2178
- border-radius: 0 4px 4px 0;
2179
- }
2180
- `}
2181
-
2182
- /* Disabled state */
2183
- &:disabled {
2184
- opacity: 0.5;
2185
- cursor: not-allowed;
2186
- }
2187
- `;
2188
- var LogoImage = styled8__default.default.img`
2189
- width: 100%;
2190
- height: 100%;
2191
- object-fit: contain;
2192
- pointer-events: none;
2193
- user-select: none;
2194
- `;
2195
- function ServiceIcon({ brand, active = false, className, ...ariaProps }) {
2196
- const ref = react.useRef(null);
2197
- const { buttonProps } = button.useButton(
2198
- {
2199
- ...ariaProps,
2200
- "aria-pressed": active
2201
- },
2202
- ref
2203
- );
2204
- return /* @__PURE__ */ jsxRuntime.jsx(Container8, { ...buttonProps, ref, $active: active, className, children: /* @__PURE__ */ jsxRuntime.jsx(LogoImage, { src: `/assets/icons/Brand/${brand}.svg`, alt: brand }) });
2205
- }
2206
- ServiceIcon.displayName = "ServiceIcon";
2207
-
2208
- exports.ActionButtons = ActionButtons;
2209
- exports.Icon = Icon;
2210
- exports.IconNames = IconNames;
2211
- exports.Layout = Layout;
2212
- exports.NavHorizontal = NavHorizontal;
2213
- exports.NavVertical = NavVertical;
2214
- exports.PaneMenus = PaneMenus;
2215
- exports.PaneSectionHeader = PaneSectionHeader;
2216
- exports.ServiceIcon = ServiceIcon;
2217
- exports.WorkflowStatusCard = WorkflowStatusCard;
2218
- //# sourceMappingURL=chunk-ULL2LDN3.cjs.map
2219
- //# sourceMappingURL=chunk-ULL2LDN3.cjs.map