@agentiffai/design 0.1.9 → 0.1.11

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.d.cts CHANGED
@@ -1,10 +1,11 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { AriaTextFieldProps } from '@react-aria/textfield';
3
- import React__default from 'react';
3
+ import * as React from 'react';
4
+ import React__default, { ReactNode } from 'react';
4
5
  export { ActionButtons, ActionButtonsProps, BrandType, CategoryItem, CategoryNav, CategoryNavProps, CategorySubItem, Icon, IconName, IconNames, IconProps, Layout, LayoutProps, NavHorizontal, NavHorizontalProps, NavVertical, NavVerticalProps, OAuthConnectionData, PaneMenus, PaneMenusProps, PaneSectionHeader, PaneSectionHeaderProps, ServiceBrand, ServiceIcon, ServiceIconProps, WorkflowStatusCard, WorkflowStatusCardProps } from './layout/index.cjs';
5
6
  import { AriaButtonProps } from '@react-aria/button';
6
7
  export { GlobalStyle, darkTheme, lightTheme, tokens } from './theme/index.cjs';
7
- export { A as Action, c as ActionVariant, d as Actions, a as ActionsLayout, b as ActionsProps, f as AgentState, e as AgentStateProps, q as AssistantMessage, m as AssistantMessageProps, i as Button, B as ButtonProps, g as ButtonSize, h as ButtonVariant, w as CopilotUserMessage, U as CopilotUserMessageProps, r as FileAttachment, n as FileAttachmentProps, j as Footer, F as FooterProps, k as Header, H as HeaderProps, l as Input, I as InputProps, M as Message, s as Messages, t as MessagesList, u as MessagesListContainer, v as MessagesListContent, o as MessagesListProps, p as MessagesProps, x as Response, R as ResponseProps, y as StreamErrorMessage, S as StreamErrorMessageProps, E as StreamStatusIndicator, D as StreamStatusIndicatorProps, C as StreamingText, z as StreamingTextProps, J as Suggestions, G as SuggestionsProps, K as Window, W as WindowProps } from './Window-CF5y1_Og.cjs';
8
+ export { A as Action, c as ActionVariant, d as Actions, a as ActionsLayout, b as ActionsProps, f as AgentState, e as AgentStateProps, q as AssistantMessage, m as AssistantMessageProps, i as Button, B as ButtonProps, g as ButtonSize, h as ButtonVariant, w as CopilotUserMessage, U as CopilotUserMessageProps, r as FileAttachment, n as FileAttachmentProps, j as Footer, F as FooterProps, k as Header, H as HeaderProps, l as Input, I as InputProps, M as Message, s as Messages, t as MessagesList, u as MessagesListContainer, v as MessagesListContent, o as MessagesListProps, p as MessagesProps, x as Response, R as ResponseProps, y as StreamErrorMessage, S as StreamErrorMessageProps, E as StreamStatusIndicator, D as StreamStatusIndicatorProps, C as StreamingText, z as StreamingTextProps, J as Suggestions, G as SuggestionsProps, K as Window, W as WindowProps } from './Window-BcTRumpc.cjs';
8
9
  export { FacebookIcon, FacebookIconProps, FacebookIconVariant, GmailIcon, GmailIconProps, GmailIconVariant, InstagramIcon, InstagramIconProps, InstagramVariant, LinkedInIcon, LinkedInIconProps, LinkedInIconVariant, RedditIcon, RedditIconProps, RedditIconVariant, SlackIcon, SlackIconProps, SlackIconVariant, TelegramIcon, TelegramIconProps, TelegramIconVariant, WhatsAppIcon, WhatsAppIconProps, WhatsAppIconVariant, XIcon, XIconProps, XIconVariant, YouTubeIcon, YouTubeIconProps, YouTubeIconVariant } from './icons/index.cjs';
9
10
  export { WorkflowCard, WorkflowCardProps, WorkflowErrorAlert, WorkflowErrorAlertProps, WorkflowIntegration, WorkflowProgressBar, WorkflowProgressBarProps, WorkflowResultPanel, WorkflowResultPanelProps, WorkflowStatusBadge, WorkflowStatusBadgeProps } from './workflow/index.cjs';
10
11
  import '@react-types/button';
@@ -163,7 +164,7 @@ interface UserMessageProps extends AriaButtonProps {
163
164
  /**
164
165
  * The message text to display
165
166
  */
166
- children: React.ReactNode;
167
+ children: ReactNode;
167
168
  /**
168
169
  * Additional CSS class name
169
170
  */
@@ -184,6 +185,8 @@ interface UserMessageProps extends AriaButtonProps {
184
185
  * pill-shaped design with fully rounded ends, and white text. It uses React ARIA
185
186
  * for accessibility and supports keyboard navigation.
186
187
  *
188
+ * Memoized to prevent unnecessary re-renders during parent updates.
189
+ *
187
190
  * @example
188
191
  * ```tsx
189
192
  * <UserMessage onPress={() => console.log('clicked')}>
@@ -191,10 +194,8 @@ interface UserMessageProps extends AriaButtonProps {
191
194
  * </UserMessage>
192
195
  * ```
193
196
  */
194
- declare function UserMessage({ children, className, isPressed, onPress, ...ariaProps }: UserMessageProps): react_jsx_runtime.JSX.Element;
195
- declare namespace UserMessage {
196
- var displayName: string;
197
- }
197
+ declare function UserMessageBase({ children, className, isPressed, onPress, ...ariaProps }: UserMessageProps): react_jsx_runtime.JSX.Element;
198
+ declare const UserMessage: React.MemoExoticComponent<typeof UserMessageBase>;
198
199
 
199
200
  /**
200
201
  * ConnectionStatusBadge Component
@@ -475,6 +476,10 @@ interface PlatformGridProps {
475
476
  onEditContentChange?: (content: string) => void;
476
477
  /** Whether content is being loaded/generated */
477
478
  isLoading?: boolean;
479
+ /** Currently active/selected post index */
480
+ activeIndex?: number;
481
+ /** Callback when a post is clicked/selected */
482
+ onActiveChange?: (index: number) => void;
478
483
  }
479
484
  /**
480
485
  * PlatformGrid displays all proposed posts in a responsive grid layout.
@@ -504,7 +509,7 @@ interface SocialMediaCanvasProps {
504
509
  emptyTitle?: string;
505
510
  /** Empty state description */
506
511
  emptyDescription?: string;
507
- /** Callback when active post changes in carousel mode */
512
+ /** Callback when active post changes */
508
513
  onActiveChange?: (index: number) => void;
509
514
  /** Whether to show the view mode toggle */
510
515
  showViewToggle?: boolean;
@@ -516,6 +521,8 @@ interface SocialMediaCanvasProps {
516
521
  onEditContentChange?: (content: string) => void;
517
522
  /** Whether content is being loaded/generated */
518
523
  isLoading?: boolean;
524
+ /** Currently active post index (for grid mode) */
525
+ activeIndex?: number;
519
526
  }
520
527
  /**
521
528
  * SocialMediaCanvas displays social media post previews in carousel or grid mode.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { AriaTextFieldProps } from '@react-aria/textfield';
3
- import React__default from 'react';
3
+ import * as React from 'react';
4
+ import React__default, { ReactNode } from 'react';
4
5
  export { ActionButtons, ActionButtonsProps, BrandType, CategoryItem, CategoryNav, CategoryNavProps, CategorySubItem, Icon, IconName, IconNames, IconProps, Layout, LayoutProps, NavHorizontal, NavHorizontalProps, NavVertical, NavVerticalProps, OAuthConnectionData, PaneMenus, PaneMenusProps, PaneSectionHeader, PaneSectionHeaderProps, ServiceBrand, ServiceIcon, ServiceIconProps, WorkflowStatusCard, WorkflowStatusCardProps } from './layout/index.js';
5
6
  import { AriaButtonProps } from '@react-aria/button';
6
7
  export { GlobalStyle, darkTheme, lightTheme, tokens } from './theme/index.js';
7
- export { A as Action, c as ActionVariant, d as Actions, a as ActionsLayout, b as ActionsProps, f as AgentState, e as AgentStateProps, q as AssistantMessage, m as AssistantMessageProps, i as Button, B as ButtonProps, g as ButtonSize, h as ButtonVariant, w as CopilotUserMessage, U as CopilotUserMessageProps, r as FileAttachment, n as FileAttachmentProps, j as Footer, F as FooterProps, k as Header, H as HeaderProps, l as Input, I as InputProps, M as Message, s as Messages, t as MessagesList, u as MessagesListContainer, v as MessagesListContent, o as MessagesListProps, p as MessagesProps, x as Response, R as ResponseProps, y as StreamErrorMessage, S as StreamErrorMessageProps, E as StreamStatusIndicator, D as StreamStatusIndicatorProps, C as StreamingText, z as StreamingTextProps, J as Suggestions, G as SuggestionsProps, K as Window, W as WindowProps } from './Window-CF5y1_Og.js';
8
+ export { A as Action, c as ActionVariant, d as Actions, a as ActionsLayout, b as ActionsProps, f as AgentState, e as AgentStateProps, q as AssistantMessage, m as AssistantMessageProps, i as Button, B as ButtonProps, g as ButtonSize, h as ButtonVariant, w as CopilotUserMessage, U as CopilotUserMessageProps, r as FileAttachment, n as FileAttachmentProps, j as Footer, F as FooterProps, k as Header, H as HeaderProps, l as Input, I as InputProps, M as Message, s as Messages, t as MessagesList, u as MessagesListContainer, v as MessagesListContent, o as MessagesListProps, p as MessagesProps, x as Response, R as ResponseProps, y as StreamErrorMessage, S as StreamErrorMessageProps, E as StreamStatusIndicator, D as StreamStatusIndicatorProps, C as StreamingText, z as StreamingTextProps, J as Suggestions, G as SuggestionsProps, K as Window, W as WindowProps } from './Window-BcTRumpc.js';
8
9
  export { FacebookIcon, FacebookIconProps, FacebookIconVariant, GmailIcon, GmailIconProps, GmailIconVariant, InstagramIcon, InstagramIconProps, InstagramVariant, LinkedInIcon, LinkedInIconProps, LinkedInIconVariant, RedditIcon, RedditIconProps, RedditIconVariant, SlackIcon, SlackIconProps, SlackIconVariant, TelegramIcon, TelegramIconProps, TelegramIconVariant, WhatsAppIcon, WhatsAppIconProps, WhatsAppIconVariant, XIcon, XIconProps, XIconVariant, YouTubeIcon, YouTubeIconProps, YouTubeIconVariant } from './icons/index.js';
9
10
  export { WorkflowCard, WorkflowCardProps, WorkflowErrorAlert, WorkflowErrorAlertProps, WorkflowIntegration, WorkflowProgressBar, WorkflowProgressBarProps, WorkflowResultPanel, WorkflowResultPanelProps, WorkflowStatusBadge, WorkflowStatusBadgeProps } from './workflow/index.js';
10
11
  import '@react-types/button';
@@ -163,7 +164,7 @@ interface UserMessageProps extends AriaButtonProps {
163
164
  /**
164
165
  * The message text to display
165
166
  */
166
- children: React.ReactNode;
167
+ children: ReactNode;
167
168
  /**
168
169
  * Additional CSS class name
169
170
  */
@@ -184,6 +185,8 @@ interface UserMessageProps extends AriaButtonProps {
184
185
  * pill-shaped design with fully rounded ends, and white text. It uses React ARIA
185
186
  * for accessibility and supports keyboard navigation.
186
187
  *
188
+ * Memoized to prevent unnecessary re-renders during parent updates.
189
+ *
187
190
  * @example
188
191
  * ```tsx
189
192
  * <UserMessage onPress={() => console.log('clicked')}>
@@ -191,10 +194,8 @@ interface UserMessageProps extends AriaButtonProps {
191
194
  * </UserMessage>
192
195
  * ```
193
196
  */
194
- declare function UserMessage({ children, className, isPressed, onPress, ...ariaProps }: UserMessageProps): react_jsx_runtime.JSX.Element;
195
- declare namespace UserMessage {
196
- var displayName: string;
197
- }
197
+ declare function UserMessageBase({ children, className, isPressed, onPress, ...ariaProps }: UserMessageProps): react_jsx_runtime.JSX.Element;
198
+ declare const UserMessage: React.MemoExoticComponent<typeof UserMessageBase>;
198
199
 
199
200
  /**
200
201
  * ConnectionStatusBadge Component
@@ -475,6 +476,10 @@ interface PlatformGridProps {
475
476
  onEditContentChange?: (content: string) => void;
476
477
  /** Whether content is being loaded/generated */
477
478
  isLoading?: boolean;
479
+ /** Currently active/selected post index */
480
+ activeIndex?: number;
481
+ /** Callback when a post is clicked/selected */
482
+ onActiveChange?: (index: number) => void;
478
483
  }
479
484
  /**
480
485
  * PlatformGrid displays all proposed posts in a responsive grid layout.
@@ -504,7 +509,7 @@ interface SocialMediaCanvasProps {
504
509
  emptyTitle?: string;
505
510
  /** Empty state description */
506
511
  emptyDescription?: string;
507
- /** Callback when active post changes in carousel mode */
512
+ /** Callback when active post changes */
508
513
  onActiveChange?: (index: number) => void;
509
514
  /** Whether to show the view mode toggle */
510
515
  showViewToggle?: boolean;
@@ -516,6 +521,8 @@ interface SocialMediaCanvasProps {
516
521
  onEditContentChange?: (content: string) => void;
517
522
  /** Whether content is being loaded/generated */
518
523
  isLoading?: boolean;
524
+ /** Currently active post index (for grid mode) */
525
+ activeIndex?: number;
519
526
  }
520
527
  /**
521
528
  * SocialMediaCanvas displays social media post previews in carousel or grid mode.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
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';
@@ -1050,8 +1050,10 @@ var Container2 = styled11.nav`
1050
1050
  right: 0;
1051
1051
  background-color: ${tokens.colors.background.darker};
1052
1052
  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));
1053
+ /* Use safe-area-inset-bottom for Android navigation buttons.
1054
+ The env() value will be 0 on devices without soft nav buttons.
1055
+ Fallback to 0 if env() is not supported. */
1056
+ padding-bottom: env(safe-area-inset-bottom, 0px);
1055
1057
  z-index: ${tokens.zIndex.sticky};
1056
1058
 
1057
1059
  /* Dark theme support */
@@ -2938,7 +2940,8 @@ function PaneMenus({
2938
2940
  isOAuthConnecting = false,
2939
2941
  isOAuthLoading = false,
2940
2942
  connectionsSlot,
2941
- workflowsSlot
2943
+ workflowsSlot,
2944
+ usageSlot
2942
2945
  }) {
2943
2946
  const state = useTabListState({
2944
2947
  selectedKey: activeTab,
@@ -2950,7 +2953,7 @@ function PaneMenus({
2950
2953
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
2951
2954
  workflowsSlot && /* @__PURE__ */ jsx(Item, { title: "Workflows", children: workflowsSlot }, "workflows"),
2952
2955
  /* @__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"),
2956
+ /* @__PURE__ */ jsx(Item, { title: "Usage", children: usageSlot || /* @__PURE__ */ jsx(UsageTabContent, { currentUsage, maxUsage }) }, "usage"),
2954
2957
  /* @__PURE__ */ jsx(Item, { title: "Connections", children: connectionsSlot || /* @__PURE__ */ jsx(
2955
2958
  ConnectionsTabContent,
2956
2959
  {
@@ -3723,7 +3726,7 @@ var StyledUserMessage = styled11.button`
3723
3726
  }
3724
3727
  }
3725
3728
  `;
3726
- function UserMessage({
3729
+ function UserMessageBase({
3727
3730
  children,
3728
3731
  className,
3729
3732
  isPressed = false,
@@ -3754,6 +3757,7 @@ function UserMessage({
3754
3757
  }
3755
3758
  );
3756
3759
  }
3760
+ var UserMessage = memo(UserMessageBase);
3757
3761
  UserMessage.displayName = "UserMessage";
3758
3762
 
3759
3763
  // src/theme/darkTheme.ts
@@ -3945,25 +3949,28 @@ var IntegrationCard = ({
3945
3949
  className
3946
3950
  }) => {
3947
3951
  return /* @__PURE__ */ jsxs(Card, { className, "data-testid": "integration-card", children: [
3948
- /* @__PURE__ */ jsxs(Header, { children: [
3952
+ status && /* @__PURE__ */ jsx(StatusRow, { children: status }),
3953
+ /* @__PURE__ */ jsxs(ContentHeader, { children: [
3949
3954
  /* @__PURE__ */ jsx(IconWrapper3, { children: typeof icon === "string" ? /* @__PURE__ */ jsx(IconImage, { src: icon, alt: name }) : icon }),
3950
3955
  /* @__PURE__ */ jsxs(Info, { children: [
3951
3956
  /* @__PURE__ */ jsx(Name, { children: name }),
3952
3957
  description && /* @__PURE__ */ jsx(Description, { children: description })
3953
- ] }),
3954
- status && /* @__PURE__ */ jsx(StatusWrapper, { children: status })
3958
+ ] })
3955
3959
  ] }),
3956
- children && /* @__PURE__ */ jsx(ContentRow, { children }),
3957
- actions && /* @__PURE__ */ jsx(ActionsRow, { children: actions })
3960
+ (children || actions) && /* @__PURE__ */ jsxs(ActionsRow, { children: [
3961
+ children,
3962
+ actions
3963
+ ] })
3958
3964
  ] });
3959
3965
  };
3960
3966
  IntegrationCard.displayName = "IntegrationCard";
3961
3967
  var Card = styled11.div`
3962
- display: grid;
3968
+ display: flex;
3969
+ flex-direction: column;
3963
3970
  gap: ${tokens.spacing.sm};
3964
3971
  padding: ${tokens.spacing.md};
3965
3972
  background: ${tokens.colors.background.dark};
3966
- border-radius: ${tokens.borderRadius.lg};
3973
+ border-radius: ${tokens.borderRadius.xl};
3967
3974
  border: 1px solid ${tokens.colors.border.default};
3968
3975
  font-family: ${tokens.typography.fontFamily.primary};
3969
3976
  transition: border-color ${tokens.transitions.fast};
@@ -3972,10 +3979,13 @@ var Card = styled11.div`
3972
3979
  border-color: ${tokens.colors.border.hover};
3973
3980
  }
3974
3981
  `;
3975
- var Header = styled11.div`
3976
- display: grid;
3977
- grid-template-columns: auto 1fr auto;
3978
- align-items: start;
3982
+ var StatusRow = styled11.div`
3983
+ display: flex;
3984
+ align-items: center;
3985
+ `;
3986
+ var ContentHeader = styled11.div`
3987
+ display: flex;
3988
+ align-items: flex-start;
3979
3989
  gap: ${tokens.spacing.sm};
3980
3990
  `;
3981
3991
  var IconWrapper3 = styled11.div`
@@ -3998,7 +4008,7 @@ var Info = styled11.div`
3998
4008
  flex-direction: column;
3999
4009
  gap: 2px;
4000
4010
  min-width: 0;
4001
- padding-top: 2px;
4011
+ flex: 1;
4002
4012
  `;
4003
4013
  var Name = styled11.h3`
4004
4014
  margin: 0;
@@ -4013,21 +4023,10 @@ var Description = styled11.p`
4013
4023
  color: ${tokens.colors.text.tertiary};
4014
4024
  line-height: ${tokens.typography.lineHeight.normal};
4015
4025
  `;
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
4026
  var ActionsRow = styled11.div`
4027
4027
  display: flex;
4028
+ flex-direction: column;
4028
4029
  gap: ${tokens.spacing.sm};
4029
- justify-content: flex-end;
4030
- padding-top: ${tokens.spacing.xs};
4031
4030
  `;
4032
4031
  var EyeIcon = () => /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
4033
4032
  /* @__PURE__ */ jsx("title", { children: "Show" }),
@@ -4945,7 +4944,7 @@ var ActionButton2 = styled11.button`
4945
4944
  display: block;
4946
4945
  }
4947
4946
  `;
4948
- var Header2 = ({
4947
+ var Header = ({
4949
4948
  title,
4950
4949
  subtitle,
4951
4950
  streamStatus,
@@ -5022,7 +5021,7 @@ var Header2 = ({
5022
5021
  ] })
5023
5022
  ] });
5024
5023
  };
5025
- Header2.displayName = "Header";
5024
+ Header.displayName = "Header";
5026
5025
  var InputContainer = styled11.div`
5027
5026
  display: flex;
5028
5027
  flex-direction: column;
@@ -5251,7 +5250,7 @@ var Cursor = styled11.span`
5251
5250
  }
5252
5251
  }
5253
5252
  `;
5254
- var StreamingText2 = ({
5253
+ var StreamingTextBase = ({
5255
5254
  content,
5256
5255
  isStreaming = false,
5257
5256
  typingSpeed: _typingSpeed = 50,
@@ -5261,25 +5260,27 @@ var StreamingText2 = ({
5261
5260
  onStreamComplete,
5262
5261
  className
5263
5262
  }) => {
5264
- const [displayedText, setDisplayedText] = useState("");
5263
+ const [displayedText, setDisplayedText] = useState(content);
5264
+ const wasStreamingRef = useRef(isStreaming);
5265
+ const completionCalledRef = useRef(false);
5265
5266
  useEffect(() => {
5266
- if (isStreaming) {
5267
- setDisplayedText(content);
5268
- return;
5267
+ setDisplayedText(content);
5268
+ if (wasStreamingRef.current && !isStreaming && !completionCalledRef.current) {
5269
+ completionCalledRef.current = true;
5270
+ onStreamComplete?.();
5269
5271
  }
5270
- if (!isStreaming && displayedText !== content) {
5271
- setDisplayedText(content);
5272
- if (onStreamComplete) {
5273
- onStreamComplete();
5274
- }
5272
+ if (isStreaming) {
5273
+ completionCalledRef.current = false;
5275
5274
  }
5276
- }, [content, isStreaming, onStreamComplete, displayedText]);
5275
+ wasStreamingRef.current = isStreaming;
5276
+ }, [content, isStreaming, onStreamComplete]);
5277
5277
  const showCursor = isStreaming && cursor;
5278
5278
  return /* @__PURE__ */ jsxs(Container12, { variant, className, children: [
5279
5279
  displayedText,
5280
5280
  showCursor && /* @__PURE__ */ jsx(Cursor, {})
5281
5281
  ] });
5282
5282
  };
5283
+ var StreamingText2 = memo(StreamingTextBase);
5283
5284
  StreamingText2.displayName = "StreamingText";
5284
5285
  var MessageContainer = styled11.div`
5285
5286
  display: flex;
@@ -5567,7 +5568,7 @@ var StreamingIndicator = styled11.span`
5567
5568
  }
5568
5569
  }
5569
5570
  `;
5570
- var AssistantMessage = ({
5571
+ var AssistantMessageBase = ({
5571
5572
  content = "",
5572
5573
  avatarUrl,
5573
5574
  avatarInitials: _avatarInitials = "AI",
@@ -5614,6 +5615,8 @@ var AssistantMessage = ({
5614
5615
  /* @__PURE__ */ jsx(ContentContainer, { children: renderContent() })
5615
5616
  ] });
5616
5617
  };
5618
+ var AssistantMessage = memo(AssistantMessageBase);
5619
+ AssistantMessage.displayName = "AssistantMessage";
5617
5620
  var MessagesContainer = styled11.div`
5618
5621
  display: flex;
5619
5622
  flex-direction: column;
@@ -7569,7 +7572,7 @@ var PostApprovalControls = ({
7569
7572
  setIsEditing(false);
7570
7573
  };
7571
7574
  return /* @__PURE__ */ jsxs(Container13, { "data-testid": "post-approval-controls", children: [
7572
- /* @__PURE__ */ jsxs(Header3, { onClick: () => !isEditing && setIsCollapsed(!isCollapsed), children: [
7575
+ /* @__PURE__ */ jsxs(Header2, { onClick: () => !isEditing && setIsCollapsed(!isCollapsed), children: [
7573
7576
  /* @__PURE__ */ jsx(StatusBadge, { $color: statusConfig.color, children: statusConfig.label }),
7574
7577
  /* @__PURE__ */ jsxs(MetaInfo, { children: [
7575
7578
  postId && /* @__PURE__ */ jsxs(PostId, { children: [
@@ -7638,7 +7641,7 @@ var Container13 = styled11.div`
7638
7641
  font-family: ${tokens.typography.fontFamily.primary};
7639
7642
  transition: border-color ${tokens.transitions.fast};
7640
7643
  `;
7641
- var Header3 = styled11.div`
7644
+ var Header2 = styled11.div`
7642
7645
  display: grid;
7643
7646
  grid-template-columns: auto 1fr auto;
7644
7647
  align-items: center;
@@ -7893,6 +7896,16 @@ var PostPreviewCard = ({
7893
7896
  );
7894
7897
  };
7895
7898
  PostPreviewCard.displayName = "PostPreviewCard";
7899
+ var fadeIn2 = keyframes`
7900
+ from {
7901
+ opacity: 0;
7902
+ transform: translateY(4px);
7903
+ }
7904
+ to {
7905
+ opacity: 1;
7906
+ transform: translateY(0);
7907
+ }
7908
+ `;
7896
7909
  var CardContainer = styled11.div`
7897
7910
  background: ${tokens.colors.background.dark};
7898
7911
  border-radius: ${tokens.borderRadius.lg};
@@ -7956,6 +7969,8 @@ var PostContent = styled11.div`
7956
7969
  word-break: break-word;
7957
7970
  margin-bottom: ${tokens.spacing.sm};
7958
7971
  letter-spacing: 0.01em;
7972
+ /* Smooth fade-in animation when content appears */
7973
+ animation: ${fadeIn2} 0.4s ease-out;
7959
7974
  `;
7960
7975
  var PostContentEditable = styled11.textarea`
7961
7976
  width: 100%;
@@ -8250,23 +8265,46 @@ var PlatformGrid = ({
8250
8265
  editingIndex,
8251
8266
  editContent,
8252
8267
  onEditContentChange,
8253
- isLoading = false
8268
+ isLoading = false,
8269
+ activeIndex = 0,
8270
+ onActiveChange
8254
8271
  }) => {
8255
8272
  if (posts.length === 0) {
8256
8273
  return /* @__PURE__ */ jsx(EmptyState2, { children: /* @__PURE__ */ jsx(EmptyStateText, { children: "No posts to display" }) });
8257
8274
  }
8275
+ const handlePostClick = (index) => {
8276
+ onActiveChange?.(index);
8277
+ };
8258
8278
  return /* @__PURE__ */ jsx(Grid, { "data-testid": "platform-grid", children: posts.map((post, index) => {
8259
8279
  const isEditing = editingIndex === index;
8260
- return /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(
8261
- PostPreviewCard,
8280
+ const isActive = activeIndex === index;
8281
+ return /* @__PURE__ */ jsx(
8282
+ GridCell,
8262
8283
  {
8263
- post,
8264
- isEditing,
8265
- editContent: isEditing ? editContent : void 0,
8266
- onContentChange: isEditing ? onEditContentChange : void 0,
8267
- isLoading
8268
- }
8269
- ) }, post.platform);
8284
+ $isActive: isActive,
8285
+ onClick: () => handlePostClick(index),
8286
+ role: "button",
8287
+ tabIndex: 0,
8288
+ onKeyDown: (e) => {
8289
+ if (e.key === "Enter" || e.key === " ") {
8290
+ e.preventDefault();
8291
+ handlePostClick(index);
8292
+ }
8293
+ },
8294
+ children: /* @__PURE__ */ jsx(
8295
+ PostPreviewCard,
8296
+ {
8297
+ post,
8298
+ isActive,
8299
+ isEditing,
8300
+ editContent: isEditing ? editContent : void 0,
8301
+ onContentChange: isEditing ? onEditContentChange : void 0,
8302
+ isLoading
8303
+ }
8304
+ )
8305
+ },
8306
+ post.platform
8307
+ );
8270
8308
  }) });
8271
8309
  };
8272
8310
  PlatformGrid.displayName = "PlatformGrid";
@@ -8290,6 +8328,13 @@ var Grid = styled11.div`
8290
8328
  `;
8291
8329
  var GridCell = styled11.div`
8292
8330
  min-width: 0; /* Prevent grid blowout with long content */
8331
+ cursor: pointer;
8332
+ border-radius: ${tokens.borderRadius.lg};
8333
+ transition: transform ${tokens.transitions.fast};
8334
+
8335
+ &:hover {
8336
+ transform: translateY(-2px);
8337
+ }
8293
8338
  `;
8294
8339
  var EmptyState2 = styled11.div`
8295
8340
  display: flex;
@@ -8310,7 +8355,7 @@ var Container14 = styled11.div`
8310
8355
  flex-direction: column;
8311
8356
  height: 100%;
8312
8357
  width: 100%;
8313
- padding: ${tokens.spacing.md};
8358
+ padding: ${tokens.spacing.md} ${tokens.spacing.md} 0 ${tokens.spacing.md};
8314
8359
  box-sizing: border-box;
8315
8360
  background: linear-gradient(
8316
8361
  180deg,
@@ -8319,7 +8364,7 @@ var Container14 = styled11.div`
8319
8364
  );
8320
8365
  overflow: auto;
8321
8366
  `;
8322
- var Header4 = styled11.div`
8367
+ var Header3 = styled11.div`
8323
8368
  display: flex;
8324
8369
  justify-content: space-between;
8325
8370
  align-items: center;
@@ -8408,7 +8453,8 @@ var SocialMediaCanvas = ({
8408
8453
  editingIndex,
8409
8454
  editContent,
8410
8455
  onEditContentChange,
8411
- isLoading = false
8456
+ isLoading = false,
8457
+ activeIndex = 0
8412
8458
  }) => {
8413
8459
  const [viewMode, setViewMode] = useState(initialViewMode);
8414
8460
  const handleActiveChange = (index) => {
@@ -8422,7 +8468,7 @@ var SocialMediaCanvas = ({
8422
8468
  ] }) });
8423
8469
  }
8424
8470
  return /* @__PURE__ */ jsxs(Container14, { children: [
8425
- /* @__PURE__ */ jsxs(Header4, { children: [
8471
+ /* @__PURE__ */ jsxs(Header3, { children: [
8426
8472
  /* @__PURE__ */ jsxs(Title, { children: [
8427
8473
  title,
8428
8474
  " ",
@@ -8470,7 +8516,9 @@ var SocialMediaCanvas = ({
8470
8516
  editingIndex,
8471
8517
  editContent,
8472
8518
  onEditContentChange,
8473
- isLoading
8519
+ isLoading,
8520
+ activeIndex,
8521
+ onActiveChange: handleActiveChange
8474
8522
  }
8475
8523
  ) })
8476
8524
  ] });
@@ -8533,7 +8581,7 @@ function TokenUsageCard({
8533
8581
  );
8534
8582
  const usageLevel = useMemo(() => getUsageLevel(percentage), [percentage]);
8535
8583
  return /* @__PURE__ */ jsxs(Card2, { className, "data-testid": "token-usage-card", children: [
8536
- /* @__PURE__ */ jsxs(Header5, { children: [
8584
+ /* @__PURE__ */ jsxs(Header4, { children: [
8537
8585
  /* @__PURE__ */ jsx(Title2, { children: "Token Usage" }),
8538
8586
  /* @__PURE__ */ jsx(Period, { children: periodLabel })
8539
8587
  ] }),
@@ -8576,10 +8624,10 @@ var Card2 = styled11.div`
8576
8624
  gap: ${tokens.spacing.md};
8577
8625
  padding: ${tokens.spacing.lg};
8578
8626
  background: ${tokens.colors.background.dark};
8579
- border-radius: ${tokens.borderRadius.lg};
8627
+ border-radius: ${tokens.borderRadius.xl};
8580
8628
  border: 1px solid ${tokens.colors.border.default};
8581
8629
  `;
8582
- var Header5 = styled11.div`
8630
+ var Header4 = styled11.div`
8583
8631
  display: flex;
8584
8632
  justify-content: space-between;
8585
8633
  align-items: center;
@@ -8799,7 +8847,7 @@ var Card3 = styled11.button`
8799
8847
  gap: ${tokens.spacing.sm};
8800
8848
  padding: ${tokens.spacing.md};
8801
8849
  background: ${tokens.colors.background.dark};
8802
- border-radius: ${tokens.borderRadius.lg};
8850
+ border-radius: ${tokens.borderRadius.xl};
8803
8851
  border: 1px solid ${tokens.colors.border.default};
8804
8852
  cursor: pointer;
8805
8853
  text-align: left;
@@ -8949,7 +8997,7 @@ var ModalContent = styled11.div`
8949
8997
  width: 100%;
8950
8998
  box-shadow: ${tokens.shadows.xl};
8951
8999
  `;
8952
- var Header6 = styled11.div`
9000
+ var Header5 = styled11.div`
8953
9001
  display: flex;
8954
9002
  align-items: flex-start;
8955
9003
  gap: ${tokens.spacing.md};
@@ -9174,7 +9222,7 @@ var WorkflowErrorAlert = ({
9174
9222
  return /* @__PURE__ */ jsx(InfoIcon, {});
9175
9223
  }
9176
9224
  };
9177
- const alertContent = /* @__PURE__ */ jsx(AlertContainer, { variant, severity, className, role: "alert", children: /* @__PURE__ */ jsxs(Header6, { children: [
9225
+ const alertContent = /* @__PURE__ */ jsx(AlertContainer, { variant, severity, className, role: "alert", children: /* @__PURE__ */ jsxs(Header5, { children: [
9178
9226
  /* @__PURE__ */ jsx(IconContainer2, { severity, "aria-hidden": "true", children: getIcon() }),
9179
9227
  /* @__PURE__ */ jsxs(Content5, { children: [
9180
9228
  /* @__PURE__ */ jsx(Title3, { children: displayTitle }),
@@ -9483,7 +9531,7 @@ var Panel = styled11.div`
9483
9531
  overflow: hidden;
9484
9532
  font-family: ${tokens.typography.fontFamily.primary};
9485
9533
  `;
9486
- var Header7 = styled11.div`
9534
+ var Header6 = styled11.div`
9487
9535
  display: flex;
9488
9536
  justify-content: space-between;
9489
9537
  align-items: center;
@@ -9676,7 +9724,7 @@ var WorkflowResultPanel = ({
9676
9724
  }
9677
9725
  };
9678
9726
  return /* @__PURE__ */ jsxs(Panel, { collapsible, expanded, className, children: [
9679
- /* @__PURE__ */ jsxs(Header7, { collapsible, onClick: handleToggle, children: [
9727
+ /* @__PURE__ */ jsxs(Header6, { collapsible, onClick: handleToggle, children: [
9680
9728
  /* @__PURE__ */ jsxs(Title4, { children: [
9681
9729
  title,
9682
9730
  collapsible && /* @__PURE__ */ jsx(CollapseIcon2, { expanded, children: /* @__PURE__ */ jsx(ChevronIcon4, {}) })
@@ -9904,6 +9952,6 @@ var WorkflowStatusBadge = ({
9904
9952
  };
9905
9953
  WorkflowStatusBadge.displayName = "WorkflowStatusBadge";
9906
9954
 
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 };
9955
+ 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, 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
9956
  //# sourceMappingURL=index.js.map
9909
9957
  //# sourceMappingURL=index.js.map