@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.cjs CHANGED
@@ -4,12 +4,12 @@ var react = require('react');
4
4
  var styled11 = require('styled-components');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var button = require('@react-aria/button');
7
- var textfield = require('@react-aria/textfield');
8
7
  var meter = require('@react-aria/meter');
9
8
  var tabs$1 = require('@react-aria/tabs');
10
9
  var collections = require('@react-stately/collections');
11
10
  var tabs = require('@react-stately/tabs');
12
11
  var reactAriaComponents = require('react-aria-components');
12
+ var textfield = require('@react-aria/textfield');
13
13
 
14
14
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
15
 
@@ -462,7 +462,7 @@ var SuggestionButton = styled11__default.default.button`
462
462
  font-weight: ${tokens.typography.fontWeight.regular};
463
463
  text-align: center;
464
464
  border: 1px solid ${tokens.colors.border.default};
465
- border-radius: 20px;
465
+ border-radius: ${tokens.borderRadius.full};
466
466
  cursor: pointer;
467
467
  transition: all ${tokens.transitions.fast};
468
468
  white-space: nowrap;
@@ -496,9 +496,9 @@ var SuggestionButton = styled11__default.default.button`
496
496
  `;
497
497
  var InputWrapper = styled11__default.default.div`
498
498
  display: flex;
499
- align-items: center;
500
- gap: 10px;
501
- padding: 10px 14px;
499
+ align-items: flex-end; /* Align button to bottom when textarea expands */
500
+ gap: ${tokens.spacing.sm};
501
+ padding: ${tokens.spacing.sm} ${tokens.spacing.md};
502
502
  background-color: rgba(25, 25, 25, 0.4);
503
503
  border: 1px solid ${tokens.colors.border.subtle};
504
504
  border-radius: ${tokens.borderRadius.lg};
@@ -512,7 +512,7 @@ var InputWrapper = styled11__default.default.div`
512
512
  background-color: rgba(50, 50, 52, 0.6);
513
513
  }
514
514
  `;
515
- var InputField = styled11__default.default.input`
515
+ var InputField = styled11__default.default.textarea`
516
516
  flex: 1;
517
517
  border: none;
518
518
  outline: none;
@@ -520,6 +520,13 @@ var InputField = styled11__default.default.input`
520
520
  font-size: ${tokens.typography.fontSize.sm};
521
521
  color: ${tokens.colors.text.secondary};
522
522
  background: transparent;
523
+ resize: none; /* Disable manual resize, we auto-resize */
524
+ min-height: 24px; /* Single line height */
525
+ max-height: 150px; /* Max ~6 lines before scrolling */
526
+ overflow-y: auto;
527
+ line-height: 1.5;
528
+ padding: 0;
529
+ margin: 0;
523
530
 
524
531
  &::placeholder {
525
532
  color: ${tokens.colors.text.tertiary};
@@ -575,31 +582,29 @@ var ChatInput = ({
575
582
  isReadOnly = false,
576
583
  autoFocus = false,
577
584
  className,
578
- "aria-label": ariaLabel = "Chat message input",
579
- ...ariaProps
585
+ "aria-label": ariaLabel = "Chat message input"
586
+ // Note: Additional AriaTextFieldProps are accepted but not spread to textarea
587
+ // since useTextField is not compatible with textarea elements
580
588
  }) => {
581
589
  const [internalValue, setInternalValue] = react.useState(value);
582
590
  const inputRef = react.useRef(null);
583
591
  const currentValue = value !== void 0 ? value : internalValue;
584
592
  const setValue = onChange || setInternalValue;
585
- const { inputProps } = textfield.useTextField(
586
- {
587
- ...ariaProps,
588
- "aria-label": ariaLabel,
589
- value: currentValue,
590
- onChange: (newValue) => {
591
- setValue(newValue);
592
- },
593
- isDisabled,
594
- isReadOnly
595
- },
596
- inputRef
597
- );
593
+ const autoResize = react.useCallback(() => {
594
+ const textarea = inputRef.current;
595
+ if (textarea) {
596
+ textarea.style.height = "auto";
597
+ textarea.style.height = `${textarea.scrollHeight}px`;
598
+ }
599
+ }, []);
600
+ react.useEffect(() => {
601
+ autoResize();
602
+ }, [currentValue, autoResize]);
598
603
  const handleDirectChange = (e) => {
599
604
  setValue(e.target.value);
600
605
  };
601
606
  const handleKeyDown = (e) => {
602
- if (e.key === "Enter") {
607
+ if (e.key === "Enter" && !e.shiftKey) {
603
608
  e.preventDefault();
604
609
  handleSubmit();
605
610
  }
@@ -608,6 +613,9 @@ var ChatInput = ({
608
613
  if (currentValue.trim() && onSubmit && !isDisabled && !isReadOnly) {
609
614
  onSubmit(currentValue.trim());
610
615
  setValue("");
616
+ if (inputRef.current) {
617
+ inputRef.current.style.height = "auto";
618
+ }
611
619
  inputRef.current?.focus();
612
620
  }
613
621
  };
@@ -631,16 +639,16 @@ var ChatInput = ({
631
639
  /* @__PURE__ */ jsxRuntime.jsx(
632
640
  InputField,
633
641
  {
634
- ...inputProps,
635
642
  ref: inputRef,
636
- type: "text",
643
+ "aria-label": ariaLabel,
637
644
  placeholder,
638
645
  onKeyDown: handleKeyDown,
639
646
  onChange: handleDirectChange,
640
647
  autoFocus,
641
648
  disabled: isDisabled,
642
649
  readOnly: isReadOnly,
643
- value: currentValue
650
+ value: currentValue,
651
+ rows: 1
644
652
  }
645
653
  ),
646
654
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -715,7 +723,7 @@ var NavigationContainer = styled11__default.default.div`
715
723
  display: flex;
716
724
  flex-direction: column;
717
725
  align-items: center;
718
- padding-top: 6px;
726
+ padding-top: ${tokens.spacing.xs};
719
727
  gap: ${tokens.spacing.xs};
720
728
  width: 100%;
721
729
  height: 100%;
@@ -768,7 +776,7 @@ var CategoryButton = styled11__default.default.button`
768
776
  var CategoryLabel = styled11__default.default.span`
769
777
  font-size: 9px;
770
778
  color: ${tokens.colors.text.tertiary};
771
- margin-top: 2px;
779
+ margin-top: ${tokens.spacing.xs};
772
780
  text-align: center;
773
781
  max-width: 56px;
774
782
  overflow: hidden;
@@ -1056,8 +1064,10 @@ var Container2 = styled11__default.default.nav`
1056
1064
  right: 0;
1057
1065
  background-color: ${tokens.colors.background.darker};
1058
1066
  border-top: 1px solid ${tokens.colors.border.subtle};
1059
- /* Reserve space for Android nav buttons (80px) below the actual navbar */
1060
- padding-bottom: max(80px, env(safe-area-inset-bottom, 80px));
1067
+ /* Use safe-area-inset-bottom for Android navigation buttons.
1068
+ The env() value will be 0 on devices without soft nav buttons.
1069
+ Fallback to 0 if env() is not supported. */
1070
+ padding-bottom: env(safe-area-inset-bottom, 0px);
1061
1071
  z-index: ${tokens.zIndex.sticky};
1062
1072
 
1063
1073
  /* Dark theme support */
@@ -1615,7 +1625,7 @@ WorkflowStatusCard.displayName = "WorkflowStatusCard";
1615
1625
  var DarkNotificationCardContainer = styled11__default.default.div`
1616
1626
  display: flex;
1617
1627
  flex-direction: column;
1618
- padding: 6px;
1628
+ padding: ${tokens.spacing.xs};
1619
1629
  background: ${tokens.colors.surface.base};
1620
1630
  border-radius: ${tokens.borderRadius.md};
1621
1631
  gap: ${tokens.spacing.xs};
@@ -1628,7 +1638,7 @@ var DarkSectionHeader = styled11__default.default.button`
1628
1638
  align-items: center;
1629
1639
  justify-content: space-between;
1630
1640
  width: 100%;
1631
- padding: ${tokens.spacing.xs} 2px;
1641
+ padding: ${tokens.spacing.xs} ${tokens.spacing.xs};
1632
1642
  border: none;
1633
1643
  background: transparent;
1634
1644
  font-family: ${tokens.typography.fontFamily.primary};
@@ -1670,18 +1680,18 @@ var DarkChevronIcon = styled11__default.default.span`
1670
1680
  var DarkSectionContent = styled11__default.default.div`
1671
1681
  display: flex;
1672
1682
  flex-direction: column;
1673
- gap: 2px;
1683
+ gap: ${tokens.spacing.xs};
1674
1684
  padding-left: ${tokens.spacing.xs};
1675
- margin-top: 2px;
1685
+ margin-top: ${tokens.spacing.xs};
1676
1686
  min-width: 0;
1677
1687
  overflow: hidden;
1678
1688
  `;
1679
1689
  var DarkNotificationItemWrapper = styled11__default.default.button`
1680
1690
  display: flex;
1681
1691
  align-items: center;
1682
- gap: 6px;
1692
+ gap: ${tokens.spacing.xs};
1683
1693
  width: 100%;
1684
- padding: ${tokens.spacing.xs} 6px;
1694
+ padding: ${tokens.spacing.xs} ${tokens.spacing.xs};
1685
1695
  border: none;
1686
1696
  cursor: pointer;
1687
1697
  text-align: left;
@@ -1737,7 +1747,7 @@ var DarkItemIcon = styled11__default.default.span`
1737
1747
 
1738
1748
  /* Custom icon (emoji or colored icon) styling */
1739
1749
  ${(props) => props.$hasCustomIcon && `
1740
- padding: 2px;
1750
+ padding: ${tokens.spacing.xs};
1741
1751
  `}
1742
1752
  `;
1743
1753
  var DarkItemText = styled11__default.default.span`
@@ -2015,7 +2025,7 @@ var TabButton = styled11__default.default.button`
2015
2025
  flex-shrink: 0;
2016
2026
 
2017
2027
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2018
- padding: 10px ${tokens.spacing.md};
2028
+ padding: ${tokens.spacing.sm} ${tokens.spacing.md};
2019
2029
  font-size: ${tokens.typography.fontSize.xs};
2020
2030
  }
2021
2031
 
@@ -2113,7 +2123,7 @@ styled11__default.default.button`
2113
2123
  overflow: hidden;
2114
2124
 
2115
2125
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2116
- padding: 10px ${tokens.spacing.md};
2126
+ padding: ${tokens.spacing.sm} ${tokens.spacing.md};
2117
2127
  font-size: 13px;
2118
2128
  gap: ${tokens.spacing.sm};
2119
2129
  }
@@ -2195,7 +2205,7 @@ var CategoryTitle = styled11__default.default.div`
2195
2205
  gap: ${tokens.spacing.sm};
2196
2206
 
2197
2207
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2198
- gap: 6px;
2208
+ gap: ${tokens.spacing.xs};
2199
2209
  }
2200
2210
  `;
2201
2211
  styled11__default.default.img`
@@ -2252,7 +2262,7 @@ var CategoryDisclosurePanel = styled11__default.default(reactAriaComponents.Disc
2252
2262
  overflow: hidden;
2253
2263
 
2254
2264
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2255
- padding-left: 2px;
2265
+ padding-left: ${tokens.spacing.xs};
2256
2266
  }
2257
2267
 
2258
2268
  &[data-entering] {
@@ -2274,7 +2284,7 @@ var ItemContainer = styled11__default.default.div`
2274
2284
  display: flex;
2275
2285
  align-items: center;
2276
2286
  gap: ${tokens.spacing.sm};
2277
- padding: 10px ${tokens.spacing.sm}; // Increased vertical padding from 4px to 10px for better breathing room
2287
+ padding: ${tokens.spacing.sm} ${tokens.spacing.sm}; // Increased vertical padding from 4px to 8px for better breathing room
2278
2288
  border-radius: ${tokens.borderRadius.sm};
2279
2289
  cursor: pointer;
2280
2290
  transition: background-color ${tokens.transitions.fast};
@@ -2282,8 +2292,8 @@ var ItemContainer = styled11__default.default.div`
2282
2292
  overflow: hidden;
2283
2293
 
2284
2294
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2285
- gap: 6px;
2286
- padding: ${tokens.spacing.sm} 6px; // Increased vertical padding from 4px to 8px for mobile
2295
+ gap: ${tokens.spacing.xs};
2296
+ padding: ${tokens.spacing.sm} ${tokens.spacing.xs}; // Increased vertical padding from 4px to 8px for mobile
2287
2297
  }
2288
2298
 
2289
2299
  &:hover {
@@ -2324,7 +2334,7 @@ var ItemHeader = styled11__default.default(reactAriaComponents.Button)`
2324
2334
  }
2325
2335
  `;
2326
2336
  var ItemDisclosurePanel = styled11__default.default(reactAriaComponents.DisclosurePanel)`
2327
- padding: 6px;
2337
+ padding: ${tokens.spacing.xs};
2328
2338
  background-color: ${tokens.colors.overlay};
2329
2339
  border-radius: 0 0 ${tokens.borderRadius.md} ${tokens.borderRadius.md};
2330
2340
  margin-top: -${tokens.spacing.xs};
@@ -2335,7 +2345,7 @@ var ItemDisclosurePanel = styled11__default.default(reactAriaComponents.Disclosu
2335
2345
  overflow: hidden;
2336
2346
 
2337
2347
  @media (max-width: ${tokens.breakpoints.mobile}px) {
2338
- padding: 6px;
2348
+ padding: ${tokens.spacing.xs};
2339
2349
  }
2340
2350
 
2341
2351
  &[data-entering] {
@@ -2656,7 +2666,7 @@ function ItemWithLogs({
2656
2666
  isExpanded && /* @__PURE__ */ jsxRuntime.jsx(ItemDisclosurePanel, { children: run.customContent ? (
2657
2667
  // Render custom content directly
2658
2668
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "16px" }, children: run.customContent })
2659
- ) : 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" }) })
2669
+ ) : run.logs && run.logs.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(DarkNotificationCard, { sections: logSections }) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: tokens.colors.text.tertiary, fontSize: "13px", padding: "8px" }, children: "No action logs available" }) })
2660
2670
  ] });
2661
2671
  }
2662
2672
  function normalizeCategory(category) {
@@ -2691,7 +2701,7 @@ function WorkflowGroupItem({
2691
2701
  /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Heading, { level: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(CategoryHeader, { slot: "trigger", style: { paddingLeft: "8px" }, children: [
2692
2702
  /* @__PURE__ */ jsxRuntime.jsxs(CategoryTitle, { children: [
2693
2703
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "13px", fontWeight: 500 }, children: group.workflowName }),
2694
- /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "11px", color: "#72767D", marginLeft: "8px" }, children: [
2704
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "11px", color: tokens.colors.text.tertiary, marginLeft: "8px" }, children: [
2695
2705
  "(",
2696
2706
  group.runs.length,
2697
2707
  ")"
@@ -2901,7 +2911,7 @@ function ConnectionsTabContent({
2901
2911
  return /* @__PURE__ */ jsxRuntime.jsxs(ConnectionsContainer, { children: [
2902
2912
  /* @__PURE__ */ jsxRuntime.jsx(ConnectionDescription, { children: descriptionText }),
2903
2913
  /* @__PURE__ */ jsxRuntime.jsx(GoogleButton, { ...buttonProps, ref, $isConnected: isConnected, children: buttonText }),
2904
- isConnected && googleConnection?.scopes && googleConnection.scopes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "16px", fontSize: "13px", color: "#B9BBBE" }, children: [
2914
+ isConnected && googleConnection?.scopes && googleConnection.scopes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "16px", fontSize: "13px", color: tokens.colors.text.secondary }, children: [
2905
2915
  "Connected services: ",
2906
2916
  googleConnection.scopes.join(", ")
2907
2917
  ] })
@@ -2944,7 +2954,8 @@ function PaneMenus({
2944
2954
  isOAuthConnecting = false,
2945
2955
  isOAuthLoading = false,
2946
2956
  connectionsSlot,
2947
- workflowsSlot
2957
+ workflowsSlot,
2958
+ usageSlot
2948
2959
  }) {
2949
2960
  const state = tabs.useTabListState({
2950
2961
  selectedKey: activeTab,
@@ -2956,7 +2967,7 @@ function PaneMenus({
2956
2967
  children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2957
2968
  workflowsSlot && /* @__PURE__ */ jsxRuntime.jsx(collections.Item, { title: "Workflows", children: workflowsSlot }, "workflows"),
2958
2969
  /* @__PURE__ */ jsxRuntime.jsx(collections.Item, { title: "Runs", children: /* @__PURE__ */ jsxRuntime.jsx(RunsTabContent, { runs, onRunSelect }) }, "runs"),
2959
- /* @__PURE__ */ jsxRuntime.jsx(collections.Item, { title: "Usage", children: /* @__PURE__ */ jsxRuntime.jsx(UsageTabContent, { currentUsage, maxUsage }) }, "usage"),
2970
+ /* @__PURE__ */ jsxRuntime.jsx(collections.Item, { title: "Usage", children: usageSlot || /* @__PURE__ */ jsxRuntime.jsx(UsageTabContent, { currentUsage, maxUsage }) }, "usage"),
2960
2971
  /* @__PURE__ */ jsxRuntime.jsx(collections.Item, { title: "Connections", children: connectionsSlot || /* @__PURE__ */ jsxRuntime.jsx(
2961
2972
  ConnectionsTabContent,
2962
2973
  {
@@ -3351,12 +3362,12 @@ var NotificationItemWrapper = styled11__default.default.button`
3351
3362
  align-items: center;
3352
3363
  gap: ${tokens.spacing.md};
3353
3364
  width: 100%;
3354
- padding: ${(props) => props.$isSelected ? `${tokens.spacing.md} ${tokens.spacing.md}` : `10px ${tokens.spacing.md}`};
3365
+ padding: ${(props) => props.$isSelected ? `${tokens.spacing.md} ${tokens.spacing.md}` : `${tokens.spacing.sm} ${tokens.spacing.md}`};
3355
3366
  border: none;
3356
3367
  cursor: pointer;
3357
3368
  text-align: left;
3358
3369
  transition: all ${tokens.transitions.normal};
3359
- border-radius: ${(props) => props.$isSelected ? tokens.borderRadius.lg : "10px"};
3370
+ border-radius: ${(props) => props.$isSelected ? tokens.borderRadius.lg : tokens.borderRadius.lg};
3360
3371
 
3361
3372
  /* Default state - transparent background */
3362
3373
  background-color: ${(props) => props.$isSelected ? tokens.colors.secondary : "transparent"};
@@ -3405,7 +3416,7 @@ var ItemIcon2 = styled11__default.default.span`
3405
3416
 
3406
3417
  /* Custom icon (emoji or colored icon) styling */
3407
3418
  ${(props) => props.$hasCustomIcon && `
3408
- padding: 2px;
3419
+ padding: ${tokens.spacing.xs};
3409
3420
  `}
3410
3421
  `;
3411
3422
  var ItemText = styled11__default.default.span`
@@ -3649,7 +3660,7 @@ var StyledUserMessage = styled11__default.default.button`
3649
3660
  && {
3650
3661
  background: ${tokens.colors.message.user} !important;
3651
3662
  color: ${tokens.colors.text.primary} !important;
3652
- border-radius: ${tokens.borderRadius.full} !important; /* Pill shape - fully rounded ends */
3663
+ border-radius: ${tokens.borderRadius["2xl"]} !important; /* Rounded corners that work for multi-line */
3653
3664
  }
3654
3665
 
3655
3666
  /* Subtle shadow and glow effect */
@@ -3729,7 +3740,7 @@ var StyledUserMessage = styled11__default.default.button`
3729
3740
  }
3730
3741
  }
3731
3742
  `;
3732
- function UserMessage({
3743
+ function UserMessageBase({
3733
3744
  children,
3734
3745
  className,
3735
3746
  isPressed = false,
@@ -3760,6 +3771,7 @@ function UserMessage({
3760
3771
  }
3761
3772
  );
3762
3773
  }
3774
+ var UserMessage = react.memo(UserMessageBase);
3763
3775
  UserMessage.displayName = "UserMessage";
3764
3776
 
3765
3777
  // src/theme/darkTheme.ts
@@ -3951,25 +3963,28 @@ var IntegrationCard = ({
3951
3963
  className
3952
3964
  }) => {
3953
3965
  return /* @__PURE__ */ jsxRuntime.jsxs(Card, { className, "data-testid": "integration-card", children: [
3954
- /* @__PURE__ */ jsxRuntime.jsxs(Header, { children: [
3966
+ status && /* @__PURE__ */ jsxRuntime.jsx(StatusRow, { children: status }),
3967
+ /* @__PURE__ */ jsxRuntime.jsxs(ContentHeader, { children: [
3955
3968
  /* @__PURE__ */ jsxRuntime.jsx(IconWrapper3, { children: typeof icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(IconImage, { src: icon, alt: name }) : icon }),
3956
3969
  /* @__PURE__ */ jsxRuntime.jsxs(Info, { children: [
3957
3970
  /* @__PURE__ */ jsxRuntime.jsx(Name, { children: name }),
3958
3971
  description && /* @__PURE__ */ jsxRuntime.jsx(Description, { children: description })
3959
- ] }),
3960
- status && /* @__PURE__ */ jsxRuntime.jsx(StatusWrapper, { children: status })
3972
+ ] })
3961
3973
  ] }),
3962
- children && /* @__PURE__ */ jsxRuntime.jsx(ContentRow, { children }),
3963
- actions && /* @__PURE__ */ jsxRuntime.jsx(ActionsRow, { children: actions })
3974
+ (children || actions) && /* @__PURE__ */ jsxRuntime.jsxs(ActionsRow, { children: [
3975
+ children,
3976
+ actions
3977
+ ] })
3964
3978
  ] });
3965
3979
  };
3966
3980
  IntegrationCard.displayName = "IntegrationCard";
3967
3981
  var Card = styled11__default.default.div`
3968
- display: grid;
3982
+ display: flex;
3983
+ flex-direction: column;
3969
3984
  gap: ${tokens.spacing.sm};
3970
3985
  padding: ${tokens.spacing.md};
3971
3986
  background: ${tokens.colors.background.dark};
3972
- border-radius: ${tokens.borderRadius.lg};
3987
+ border-radius: ${tokens.borderRadius.xl};
3973
3988
  border: 1px solid ${tokens.colors.border.default};
3974
3989
  font-family: ${tokens.typography.fontFamily.primary};
3975
3990
  transition: border-color ${tokens.transitions.fast};
@@ -3978,10 +3993,13 @@ var Card = styled11__default.default.div`
3978
3993
  border-color: ${tokens.colors.border.hover};
3979
3994
  }
3980
3995
  `;
3981
- var Header = styled11__default.default.div`
3982
- display: grid;
3983
- grid-template-columns: auto 1fr auto;
3984
- align-items: start;
3996
+ var StatusRow = styled11__default.default.div`
3997
+ display: flex;
3998
+ align-items: center;
3999
+ `;
4000
+ var ContentHeader = styled11__default.default.div`
4001
+ display: flex;
4002
+ align-items: flex-start;
3985
4003
  gap: ${tokens.spacing.sm};
3986
4004
  `;
3987
4005
  var IconWrapper3 = styled11__default.default.div`
@@ -4004,7 +4022,7 @@ var Info = styled11__default.default.div`
4004
4022
  flex-direction: column;
4005
4023
  gap: 2px;
4006
4024
  min-width: 0;
4007
- padding-top: 2px;
4025
+ flex: 1;
4008
4026
  `;
4009
4027
  var Name = styled11__default.default.h3`
4010
4028
  margin: 0;
@@ -4019,21 +4037,10 @@ var Description = styled11__default.default.p`
4019
4037
  color: ${tokens.colors.text.tertiary};
4020
4038
  line-height: ${tokens.typography.lineHeight.normal};
4021
4039
  `;
4022
- var StatusWrapper = styled11__default.default.div`
4023
- flex-shrink: 0;
4024
- padding-top: 2px;
4025
- `;
4026
- var ContentRow = styled11__default.default.div`
4027
- display: flex;
4028
- gap: ${tokens.spacing.sm};
4029
- align-items: center;
4030
- padding-left: calc(40px + ${tokens.spacing.sm});
4031
- `;
4032
4040
  var ActionsRow = styled11__default.default.div`
4033
4041
  display: flex;
4042
+ flex-direction: column;
4034
4043
  gap: ${tokens.spacing.sm};
4035
- justify-content: flex-end;
4036
- padding-top: ${tokens.spacing.xs};
4037
4044
  `;
4038
4045
  var EyeIcon = () => /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
4039
4046
  /* @__PURE__ */ jsxRuntime.jsx("title", { children: "Show" }),
@@ -4951,7 +4958,7 @@ var ActionButton2 = styled11__default.default.button`
4951
4958
  display: block;
4952
4959
  }
4953
4960
  `;
4954
- var Header2 = ({
4961
+ var Header = ({
4955
4962
  title,
4956
4963
  subtitle,
4957
4964
  streamStatus,
@@ -5028,7 +5035,7 @@ var Header2 = ({
5028
5035
  ] })
5029
5036
  ] });
5030
5037
  };
5031
- Header2.displayName = "Header";
5038
+ Header.displayName = "Header";
5032
5039
  var InputContainer = styled11__default.default.div`
5033
5040
  display: flex;
5034
5041
  flex-direction: column;
@@ -5236,6 +5243,9 @@ var Container12 = styled11__default.default.div`
5236
5243
  white-space: pre-wrap;
5237
5244
  word-break: break-word;
5238
5245
  line-height: ${tokens.typography.lineHeight.normal};
5246
+ /* Performance optimizations for streaming text */
5247
+ text-rendering: optimizeSpeed;
5248
+ contain: content;
5239
5249
  `;
5240
5250
  var Cursor = styled11__default.default.span`
5241
5251
  display: inline-block;
@@ -5257,7 +5267,7 @@ var Cursor = styled11__default.default.span`
5257
5267
  }
5258
5268
  }
5259
5269
  `;
5260
- var StreamingText2 = ({
5270
+ var StreamingTextBase = ({
5261
5271
  content,
5262
5272
  isStreaming = false,
5263
5273
  typingSpeed: _typingSpeed = 50,
@@ -5267,25 +5277,27 @@ var StreamingText2 = ({
5267
5277
  onStreamComplete,
5268
5278
  className
5269
5279
  }) => {
5270
- const [displayedText, setDisplayedText] = react.useState("");
5280
+ const [displayedText, setDisplayedText] = react.useState(content);
5281
+ const wasStreamingRef = react.useRef(isStreaming);
5282
+ const completionCalledRef = react.useRef(false);
5271
5283
  react.useEffect(() => {
5272
- if (isStreaming) {
5273
- setDisplayedText(content);
5274
- return;
5284
+ setDisplayedText(content);
5285
+ if (wasStreamingRef.current && !isStreaming && !completionCalledRef.current) {
5286
+ completionCalledRef.current = true;
5287
+ onStreamComplete?.();
5275
5288
  }
5276
- if (!isStreaming && displayedText !== content) {
5277
- setDisplayedText(content);
5278
- if (onStreamComplete) {
5279
- onStreamComplete();
5280
- }
5289
+ if (isStreaming) {
5290
+ completionCalledRef.current = false;
5281
5291
  }
5282
- }, [content, isStreaming, onStreamComplete, displayedText]);
5292
+ wasStreamingRef.current = isStreaming;
5293
+ }, [content, isStreaming, onStreamComplete]);
5283
5294
  const showCursor = isStreaming && cursor;
5284
5295
  return /* @__PURE__ */ jsxRuntime.jsxs(Container12, { variant, className, children: [
5285
5296
  displayedText,
5286
5297
  showCursor && /* @__PURE__ */ jsxRuntime.jsx(Cursor, {})
5287
5298
  ] });
5288
5299
  };
5300
+ var StreamingText2 = react.memo(StreamingTextBase);
5289
5301
  StreamingText2.displayName = "StreamingText";
5290
5302
  var MessageContainer = styled11__default.default.div`
5291
5303
  display: flex;
@@ -5293,20 +5305,9 @@ var MessageContainer = styled11__default.default.div`
5293
5305
  align-items: flex-start;
5294
5306
  padding: ${tokens.spacing.sm} 0;
5295
5307
  max-width: 100%;
5296
-
5297
- /* Fade in and slide up animation */
5298
- animation: fadeInSlideUp ${tokens.animation.duration.medium} ease-out;
5299
-
5300
- @keyframes fadeInSlideUp {
5301
- from {
5302
- opacity: 0;
5303
- transform: translateY(${tokens.spacing.sm});
5304
- }
5305
- to {
5306
- opacity: 1;
5307
- transform: translateY(0);
5308
- }
5309
- }
5308
+ /* GPU acceleration hint for smooth rendering during streaming */
5309
+ will-change: contents;
5310
+ contain: content;
5310
5311
  `;
5311
5312
  var AvatarContainer = styled11__default.default.div`
5312
5313
  flex-shrink: 0;
@@ -5341,9 +5342,8 @@ var ContentContainer = styled11__default.default.div`
5341
5342
  min-width: 0;
5342
5343
  `;
5343
5344
  var MessageContent = styled11__default.default.div`
5344
- background-color: ${tokens.colors.surface.glass};
5345
- backdrop-filter: blur(10px);
5346
- -webkit-backdrop-filter: blur(10px);
5345
+ /* Use solid color instead of backdrop-filter for performance during streaming */
5346
+ background-color: ${tokens.colors.surface.elevated};
5347
5347
  padding: ${tokens.spacing.sm} ${tokens.spacing.md};
5348
5348
  border-radius: ${tokens.borderRadius.lg};
5349
5349
  border-top-left-radius: ${tokens.borderRadius.sm};
@@ -5353,24 +5353,25 @@ var MessageContent = styled11__default.default.div`
5353
5353
  font-family: ${tokens.typography.fontFamily.primary};
5354
5354
  word-wrap: break-word;
5355
5355
  white-space: pre-wrap;
5356
+ /* Optimize text rendering */
5357
+ text-rendering: optimizeSpeed;
5356
5358
  `;
5357
5359
  var LoadingDots3 = styled11__default.default.div`
5358
5360
  display: flex;
5359
5361
  gap: ${tokens.spacing.xs};
5360
5362
  padding: ${tokens.spacing.sm} ${tokens.spacing.md};
5361
- background-color: ${tokens.colors.surface.glass};
5362
- backdrop-filter: blur(10px);
5363
- -webkit-backdrop-filter: blur(10px);
5363
+ /* Use solid color instead of backdrop-filter for performance */
5364
+ background-color: ${tokens.colors.surface.elevated};
5364
5365
  border-radius: ${tokens.borderRadius.lg};
5365
5366
  border-top-left-radius: ${tokens.borderRadius.sm};
5366
5367
  width: fit-content;
5367
5368
  `;
5368
- var bounce = styled11.keyframes`
5369
- 0%, 60%, 100% {
5370
- transform: translateY(0);
5369
+ var pulse3 = styled11.keyframes`
5370
+ 0%, 100% {
5371
+ opacity: 0.4;
5371
5372
  }
5372
- 30% {
5373
- transform: translateY(-${tokens.spacing.sm});
5373
+ 50% {
5374
+ opacity: 1;
5374
5375
  }
5375
5376
  `;
5376
5377
  var LoadingDot = styled11__default.default.div`
@@ -5378,7 +5379,8 @@ var LoadingDot = styled11__default.default.div`
5378
5379
  height: ${tokens.spacing.sm};
5379
5380
  border-radius: ${tokens.borderRadius.full};
5380
5381
  background-color: ${tokens.colors.text.tertiary};
5381
- animation: ${bounce} 1.4s ease-in-out infinite;
5382
+ /* Use simple opacity animation instead of transform bounce */
5383
+ animation: ${pulse3} 1.4s ease-in-out infinite;
5382
5384
  animation-delay: ${(props) => props.delay}s;
5383
5385
  `;
5384
5386
  var FileAttachmentContainer = styled11__default.default.div`
@@ -5573,7 +5575,7 @@ var StreamingIndicator = styled11__default.default.span`
5573
5575
  }
5574
5576
  }
5575
5577
  `;
5576
- var AssistantMessage = ({
5578
+ var AssistantMessageBase = ({
5577
5579
  content = "",
5578
5580
  avatarUrl,
5579
5581
  avatarInitials: _avatarInitials = "AI",
@@ -5620,6 +5622,8 @@ var AssistantMessage = ({
5620
5622
  /* @__PURE__ */ jsxRuntime.jsx(ContentContainer, { children: renderContent() })
5621
5623
  ] });
5622
5624
  };
5625
+ var AssistantMessage = react.memo(AssistantMessageBase);
5626
+ AssistantMessage.displayName = "AssistantMessage";
5623
5627
  var MessagesContainer = styled11__default.default.div`
5624
5628
  display: flex;
5625
5629
  flex-direction: column;
@@ -6767,6 +6771,161 @@ function LinkedInIcon({
6767
6771
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className, style: { display: "inline-flex", width: size, height: size }, children: svgElement });
6768
6772
  }
6769
6773
  LinkedInIcon.displayName = "LinkedInIcon";
6774
+ var StyledIconWrapper3 = styled11__default.default.button`
6775
+ display: inline-flex;
6776
+ align-items: center;
6777
+ justify-content: center;
6778
+ background: transparent;
6779
+ border: none;
6780
+ padding: 0;
6781
+ cursor: pointer;
6782
+ transition: all 0.2s ease-in-out;
6783
+ width: ${({ $size }) => `${$size}px`};
6784
+ height: ${({ $size }) => `${$size}px`};
6785
+ border-radius: ${({ theme }) => theme?.radii?.sm ?? "4px"};
6786
+
6787
+ &:hover:not(:disabled) {
6788
+ opacity: 0.8;
6789
+ transform: scale(1.05);
6790
+ }
6791
+
6792
+ &:active:not(:disabled) {
6793
+ opacity: 0.6;
6794
+ transform: scale(0.95);
6795
+ }
6796
+
6797
+ &:focus-visible {
6798
+ outline: 2px solid ${({ theme }) => (theme?.colors?.primary && typeof theme.colors.primary === "object" ? theme.colors.primary.light : theme?.colors?.primary) ?? "#0066FF"};
6799
+ outline-offset: 2px;
6800
+ }
6801
+
6802
+ &:disabled {
6803
+ cursor: not-allowed;
6804
+ opacity: 0.5;
6805
+ }
6806
+
6807
+ /* Remove default focus outline, using focus-visible instead */
6808
+ &:focus {
6809
+ outline: none;
6810
+ }
6811
+
6812
+ svg {
6813
+ display: block;
6814
+ width: 100%;
6815
+ height: 100%;
6816
+ }
6817
+ `;
6818
+ function PostizIcon({
6819
+ variant = "colored",
6820
+ size = 24,
6821
+ className,
6822
+ style,
6823
+ "aria-label": ariaLabel = "Postiz",
6824
+ onPress,
6825
+ ...ariaProps
6826
+ }) {
6827
+ const ref = react.useRef(null);
6828
+ const isInteractive = Boolean(onPress);
6829
+ const { buttonProps } = button.useButton(
6830
+ {
6831
+ ...ariaProps,
6832
+ onPress,
6833
+ "aria-label": ariaLabel,
6834
+ isDisabled: !isInteractive
6835
+ },
6836
+ ref
6837
+ );
6838
+ const role = isInteractive ? "button" : "img";
6839
+ const ariaHidden = !isInteractive && !ariaLabel;
6840
+ const colors = {
6841
+ colored: {
6842
+ purple: "#612bd3",
6843
+ dark: "#131019",
6844
+ white: "#fff",
6845
+ stroke: "#131019"
6846
+ },
6847
+ black: {
6848
+ purple: "black",
6849
+ dark: "black",
6850
+ white: "black",
6851
+ stroke: "black"
6852
+ },
6853
+ white: {
6854
+ purple: "white",
6855
+ dark: "white",
6856
+ white: "white",
6857
+ stroke: "white"
6858
+ }
6859
+ };
6860
+ const c = colors[variant];
6861
+ const svgElement = /* @__PURE__ */ jsxRuntime.jsxs(
6862
+ "svg",
6863
+ {
6864
+ width: size,
6865
+ height: size,
6866
+ viewBox: "26.74 0.02 460.94 509.34",
6867
+ fill: "none",
6868
+ xmlns: "http://www.w3.org/2000/svg",
6869
+ role,
6870
+ "aria-label": ariaLabel,
6871
+ "aria-hidden": ariaHidden,
6872
+ children: [
6873
+ /* @__PURE__ */ jsxRuntime.jsx(
6874
+ "path",
6875
+ {
6876
+ 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",
6877
+ fill: c.purple
6878
+ }
6879
+ ),
6880
+ /* @__PURE__ */ jsxRuntime.jsx(
6881
+ "path",
6882
+ {
6883
+ 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",
6884
+ fill: "none",
6885
+ stroke: c.stroke,
6886
+ strokeWidth: "4.9373"
6887
+ }
6888
+ ),
6889
+ /* @__PURE__ */ jsxRuntime.jsx(
6890
+ "path",
6891
+ {
6892
+ 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",
6893
+ fill: c.white
6894
+ }
6895
+ ),
6896
+ /* @__PURE__ */ jsxRuntime.jsx(
6897
+ "path",
6898
+ {
6899
+ 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",
6900
+ fill: c.dark
6901
+ }
6902
+ )
6903
+ ]
6904
+ }
6905
+ );
6906
+ if (isInteractive) {
6907
+ return /* @__PURE__ */ jsxRuntime.jsx(
6908
+ StyledIconWrapper3,
6909
+ {
6910
+ ...buttonProps,
6911
+ ref,
6912
+ className,
6913
+ style,
6914
+ $size: size,
6915
+ children: svgElement
6916
+ }
6917
+ );
6918
+ }
6919
+ return /* @__PURE__ */ jsxRuntime.jsx(
6920
+ "span",
6921
+ {
6922
+ className,
6923
+ style: { display: "inline-flex", width: size, height: size, ...style },
6924
+ children: svgElement
6925
+ }
6926
+ );
6927
+ }
6928
+ PostizIcon.displayName = "PostizIcon";
6770
6929
  var ColoredVariant = () => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6771
6930
  /* @__PURE__ */ jsxRuntime.jsx(
6772
6931
  "path",
@@ -7269,7 +7428,7 @@ var StyledXIcon = styled11__default.default.svg`
7269
7428
  &:focus-visible {
7270
7429
  outline: 2px solid ${theme?.colors?.primary ?? "#007bff"};
7271
7430
  outline-offset: 2px;
7272
- border-radius: 2px;
7431
+ border-radius: ${tokens.borderRadius.sm};
7273
7432
  }
7274
7433
  `}
7275
7434
  `;
@@ -7422,15 +7581,15 @@ YouTubeIcon.displayName = "YouTubeIcon";
7422
7581
  var PLATFORM_CONFIGS = {
7423
7582
  x: {
7424
7583
  icon: /* @__PURE__ */ jsxRuntime.jsx(XIcon, { variant: "white", size: 20 }),
7425
- color: "#FFFFFF",
7426
- bgColor: "#000000",
7584
+ color: tokens.colors.text.primary,
7585
+ bgColor: tokens.colors.platform.x,
7427
7586
  maxChars: 280,
7428
7587
  name: "X (Twitter)",
7429
7588
  description: "Concise, punchy posts with 1-2 hashtags"
7430
7589
  },
7431
7590
  linkedin: {
7432
7591
  icon: /* @__PURE__ */ jsxRuntime.jsx(LinkedInIcon, { variant: "colored", size: 20 }),
7433
- color: "#0A66C2",
7592
+ color: tokens.colors.platform.linkedin,
7434
7593
  bgColor: "#f3f6f8",
7435
7594
  maxChars: 3e3,
7436
7595
  name: "LinkedIn",
@@ -7438,7 +7597,7 @@ var PLATFORM_CONFIGS = {
7438
7597
  },
7439
7598
  instagram: {
7440
7599
  icon: /* @__PURE__ */ jsxRuntime.jsx(InstagramIcon, { variant: "colored", size: 20 }),
7441
- color: "#E4405F",
7600
+ color: tokens.colors.platform.instagram,
7442
7601
  bgColor: "#fafafa",
7443
7602
  maxChars: 2200,
7444
7603
  name: "Instagram",
@@ -7446,7 +7605,7 @@ var PLATFORM_CONFIGS = {
7446
7605
  },
7447
7606
  facebook: {
7448
7607
  icon: /* @__PURE__ */ jsxRuntime.jsx(FacebookIcon, { variant: "colored", size: 20 }),
7449
- color: "#1877F2",
7608
+ color: tokens.colors.platform.facebook,
7450
7609
  bgColor: "#f0f2f5",
7451
7610
  maxChars: 63206,
7452
7611
  name: "Facebook",
@@ -7454,7 +7613,7 @@ var PLATFORM_CONFIGS = {
7454
7613
  },
7455
7614
  youtube: {
7456
7615
  icon: /* @__PURE__ */ jsxRuntime.jsx(YouTubeIcon, { variant: "colored", size: 20 }),
7457
- color: "#FF0000",
7616
+ color: tokens.colors.platform.youtube,
7458
7617
  bgColor: "#f9f9f9",
7459
7618
  maxChars: 5e3,
7460
7619
  name: "YouTube",
@@ -7515,10 +7674,12 @@ function getCharacterCount(content, hashtags) {
7515
7674
  return (content + hashtagString).length;
7516
7675
  }
7517
7676
  function isWithinCharLimit(platform, characterCount) {
7518
- return characterCount <= PLATFORM_CONFIGS[platform].maxChars;
7677
+ const config = PLATFORM_CONFIGS[platform] || PLATFORM_CONFIGS.x;
7678
+ return characterCount <= config.maxChars;
7519
7679
  }
7520
7680
  function getCharacterLimitPercentage(platform, characterCount) {
7521
- return Math.min(100, characterCount / PLATFORM_CONFIGS[platform].maxChars * 100);
7681
+ const config = PLATFORM_CONFIGS[platform] || PLATFORM_CONFIGS.x;
7682
+ return Math.min(100, characterCount / config.maxChars * 100);
7522
7683
  }
7523
7684
  function getCharacterLimitColor(percentage) {
7524
7685
  if (percentage > 100) return "bg-red-500";
@@ -7575,7 +7736,7 @@ var PostApprovalControls = ({
7575
7736
  setIsEditing(false);
7576
7737
  };
7577
7738
  return /* @__PURE__ */ jsxRuntime.jsxs(Container13, { "data-testid": "post-approval-controls", children: [
7578
- /* @__PURE__ */ jsxRuntime.jsxs(Header3, { onClick: () => !isEditing && setIsCollapsed(!isCollapsed), children: [
7739
+ /* @__PURE__ */ jsxRuntime.jsxs(Header2, { onClick: () => !isEditing && setIsCollapsed(!isCollapsed), children: [
7579
7740
  /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { $color: statusConfig.color, children: statusConfig.label }),
7580
7741
  /* @__PURE__ */ jsxRuntime.jsxs(MetaInfo, { children: [
7581
7742
  postId && /* @__PURE__ */ jsxRuntime.jsxs(PostId, { children: [
@@ -7644,7 +7805,7 @@ var Container13 = styled11__default.default.div`
7644
7805
  font-family: ${tokens.typography.fontFamily.primary};
7645
7806
  transition: border-color ${tokens.transitions.fast};
7646
7807
  `;
7647
- var Header3 = styled11__default.default.div`
7808
+ var Header2 = styled11__default.default.div`
7648
7809
  display: grid;
7649
7810
  grid-template-columns: auto 1fr auto;
7650
7811
  align-items: center;
@@ -7836,7 +7997,7 @@ var PostPreviewCard = ({
7836
7997
  onContentChange,
7837
7998
  isLoading = false
7838
7999
  }) => {
7839
- const platformConfig = PLATFORM_CONFIGS[post.platform];
8000
+ const platformConfig = PLATFORM_CONFIGS[post.platform] || PLATFORM_CONFIGS.x;
7840
8001
  const showSkeleton = isLoading && !post.content;
7841
8002
  const displayContent = isEditing && editContent !== void 0 ? editContent : post.editedContent || post.content;
7842
8003
  const currentCharCount = displayContent.length;
@@ -7899,6 +8060,16 @@ var PostPreviewCard = ({
7899
8060
  );
7900
8061
  };
7901
8062
  PostPreviewCard.displayName = "PostPreviewCard";
8063
+ var fadeIn2 = styled11.keyframes`
8064
+ from {
8065
+ opacity: 0;
8066
+ transform: translateY(4px);
8067
+ }
8068
+ to {
8069
+ opacity: 1;
8070
+ transform: translateY(0);
8071
+ }
8072
+ `;
7902
8073
  var CardContainer = styled11__default.default.div`
7903
8074
  background: ${tokens.colors.background.dark};
7904
8075
  border-radius: ${tokens.borderRadius.lg};
@@ -7962,6 +8133,8 @@ var PostContent = styled11__default.default.div`
7962
8133
  word-break: break-word;
7963
8134
  margin-bottom: ${tokens.spacing.sm};
7964
8135
  letter-spacing: 0.01em;
8136
+ /* Smooth fade-in animation when content appears */
8137
+ animation: ${fadeIn2} 0.4s ease-out;
7965
8138
  `;
7966
8139
  var PostContentEditable = styled11__default.default.textarea`
7967
8140
  width: 100%;
@@ -8021,13 +8194,13 @@ var ProgressBarTrack = styled11__default.default.div`
8021
8194
  width: 100%;
8022
8195
  height: 4px;
8023
8196
  background: ${tokens.colors.border.default};
8024
- border-radius: 2px;
8197
+ border-radius: ${tokens.borderRadius.sm};
8025
8198
  overflow: hidden;
8026
8199
  `;
8027
8200
  var ProgressBarFill2 = styled11__default.default.div`
8028
8201
  width: ${({ $percentage }) => $percentage}%;
8029
8202
  height: 100%;
8030
- border-radius: 2px;
8203
+ border-radius: ${tokens.borderRadius.sm};
8031
8204
  transition: width 0.3s ease, background-color 0.3s ease;
8032
8205
  background: ${({ $colorClass }) => {
8033
8206
  if ($colorClass.includes("red")) return tokens.colors.error;
@@ -8099,9 +8272,21 @@ var PlatformCarousel = ({
8099
8272
  if (posts.length === 0) {
8100
8273
  return /* @__PURE__ */ jsxRuntime.jsx(CarouselContainer, { children: /* @__PURE__ */ jsxRuntime.jsx(EmptyState, { children: "No posts available" }) });
8101
8274
  }
8275
+ const defaultConfig = {
8276
+ icon: null,
8277
+ color: tokens.colors.text.secondary,
8278
+ bgColor: tokens.colors.background.light,
8279
+ maxChars: 1e3,
8280
+ name: "Unknown",
8281
+ description: "Unknown platform"
8282
+ };
8283
+ const getConfig = (platform) => {
8284
+ const normalized = normalizePlatform(platform);
8285
+ return normalized ? PLATFORM_CONFIGS[normalized] : defaultConfig;
8286
+ };
8102
8287
  return /* @__PURE__ */ jsxRuntime.jsxs(CarouselContainer, { children: [
8103
8288
  /* @__PURE__ */ jsxRuntime.jsx(TabsContainer, { children: posts.map((post, index) => {
8104
- const config = PLATFORM_CONFIGS[post.platform];
8289
+ const config = getConfig(post.platform);
8105
8290
  const isActive = index === activeIndex;
8106
8291
  return /* @__PURE__ */ jsxRuntime.jsxs(
8107
8292
  PlatformTab,
@@ -8134,7 +8319,7 @@ var PlatformCarousel = ({
8134
8319
  ) }, `slide-${post.platform}-${index}`);
8135
8320
  }) }),
8136
8321
  posts.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(NavigationDotsContainer, { children: posts.map((post, index) => {
8137
- const config = PLATFORM_CONFIGS[post.platform];
8322
+ const config = getConfig(post.platform);
8138
8323
  return /* @__PURE__ */ jsxRuntime.jsx(
8139
8324
  NavigationDot,
8140
8325
  {
@@ -8256,23 +8441,46 @@ var PlatformGrid = ({
8256
8441
  editingIndex,
8257
8442
  editContent,
8258
8443
  onEditContentChange,
8259
- isLoading = false
8444
+ isLoading = false,
8445
+ activeIndex = 0,
8446
+ onActiveChange
8260
8447
  }) => {
8261
8448
  if (posts.length === 0) {
8262
8449
  return /* @__PURE__ */ jsxRuntime.jsx(EmptyState2, { children: /* @__PURE__ */ jsxRuntime.jsx(EmptyStateText, { children: "No posts to display" }) });
8263
8450
  }
8451
+ const handlePostClick = (index) => {
8452
+ onActiveChange?.(index);
8453
+ };
8264
8454
  return /* @__PURE__ */ jsxRuntime.jsx(Grid, { "data-testid": "platform-grid", children: posts.map((post, index) => {
8265
8455
  const isEditing = editingIndex === index;
8266
- return /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: /* @__PURE__ */ jsxRuntime.jsx(
8267
- PostPreviewCard,
8456
+ const isActive = activeIndex === index;
8457
+ return /* @__PURE__ */ jsxRuntime.jsx(
8458
+ GridCell,
8268
8459
  {
8269
- post,
8270
- isEditing,
8271
- editContent: isEditing ? editContent : void 0,
8272
- onContentChange: isEditing ? onEditContentChange : void 0,
8273
- isLoading
8274
- }
8275
- ) }, post.platform);
8460
+ $isActive: isActive,
8461
+ onClick: () => handlePostClick(index),
8462
+ role: "button",
8463
+ tabIndex: 0,
8464
+ onKeyDown: (e) => {
8465
+ if (e.key === "Enter" || e.key === " ") {
8466
+ e.preventDefault();
8467
+ handlePostClick(index);
8468
+ }
8469
+ },
8470
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8471
+ PostPreviewCard,
8472
+ {
8473
+ post,
8474
+ isActive,
8475
+ isEditing,
8476
+ editContent: isEditing ? editContent : void 0,
8477
+ onContentChange: isEditing ? onEditContentChange : void 0,
8478
+ isLoading
8479
+ }
8480
+ )
8481
+ },
8482
+ post.platform
8483
+ );
8276
8484
  }) });
8277
8485
  };
8278
8486
  PlatformGrid.displayName = "PlatformGrid";
@@ -8296,6 +8504,13 @@ var Grid = styled11__default.default.div`
8296
8504
  `;
8297
8505
  var GridCell = styled11__default.default.div`
8298
8506
  min-width: 0; /* Prevent grid blowout with long content */
8507
+ cursor: pointer;
8508
+ border-radius: ${tokens.borderRadius.lg};
8509
+ transition: transform ${tokens.transitions.fast};
8510
+
8511
+ &:hover {
8512
+ transform: translateY(-2px);
8513
+ }
8299
8514
  `;
8300
8515
  var EmptyState2 = styled11__default.default.div`
8301
8516
  display: flex;
@@ -8316,7 +8531,7 @@ var Container14 = styled11__default.default.div`
8316
8531
  flex-direction: column;
8317
8532
  height: 100%;
8318
8533
  width: 100%;
8319
- padding: ${tokens.spacing.md};
8534
+ padding: ${tokens.spacing.md} ${tokens.spacing.md} 0 ${tokens.spacing.md};
8320
8535
  box-sizing: border-box;
8321
8536
  background: linear-gradient(
8322
8537
  180deg,
@@ -8325,7 +8540,7 @@ var Container14 = styled11__default.default.div`
8325
8540
  );
8326
8541
  overflow: auto;
8327
8542
  `;
8328
- var Header4 = styled11__default.default.div`
8543
+ var Header3 = styled11__default.default.div`
8329
8544
  display: flex;
8330
8545
  justify-content: space-between;
8331
8546
  align-items: center;
@@ -8414,7 +8629,8 @@ var SocialMediaCanvas = ({
8414
8629
  editingIndex,
8415
8630
  editContent,
8416
8631
  onEditContentChange,
8417
- isLoading = false
8632
+ isLoading = false,
8633
+ activeIndex = 0
8418
8634
  }) => {
8419
8635
  const [viewMode, setViewMode] = react.useState(initialViewMode);
8420
8636
  const handleActiveChange = (index) => {
@@ -8428,7 +8644,7 @@ var SocialMediaCanvas = ({
8428
8644
  ] }) });
8429
8645
  }
8430
8646
  return /* @__PURE__ */ jsxRuntime.jsxs(Container14, { children: [
8431
- /* @__PURE__ */ jsxRuntime.jsxs(Header4, { children: [
8647
+ /* @__PURE__ */ jsxRuntime.jsxs(Header3, { children: [
8432
8648
  /* @__PURE__ */ jsxRuntime.jsxs(Title, { children: [
8433
8649
  title,
8434
8650
  " ",
@@ -8476,7 +8692,9 @@ var SocialMediaCanvas = ({
8476
8692
  editingIndex,
8477
8693
  editContent,
8478
8694
  onEditContentChange,
8479
- isLoading
8695
+ isLoading,
8696
+ activeIndex,
8697
+ onActiveChange: handleActiveChange
8480
8698
  }
8481
8699
  ) })
8482
8700
  ] });
@@ -8539,7 +8757,7 @@ function TokenUsageCard({
8539
8757
  );
8540
8758
  const usageLevel = react.useMemo(() => getUsageLevel(percentage), [percentage]);
8541
8759
  return /* @__PURE__ */ jsxRuntime.jsxs(Card2, { className, "data-testid": "token-usage-card", children: [
8542
- /* @__PURE__ */ jsxRuntime.jsxs(Header5, { children: [
8760
+ /* @__PURE__ */ jsxRuntime.jsxs(Header4, { children: [
8543
8761
  /* @__PURE__ */ jsxRuntime.jsx(Title2, { children: "Token Usage" }),
8544
8762
  /* @__PURE__ */ jsxRuntime.jsx(Period, { children: periodLabel })
8545
8763
  ] }),
@@ -8582,10 +8800,10 @@ var Card2 = styled11__default.default.div`
8582
8800
  gap: ${tokens.spacing.md};
8583
8801
  padding: ${tokens.spacing.lg};
8584
8802
  background: ${tokens.colors.background.dark};
8585
- border-radius: ${tokens.borderRadius.lg};
8803
+ border-radius: ${tokens.borderRadius.xl};
8586
8804
  border: 1px solid ${tokens.colors.border.default};
8587
8805
  `;
8588
- var Header5 = styled11__default.default.div`
8806
+ var Header4 = styled11__default.default.div`
8589
8807
  display: flex;
8590
8808
  justify-content: space-between;
8591
8809
  align-items: center;
@@ -8805,7 +9023,7 @@ var Card3 = styled11__default.default.button`
8805
9023
  gap: ${tokens.spacing.sm};
8806
9024
  padding: ${tokens.spacing.md};
8807
9025
  background: ${tokens.colors.background.dark};
8808
- border-radius: ${tokens.borderRadius.lg};
9026
+ border-radius: ${tokens.borderRadius.xl};
8809
9027
  border: 1px solid ${tokens.colors.border.default};
8810
9028
  cursor: pointer;
8811
9029
  text-align: left;
@@ -8893,8 +9111,8 @@ var Indicators = styled11__default.default.div`
8893
9111
  var IndicatorPill = styled11__default.default.span`
8894
9112
  display: inline-flex;
8895
9113
  align-items: center;
8896
- gap: 6px;
8897
- padding: 4px 10px;
9114
+ gap: ${tokens.spacing.xs};
9115
+ padding: ${tokens.spacing.xs} ${tokens.spacing.sm};
8898
9116
  border-radius: ${tokens.borderRadius.full};
8899
9117
  background: ${({ $variant }) => $variant === "warning" ? `${tokens.colors.warning}15` : `${tokens.colors.info}15`};
8900
9118
  border: 1px solid ${({ $variant }) => $variant === "warning" ? `${tokens.colors.warning}30` : `${tokens.colors.info}30`};
@@ -8955,7 +9173,7 @@ var ModalContent = styled11__default.default.div`
8955
9173
  width: 100%;
8956
9174
  box-shadow: ${tokens.shadows.xl};
8957
9175
  `;
8958
- var Header6 = styled11__default.default.div`
9176
+ var Header5 = styled11__default.default.div`
8959
9177
  display: flex;
8960
9178
  align-items: flex-start;
8961
9179
  gap: ${tokens.spacing.md};
@@ -9180,7 +9398,7 @@ var WorkflowErrorAlert = ({
9180
9398
  return /* @__PURE__ */ jsxRuntime.jsx(InfoIcon, {});
9181
9399
  }
9182
9400
  };
9183
- const alertContent = /* @__PURE__ */ jsxRuntime.jsx(AlertContainer, { variant, severity, className, role: "alert", children: /* @__PURE__ */ jsxRuntime.jsxs(Header6, { children: [
9401
+ const alertContent = /* @__PURE__ */ jsxRuntime.jsx(AlertContainer, { variant, severity, className, role: "alert", children: /* @__PURE__ */ jsxRuntime.jsxs(Header5, { children: [
9184
9402
  /* @__PURE__ */ jsxRuntime.jsx(IconContainer2, { severity, "aria-hidden": "true", children: getIcon() }),
9185
9403
  /* @__PURE__ */ jsxRuntime.jsxs(Content5, { children: [
9186
9404
  /* @__PURE__ */ jsxRuntime.jsx(Title3, { children: displayTitle }),
@@ -9489,7 +9707,7 @@ var Panel = styled11__default.default.div`
9489
9707
  overflow: hidden;
9490
9708
  font-family: ${tokens.typography.fontFamily.primary};
9491
9709
  `;
9492
- var Header7 = styled11__default.default.div`
9710
+ var Header6 = styled11__default.default.div`
9493
9711
  display: flex;
9494
9712
  justify-content: space-between;
9495
9713
  align-items: center;
@@ -9682,7 +9900,7 @@ var WorkflowResultPanel = ({
9682
9900
  }
9683
9901
  };
9684
9902
  return /* @__PURE__ */ jsxRuntime.jsxs(Panel, { collapsible, expanded, className, children: [
9685
- /* @__PURE__ */ jsxRuntime.jsxs(Header7, { collapsible, onClick: handleToggle, children: [
9903
+ /* @__PURE__ */ jsxRuntime.jsxs(Header6, { collapsible, onClick: handleToggle, children: [
9686
9904
  /* @__PURE__ */ jsxRuntime.jsxs(Title4, { children: [
9687
9905
  title,
9688
9906
  collapsible && /* @__PURE__ */ jsxRuntime.jsx(CollapseIcon2, { expanded, children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon4, {}) })
@@ -9704,7 +9922,7 @@ var spin = styled11.keyframes`
9704
9922
  transform: rotate(360deg);
9705
9923
  }
9706
9924
  `;
9707
- var pulse3 = styled11.keyframes`
9925
+ var pulse4 = styled11.keyframes`
9708
9926
  0%, 100% {
9709
9927
  opacity: 1;
9710
9928
  }
@@ -9782,7 +10000,7 @@ var IconContainer3 = styled11__default.default.div`
9782
10000
  animation: ${(props) => {
9783
10001
  if (props.$animated) {
9784
10002
  if (props.$status === "running") return spin;
9785
- if (props.$status === "pending") return pulse3;
10003
+ if (props.$status === "pending") return pulse4;
9786
10004
  }
9787
10005
  return "none";
9788
10006
  }}
@@ -9927,7 +10145,7 @@ exports.FileAttachment = FileAttachment;
9927
10145
  exports.Footer = Footer;
9928
10146
  exports.GlobalStyle = GlobalStyle;
9929
10147
  exports.GmailIcon = GmailIcon;
9930
- exports.Header = Header2;
10148
+ exports.Header = Header;
9931
10149
  exports.Icon = Icon;
9932
10150
  exports.IconNames = IconNames;
9933
10151
  exports.Input = Input2;
@@ -9949,6 +10167,7 @@ exports.PlatformCarousel = PlatformCarousel;
9949
10167
  exports.PlatformGrid = PlatformGrid;
9950
10168
  exports.PostApprovalControls = PostApprovalControls;
9951
10169
  exports.PostPreviewCard = PostPreviewCard;
10170
+ exports.PostizIcon = PostizIcon;
9952
10171
  exports.RedditIcon = RedditIcon;
9953
10172
  exports.Response = Response;
9954
10173
  exports.SecretInput = SecretInput;