@agentiffai/design 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
- import { useRef, useState, useCallback, useEffect, useId, useMemo } from 'react';
1
+ import { memo, useRef, useState, useEffect, useCallback, useId, useMemo } from 'react';
2
2
  import styled11, { keyframes, css, createGlobalStyle } from 'styled-components';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { useButton } from '@react-aria/button';
5
- import { useTextField } from '@react-aria/textfield';
6
5
  import { useMeter } from '@react-aria/meter';
7
6
  import { useTabList, useTabPanel, useTab } from '@react-aria/tabs';
8
7
  import { Item } from '@react-stately/collections';
9
8
  import { useTabListState } from '@react-stately/tabs';
10
9
  import { DisclosureGroup, Disclosure, Button, DisclosurePanel, Heading } from 'react-aria-components';
10
+ import { useTextField } from '@react-aria/textfield';
11
11
 
12
12
  // src/components/AssistantThinking/AssistantThinking.tsx
13
13
 
@@ -456,7 +456,7 @@ var SuggestionButton = styled11.button`
456
456
  font-weight: ${tokens.typography.fontWeight.regular};
457
457
  text-align: center;
458
458
  border: 1px solid ${tokens.colors.border.default};
459
- border-radius: 20px;
459
+ border-radius: ${tokens.borderRadius.full};
460
460
  cursor: pointer;
461
461
  transition: all ${tokens.transitions.fast};
462
462
  white-space: nowrap;
@@ -490,9 +490,9 @@ var SuggestionButton = styled11.button`
490
490
  `;
491
491
  var InputWrapper = styled11.div`
492
492
  display: flex;
493
- align-items: center;
494
- gap: 10px;
495
- padding: 10px 14px;
493
+ align-items: flex-end; /* Align button to bottom when textarea expands */
494
+ gap: ${tokens.spacing.sm};
495
+ padding: ${tokens.spacing.sm} ${tokens.spacing.md};
496
496
  background-color: rgba(25, 25, 25, 0.4);
497
497
  border: 1px solid ${tokens.colors.border.subtle};
498
498
  border-radius: ${tokens.borderRadius.lg};
@@ -506,7 +506,7 @@ var InputWrapper = styled11.div`
506
506
  background-color: rgba(50, 50, 52, 0.6);
507
507
  }
508
508
  `;
509
- var InputField = styled11.input`
509
+ var InputField = styled11.textarea`
510
510
  flex: 1;
511
511
  border: none;
512
512
  outline: none;
@@ -514,6 +514,13 @@ var InputField = styled11.input`
514
514
  font-size: ${tokens.typography.fontSize.sm};
515
515
  color: ${tokens.colors.text.secondary};
516
516
  background: transparent;
517
+ resize: none; /* Disable manual resize, we auto-resize */
518
+ min-height: 24px; /* Single line height */
519
+ max-height: 150px; /* Max ~6 lines before scrolling */
520
+ overflow-y: auto;
521
+ line-height: 1.5;
522
+ padding: 0;
523
+ margin: 0;
517
524
 
518
525
  &::placeholder {
519
526
  color: ${tokens.colors.text.tertiary};
@@ -569,31 +576,29 @@ var ChatInput = ({
569
576
  isReadOnly = false,
570
577
  autoFocus = false,
571
578
  className,
572
- "aria-label": ariaLabel = "Chat message input",
573
- ...ariaProps
579
+ "aria-label": ariaLabel = "Chat message input"
580
+ // Note: Additional AriaTextFieldProps are accepted but not spread to textarea
581
+ // since useTextField is not compatible with textarea elements
574
582
  }) => {
575
583
  const [internalValue, setInternalValue] = useState(value);
576
584
  const inputRef = useRef(null);
577
585
  const currentValue = value !== void 0 ? value : internalValue;
578
586
  const setValue = onChange || setInternalValue;
579
- const { inputProps } = useTextField(
580
- {
581
- ...ariaProps,
582
- "aria-label": ariaLabel,
583
- value: currentValue,
584
- onChange: (newValue) => {
585
- setValue(newValue);
586
- },
587
- isDisabled,
588
- isReadOnly
589
- },
590
- inputRef
591
- );
587
+ const autoResize = useCallback(() => {
588
+ const textarea = inputRef.current;
589
+ if (textarea) {
590
+ textarea.style.height = "auto";
591
+ textarea.style.height = `${textarea.scrollHeight}px`;
592
+ }
593
+ }, []);
594
+ useEffect(() => {
595
+ autoResize();
596
+ }, [currentValue, autoResize]);
592
597
  const handleDirectChange = (e) => {
593
598
  setValue(e.target.value);
594
599
  };
595
600
  const handleKeyDown = (e) => {
596
- if (e.key === "Enter") {
601
+ if (e.key === "Enter" && !e.shiftKey) {
597
602
  e.preventDefault();
598
603
  handleSubmit();
599
604
  }
@@ -602,6 +607,9 @@ var ChatInput = ({
602
607
  if (currentValue.trim() && onSubmit && !isDisabled && !isReadOnly) {
603
608
  onSubmit(currentValue.trim());
604
609
  setValue("");
610
+ if (inputRef.current) {
611
+ inputRef.current.style.height = "auto";
612
+ }
605
613
  inputRef.current?.focus();
606
614
  }
607
615
  };
@@ -625,16 +633,16 @@ var ChatInput = ({
625
633
  /* @__PURE__ */ jsx(
626
634
  InputField,
627
635
  {
628
- ...inputProps,
629
636
  ref: inputRef,
630
- type: "text",
637
+ "aria-label": ariaLabel,
631
638
  placeholder,
632
639
  onKeyDown: handleKeyDown,
633
640
  onChange: handleDirectChange,
634
641
  autoFocus,
635
642
  disabled: isDisabled,
636
643
  readOnly: isReadOnly,
637
- value: currentValue
644
+ value: currentValue,
645
+ rows: 1
638
646
  }
639
647
  ),
640
648
  /* @__PURE__ */ jsx(
@@ -709,7 +717,7 @@ var NavigationContainer = styled11.div`
709
717
  display: flex;
710
718
  flex-direction: column;
711
719
  align-items: center;
712
- padding-top: 6px;
720
+ padding-top: ${tokens.spacing.xs};
713
721
  gap: ${tokens.spacing.xs};
714
722
  width: 100%;
715
723
  height: 100%;
@@ -762,7 +770,7 @@ var CategoryButton = styled11.button`
762
770
  var CategoryLabel = styled11.span`
763
771
  font-size: 9px;
764
772
  color: ${tokens.colors.text.tertiary};
765
- margin-top: 2px;
773
+ margin-top: ${tokens.spacing.xs};
766
774
  text-align: center;
767
775
  max-width: 56px;
768
776
  overflow: hidden;
@@ -1050,8 +1058,10 @@ var Container2 = styled11.nav`
1050
1058
  right: 0;
1051
1059
  background-color: ${tokens.colors.background.darker};
1052
1060
  border-top: 1px solid ${tokens.colors.border.subtle};
1053
- /* Reserve space for Android nav buttons (80px) below the actual navbar */
1054
- padding-bottom: max(80px, env(safe-area-inset-bottom, 80px));
1061
+ /* Use safe-area-inset-bottom for Android navigation buttons.
1062
+ The env() value will be 0 on devices without soft nav buttons.
1063
+ Fallback to 0 if env() is not supported. */
1064
+ padding-bottom: env(safe-area-inset-bottom, 0px);
1055
1065
  z-index: ${tokens.zIndex.sticky};
1056
1066
 
1057
1067
  /* Dark theme support */
@@ -1609,7 +1619,7 @@ WorkflowStatusCard.displayName = "WorkflowStatusCard";
1609
1619
  var DarkNotificationCardContainer = styled11.div`
1610
1620
  display: flex;
1611
1621
  flex-direction: column;
1612
- padding: 6px;
1622
+ padding: ${tokens.spacing.xs};
1613
1623
  background: ${tokens.colors.surface.base};
1614
1624
  border-radius: ${tokens.borderRadius.md};
1615
1625
  gap: ${tokens.spacing.xs};
@@ -1622,7 +1632,7 @@ var DarkSectionHeader = styled11.button`
1622
1632
  align-items: center;
1623
1633
  justify-content: space-between;
1624
1634
  width: 100%;
1625
- padding: ${tokens.spacing.xs} 2px;
1635
+ padding: ${tokens.spacing.xs} ${tokens.spacing.xs};
1626
1636
  border: none;
1627
1637
  background: transparent;
1628
1638
  font-family: ${tokens.typography.fontFamily.primary};
@@ -1664,18 +1674,18 @@ var DarkChevronIcon = styled11.span`
1664
1674
  var DarkSectionContent = styled11.div`
1665
1675
  display: flex;
1666
1676
  flex-direction: column;
1667
- gap: 2px;
1677
+ gap: ${tokens.spacing.xs};
1668
1678
  padding-left: ${tokens.spacing.xs};
1669
- margin-top: 2px;
1679
+ margin-top: ${tokens.spacing.xs};
1670
1680
  min-width: 0;
1671
1681
  overflow: hidden;
1672
1682
  `;
1673
1683
  var DarkNotificationItemWrapper = styled11.button`
1674
1684
  display: flex;
1675
1685
  align-items: center;
1676
- gap: 6px;
1686
+ gap: ${tokens.spacing.xs};
1677
1687
  width: 100%;
1678
- padding: ${tokens.spacing.xs} 6px;
1688
+ padding: ${tokens.spacing.xs} ${tokens.spacing.xs};
1679
1689
  border: none;
1680
1690
  cursor: pointer;
1681
1691
  text-align: left;
@@ -1731,7 +1741,7 @@ var DarkItemIcon = styled11.span`
1731
1741
 
1732
1742
  /* Custom icon (emoji or colored icon) styling */
1733
1743
  ${(props) => props.$hasCustomIcon && `
1734
- padding: 2px;
1744
+ padding: ${tokens.spacing.xs};
1735
1745
  `}
1736
1746
  `;
1737
1747
  var DarkItemText = styled11.span`
@@ -2009,7 +2019,7 @@ var TabButton = styled11.button`
2009
2019
  flex-shrink: 0;
2010
2020
 
2011
2021
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2012
- padding: 10px ${tokens.spacing.md};
2022
+ padding: ${tokens.spacing.sm} ${tokens.spacing.md};
2013
2023
  font-size: ${tokens.typography.fontSize.xs};
2014
2024
  }
2015
2025
 
@@ -2107,7 +2117,7 @@ styled11.button`
2107
2117
  overflow: hidden;
2108
2118
 
2109
2119
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2110
- padding: 10px ${tokens.spacing.md};
2120
+ padding: ${tokens.spacing.sm} ${tokens.spacing.md};
2111
2121
  font-size: 13px;
2112
2122
  gap: ${tokens.spacing.sm};
2113
2123
  }
@@ -2189,7 +2199,7 @@ var CategoryTitle = styled11.div`
2189
2199
  gap: ${tokens.spacing.sm};
2190
2200
 
2191
2201
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2192
- gap: 6px;
2202
+ gap: ${tokens.spacing.xs};
2193
2203
  }
2194
2204
  `;
2195
2205
  styled11.img`
@@ -2246,7 +2256,7 @@ var CategoryDisclosurePanel = styled11(DisclosurePanel)`
2246
2256
  overflow: hidden;
2247
2257
 
2248
2258
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2249
- padding-left: 2px;
2259
+ padding-left: ${tokens.spacing.xs};
2250
2260
  }
2251
2261
 
2252
2262
  &[data-entering] {
@@ -2268,7 +2278,7 @@ var ItemContainer = styled11.div`
2268
2278
  display: flex;
2269
2279
  align-items: center;
2270
2280
  gap: ${tokens.spacing.sm};
2271
- padding: 10px ${tokens.spacing.sm}; // Increased vertical padding from 4px to 10px for better breathing room
2281
+ padding: ${tokens.spacing.sm} ${tokens.spacing.sm}; // Increased vertical padding from 4px to 8px for better breathing room
2272
2282
  border-radius: ${tokens.borderRadius.sm};
2273
2283
  cursor: pointer;
2274
2284
  transition: background-color ${tokens.transitions.fast};
@@ -2276,8 +2286,8 @@ var ItemContainer = styled11.div`
2276
2286
  overflow: hidden;
2277
2287
 
2278
2288
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2279
- gap: 6px;
2280
- padding: ${tokens.spacing.sm} 6px; // Increased vertical padding from 4px to 8px for mobile
2289
+ gap: ${tokens.spacing.xs};
2290
+ padding: ${tokens.spacing.sm} ${tokens.spacing.xs}; // Increased vertical padding from 4px to 8px for mobile
2281
2291
  }
2282
2292
 
2283
2293
  &:hover {
@@ -2318,7 +2328,7 @@ var ItemHeader = styled11(Button)`
2318
2328
  }
2319
2329
  `;
2320
2330
  var ItemDisclosurePanel = styled11(DisclosurePanel)`
2321
- padding: 6px;
2331
+ padding: ${tokens.spacing.xs};
2322
2332
  background-color: ${tokens.colors.overlay};
2323
2333
  border-radius: 0 0 ${tokens.borderRadius.md} ${tokens.borderRadius.md};
2324
2334
  margin-top: -${tokens.spacing.xs};
@@ -2329,7 +2339,7 @@ var ItemDisclosurePanel = styled11(DisclosurePanel)`
2329
2339
  overflow: hidden;
2330
2340
 
2331
2341
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2332
- padding: 6px;
2342
+ padding: ${tokens.spacing.xs};
2333
2343
  }
2334
2344
 
2335
2345
  &[data-entering] {
@@ -2650,7 +2660,7 @@ function ItemWithLogs({
2650
2660
  isExpanded && /* @__PURE__ */ jsx(ItemDisclosurePanel, { children: run.customContent ? (
2651
2661
  // Render custom content directly
2652
2662
  /* @__PURE__ */ jsx("div", { style: { padding: "16px" }, children: run.customContent })
2653
- ) : run.logs && run.logs.length > 0 ? /* @__PURE__ */ jsx(DarkNotificationCard, { sections: logSections }) : /* @__PURE__ */ jsx("div", { style: { color: "#72767D", fontSize: "13px", padding: "8px" }, children: "No action logs available" }) })
2663
+ ) : run.logs && run.logs.length > 0 ? /* @__PURE__ */ jsx(DarkNotificationCard, { sections: logSections }) : /* @__PURE__ */ jsx("div", { style: { color: tokens.colors.text.tertiary, fontSize: "13px", padding: "8px" }, children: "No action logs available" }) })
2654
2664
  ] });
2655
2665
  }
2656
2666
  function normalizeCategory(category) {
@@ -2685,7 +2695,7 @@ function WorkflowGroupItem({
2685
2695
  /* @__PURE__ */ jsx(Heading, { level: 4, children: /* @__PURE__ */ jsxs(CategoryHeader, { slot: "trigger", style: { paddingLeft: "8px" }, children: [
2686
2696
  /* @__PURE__ */ jsxs(CategoryTitle, { children: [
2687
2697
  /* @__PURE__ */ jsx("span", { style: { fontSize: "13px", fontWeight: 500 }, children: group.workflowName }),
2688
- /* @__PURE__ */ jsxs("span", { style: { fontSize: "11px", color: "#72767D", marginLeft: "8px" }, children: [
2698
+ /* @__PURE__ */ jsxs("span", { style: { fontSize: "11px", color: tokens.colors.text.tertiary, marginLeft: "8px" }, children: [
2689
2699
  "(",
2690
2700
  group.runs.length,
2691
2701
  ")"
@@ -2895,7 +2905,7 @@ function ConnectionsTabContent({
2895
2905
  return /* @__PURE__ */ jsxs(ConnectionsContainer, { children: [
2896
2906
  /* @__PURE__ */ jsx(ConnectionDescription, { children: descriptionText }),
2897
2907
  /* @__PURE__ */ jsx(GoogleButton, { ...buttonProps, ref, $isConnected: isConnected, children: buttonText }),
2898
- isConnected && googleConnection?.scopes && googleConnection.scopes.length > 0 && /* @__PURE__ */ jsxs("div", { style: { marginTop: "16px", fontSize: "13px", color: "#B9BBBE" }, children: [
2908
+ isConnected && googleConnection?.scopes && googleConnection.scopes.length > 0 && /* @__PURE__ */ jsxs("div", { style: { marginTop: "16px", fontSize: "13px", color: tokens.colors.text.secondary }, children: [
2899
2909
  "Connected services: ",
2900
2910
  googleConnection.scopes.join(", ")
2901
2911
  ] })
@@ -2938,7 +2948,8 @@ function PaneMenus({
2938
2948
  isOAuthConnecting = false,
2939
2949
  isOAuthLoading = false,
2940
2950
  connectionsSlot,
2941
- workflowsSlot
2951
+ workflowsSlot,
2952
+ usageSlot
2942
2953
  }) {
2943
2954
  const state = useTabListState({
2944
2955
  selectedKey: activeTab,
@@ -2950,7 +2961,7 @@ function PaneMenus({
2950
2961
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
2951
2962
  workflowsSlot && /* @__PURE__ */ jsx(Item, { title: "Workflows", children: workflowsSlot }, "workflows"),
2952
2963
  /* @__PURE__ */ jsx(Item, { title: "Runs", children: /* @__PURE__ */ jsx(RunsTabContent, { runs, onRunSelect }) }, "runs"),
2953
- /* @__PURE__ */ jsx(Item, { title: "Usage", children: /* @__PURE__ */ jsx(UsageTabContent, { currentUsage, maxUsage }) }, "usage"),
2964
+ /* @__PURE__ */ jsx(Item, { title: "Usage", children: usageSlot || /* @__PURE__ */ jsx(UsageTabContent, { currentUsage, maxUsage }) }, "usage"),
2954
2965
  /* @__PURE__ */ jsx(Item, { title: "Connections", children: connectionsSlot || /* @__PURE__ */ jsx(
2955
2966
  ConnectionsTabContent,
2956
2967
  {
@@ -3345,12 +3356,12 @@ var NotificationItemWrapper = styled11.button`
3345
3356
  align-items: center;
3346
3357
  gap: ${tokens.spacing.md};
3347
3358
  width: 100%;
3348
- padding: ${(props) => props.$isSelected ? `${tokens.spacing.md} ${tokens.spacing.md}` : `10px ${tokens.spacing.md}`};
3359
+ padding: ${(props) => props.$isSelected ? `${tokens.spacing.md} ${tokens.spacing.md}` : `${tokens.spacing.sm} ${tokens.spacing.md}`};
3349
3360
  border: none;
3350
3361
  cursor: pointer;
3351
3362
  text-align: left;
3352
3363
  transition: all ${tokens.transitions.normal};
3353
- border-radius: ${(props) => props.$isSelected ? tokens.borderRadius.lg : "10px"};
3364
+ border-radius: ${(props) => props.$isSelected ? tokens.borderRadius.lg : tokens.borderRadius.lg};
3354
3365
 
3355
3366
  /* Default state - transparent background */
3356
3367
  background-color: ${(props) => props.$isSelected ? tokens.colors.secondary : "transparent"};
@@ -3399,7 +3410,7 @@ var ItemIcon2 = styled11.span`
3399
3410
 
3400
3411
  /* Custom icon (emoji or colored icon) styling */
3401
3412
  ${(props) => props.$hasCustomIcon && `
3402
- padding: 2px;
3413
+ padding: ${tokens.spacing.xs};
3403
3414
  `}
3404
3415
  `;
3405
3416
  var ItemText = styled11.span`
@@ -3643,7 +3654,7 @@ var StyledUserMessage = styled11.button`
3643
3654
  && {
3644
3655
  background: ${tokens.colors.message.user} !important;
3645
3656
  color: ${tokens.colors.text.primary} !important;
3646
- border-radius: ${tokens.borderRadius.full} !important; /* Pill shape - fully rounded ends */
3657
+ border-radius: ${tokens.borderRadius["2xl"]} !important; /* Rounded corners that work for multi-line */
3647
3658
  }
3648
3659
 
3649
3660
  /* Subtle shadow and glow effect */
@@ -3723,7 +3734,7 @@ var StyledUserMessage = styled11.button`
3723
3734
  }
3724
3735
  }
3725
3736
  `;
3726
- function UserMessage({
3737
+ function UserMessageBase({
3727
3738
  children,
3728
3739
  className,
3729
3740
  isPressed = false,
@@ -3754,6 +3765,7 @@ function UserMessage({
3754
3765
  }
3755
3766
  );
3756
3767
  }
3768
+ var UserMessage = memo(UserMessageBase);
3757
3769
  UserMessage.displayName = "UserMessage";
3758
3770
 
3759
3771
  // src/theme/darkTheme.ts
@@ -3945,25 +3957,28 @@ var IntegrationCard = ({
3945
3957
  className
3946
3958
  }) => {
3947
3959
  return /* @__PURE__ */ jsxs(Card, { className, "data-testid": "integration-card", children: [
3948
- /* @__PURE__ */ jsxs(Header, { children: [
3960
+ status && /* @__PURE__ */ jsx(StatusRow, { children: status }),
3961
+ /* @__PURE__ */ jsxs(ContentHeader, { children: [
3949
3962
  /* @__PURE__ */ jsx(IconWrapper3, { children: typeof icon === "string" ? /* @__PURE__ */ jsx(IconImage, { src: icon, alt: name }) : icon }),
3950
3963
  /* @__PURE__ */ jsxs(Info, { children: [
3951
3964
  /* @__PURE__ */ jsx(Name, { children: name }),
3952
3965
  description && /* @__PURE__ */ jsx(Description, { children: description })
3953
- ] }),
3954
- status && /* @__PURE__ */ jsx(StatusWrapper, { children: status })
3966
+ ] })
3955
3967
  ] }),
3956
- children && /* @__PURE__ */ jsx(ContentRow, { children }),
3957
- actions && /* @__PURE__ */ jsx(ActionsRow, { children: actions })
3968
+ (children || actions) && /* @__PURE__ */ jsxs(ActionsRow, { children: [
3969
+ children,
3970
+ actions
3971
+ ] })
3958
3972
  ] });
3959
3973
  };
3960
3974
  IntegrationCard.displayName = "IntegrationCard";
3961
3975
  var Card = styled11.div`
3962
- display: grid;
3976
+ display: flex;
3977
+ flex-direction: column;
3963
3978
  gap: ${tokens.spacing.sm};
3964
3979
  padding: ${tokens.spacing.md};
3965
3980
  background: ${tokens.colors.background.dark};
3966
- border-radius: ${tokens.borderRadius.lg};
3981
+ border-radius: ${tokens.borderRadius.xl};
3967
3982
  border: 1px solid ${tokens.colors.border.default};
3968
3983
  font-family: ${tokens.typography.fontFamily.primary};
3969
3984
  transition: border-color ${tokens.transitions.fast};
@@ -3972,10 +3987,13 @@ var Card = styled11.div`
3972
3987
  border-color: ${tokens.colors.border.hover};
3973
3988
  }
3974
3989
  `;
3975
- var Header = styled11.div`
3976
- display: grid;
3977
- grid-template-columns: auto 1fr auto;
3978
- align-items: start;
3990
+ var StatusRow = styled11.div`
3991
+ display: flex;
3992
+ align-items: center;
3993
+ `;
3994
+ var ContentHeader = styled11.div`
3995
+ display: flex;
3996
+ align-items: flex-start;
3979
3997
  gap: ${tokens.spacing.sm};
3980
3998
  `;
3981
3999
  var IconWrapper3 = styled11.div`
@@ -3998,7 +4016,7 @@ var Info = styled11.div`
3998
4016
  flex-direction: column;
3999
4017
  gap: 2px;
4000
4018
  min-width: 0;
4001
- padding-top: 2px;
4019
+ flex: 1;
4002
4020
  `;
4003
4021
  var Name = styled11.h3`
4004
4022
  margin: 0;
@@ -4013,21 +4031,10 @@ var Description = styled11.p`
4013
4031
  color: ${tokens.colors.text.tertiary};
4014
4032
  line-height: ${tokens.typography.lineHeight.normal};
4015
4033
  `;
4016
- var StatusWrapper = styled11.div`
4017
- flex-shrink: 0;
4018
- padding-top: 2px;
4019
- `;
4020
- var ContentRow = styled11.div`
4021
- display: flex;
4022
- gap: ${tokens.spacing.sm};
4023
- align-items: center;
4024
- padding-left: calc(40px + ${tokens.spacing.sm});
4025
- `;
4026
4034
  var ActionsRow = styled11.div`
4027
4035
  display: flex;
4036
+ flex-direction: column;
4028
4037
  gap: ${tokens.spacing.sm};
4029
- justify-content: flex-end;
4030
- padding-top: ${tokens.spacing.xs};
4031
4038
  `;
4032
4039
  var EyeIcon = () => /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
4033
4040
  /* @__PURE__ */ jsx("title", { children: "Show" }),
@@ -4945,7 +4952,7 @@ var ActionButton2 = styled11.button`
4945
4952
  display: block;
4946
4953
  }
4947
4954
  `;
4948
- var Header2 = ({
4955
+ var Header = ({
4949
4956
  title,
4950
4957
  subtitle,
4951
4958
  streamStatus,
@@ -5022,7 +5029,7 @@ var Header2 = ({
5022
5029
  ] })
5023
5030
  ] });
5024
5031
  };
5025
- Header2.displayName = "Header";
5032
+ Header.displayName = "Header";
5026
5033
  var InputContainer = styled11.div`
5027
5034
  display: flex;
5028
5035
  flex-direction: column;
@@ -5230,6 +5237,9 @@ var Container12 = styled11.div`
5230
5237
  white-space: pre-wrap;
5231
5238
  word-break: break-word;
5232
5239
  line-height: ${tokens.typography.lineHeight.normal};
5240
+ /* Performance optimizations for streaming text */
5241
+ text-rendering: optimizeSpeed;
5242
+ contain: content;
5233
5243
  `;
5234
5244
  var Cursor = styled11.span`
5235
5245
  display: inline-block;
@@ -5251,7 +5261,7 @@ var Cursor = styled11.span`
5251
5261
  }
5252
5262
  }
5253
5263
  `;
5254
- var StreamingText2 = ({
5264
+ var StreamingTextBase = ({
5255
5265
  content,
5256
5266
  isStreaming = false,
5257
5267
  typingSpeed: _typingSpeed = 50,
@@ -5261,25 +5271,27 @@ var StreamingText2 = ({
5261
5271
  onStreamComplete,
5262
5272
  className
5263
5273
  }) => {
5264
- const [displayedText, setDisplayedText] = useState("");
5274
+ const [displayedText, setDisplayedText] = useState(content);
5275
+ const wasStreamingRef = useRef(isStreaming);
5276
+ const completionCalledRef = useRef(false);
5265
5277
  useEffect(() => {
5266
- if (isStreaming) {
5267
- setDisplayedText(content);
5268
- return;
5278
+ setDisplayedText(content);
5279
+ if (wasStreamingRef.current && !isStreaming && !completionCalledRef.current) {
5280
+ completionCalledRef.current = true;
5281
+ onStreamComplete?.();
5269
5282
  }
5270
- if (!isStreaming && displayedText !== content) {
5271
- setDisplayedText(content);
5272
- if (onStreamComplete) {
5273
- onStreamComplete();
5274
- }
5283
+ if (isStreaming) {
5284
+ completionCalledRef.current = false;
5275
5285
  }
5276
- }, [content, isStreaming, onStreamComplete, displayedText]);
5286
+ wasStreamingRef.current = isStreaming;
5287
+ }, [content, isStreaming, onStreamComplete]);
5277
5288
  const showCursor = isStreaming && cursor;
5278
5289
  return /* @__PURE__ */ jsxs(Container12, { variant, className, children: [
5279
5290
  displayedText,
5280
5291
  showCursor && /* @__PURE__ */ jsx(Cursor, {})
5281
5292
  ] });
5282
5293
  };
5294
+ var StreamingText2 = memo(StreamingTextBase);
5283
5295
  StreamingText2.displayName = "StreamingText";
5284
5296
  var MessageContainer = styled11.div`
5285
5297
  display: flex;
@@ -5287,20 +5299,9 @@ var MessageContainer = styled11.div`
5287
5299
  align-items: flex-start;
5288
5300
  padding: ${tokens.spacing.sm} 0;
5289
5301
  max-width: 100%;
5290
-
5291
- /* Fade in and slide up animation */
5292
- animation: fadeInSlideUp ${tokens.animation.duration.medium} ease-out;
5293
-
5294
- @keyframes fadeInSlideUp {
5295
- from {
5296
- opacity: 0;
5297
- transform: translateY(${tokens.spacing.sm});
5298
- }
5299
- to {
5300
- opacity: 1;
5301
- transform: translateY(0);
5302
- }
5303
- }
5302
+ /* GPU acceleration hint for smooth rendering during streaming */
5303
+ will-change: contents;
5304
+ contain: content;
5304
5305
  `;
5305
5306
  var AvatarContainer = styled11.div`
5306
5307
  flex-shrink: 0;
@@ -5335,9 +5336,8 @@ var ContentContainer = styled11.div`
5335
5336
  min-width: 0;
5336
5337
  `;
5337
5338
  var MessageContent = styled11.div`
5338
- background-color: ${tokens.colors.surface.glass};
5339
- backdrop-filter: blur(10px);
5340
- -webkit-backdrop-filter: blur(10px);
5339
+ /* Use solid color instead of backdrop-filter for performance during streaming */
5340
+ background-color: ${tokens.colors.surface.elevated};
5341
5341
  padding: ${tokens.spacing.sm} ${tokens.spacing.md};
5342
5342
  border-radius: ${tokens.borderRadius.lg};
5343
5343
  border-top-left-radius: ${tokens.borderRadius.sm};
@@ -5347,24 +5347,25 @@ var MessageContent = styled11.div`
5347
5347
  font-family: ${tokens.typography.fontFamily.primary};
5348
5348
  word-wrap: break-word;
5349
5349
  white-space: pre-wrap;
5350
+ /* Optimize text rendering */
5351
+ text-rendering: optimizeSpeed;
5350
5352
  `;
5351
5353
  var LoadingDots3 = styled11.div`
5352
5354
  display: flex;
5353
5355
  gap: ${tokens.spacing.xs};
5354
5356
  padding: ${tokens.spacing.sm} ${tokens.spacing.md};
5355
- background-color: ${tokens.colors.surface.glass};
5356
- backdrop-filter: blur(10px);
5357
- -webkit-backdrop-filter: blur(10px);
5357
+ /* Use solid color instead of backdrop-filter for performance */
5358
+ background-color: ${tokens.colors.surface.elevated};
5358
5359
  border-radius: ${tokens.borderRadius.lg};
5359
5360
  border-top-left-radius: ${tokens.borderRadius.sm};
5360
5361
  width: fit-content;
5361
5362
  `;
5362
- var bounce = keyframes`
5363
- 0%, 60%, 100% {
5364
- transform: translateY(0);
5363
+ var pulse3 = keyframes`
5364
+ 0%, 100% {
5365
+ opacity: 0.4;
5365
5366
  }
5366
- 30% {
5367
- transform: translateY(-${tokens.spacing.sm});
5367
+ 50% {
5368
+ opacity: 1;
5368
5369
  }
5369
5370
  `;
5370
5371
  var LoadingDot = styled11.div`
@@ -5372,7 +5373,8 @@ var LoadingDot = styled11.div`
5372
5373
  height: ${tokens.spacing.sm};
5373
5374
  border-radius: ${tokens.borderRadius.full};
5374
5375
  background-color: ${tokens.colors.text.tertiary};
5375
- animation: ${bounce} 1.4s ease-in-out infinite;
5376
+ /* Use simple opacity animation instead of transform bounce */
5377
+ animation: ${pulse3} 1.4s ease-in-out infinite;
5376
5378
  animation-delay: ${(props) => props.delay}s;
5377
5379
  `;
5378
5380
  var FileAttachmentContainer = styled11.div`
@@ -5567,7 +5569,7 @@ var StreamingIndicator = styled11.span`
5567
5569
  }
5568
5570
  }
5569
5571
  `;
5570
- var AssistantMessage = ({
5572
+ var AssistantMessageBase = ({
5571
5573
  content = "",
5572
5574
  avatarUrl,
5573
5575
  avatarInitials: _avatarInitials = "AI",
@@ -5614,6 +5616,8 @@ var AssistantMessage = ({
5614
5616
  /* @__PURE__ */ jsx(ContentContainer, { children: renderContent() })
5615
5617
  ] });
5616
5618
  };
5619
+ var AssistantMessage = memo(AssistantMessageBase);
5620
+ AssistantMessage.displayName = "AssistantMessage";
5617
5621
  var MessagesContainer = styled11.div`
5618
5622
  display: flex;
5619
5623
  flex-direction: column;
@@ -6761,6 +6765,161 @@ function LinkedInIcon({
6761
6765
  return /* @__PURE__ */ jsx("span", { className, style: { display: "inline-flex", width: size, height: size }, children: svgElement });
6762
6766
  }
6763
6767
  LinkedInIcon.displayName = "LinkedInIcon";
6768
+ var StyledIconWrapper3 = styled11.button`
6769
+ display: inline-flex;
6770
+ align-items: center;
6771
+ justify-content: center;
6772
+ background: transparent;
6773
+ border: none;
6774
+ padding: 0;
6775
+ cursor: pointer;
6776
+ transition: all 0.2s ease-in-out;
6777
+ width: ${({ $size }) => `${$size}px`};
6778
+ height: ${({ $size }) => `${$size}px`};
6779
+ border-radius: ${({ theme }) => theme?.radii?.sm ?? "4px"};
6780
+
6781
+ &:hover:not(:disabled) {
6782
+ opacity: 0.8;
6783
+ transform: scale(1.05);
6784
+ }
6785
+
6786
+ &:active:not(:disabled) {
6787
+ opacity: 0.6;
6788
+ transform: scale(0.95);
6789
+ }
6790
+
6791
+ &:focus-visible {
6792
+ outline: 2px solid ${({ theme }) => (theme?.colors?.primary && typeof theme.colors.primary === "object" ? theme.colors.primary.light : theme?.colors?.primary) ?? "#0066FF"};
6793
+ outline-offset: 2px;
6794
+ }
6795
+
6796
+ &:disabled {
6797
+ cursor: not-allowed;
6798
+ opacity: 0.5;
6799
+ }
6800
+
6801
+ /* Remove default focus outline, using focus-visible instead */
6802
+ &:focus {
6803
+ outline: none;
6804
+ }
6805
+
6806
+ svg {
6807
+ display: block;
6808
+ width: 100%;
6809
+ height: 100%;
6810
+ }
6811
+ `;
6812
+ function PostizIcon({
6813
+ variant = "colored",
6814
+ size = 24,
6815
+ className,
6816
+ style,
6817
+ "aria-label": ariaLabel = "Postiz",
6818
+ onPress,
6819
+ ...ariaProps
6820
+ }) {
6821
+ const ref = useRef(null);
6822
+ const isInteractive = Boolean(onPress);
6823
+ const { buttonProps } = useButton(
6824
+ {
6825
+ ...ariaProps,
6826
+ onPress,
6827
+ "aria-label": ariaLabel,
6828
+ isDisabled: !isInteractive
6829
+ },
6830
+ ref
6831
+ );
6832
+ const role = isInteractive ? "button" : "img";
6833
+ const ariaHidden = !isInteractive && !ariaLabel;
6834
+ const colors = {
6835
+ colored: {
6836
+ purple: "#612bd3",
6837
+ dark: "#131019",
6838
+ white: "#fff",
6839
+ stroke: "#131019"
6840
+ },
6841
+ black: {
6842
+ purple: "black",
6843
+ dark: "black",
6844
+ white: "black",
6845
+ stroke: "black"
6846
+ },
6847
+ white: {
6848
+ purple: "white",
6849
+ dark: "white",
6850
+ white: "white",
6851
+ stroke: "white"
6852
+ }
6853
+ };
6854
+ const c = colors[variant];
6855
+ const svgElement = /* @__PURE__ */ jsxs(
6856
+ "svg",
6857
+ {
6858
+ width: size,
6859
+ height: size,
6860
+ viewBox: "26.74 0.02 460.94 509.34",
6861
+ fill: "none",
6862
+ xmlns: "http://www.w3.org/2000/svg",
6863
+ role,
6864
+ "aria-label": ariaLabel,
6865
+ "aria-hidden": ariaHidden,
6866
+ children: [
6867
+ /* @__PURE__ */ jsx(
6868
+ "path",
6869
+ {
6870
+ d: "M103.4 82.6c.4 5.6.8 12 1.4 19.1L125 362.4c2.3 29.1 3.4 43.8 9.9 54.4 5.7 9.4 14.4 16.7 24.5 21 11.6 4.9 26.1 3.7 55.2 1.4l199.8-15.4c18.9-1.5 31.7-2.5 41.2-4.8-3.2 7.5-8.1 14.3-14.5 19.5-9.6 8-23.9 11.4-52.4 17.9l-195 45c-28.5 6.5-42.8 9.9-54.8 6.8-10.7-2.7-20.3-8.6-27.3-17.1-8-9.6-11.4-23.9-17.9-52.4L34.7 184c-6.5-28.5-9.9-42.8-6.8-54.8 2.7-10.7 8.6-20.3 17.1-27.3 9.6-8 23.9-11.4 52.4-17.9z",
6871
+ fill: c.purple
6872
+ }
6873
+ ),
6874
+ /* @__PURE__ */ jsx(
6875
+ "path",
6876
+ {
6877
+ d: "M112.8 101.1c-1.1-14.8-2-25.2-1.9-33.6 0-8.2.9-13.6 2.8-18 3.6-8.6 9.8-15.8 17.7-20.8 4.1-2.5 9.2-4.2 17.4-5.4 8.2-1.3 18.8-2.2 33.5-3.3L382 4.4c14.8-1.1 25.2-2 33.6-1.9 8.2 0 13.6.9 18 2.8 8.6 3.6 15.8 9.8 20.8 17.7 2.5 4.1 4.2 9.2 5.4 17.4s2.2 18.8 3.3 33.5l20.2 260.8c1.1 14.8 2 25.2 1.9 33.6 0 8.2-.9 13.6-2.8 18-3.6 8.6-9.8 15.8-17.7 20.8-4.1 2.5-9.2 4.2-17.4 5.4-8.2 1.3-18.8 2.2-33.5 3.3l-199.7 15.4c-14.8 1.1-25.2 2-33.6 1.9-8.2 0-13.6-.9-18-2.8-8.6-3.6-15.8-9.8-20.8-17.7-2.5-4.1-4.2-9.2-5.4-17.4-1.3-8.2-2.2-18.8-3.3-33.5z",
6878
+ fill: "none",
6879
+ stroke: c.stroke,
6880
+ strokeWidth: "4.9373"
6881
+ }
6882
+ ),
6883
+ /* @__PURE__ */ jsx(
6884
+ "path",
6885
+ {
6886
+ d: "m182.9 27.9 199.7-15.4c14.9-1.2 25-1.9 33-1.9 7.7 0 11.9.9 14.9 2.2 7 3 13 8 17 14.6 1.7 2.9 3.2 6.8 4.5 14.5 1.3 7.8 2.1 18 3.2 32.9l20.2 260.8c1.2 14.9 1.9 25 1.9 33 0 7.7-.9 11.9-2.2 14.9-3 7-8 13-14.6 17-2.9 1.7-6.8 3.2-14.5 4.5-7.8 1.3-18 2.1-32.9 3.2l-199.7 15.3c-14.8 1.2-25 1.9-33 1.9-7.7 0-11.9-.9-14.9-2.2-7-3-13-8-17-14.6-1.7-2.9-3.2-6.8-4.5-14.5-1.3-7.8-2.1-18-3.2-32.9l-20.2-260.8c-1.2-14.8-1.9-25-1.9-33 0-7.7.9-11.9 2.2-14.9 3-7 8-13 14.6-17 2.9-1.7 6.8-3.2 14.5-4.5 7.9-1.1 18.1-1.9 32.9-3.1",
6887
+ fill: c.white
6888
+ }
6889
+ ),
6890
+ /* @__PURE__ */ jsx(
6891
+ "path",
6892
+ {
6893
+ d: "m269.4 88.3 1.9 24.8c3.5-4.3 7.9-7.9 13.4-11 5.4-3.3 12.3-5.2 20.4-5.8 7.4-.6 14.7.3 21.4 2.7 7 2.4 13.3 6.4 18.8 12.5 5.7 5.7 10.6 13.7 14.5 23.8s6.3 22.5 7.5 37.2c.8 10.5.7 21.2-.5 31.9-1 10.7-3.4 20.4-7.3 29.1-4 8.7-9.7 16-17.2 21.9-7.3 5.6-16.7 8.9-28.4 9.8-8.3.7-15 .1-20-1.8-5-2.1-8.8-4.6-11.5-7.4l6.2 80-46.5 15.5L221.8 92zm26.4 149c5.7-.4 10.4-2.7 14.1-6.7 3.7-4.3 6.3-9.5 8-15.8 2-6.3 3.1-13.3 3.4-20.8.5-7.7.5-15.3-.1-22.9-.9-12.1-2.8-21.6-5.5-28.4-2.5-6.8-5.3-11.9-8.4-14.9-3.2-3.3-6.1-5.2-9.1-5.9-2.7-.7-4.9-1-6.3-.8-4 .3-7.7 2.1-11.2 5.1-3.6 3-5.9 7.2-7.3 12.9l7.1 91.9c1.2 1.7 3.2 3.3 5.6 4.9 2.5 1.2 5.7 1.7 9.7 1.4",
6894
+ fill: c.dark
6895
+ }
6896
+ )
6897
+ ]
6898
+ }
6899
+ );
6900
+ if (isInteractive) {
6901
+ return /* @__PURE__ */ jsx(
6902
+ StyledIconWrapper3,
6903
+ {
6904
+ ...buttonProps,
6905
+ ref,
6906
+ className,
6907
+ style,
6908
+ $size: size,
6909
+ children: svgElement
6910
+ }
6911
+ );
6912
+ }
6913
+ return /* @__PURE__ */ jsx(
6914
+ "span",
6915
+ {
6916
+ className,
6917
+ style: { display: "inline-flex", width: size, height: size, ...style },
6918
+ children: svgElement
6919
+ }
6920
+ );
6921
+ }
6922
+ PostizIcon.displayName = "PostizIcon";
6764
6923
  var ColoredVariant = () => /* @__PURE__ */ jsxs(Fragment, { children: [
6765
6924
  /* @__PURE__ */ jsx(
6766
6925
  "path",
@@ -7263,7 +7422,7 @@ var StyledXIcon = styled11.svg`
7263
7422
  &:focus-visible {
7264
7423
  outline: 2px solid ${theme?.colors?.primary ?? "#007bff"};
7265
7424
  outline-offset: 2px;
7266
- border-radius: 2px;
7425
+ border-radius: ${tokens.borderRadius.sm};
7267
7426
  }
7268
7427
  `}
7269
7428
  `;
@@ -7416,15 +7575,15 @@ YouTubeIcon.displayName = "YouTubeIcon";
7416
7575
  var PLATFORM_CONFIGS = {
7417
7576
  x: {
7418
7577
  icon: /* @__PURE__ */ jsx(XIcon, { variant: "white", size: 20 }),
7419
- color: "#FFFFFF",
7420
- bgColor: "#000000",
7578
+ color: tokens.colors.text.primary,
7579
+ bgColor: tokens.colors.platform.x,
7421
7580
  maxChars: 280,
7422
7581
  name: "X (Twitter)",
7423
7582
  description: "Concise, punchy posts with 1-2 hashtags"
7424
7583
  },
7425
7584
  linkedin: {
7426
7585
  icon: /* @__PURE__ */ jsx(LinkedInIcon, { variant: "colored", size: 20 }),
7427
- color: "#0A66C2",
7586
+ color: tokens.colors.platform.linkedin,
7428
7587
  bgColor: "#f3f6f8",
7429
7588
  maxChars: 3e3,
7430
7589
  name: "LinkedIn",
@@ -7432,7 +7591,7 @@ var PLATFORM_CONFIGS = {
7432
7591
  },
7433
7592
  instagram: {
7434
7593
  icon: /* @__PURE__ */ jsx(InstagramIcon, { variant: "colored", size: 20 }),
7435
- color: "#E4405F",
7594
+ color: tokens.colors.platform.instagram,
7436
7595
  bgColor: "#fafafa",
7437
7596
  maxChars: 2200,
7438
7597
  name: "Instagram",
@@ -7440,7 +7599,7 @@ var PLATFORM_CONFIGS = {
7440
7599
  },
7441
7600
  facebook: {
7442
7601
  icon: /* @__PURE__ */ jsx(FacebookIcon, { variant: "colored", size: 20 }),
7443
- color: "#1877F2",
7602
+ color: tokens.colors.platform.facebook,
7444
7603
  bgColor: "#f0f2f5",
7445
7604
  maxChars: 63206,
7446
7605
  name: "Facebook",
@@ -7448,7 +7607,7 @@ var PLATFORM_CONFIGS = {
7448
7607
  },
7449
7608
  youtube: {
7450
7609
  icon: /* @__PURE__ */ jsx(YouTubeIcon, { variant: "colored", size: 20 }),
7451
- color: "#FF0000",
7610
+ color: tokens.colors.platform.youtube,
7452
7611
  bgColor: "#f9f9f9",
7453
7612
  maxChars: 5e3,
7454
7613
  name: "YouTube",
@@ -7509,10 +7668,12 @@ function getCharacterCount(content, hashtags) {
7509
7668
  return (content + hashtagString).length;
7510
7669
  }
7511
7670
  function isWithinCharLimit(platform, characterCount) {
7512
- return characterCount <= PLATFORM_CONFIGS[platform].maxChars;
7671
+ const config = PLATFORM_CONFIGS[platform] || PLATFORM_CONFIGS.x;
7672
+ return characterCount <= config.maxChars;
7513
7673
  }
7514
7674
  function getCharacterLimitPercentage(platform, characterCount) {
7515
- return Math.min(100, characterCount / PLATFORM_CONFIGS[platform].maxChars * 100);
7675
+ const config = PLATFORM_CONFIGS[platform] || PLATFORM_CONFIGS.x;
7676
+ return Math.min(100, characterCount / config.maxChars * 100);
7516
7677
  }
7517
7678
  function getCharacterLimitColor(percentage) {
7518
7679
  if (percentage > 100) return "bg-red-500";
@@ -7569,7 +7730,7 @@ var PostApprovalControls = ({
7569
7730
  setIsEditing(false);
7570
7731
  };
7571
7732
  return /* @__PURE__ */ jsxs(Container13, { "data-testid": "post-approval-controls", children: [
7572
- /* @__PURE__ */ jsxs(Header3, { onClick: () => !isEditing && setIsCollapsed(!isCollapsed), children: [
7733
+ /* @__PURE__ */ jsxs(Header2, { onClick: () => !isEditing && setIsCollapsed(!isCollapsed), children: [
7573
7734
  /* @__PURE__ */ jsx(StatusBadge, { $color: statusConfig.color, children: statusConfig.label }),
7574
7735
  /* @__PURE__ */ jsxs(MetaInfo, { children: [
7575
7736
  postId && /* @__PURE__ */ jsxs(PostId, { children: [
@@ -7638,7 +7799,7 @@ var Container13 = styled11.div`
7638
7799
  font-family: ${tokens.typography.fontFamily.primary};
7639
7800
  transition: border-color ${tokens.transitions.fast};
7640
7801
  `;
7641
- var Header3 = styled11.div`
7802
+ var Header2 = styled11.div`
7642
7803
  display: grid;
7643
7804
  grid-template-columns: auto 1fr auto;
7644
7805
  align-items: center;
@@ -7830,7 +7991,7 @@ var PostPreviewCard = ({
7830
7991
  onContentChange,
7831
7992
  isLoading = false
7832
7993
  }) => {
7833
- const platformConfig = PLATFORM_CONFIGS[post.platform];
7994
+ const platformConfig = PLATFORM_CONFIGS[post.platform] || PLATFORM_CONFIGS.x;
7834
7995
  const showSkeleton = isLoading && !post.content;
7835
7996
  const displayContent = isEditing && editContent !== void 0 ? editContent : post.editedContent || post.content;
7836
7997
  const currentCharCount = displayContent.length;
@@ -7893,6 +8054,16 @@ var PostPreviewCard = ({
7893
8054
  );
7894
8055
  };
7895
8056
  PostPreviewCard.displayName = "PostPreviewCard";
8057
+ var fadeIn2 = keyframes`
8058
+ from {
8059
+ opacity: 0;
8060
+ transform: translateY(4px);
8061
+ }
8062
+ to {
8063
+ opacity: 1;
8064
+ transform: translateY(0);
8065
+ }
8066
+ `;
7896
8067
  var CardContainer = styled11.div`
7897
8068
  background: ${tokens.colors.background.dark};
7898
8069
  border-radius: ${tokens.borderRadius.lg};
@@ -7956,6 +8127,8 @@ var PostContent = styled11.div`
7956
8127
  word-break: break-word;
7957
8128
  margin-bottom: ${tokens.spacing.sm};
7958
8129
  letter-spacing: 0.01em;
8130
+ /* Smooth fade-in animation when content appears */
8131
+ animation: ${fadeIn2} 0.4s ease-out;
7959
8132
  `;
7960
8133
  var PostContentEditable = styled11.textarea`
7961
8134
  width: 100%;
@@ -8015,13 +8188,13 @@ var ProgressBarTrack = styled11.div`
8015
8188
  width: 100%;
8016
8189
  height: 4px;
8017
8190
  background: ${tokens.colors.border.default};
8018
- border-radius: 2px;
8191
+ border-radius: ${tokens.borderRadius.sm};
8019
8192
  overflow: hidden;
8020
8193
  `;
8021
8194
  var ProgressBarFill2 = styled11.div`
8022
8195
  width: ${({ $percentage }) => $percentage}%;
8023
8196
  height: 100%;
8024
- border-radius: 2px;
8197
+ border-radius: ${tokens.borderRadius.sm};
8025
8198
  transition: width 0.3s ease, background-color 0.3s ease;
8026
8199
  background: ${({ $colorClass }) => {
8027
8200
  if ($colorClass.includes("red")) return tokens.colors.error;
@@ -8093,9 +8266,21 @@ var PlatformCarousel = ({
8093
8266
  if (posts.length === 0) {
8094
8267
  return /* @__PURE__ */ jsx(CarouselContainer, { children: /* @__PURE__ */ jsx(EmptyState, { children: "No posts available" }) });
8095
8268
  }
8269
+ const defaultConfig = {
8270
+ icon: null,
8271
+ color: tokens.colors.text.secondary,
8272
+ bgColor: tokens.colors.background.light,
8273
+ maxChars: 1e3,
8274
+ name: "Unknown",
8275
+ description: "Unknown platform"
8276
+ };
8277
+ const getConfig = (platform) => {
8278
+ const normalized = normalizePlatform(platform);
8279
+ return normalized ? PLATFORM_CONFIGS[normalized] : defaultConfig;
8280
+ };
8096
8281
  return /* @__PURE__ */ jsxs(CarouselContainer, { children: [
8097
8282
  /* @__PURE__ */ jsx(TabsContainer, { children: posts.map((post, index) => {
8098
- const config = PLATFORM_CONFIGS[post.platform];
8283
+ const config = getConfig(post.platform);
8099
8284
  const isActive = index === activeIndex;
8100
8285
  return /* @__PURE__ */ jsxs(
8101
8286
  PlatformTab,
@@ -8128,7 +8313,7 @@ var PlatformCarousel = ({
8128
8313
  ) }, `slide-${post.platform}-${index}`);
8129
8314
  }) }),
8130
8315
  posts.length > 1 && /* @__PURE__ */ jsx(NavigationDotsContainer, { children: posts.map((post, index) => {
8131
- const config = PLATFORM_CONFIGS[post.platform];
8316
+ const config = getConfig(post.platform);
8132
8317
  return /* @__PURE__ */ jsx(
8133
8318
  NavigationDot,
8134
8319
  {
@@ -8250,23 +8435,46 @@ var PlatformGrid = ({
8250
8435
  editingIndex,
8251
8436
  editContent,
8252
8437
  onEditContentChange,
8253
- isLoading = false
8438
+ isLoading = false,
8439
+ activeIndex = 0,
8440
+ onActiveChange
8254
8441
  }) => {
8255
8442
  if (posts.length === 0) {
8256
8443
  return /* @__PURE__ */ jsx(EmptyState2, { children: /* @__PURE__ */ jsx(EmptyStateText, { children: "No posts to display" }) });
8257
8444
  }
8445
+ const handlePostClick = (index) => {
8446
+ onActiveChange?.(index);
8447
+ };
8258
8448
  return /* @__PURE__ */ jsx(Grid, { "data-testid": "platform-grid", children: posts.map((post, index) => {
8259
8449
  const isEditing = editingIndex === index;
8260
- return /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(
8261
- PostPreviewCard,
8450
+ const isActive = activeIndex === index;
8451
+ return /* @__PURE__ */ jsx(
8452
+ GridCell,
8262
8453
  {
8263
- post,
8264
- isEditing,
8265
- editContent: isEditing ? editContent : void 0,
8266
- onContentChange: isEditing ? onEditContentChange : void 0,
8267
- isLoading
8268
- }
8269
- ) }, post.platform);
8454
+ $isActive: isActive,
8455
+ onClick: () => handlePostClick(index),
8456
+ role: "button",
8457
+ tabIndex: 0,
8458
+ onKeyDown: (e) => {
8459
+ if (e.key === "Enter" || e.key === " ") {
8460
+ e.preventDefault();
8461
+ handlePostClick(index);
8462
+ }
8463
+ },
8464
+ children: /* @__PURE__ */ jsx(
8465
+ PostPreviewCard,
8466
+ {
8467
+ post,
8468
+ isActive,
8469
+ isEditing,
8470
+ editContent: isEditing ? editContent : void 0,
8471
+ onContentChange: isEditing ? onEditContentChange : void 0,
8472
+ isLoading
8473
+ }
8474
+ )
8475
+ },
8476
+ post.platform
8477
+ );
8270
8478
  }) });
8271
8479
  };
8272
8480
  PlatformGrid.displayName = "PlatformGrid";
@@ -8290,6 +8498,13 @@ var Grid = styled11.div`
8290
8498
  `;
8291
8499
  var GridCell = styled11.div`
8292
8500
  min-width: 0; /* Prevent grid blowout with long content */
8501
+ cursor: pointer;
8502
+ border-radius: ${tokens.borderRadius.lg};
8503
+ transition: transform ${tokens.transitions.fast};
8504
+
8505
+ &:hover {
8506
+ transform: translateY(-2px);
8507
+ }
8293
8508
  `;
8294
8509
  var EmptyState2 = styled11.div`
8295
8510
  display: flex;
@@ -8310,7 +8525,7 @@ var Container14 = styled11.div`
8310
8525
  flex-direction: column;
8311
8526
  height: 100%;
8312
8527
  width: 100%;
8313
- padding: ${tokens.spacing.md};
8528
+ padding: ${tokens.spacing.md} ${tokens.spacing.md} 0 ${tokens.spacing.md};
8314
8529
  box-sizing: border-box;
8315
8530
  background: linear-gradient(
8316
8531
  180deg,
@@ -8319,7 +8534,7 @@ var Container14 = styled11.div`
8319
8534
  );
8320
8535
  overflow: auto;
8321
8536
  `;
8322
- var Header4 = styled11.div`
8537
+ var Header3 = styled11.div`
8323
8538
  display: flex;
8324
8539
  justify-content: space-between;
8325
8540
  align-items: center;
@@ -8408,7 +8623,8 @@ var SocialMediaCanvas = ({
8408
8623
  editingIndex,
8409
8624
  editContent,
8410
8625
  onEditContentChange,
8411
- isLoading = false
8626
+ isLoading = false,
8627
+ activeIndex = 0
8412
8628
  }) => {
8413
8629
  const [viewMode, setViewMode] = useState(initialViewMode);
8414
8630
  const handleActiveChange = (index) => {
@@ -8422,7 +8638,7 @@ var SocialMediaCanvas = ({
8422
8638
  ] }) });
8423
8639
  }
8424
8640
  return /* @__PURE__ */ jsxs(Container14, { children: [
8425
- /* @__PURE__ */ jsxs(Header4, { children: [
8641
+ /* @__PURE__ */ jsxs(Header3, { children: [
8426
8642
  /* @__PURE__ */ jsxs(Title, { children: [
8427
8643
  title,
8428
8644
  " ",
@@ -8470,7 +8686,9 @@ var SocialMediaCanvas = ({
8470
8686
  editingIndex,
8471
8687
  editContent,
8472
8688
  onEditContentChange,
8473
- isLoading
8689
+ isLoading,
8690
+ activeIndex,
8691
+ onActiveChange: handleActiveChange
8474
8692
  }
8475
8693
  ) })
8476
8694
  ] });
@@ -8533,7 +8751,7 @@ function TokenUsageCard({
8533
8751
  );
8534
8752
  const usageLevel = useMemo(() => getUsageLevel(percentage), [percentage]);
8535
8753
  return /* @__PURE__ */ jsxs(Card2, { className, "data-testid": "token-usage-card", children: [
8536
- /* @__PURE__ */ jsxs(Header5, { children: [
8754
+ /* @__PURE__ */ jsxs(Header4, { children: [
8537
8755
  /* @__PURE__ */ jsx(Title2, { children: "Token Usage" }),
8538
8756
  /* @__PURE__ */ jsx(Period, { children: periodLabel })
8539
8757
  ] }),
@@ -8576,10 +8794,10 @@ var Card2 = styled11.div`
8576
8794
  gap: ${tokens.spacing.md};
8577
8795
  padding: ${tokens.spacing.lg};
8578
8796
  background: ${tokens.colors.background.dark};
8579
- border-radius: ${tokens.borderRadius.lg};
8797
+ border-radius: ${tokens.borderRadius.xl};
8580
8798
  border: 1px solid ${tokens.colors.border.default};
8581
8799
  `;
8582
- var Header5 = styled11.div`
8800
+ var Header4 = styled11.div`
8583
8801
  display: flex;
8584
8802
  justify-content: space-between;
8585
8803
  align-items: center;
@@ -8799,7 +9017,7 @@ var Card3 = styled11.button`
8799
9017
  gap: ${tokens.spacing.sm};
8800
9018
  padding: ${tokens.spacing.md};
8801
9019
  background: ${tokens.colors.background.dark};
8802
- border-radius: ${tokens.borderRadius.lg};
9020
+ border-radius: ${tokens.borderRadius.xl};
8803
9021
  border: 1px solid ${tokens.colors.border.default};
8804
9022
  cursor: pointer;
8805
9023
  text-align: left;
@@ -8887,8 +9105,8 @@ var Indicators = styled11.div`
8887
9105
  var IndicatorPill = styled11.span`
8888
9106
  display: inline-flex;
8889
9107
  align-items: center;
8890
- gap: 6px;
8891
- padding: 4px 10px;
9108
+ gap: ${tokens.spacing.xs};
9109
+ padding: ${tokens.spacing.xs} ${tokens.spacing.sm};
8892
9110
  border-radius: ${tokens.borderRadius.full};
8893
9111
  background: ${({ $variant }) => $variant === "warning" ? `${tokens.colors.warning}15` : `${tokens.colors.info}15`};
8894
9112
  border: 1px solid ${({ $variant }) => $variant === "warning" ? `${tokens.colors.warning}30` : `${tokens.colors.info}30`};
@@ -8949,7 +9167,7 @@ var ModalContent = styled11.div`
8949
9167
  width: 100%;
8950
9168
  box-shadow: ${tokens.shadows.xl};
8951
9169
  `;
8952
- var Header6 = styled11.div`
9170
+ var Header5 = styled11.div`
8953
9171
  display: flex;
8954
9172
  align-items: flex-start;
8955
9173
  gap: ${tokens.spacing.md};
@@ -9174,7 +9392,7 @@ var WorkflowErrorAlert = ({
9174
9392
  return /* @__PURE__ */ jsx(InfoIcon, {});
9175
9393
  }
9176
9394
  };
9177
- const alertContent = /* @__PURE__ */ jsx(AlertContainer, { variant, severity, className, role: "alert", children: /* @__PURE__ */ jsxs(Header6, { children: [
9395
+ const alertContent = /* @__PURE__ */ jsx(AlertContainer, { variant, severity, className, role: "alert", children: /* @__PURE__ */ jsxs(Header5, { children: [
9178
9396
  /* @__PURE__ */ jsx(IconContainer2, { severity, "aria-hidden": "true", children: getIcon() }),
9179
9397
  /* @__PURE__ */ jsxs(Content5, { children: [
9180
9398
  /* @__PURE__ */ jsx(Title3, { children: displayTitle }),
@@ -9483,7 +9701,7 @@ var Panel = styled11.div`
9483
9701
  overflow: hidden;
9484
9702
  font-family: ${tokens.typography.fontFamily.primary};
9485
9703
  `;
9486
- var Header7 = styled11.div`
9704
+ var Header6 = styled11.div`
9487
9705
  display: flex;
9488
9706
  justify-content: space-between;
9489
9707
  align-items: center;
@@ -9676,7 +9894,7 @@ var WorkflowResultPanel = ({
9676
9894
  }
9677
9895
  };
9678
9896
  return /* @__PURE__ */ jsxs(Panel, { collapsible, expanded, className, children: [
9679
- /* @__PURE__ */ jsxs(Header7, { collapsible, onClick: handleToggle, children: [
9897
+ /* @__PURE__ */ jsxs(Header6, { collapsible, onClick: handleToggle, children: [
9680
9898
  /* @__PURE__ */ jsxs(Title4, { children: [
9681
9899
  title,
9682
9900
  collapsible && /* @__PURE__ */ jsx(CollapseIcon2, { expanded, children: /* @__PURE__ */ jsx(ChevronIcon4, {}) })
@@ -9698,7 +9916,7 @@ var spin = keyframes`
9698
9916
  transform: rotate(360deg);
9699
9917
  }
9700
9918
  `;
9701
- var pulse3 = keyframes`
9919
+ var pulse4 = keyframes`
9702
9920
  0%, 100% {
9703
9921
  opacity: 1;
9704
9922
  }
@@ -9776,7 +9994,7 @@ var IconContainer3 = styled11.div`
9776
9994
  animation: ${(props) => {
9777
9995
  if (props.$animated) {
9778
9996
  if (props.$status === "running") return spin;
9779
- if (props.$status === "pending") return pulse3;
9997
+ if (props.$status === "pending") return pulse4;
9780
9998
  }
9781
9999
  return "none";
9782
10000
  }}
@@ -9904,6 +10122,6 @@ var WorkflowStatusBadge = ({
9904
10122
  };
9905
10123
  WorkflowStatusBadge.displayName = "WorkflowStatusBadge";
9906
10124
 
9907
- export { ActionButtons, Actions, AgentState, AssistantMessage, AssistantThinking, Button2 as Button, CATEGORY_CONFIGS, CategoryNav, ChatInput, ConnectionStatusBadge, UserMessage2 as CopilotUserMessage, DarkNotificationCard, FacebookIcon, FileAttachment, Footer, GlobalStyle, GmailIcon, Header2 as Header, Icon, IconNames, Input2 as Input, InstagramIcon, IntegrationCard, Layout, LinkedInIcon, Messages, MessagesList, MessagesListContainer, MessagesListContent, NavHorizontal, NavVertical, NotificationCard, PLATFORM_CONFIGS, PaneMenus, PaneSectionHeader, PlatformCarousel, PlatformGrid, PostApprovalControls, PostPreviewCard, RedditIcon, Response, SecretInput, ServiceIcon, SlackIcon, SocialMediaCanvas, StreamErrorMessage, StreamStatusIndicator, StreamingText2 as StreamingText, Suggestions, TelegramIcon, TokenUsageCard, UserMessage, WhatsAppIcon, Window, WorkflowCard, WorkflowErrorAlert, WorkflowProgressBar, WorkflowResultPanel, WorkflowStatusBadge, WorkflowStatusCard, XIcon, YouTubeIcon, categorizeProgress, darkTheme, getCategoryColor, getCategoryIcon, getCharacterCount, getCharacterLimitColor, getCharacterLimitPercentage, isWithinCharLimit, lightTheme, normalizePlatform, tokens };
10125
+ export { ActionButtons, Actions, AgentState, AssistantMessage, AssistantThinking, Button2 as Button, CATEGORY_CONFIGS, CategoryNav, ChatInput, ConnectionStatusBadge, UserMessage2 as CopilotUserMessage, DarkNotificationCard, FacebookIcon, FileAttachment, Footer, GlobalStyle, GmailIcon, Header, Icon, IconNames, Input2 as Input, InstagramIcon, IntegrationCard, Layout, LinkedInIcon, Messages, MessagesList, MessagesListContainer, MessagesListContent, NavHorizontal, NavVertical, NotificationCard, PLATFORM_CONFIGS, PaneMenus, PaneSectionHeader, PlatformCarousel, PlatformGrid, PostApprovalControls, PostPreviewCard, PostizIcon, RedditIcon, Response, SecretInput, ServiceIcon, SlackIcon, SocialMediaCanvas, StreamErrorMessage, StreamStatusIndicator, StreamingText2 as StreamingText, Suggestions, TelegramIcon, TokenUsageCard, UserMessage, WhatsAppIcon, Window, WorkflowCard, WorkflowErrorAlert, WorkflowProgressBar, WorkflowResultPanel, WorkflowStatusBadge, WorkflowStatusCard, XIcon, YouTubeIcon, categorizeProgress, darkTheme, getCategoryColor, getCategoryIcon, getCharacterCount, getCharacterLimitColor, getCharacterLimitPercentage, isWithinCharLimit, lightTheme, normalizePlatform, tokens };
9908
10126
  //# sourceMappingURL=index.js.map
9909
10127
  //# sourceMappingURL=index.js.map