@b3-crow/ui-kit 0.0.35 → 0.0.36

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.
Files changed (176) hide show
  1. package/dist/components/backgrounds/DashboardBackground.d.ts +4 -0
  2. package/dist/components/backgrounds/DashboardBackground.d.ts.map +1 -0
  3. package/dist/components/backgrounds/DashboardBackground.js +20 -0
  4. package/dist/components/backgrounds/DashboardBackground.js.map +1 -0
  5. package/dist/components/buttons/CollapseToggleButton.d.ts +7 -0
  6. package/dist/components/buttons/CollapseToggleButton.d.ts.map +1 -0
  7. package/dist/components/buttons/CollapseToggleButton.js +7 -0
  8. package/dist/components/buttons/CollapseToggleButton.js.map +1 -0
  9. package/dist/components/cards/MetricsCard.d.ts +10 -0
  10. package/dist/components/cards/MetricsCard.d.ts.map +1 -0
  11. package/dist/components/cards/MetricsCard.js +27 -0
  12. package/dist/components/cards/MetricsCard.js.map +1 -0
  13. package/dist/components/cards/PatternCard.d.ts +15 -0
  14. package/dist/components/cards/PatternCard.d.ts.map +1 -0
  15. package/dist/components/cards/PatternCard.js +45 -0
  16. package/dist/components/cards/PatternCard.js.map +1 -0
  17. package/dist/components/cards/TipCard.d.ts +5 -0
  18. package/dist/components/cards/TipCard.d.ts.map +1 -0
  19. package/dist/components/cards/TipCard.js +10 -0
  20. package/dist/components/cards/TipCard.js.map +1 -0
  21. package/dist/components/chat/ChatHistorySection.d.ts +4 -0
  22. package/dist/components/chat/ChatHistorySection.d.ts.map +1 -0
  23. package/dist/components/chat/ChatHistorySection.js +121 -0
  24. package/dist/components/chat/ChatHistorySection.js.map +1 -0
  25. package/dist/components/chat/MessageBubble.d.ts +13 -0
  26. package/dist/components/chat/MessageBubble.d.ts.map +1 -0
  27. package/dist/components/chat/MessageBubble.js +19 -0
  28. package/dist/components/chat/MessageBubble.js.map +1 -0
  29. package/dist/components/display/CodeBlock.js +3 -3
  30. package/dist/components/display/CodeBlock.js.map +1 -1
  31. package/dist/components/display/IconBadge.d.ts +12 -0
  32. package/dist/components/display/IconBadge.d.ts.map +1 -0
  33. package/dist/components/display/IconBadge.js +26 -0
  34. package/dist/components/display/IconBadge.js.map +1 -0
  35. package/dist/components/display/SourceIcon.d.ts +7 -0
  36. package/dist/components/display/SourceIcon.d.ts.map +1 -0
  37. package/dist/components/display/SourceIcon.js +23 -0
  38. package/dist/components/display/SourceIcon.js.map +1 -0
  39. package/dist/components/display/StatusBadge.d.ts +14 -0
  40. package/dist/components/display/StatusBadge.d.ts.map +1 -0
  41. package/dist/components/display/StatusBadge.js +30 -0
  42. package/dist/components/display/StatusBadge.js.map +1 -0
  43. package/dist/components/display/StatusIndicator.d.ts +7 -0
  44. package/dist/components/display/StatusIndicator.d.ts.map +1 -0
  45. package/dist/components/display/StatusIndicator.js +26 -0
  46. package/dist/components/display/StatusIndicator.js.map +1 -0
  47. package/dist/components/display/Tag.d.ts +7 -0
  48. package/dist/components/display/Tag.d.ts.map +1 -0
  49. package/dist/components/display/Tag.js +12 -0
  50. package/dist/components/display/Tag.js.map +1 -0
  51. package/dist/components/feedback/GeneratingState.d.ts +12 -0
  52. package/dist/components/feedback/GeneratingState.d.ts.map +1 -0
  53. package/dist/components/feedback/GeneratingState.js +19 -0
  54. package/dist/components/feedback/GeneratingState.js.map +1 -0
  55. package/dist/components/feedback/SettingsModal.d.ts +4 -0
  56. package/dist/components/feedback/SettingsModal.d.ts.map +1 -0
  57. package/dist/components/feedback/SettingsModal.js +56 -0
  58. package/dist/components/feedback/SettingsModal.js.map +1 -0
  59. package/dist/components/index.d.ts +32 -0
  60. package/dist/components/index.d.ts.map +1 -1
  61. package/dist/components/index.js +33 -0
  62. package/dist/components/index.js.map +1 -1
  63. package/dist/components/inputs/FilterDropdown.d.ts +14 -0
  64. package/dist/components/inputs/FilterDropdown.d.ts.map +1 -0
  65. package/dist/components/inputs/FilterDropdown.js +112 -0
  66. package/dist/components/inputs/FilterDropdown.js.map +1 -0
  67. package/dist/components/inputs/SearchInput.d.ts +14 -0
  68. package/dist/components/inputs/SearchInput.d.ts.map +1 -0
  69. package/dist/components/inputs/SearchInput.js +38 -0
  70. package/dist/components/inputs/SearchInput.js.map +1 -0
  71. package/dist/components/inputs/SettingsDropup.d.ts +10 -0
  72. package/dist/components/inputs/SettingsDropup.d.ts.map +1 -0
  73. package/dist/components/inputs/SettingsDropup.js +94 -0
  74. package/dist/components/inputs/SettingsDropup.js.map +1 -0
  75. package/dist/components/inputs/SuggestionChip.d.ts +10 -0
  76. package/dist/components/inputs/SuggestionChip.d.ts.map +1 -0
  77. package/dist/components/inputs/SuggestionChip.js +12 -0
  78. package/dist/components/inputs/SuggestionChip.js.map +1 -0
  79. package/dist/components/inputs/ToggleSwitch.d.ts +8 -0
  80. package/dist/components/inputs/ToggleSwitch.d.ts.map +1 -0
  81. package/dist/components/inputs/ToggleSwitch.js +29 -0
  82. package/dist/components/inputs/ToggleSwitch.js.map +1 -0
  83. package/dist/components/layout/GlassPanel.d.ts +4 -0
  84. package/dist/components/layout/GlassPanel.d.ts.map +1 -0
  85. package/dist/components/layout/GlassPanel.js +11 -0
  86. package/dist/components/layout/GlassPanel.js.map +1 -0
  87. package/dist/components/layout/Header.d.ts +4 -0
  88. package/dist/components/layout/Header.d.ts.map +1 -0
  89. package/dist/components/layout/Header.js +127 -0
  90. package/dist/components/layout/Header.js.map +1 -0
  91. package/dist/components/layout/ListItem.d.ts +10 -0
  92. package/dist/components/layout/ListItem.d.ts.map +1 -0
  93. package/dist/components/layout/ListItem.js +14 -0
  94. package/dist/components/layout/ListItem.js.map +1 -0
  95. package/dist/components/layout/MobileSidebar.d.ts +4 -0
  96. package/dist/components/layout/MobileSidebar.d.ts.map +1 -0
  97. package/dist/components/layout/MobileSidebar.js +45 -0
  98. package/dist/components/layout/MobileSidebar.js.map +1 -0
  99. package/dist/components/layout/NavMenu.d.ts +10 -0
  100. package/dist/components/layout/NavMenu.d.ts.map +1 -0
  101. package/dist/components/layout/NavMenu.js +68 -0
  102. package/dist/components/layout/NavMenu.js.map +1 -0
  103. package/dist/components/layout/NavTooltip.d.ts +10 -0
  104. package/dist/components/layout/NavTooltip.d.ts.map +1 -0
  105. package/dist/components/layout/NavTooltip.js +36 -0
  106. package/dist/components/layout/NavTooltip.js.map +1 -0
  107. package/dist/components/layout/SectionHeader.d.ts +13 -0
  108. package/dist/components/layout/SectionHeader.d.ts.map +1 -0
  109. package/dist/components/layout/SectionHeader.js +22 -0
  110. package/dist/components/layout/SectionHeader.js.map +1 -0
  111. package/dist/components/layout/SidePanel.d.ts +12 -0
  112. package/dist/components/layout/SidePanel.d.ts.map +1 -0
  113. package/dist/components/layout/SidePanel.js +79 -0
  114. package/dist/components/layout/SidePanel.js.map +1 -0
  115. package/dist/components/layout/Sidebar.d.ts +4 -0
  116. package/dist/components/layout/Sidebar.d.ts.map +1 -0
  117. package/dist/components/layout/Sidebar.js +15 -0
  118. package/dist/components/layout/Sidebar.js.map +1 -0
  119. package/dist/components/layout/SidebarLogo.d.ts +9 -0
  120. package/dist/components/layout/SidebarLogo.d.ts.map +1 -0
  121. package/dist/components/layout/SidebarLogo.js +10 -0
  122. package/dist/components/layout/SidebarLogo.js.map +1 -0
  123. package/dist/components/providers/LenisProvider.d.ts +22 -0
  124. package/dist/components/providers/LenisProvider.d.ts.map +1 -0
  125. package/dist/components/providers/LenisProvider.js +45 -0
  126. package/dist/components/providers/LenisProvider.js.map +1 -0
  127. package/dist/lib/constants/accessibility.d.ts +24 -0
  128. package/dist/lib/constants/accessibility.d.ts.map +1 -0
  129. package/dist/lib/constants/accessibility.js +26 -0
  130. package/dist/lib/constants/accessibility.js.map +1 -0
  131. package/dist/lib/constants/animations.d.ts +73 -0
  132. package/dist/lib/constants/animations.d.ts.map +1 -0
  133. package/dist/lib/constants/animations.js +48 -0
  134. package/dist/lib/constants/animations.js.map +1 -0
  135. package/dist/lib/constants/colors.d.ts +55 -0
  136. package/dist/lib/constants/colors.d.ts.map +1 -0
  137. package/dist/lib/constants/colors.js +55 -0
  138. package/dist/lib/constants/colors.js.map +1 -0
  139. package/dist/lib/constants/gradients.d.ts +29 -0
  140. package/dist/lib/constants/gradients.d.ts.map +1 -0
  141. package/dist/lib/constants/gradients.js +29 -0
  142. package/dist/lib/constants/gradients.js.map +1 -0
  143. package/dist/lib/constants/icons.d.ts +4 -0
  144. package/dist/lib/constants/icons.d.ts.map +1 -0
  145. package/dist/lib/constants/icons.js +23 -0
  146. package/dist/lib/constants/icons.js.map +1 -0
  147. package/dist/lib/constants/navigation.d.ts +3 -0
  148. package/dist/lib/constants/navigation.d.ts.map +1 -0
  149. package/dist/lib/constants/navigation.js +35 -0
  150. package/dist/lib/constants/navigation.js.map +1 -0
  151. package/dist/lib/constants/sizing.d.ts +61 -0
  152. package/dist/lib/constants/sizing.d.ts.map +1 -0
  153. package/dist/lib/constants/sizing.js +49 -0
  154. package/dist/lib/constants/sizing.js.map +1 -0
  155. package/dist/lib/constants/styles.d.ts +44 -0
  156. package/dist/lib/constants/styles.d.ts.map +1 -0
  157. package/dist/lib/constants/styles.js +44 -0
  158. package/dist/lib/constants/styles.js.map +1 -0
  159. package/dist/lib/constants.d.ts +32 -0
  160. package/dist/lib/constants.d.ts.map +1 -0
  161. package/dist/lib/constants.js +105 -0
  162. package/dist/lib/constants.js.map +1 -0
  163. package/dist/lib/types.d.ts +94 -0
  164. package/dist/lib/types.d.ts.map +1 -0
  165. package/dist/lib/types.js +2 -0
  166. package/dist/lib/types.js.map +1 -0
  167. package/dist/lib/utils/accessibilityUtils.d.ts +9 -0
  168. package/dist/lib/utils/accessibilityUtils.d.ts.map +1 -0
  169. package/dist/lib/utils/accessibilityUtils.js +56 -0
  170. package/dist/lib/utils/accessibilityUtils.js.map +1 -0
  171. package/dist/lib/utils/pathUtils.d.ts +4 -0
  172. package/dist/lib/utils/pathUtils.d.ts.map +1 -0
  173. package/dist/lib/utils/pathUtils.js +16 -0
  174. package/dist/lib/utils/pathUtils.js.map +1 -0
  175. package/dist/styles.css +1 -1
  176. package/package.json +23 -14
@@ -0,0 +1,4 @@
1
+ import type { DashboardBackgroundProps } from '../../lib/types';
2
+ export type { DashboardBackgroundProps };
3
+ export declare function DashboardBackground({ variant, noiseTextureSrc, sidebarWidth, }: DashboardBackgroundProps): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=DashboardBackground.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardBackground.d.ts","sourceRoot":"","sources":["../../../src/components/backgrounds/DashboardBackground.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEhE,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAwDzC,wBAAgB,mBAAmB,CAAC,EAClC,OAAmB,EACnB,eAAe,EACf,YAAkB,GACnB,EAAE,wBAAwB,2CAW1B"}
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ const gradientStyles = {
4
+ primary: 'radial-gradient(ellipse 80% 70% at 85% 50%, rgba(30, 16, 53, 0.8) 0%, rgba(10, 5, 21, 0.4) 50%, transparent 100%)',
5
+ vignette: (sidebarWidth) => `radial-gradient(ellipse 55% 90% at calc(50% + calc(${sidebarWidth}px / 2)) 50%, rgba(3, 0, 5, 0) 0%, rgba(3, 0, 5, 0.50) 100%)`,
6
+ purpleGlow: (sidebarWidth) => `radial-gradient(ellipse 60% 50% at calc(50% + calc(${sidebarWidth}px / 2)) 100%, rgba(133, 78, 210, 0.5) 0%, rgba(133, 78, 210, 0.3) 25%, rgba(133, 78, 210, 0.1) 50%, transparent 70%)`,
7
+ };
8
+ function MinimalBackground() {
9
+ return (_jsx("div", { className: "fixed inset-0 pointer-events-none z-0", children: _jsx("div", { className: "absolute inset-0 bg-[#030005]" }) }));
10
+ }
11
+ function DefaultBackground({ noiseTextureSrc, sidebarWidth, }) {
12
+ return (_jsxs("div", { className: "fixed inset-0 pointer-events-none z-0 overflow-hidden", style: { '--sidebar-width': `${sidebarWidth}px` }, children: [_jsx("div", { className: "absolute inset-0 bg-[#030005]" }), _jsx("div", { className: "absolute top-0 bottom-0 left-0 right-0 opacity-50", style: { background: gradientStyles.primary } }), noiseTextureSrc && (_jsx("img", { src: noiseTextureSrc, alt: "", role: "presentation", className: "absolute inset-0 w-full h-full opacity-[0.07] mix-blend-overlay object-cover" })), _jsx("div", { className: "absolute inset-0 opacity-40", style: { background: gradientStyles.vignette(sidebarWidth) } }), _jsx("div", { className: "absolute inset-x-0 bottom-0 h-[800px] pointer-events-none", style: { background: gradientStyles.purpleGlow(sidebarWidth) } })] }));
13
+ }
14
+ export function DashboardBackground({ variant = 'default', noiseTextureSrc, sidebarWidth = 280, }) {
15
+ if (variant === 'minimal') {
16
+ return _jsx(MinimalBackground, {});
17
+ }
18
+ return (_jsx(DefaultBackground, { noiseTextureSrc: noiseTextureSrc, sidebarWidth: sidebarWidth }));
19
+ }
20
+ //# sourceMappingURL=DashboardBackground.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardBackground.js","sourceRoot":"","sources":["../../../src/components/backgrounds/DashboardBackground.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAMb,MAAM,cAAc,GAAG;IACrB,OAAO,EACL,mHAAmH;IACrH,QAAQ,EAAE,CAAC,YAAoB,EAAE,EAAE,CACjC,sDAAsD,YAAY,8DAA8D;IAClI,UAAU,EAAE,CAAC,YAAoB,EAAE,EAAE,CACnC,sDAAsD,YAAY,uHAAuH;CAC5L,CAAC;AAEF,SAAS,iBAAiB;IACxB,OAAO,CACL,cAAK,SAAS,EAAC,uCAAuC,YACpD,cAAK,SAAS,EAAC,+BAA+B,GAAG,GAC7C,CACP,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,EACzB,eAAe,EACf,YAAY,GAIb;IACC,OAAO,CACL,eACE,SAAS,EAAC,uDAAuD,EACjE,KAAK,EAAE,EAAE,iBAAiB,EAAE,GAAG,YAAY,IAAI,EAAyB,aAExE,cAAK,SAAS,EAAC,+BAA+B,GAAG,EACjD,cACE,SAAS,EAAC,mDAAmD,EAC7D,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,GAC7C,EACD,eAAe,IAAI,CAClB,cACE,GAAG,EAAE,eAAe,EACpB,GAAG,EAAC,EAAE,EACN,IAAI,EAAC,cAAc,EACnB,SAAS,EAAC,8EAA8E,GACxF,CACH,EACD,cACE,SAAS,EAAC,6BAA6B,EACvC,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,GAC5D,EACF,cACE,SAAS,EAAC,2DAA2D,EACrE,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,GAC9D,IACE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAClC,OAAO,GAAG,SAAS,EACnB,eAAe,EACf,YAAY,GAAG,GAAG,GACO;IACzB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,KAAC,iBAAiB,KAAG,CAAC;IAC/B,CAAC;IAED,OAAO,CACL,KAAC,iBAAiB,IAChB,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,GAC1B,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface CollapseToggleButtonProps {
2
+ isCollapsed: boolean;
3
+ onToggle: () => void;
4
+ }
5
+ export declare function CollapseToggleButton({ isCollapsed, onToggle }: CollapseToggleButtonProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=CollapseToggleButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollapseToggleButton.d.ts","sourceRoot":"","sources":["../../../src/components/buttons/CollapseToggleButton.tsx"],"names":[],"mappings":"AAMA,UAAU,yBAAyB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,yBAAyB,2CAgBxF"}
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { PanelLeftClose, PanelLeftOpen } from 'lucide-react';
4
+ export function CollapseToggleButton({ isCollapsed, onToggle }) {
5
+ return (_jsx("button", { type: "button", onClick: onToggle, "aria-label": isCollapsed ? 'Expand sidebar' : 'Collapse sidebar', "aria-expanded": !isCollapsed, className: "w-6 h-6 flex items-center justify-center rounded-md border border-white/[0.08] transition-all duration-200", children: isCollapsed ? (_jsx(PanelLeftOpen, { size: 16, className: "text-gray-400", strokeWidth: 2 })) : (_jsx(PanelLeftClose, { size: 16, className: "text-gray-400", strokeWidth: 2 })) }));
6
+ }
7
+ //# sourceMappingURL=CollapseToggleButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollapseToggleButton.js","sourceRoot":"","sources":["../../../src/components/buttons/CollapseToggleButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAS7D,MAAM,UAAU,oBAAoB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAA6B;IACvF,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,gBACL,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,mBAChD,CAAC,WAAW,EAC3B,SAAS,EAAC,4GAA4G,YAErH,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,eAAe,EAAC,WAAW,EAAE,CAAC,GAAI,CACtE,CAAC,CAAC,CAAC,CACF,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,eAAe,EAAC,WAAW,EAAE,CAAC,GAAI,CACvE,GACM,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface MetricsCardProps {
2
+ title: string;
3
+ value: string;
4
+ change: string;
5
+ changeType: 'positive' | 'negative' | 'neutral' | 'info';
6
+ chartData?: readonly number[];
7
+ chartColor?: 'violet' | 'rose' | 'gray';
8
+ }
9
+ export declare function MetricsCard({ title, value, change, changeType, chartData, chartColor, }: MetricsCardProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=MetricsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsCard.d.ts","sourceRoot":"","sources":["../../../src/components/cards/MetricsCard.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACzD,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;CACzC;AAmCD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,MAAM,EACN,UAAU,EACV,SAA8B,EAC9B,UAAqB,GACtB,EAAE,gBAAgB,2CA4BlB"}
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { StatusBadge } from '../display/StatusBadge';
4
+ import { GlassPanel } from '../layout/GlassPanel';
5
+ import { CHART_COLORS } from '../../lib/constants/gradients';
6
+ const DEFAULT_CHART_DATA = [25, 50, 35, 70, 100];
7
+ function MiniChart({ chartData, maxValue, barColor }) {
8
+ return (_jsx("div", { className: "flex items-end gap-[2px]", children: chartData.map((value, index) => {
9
+ const isLast = index === chartData.length - 1;
10
+ const height = Math.max((value / maxValue) * 20, 3);
11
+ return (_jsx("div", { style: {
12
+ width: '12px',
13
+ height: `${height}px`,
14
+ borderRadius: '2px 2px 0 0',
15
+ background: isLast ? barColor.bg : '#374151',
16
+ boxShadow: isLast ? barColor.shadow : 'none',
17
+ opacity: isLast ? 1 : 0.5,
18
+ } }, `bar-${index}-${value}`));
19
+ }) }));
20
+ }
21
+ export function MetricsCard({ title, value, change, changeType, chartData = DEFAULT_CHART_DATA, chartColor = 'violet', }) {
22
+ const safeChartData = chartData.length > 0 ? chartData : DEFAULT_CHART_DATA;
23
+ const maxValue = Math.max(...safeChartData);
24
+ const barColor = CHART_COLORS[chartColor];
25
+ return (_jsx(GlassPanel, { variant: "light", className: "relative overflow-hidden", children: _jsxs("div", { className: "p-4 sm:p-5 min-h-[100px] sm:min-h-[109px] flex flex-col", children: [_jsxs("div", { className: "flex items-start justify-between gap-2 mb-auto", children: [_jsx("span", { className: "text-[10px] sm:text-xs font-semibold uppercase tracking-wider text-gray-400", children: title }), _jsx(StatusBadge, { variant: changeType, children: change })] }), _jsxs("div", { className: "flex items-end justify-between mt-4", children: [_jsx("span", { className: "text-xl sm:text-2xl font-bold text-white", children: value }), _jsx(MiniChart, { chartData: safeChartData, maxValue: maxValue, barColor: barColor })] })] }) }));
26
+ }
27
+ //# sourceMappingURL=MetricsCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsCard.js","sourceRoot":"","sources":["../../../src/components/cards/MetricsCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAW7D,MAAM,kBAAkB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAU,CAAC;AAQ1D,SAAS,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAkB;IAClE,OAAO,CACL,cAAK,SAAS,EAAC,0BAA0B,YACtC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAEpD,OAAO,CACL,cAEE,KAAK,EAAE;oBACL,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,GAAG,MAAM,IAAI;oBACrB,YAAY,EAAE,aAAa;oBAC3B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;oBAC5C,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBAC5C,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;iBAC1B,IARI,OAAO,KAAK,IAAI,KAAK,EAAE,CAS5B,CACH,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,MAAM,EACN,UAAU,EACV,SAAS,GAAG,kBAAkB,EAC9B,UAAU,GAAG,QAAQ,GACJ;IACjB,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAE1C,OAAO,CACL,KAAC,UAAU,IAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,0BAA0B,YAC9D,eAAK,SAAS,EAAC,yDAAyD,aACtE,eAAK,SAAS,EAAC,gDAAgD,aAC7D,eAAM,SAAS,EAAC,6EAA6E,YAC1F,KAAK,GACD,EACP,KAAC,WAAW,IAAC,OAAO,EAAE,UAAU,YAAG,MAAM,GAAe,IACpD,EAEN,eAAK,SAAS,EAAC,qCAAqC,aAClD,eAAM,SAAS,EAAC,0CAA0C,YACvD,KAAK,GACD,EACP,KAAC,SAAS,IACR,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,GAClB,IACE,IACF,GACK,CACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ConfidenceLevel, SeverityLevel } from '../../lib/types';
2
+ export interface PatternCardProps {
3
+ id?: string;
4
+ title: string;
5
+ severity: SeverityLevel;
6
+ affectedStores: string;
7
+ lastSeen: string;
8
+ confidence: ConfidenceLevel;
9
+ onViewDetails?: () => void;
10
+ onViewEvidence?: () => void;
11
+ onCreateAlert?: () => void;
12
+ className?: string;
13
+ }
14
+ export declare function PatternCard({ title, severity, affectedStores, lastSeen, confidence, onViewDetails, onViewEvidence, onCreateAlert, className, }: PatternCardProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=PatternCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PatternCard.d.ts","sourceRoot":"","sources":["../../../src/components/cards/PatternCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKtE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,eAAe,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8DD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,UAAU,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,SAAS,GACV,EAAE,gBAAgB,2CA4ElB"}
@@ -0,0 +1,45 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Bell, Clock, MapPin } from 'lucide-react';
4
+ import { cn } from '../../lib/utils';
5
+ import { CONFIDENCE_CONFIG, SEVERITY_CONFIG } from '../../lib/constants';
6
+ function DetailItem({ icon: Icon, label, value }) {
7
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { size: 16, color: "#6B7280" }), _jsxs("span", { className: "text-sm leading-5", style: { color: '#9CA3AF' }, children: [label, ": ", value] })] }));
8
+ }
9
+ function ActionButton({ onClick, isSecondary = false, showIcon = false, children, }) {
10
+ return (_jsx("button", { type: "button", onClick: onClick, className: cn('flex items-center justify-center rounded-lg text-xs font-medium transition-colors', isSecondary ? 'h-[30px] px-3.5 hover:bg-white/5' : 'h-[30px] px-3.5', !isSecondary && showIcon && 'gap-1.5 h-7 px-3'), style: !isSecondary
11
+ ? {
12
+ background: '#7C3AED',
13
+ boxShadow: '0px 0px 10px rgba(124, 58, 237, 0.30)',
14
+ outline: '1px #8B5CF6 solid',
15
+ outlineOffset: '-1px',
16
+ color: 'white',
17
+ }
18
+ : {
19
+ color: '#D1D5DB',
20
+ outline: '1px rgba(255, 255, 255, 0.10) solid',
21
+ outlineOffset: '-1px',
22
+ }, children: children }));
23
+ }
24
+ export function PatternCard({ title, severity, affectedStores, lastSeen, confidence, onViewDetails, onViewEvidence, onCreateAlert, className, }) {
25
+ const severityStyle = SEVERITY_CONFIG[severity];
26
+ const confidenceStyle = CONFIDENCE_CONFIG[confidence];
27
+ return (_jsx("div", { className: cn('relative overflow-hidden rounded-xl', className), style: {
28
+ background: 'rgba(10, 5, 20, 0.40)',
29
+ boxShadow: '0px 4px 6px -4px rgba(0, 0, 0, 0.10)',
30
+ outline: '1px rgba(255, 255, 255, 0.08) solid',
31
+ outlineOffset: '-1px',
32
+ backdropFilter: 'blur(8px)',
33
+ }, children: _jsxs("div", { className: "p-6", children: [_jsxs("div", { className: "flex items-start justify-between gap-4 mb-4", children: [_jsx("h3", { className: "text-base font-semibold leading-6 flex-1 text-white", children: title }), _jsx("span", { className: "shrink-0 px-2.5 py-1 rounded-lg text-[10px] font-bold uppercase tracking-wide", style: {
34
+ color: severityStyle.color,
35
+ background: severityStyle.bg,
36
+ outline: `1px ${severityStyle.border} solid`,
37
+ outlineOffset: '-1px',
38
+ }, children: severityStyle.label })] }), _jsxs("div", { className: "space-y-2 mb-4", children: [_jsx(DetailItem, { icon: MapPin, label: "Affected stores", value: affectedStores }), _jsx(DetailItem, { icon: Clock, label: "Last seen", value: lastSeen })] }), _jsxs("div", { className: "flex items-center gap-2 mb-6", children: [_jsx("span", { className: "text-xs font-medium", style: { color: '#6B7280' }, children: "Confidence:" }), _jsx("span", { className: "px-2.5 py-1 rounded-full text-[10px] font-medium", style: {
39
+ color: confidenceStyle.color,
40
+ background: confidenceStyle.bg,
41
+ outline: `1px ${confidenceStyle.border} solid`,
42
+ outlineOffset: '-1px',
43
+ }, children: confidenceStyle.label })] }), _jsxs("div", { className: "pt-4 flex items-center gap-3", style: { borderTop: '1px solid rgba(255, 255, 255, 0.05)' }, children: [_jsx(ActionButton, { onClick: onViewDetails, children: "View details" }), _jsx(ActionButton, { onClick: onViewEvidence, isSecondary: true, children: "View evidence" }), _jsx("div", { className: "flex-1" }), _jsxs(ActionButton, { onClick: onCreateAlert, isSecondary: true, showIcon: true, children: [_jsx(Bell, { size: 14, color: "#9CA3AF" }), "Create alert"] })] })] }) }));
44
+ }
45
+ //# sourceMappingURL=PatternCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PatternCard.js","sourceRoot":"","sources":["../../../src/components/cards/PatternCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface TipCardProps {
2
+ children: React.ReactNode;
3
+ }
4
+ export declare function TipCard({ children }: TipCardProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=TipCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TipCard.d.ts","sourceRoot":"","sources":["../../../src/components/cards/TipCard.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,YAAY,2CAajD"}
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Lightbulb } from 'lucide-react';
4
+ export function TipCard({ children }) {
5
+ return (_jsxs("div", { className: "inline-flex items-start gap-3 px-4 py-3 rounded-xl", style: {
6
+ background: 'rgba(255, 255, 255, 0.02)',
7
+ border: '1px solid rgba(255, 255, 255, 0.06)',
8
+ }, children: [_jsx(Lightbulb, { size: 16, className: "text-gray-500 flex-shrink-0 mt-0.5" }), _jsx("p", { className: "text-xs text-gray-400 leading-relaxed", children: children })] }));
9
+ }
10
+ //# sourceMappingURL=TipCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TipCard.js","sourceRoot":"","sources":["../../../src/components/cards/TipCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAgB;IAChD,OAAO,CACL,eACE,SAAS,EAAC,oDAAoD,EAC9D,KAAK,EAAE;YACL,UAAU,EAAE,2BAA2B;YACvC,MAAM,EAAE,qCAAqC;SAC9C,aAED,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,oCAAoC,GAAG,EACtE,YAAG,SAAS,EAAC,uCAAuC,YAAE,QAAQ,GAAK,IAC/D,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ChatHistoryItem, ChatHistorySectionProps } from '../../lib/types';
2
+ export type { ChatHistoryItem, ChatHistorySectionProps };
3
+ export declare function ChatHistorySection({ items, activeItemId, isExpanded, isVisible, onItemClick, onToggleExpanded, onRename, onDelete, title, emptyMessage, }: ChatHistorySectionProps): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=ChatHistorySection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHistorySection.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatHistorySection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAKhF,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC;AAsCzD,wBAAgB,kBAAkB,CAAC,EACjC,KAAU,EACV,YAAY,EACZ,UAAiB,EACjB,SAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,KAAsB,EACtB,YAAoD,GACrD,EAAE,uBAAuB,2CAkNzB"}
@@ -0,0 +1,121 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ChevronDown, MoreHorizontal, Pencil, Trash2 } from 'lucide-react';
4
+ import { useEffect, useRef, useState } from 'react';
5
+ import { cn } from '../../lib/utils';
6
+ const useNewItemAnimation = (items) => {
7
+ const [newItemId, setNewItemId] = useState(null);
8
+ const [canAnimate, setCanAnimate] = useState(false);
9
+ const seenItemsRef = useRef(new Set());
10
+ useEffect(() => {
11
+ items.forEach(item => seenItemsRef.current.add(item.id));
12
+ const timer = setTimeout(() => setCanAnimate(true), 600);
13
+ return () => clearTimeout(timer);
14
+ }, []);
15
+ useEffect(() => {
16
+ if (!canAnimate) {
17
+ items.forEach(item => seenItemsRef.current.add(item.id));
18
+ return;
19
+ }
20
+ const seenItems = seenItemsRef.current;
21
+ const firstItem = items[0];
22
+ if (firstItem && !seenItems.has(firstItem.id)) {
23
+ seenItems.add(firstItem.id);
24
+ const timer = setTimeout(() => setNewItemId(firstItem.id), 0);
25
+ const resetTimer = setTimeout(() => setNewItemId(null), 350);
26
+ return () => {
27
+ clearTimeout(timer);
28
+ clearTimeout(resetTimer);
29
+ };
30
+ }
31
+ items.forEach(item => seenItems.add(item.id));
32
+ }, [items, canAnimate]);
33
+ return newItemId;
34
+ };
35
+ export function ChatHistorySection({ items = [], activeItemId, isExpanded = true, isVisible = true, onItemClick, onToggleExpanded, onRename, onDelete, title = 'Chat History', emptyMessage = 'No chats yet. Start a conversation!', }) {
36
+ const newItemId = useNewItemAnimation(items);
37
+ const [openMenuId, setOpenMenuId] = useState(null);
38
+ const [editingId, setEditingId] = useState(null);
39
+ const [editValue, setEditValue] = useState('');
40
+ const menuRef = useRef(null);
41
+ const inputRef = useRef(null);
42
+ useEffect(() => {
43
+ if (!openMenuId)
44
+ return;
45
+ const handleClickOutside = (e) => {
46
+ if (menuRef.current && !menuRef.current.contains(e.target)) {
47
+ setOpenMenuId(null);
48
+ }
49
+ };
50
+ document.addEventListener('mousedown', handleClickOutside);
51
+ return () => document.removeEventListener('mousedown', handleClickOutside);
52
+ }, [openMenuId]);
53
+ useEffect(() => {
54
+ if (editingId && inputRef.current) {
55
+ inputRef.current.focus();
56
+ inputRef.current.select();
57
+ }
58
+ }, [editingId]);
59
+ const closeMenu = () => setOpenMenuId(null);
60
+ const toggleMenu = (itemId) => {
61
+ setOpenMenuId(openMenuId === itemId ? null : itemId);
62
+ };
63
+ const handleMenuClick = (e, itemId) => {
64
+ e.stopPropagation();
65
+ toggleMenu(itemId);
66
+ };
67
+ const handleMenuKeyDown = (e, itemId) => {
68
+ if (e.key === 'Enter' || e.key === ' ') {
69
+ e.preventDefault();
70
+ e.stopPropagation();
71
+ toggleMenu(itemId);
72
+ }
73
+ };
74
+ const startRename = (item) => {
75
+ setEditingId(item.id);
76
+ setEditValue(item.title);
77
+ closeMenu();
78
+ };
79
+ const submitRename = () => {
80
+ if (editingId && editValue.trim()) {
81
+ onRename?.(editingId, editValue.trim());
82
+ }
83
+ setEditingId(null);
84
+ setEditValue('');
85
+ };
86
+ const handleRenameKeyDown = (e) => {
87
+ if (e.key === 'Enter') {
88
+ submitRename();
89
+ }
90
+ else if (e.key === 'Escape') {
91
+ setEditingId(null);
92
+ setEditValue('');
93
+ }
94
+ };
95
+ const deleteItem = (id) => {
96
+ closeMenu();
97
+ onDelete?.(id);
98
+ };
99
+ return (_jsxs("div", { className: cn('px-4 mt-4 transition-all duration-300 ease-in-out overflow-hidden', isVisible
100
+ ? 'opacity-100 animate-fadeInDown max-h-[500px]'
101
+ : 'opacity-0 max-h-0 pointer-events-none'), children: [_jsxs("button", { type: "button", onClick: onToggleExpanded, className: "flex items-center justify-between w-full group", "aria-label": `${title} section`, "aria-expanded": isExpanded, children: [_jsx("span", { className: "text-[13px] font-normal text-gray-400 leading-[21px]", children: title }), _jsx(ChevronDown, { size: 16, className: cn('text-gray-600 transition-transform duration-200', !isExpanded && '-rotate-90') })] }), _jsx("div", { className: "overflow-hidden transition-all duration-300 ease-in-out", style: {
102
+ maxHeight: isExpanded
103
+ ? `${Math.max(items.length * 42 + 16, 60)}px`
104
+ : '0px',
105
+ opacity: isExpanded ? 1 : 0,
106
+ }, children: _jsx("div", { className: "mt-2 flex flex-col gap-1", children: items.length === 0 ? (_jsx("p", { className: "text-xs italic py-2 text-gray-500", children: emptyMessage })) : (items.map(item => {
107
+ const isActive = item.id === activeItemId;
108
+ const isNew = item.id === newItemId;
109
+ const isEditing = editingId === item.id;
110
+ const isMenuOpen = openMenuId === item.id;
111
+ return (_jsxs("div", { className: "relative", ref: isMenuOpen ? menuRef : undefined, children: [_jsxs("div", { role: "button", tabIndex: isEditing ? -1 : 0, onClick: () => !isEditing && onItemClick?.(item.id), onKeyDown: e => {
112
+ if (!isEditing && (e.key === 'Enter' || e.key === ' ')) {
113
+ e.preventDefault();
114
+ onItemClick?.(item.id);
115
+ }
116
+ }, className: cn('group relative flex items-center justify-between w-full rounded-lg transition-all duration-200', 'h-[37px] hover:bg-white/5 cursor-pointer', isActive &&
117
+ 'bg-white/[0.08] shadow-[inset_0px_1px_0px_1px_rgba(255,255,255,0.05)] outline outline-1 outline-white/[0.05] -outline-offset-1', isNew &&
118
+ 'animate-[chatHistorySlideIn_0.3s_ease-out_forwards]'), children: [isEditing ? (_jsx("input", { ref: inputRef, type: "text", value: editValue, onChange: e => setEditValue(e.target.value), onBlur: submitRename, onKeyDown: handleRenameKeyDown, className: "text-[13px] font-bold bg-transparent border-none outline-none pl-3 pr-8 w-full text-gray-200 leading-[21px]", onClick: e => e.stopPropagation() })) : (_jsx("span", { className: "text-[13px] font-bold truncate pl-3 pr-8 text-left text-gray-200 leading-[21px] max-w-[198px]", children: item.title })), isActive && !isEditing && (_jsx("button", { type: "button", className: "absolute right-2 flex items-center justify-center w-[19px] h-[19px] cursor-pointer hover:bg-white/10 rounded", onClick: e => handleMenuClick(e, item.id), onKeyDown: e => handleMenuKeyDown(e, item.id), "aria-label": "Chat options", "aria-haspopup": "menu", "aria-expanded": isMenuOpen, children: _jsx(MoreHorizontal, { size: 14, className: "text-white" }) }))] }), isMenuOpen && (_jsxs("div", { role: "menu", className: "absolute right-0 top-full mt-1 z-50 min-w-[140px] rounded-lg overflow-hidden bg-[rgba(30,30,30,0.95)] border border-white/10 shadow-[0_4px_12px_rgba(0,0,0,0.5)]", children: [_jsxs("button", { type: "button", role: "menuitem", onClick: () => startRename(item), className: "flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-white/10 transition-colors", children: [_jsx(Pencil, { size: 14, className: "text-gray-400" }), _jsx("span", { className: "text-[13px] text-gray-200", children: "Rename" })] }), _jsxs("button", { type: "button", role: "menuitem", onClick: () => deleteItem(item.id), className: "flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-red-500/20 transition-colors", children: [_jsx(Trash2, { size: 14, className: "text-red-400" }), _jsx("span", { className: "text-[13px] text-red-400", children: "Delete" })] })] }))] }, item.id));
119
+ })) }) })] }));
120
+ }
121
+ //# sourceMappingURL=ChatHistorySection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHistorySection.js","sourceRoot":"","sources":["../../../src/components/chat/ChatHistorySection.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface MessageBubbleProps {
2
+ content: string;
3
+ role: 'user' | 'assistant';
4
+ isCopied?: boolean;
5
+ onCopy?: (content: string) => void;
6
+ headerComponent?: React.ReactNode;
7
+ avatarSrc?: string;
8
+ avatarAlt?: string;
9
+ assistantLabel?: string;
10
+ className?: string;
11
+ }
12
+ export declare function MessageBubble({ content, role, isCopied, onCopy, headerComponent, avatarSrc, avatarAlt, assistantLabel, className, }: MessageBubbleProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=MessageBubble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../../src/components/chat/MessageBubble.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4DD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,IAAI,EACJ,QAAgB,EAChB,MAAM,EACN,eAAe,EACf,SAAS,EACT,SAAS,EACT,cAAc,EACd,SAAS,GACV,EAAE,kBAAkB,2CAgCpB"}
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Check, Copy } from 'lucide-react';
4
+ import Image from 'next/image';
5
+ function CopyButton({ isCopied, onClick, }) {
6
+ return (_jsx("button", { type: "button", onClick: onClick, className: "absolute -bottom-3 right-2 opacity-0 group-hover:opacity-100 transition-opacity p-1.5 rounded-lg hover:bg-black/70 border border-white/10", style: { background: 'rgba(0, 0, 0, 0.5)' }, "aria-label": "Copy message", children: isCopied ? (_jsx(Check, { size: 12, className: "text-green-400" })) : (_jsx(Copy, { size: 12, className: "text-gray-400" })) }));
7
+ }
8
+ function AssistantHeader({ avatarSrc, avatarAlt, label, }) {
9
+ return (_jsxs("div", { className: "flex items-center gap-2 mb-3", children: [avatarSrc && (_jsx("div", { className: "w-6 h-6 rounded-full flex items-center justify-center ring-1 ring-purple-500/30", style: { background: 'rgba(0, 0, 0, 0.6)' }, children: _jsx(Image, { src: avatarSrc, alt: avatarAlt || 'Assistant', width: 16, height: 16, className: "rounded-full" }) })), label && (_jsx("span", { className: "text-[11px] font-semibold text-purple-400 uppercase tracking-wider", children: label }))] }));
10
+ }
11
+ export function MessageBubble({ content, role, isCopied = false, onCopy, headerComponent, avatarSrc, avatarAlt, assistantLabel, className, }) {
12
+ const isUserMessage = role === 'user';
13
+ const bubbleStyles = isUserMessage
14
+ ? 'bg-gradient-to-br from-purple-600/30 to-purple-800/30 border border-purple-500/20'
15
+ : 'bg-white/[0.05] border border-white/10';
16
+ return (_jsx("div", { className: `flex ${isUserMessage ? 'justify-end' : 'justify-start'} animate-fadeIn ${className || ''}`, children: _jsxs("div", { className: `group relative max-w-[85%] rounded-2xl px-4 py-3 ${bubbleStyles}`, children: [!isUserMessage &&
17
+ (headerComponent || (_jsx(AssistantHeader, { avatarSrc: avatarSrc, avatarAlt: avatarAlt, label: assistantLabel }))), _jsx("p", { className: "text-[14px] text-gray-200 leading-[1.8] whitespace-pre-wrap", children: content }), onCopy && (_jsx(CopyButton, { isCopied: isCopied, onClick: () => onCopy(content) }))] }) }));
18
+ }
19
+ //# sourceMappingURL=MessageBubble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.js","sourceRoot":"","sources":["../../../src/components/chat/MessageBubble.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,MAAM,YAAY,CAAC;AAc/B,SAAS,UAAU,CAAC,EAClB,QAAQ,EACR,OAAO,GAIR;IACC,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,2IAA2I,EACrJ,KAAK,EAAE,EAAE,UAAU,EAAE,oBAAoB,EAAE,gBAChC,cAAc,YAExB,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,gBAAgB,GAAG,CAC/C,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,eAAe,GAAG,CAC7C,GACM,CACV,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EACvB,SAAS,EACT,SAAS,EACT,KAAK,GAKN;IACC,OAAO,CACL,eAAK,SAAS,EAAC,8BAA8B,aAC1C,SAAS,IAAI,CACZ,cACE,SAAS,EAAC,iFAAiF,EAC3F,KAAK,EAAE,EAAE,UAAU,EAAE,oBAAoB,EAAE,YAE3C,KAAC,KAAK,IACJ,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,SAAS,IAAI,WAAW,EAC7B,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,SAAS,EAAC,cAAc,GACxB,GACE,CACP,EACA,KAAK,IAAI,CACR,eAAM,SAAS,EAAC,oEAAoE,YACjF,KAAK,GACD,CACR,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,IAAI,EACJ,QAAQ,GAAG,KAAK,EAChB,MAAM,EACN,eAAe,EACf,SAAS,EACT,SAAS,EACT,cAAc,EACd,SAAS,GACU;IACnB,MAAM,aAAa,GAAG,IAAI,KAAK,MAAM,CAAC;IACtC,MAAM,YAAY,GAAG,aAAa;QAChC,CAAC,CAAC,mFAAmF;QACrF,CAAC,CAAC,wCAAwC,CAAC;IAE7C,OAAO,CACL,cACE,SAAS,EAAE,QAAQ,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,mBAAmB,SAAS,IAAI,EAAE,EAAE,YAEtG,eACE,SAAS,EAAE,oDAAoD,YAAY,EAAE,aAE5E,CAAC,aAAa;oBACb,CAAC,eAAe,IAAI,CAClB,KAAC,eAAe,IACd,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,cAAc,GACrB,CACH,CAAC,EAEJ,YAAG,SAAS,EAAC,6DAA6D,YACvE,OAAO,GACN,EAEH,MAAM,IAAI,CACT,KAAC,UAAU,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,CACnE,IACG,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useEffect } from 'react';
3
- import { LuCopy, LuCheck } from 'react-icons/lu';
4
- import { motion, AnimatePresence } from 'framer-motion';
2
+ import { AnimatePresence, motion } from 'framer-motion';
3
+ import { useEffect, useState } from 'react';
4
+ import { LuCheck, LuCopy } from 'react-icons/lu';
5
5
  import { codeToHtml } from 'shiki';
6
6
  export function CodeBlock({ code, language = 'typescript', showCopy = true, className = '', onCopy, }) {
7
7
  const [isCopied, setIsCopied] = useState(false);
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlock.js","sourceRoot":"","sources":["../../../src/components/display/CodeBlock.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAUnC,MAAM,UAAU,SAAS,CAAC,EACxB,IAAI,EACJ,QAAQ,GAAG,YAAY,EACvB,QAAQ,GAAG,IAAI,EACf,SAAS,GAAG,EAAE,EACd,MAAM,GACS;IACf,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAEnE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;YAC/B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE;gBAClC,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,qBAAqB;aAC7B,CAAC,CAAC;YACH,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF,aAAa,EAAE,CAAC;IAClB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErB,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YACf,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,kBAAkB,SAAS,EAAE,aAC1C,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,6BAA6B,YAC1C,iBACE,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,mFAAmF,gBAClF,WAAW,YAEtB,KAAC,eAAe,IAAC,IAAI,EAAC,MAAM,YACzB,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,MAAM,CAAC,GAAG,IAET,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,YAElB,KAAC,OAAO,IAAC,SAAS,EAAC,4BAA4B,GAAG,IAL9C,OAAO,CAMA,CACd,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,CAAC,GAAG,IAET,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,YAElB,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,GAAG,IAL9B,MAAM,CAMC,CACd,GACe,GACX,GACL,CACP,EACD,cAAK,SAAS,EAAC,oNAAoN,YAChO,eAAe,CAAC,CAAC,CAAC,CACjB,cAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,GAAI,CAC9D,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,oEAAoE,YACjF,yBAAO,IAAI,GAAQ,GACf,CACP,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"CodeBlock.js","sourceRoot":"","sources":["../../../src/components/display/CodeBlock.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAUnC,MAAM,UAAU,SAAS,CAAC,EACxB,IAAI,EACJ,QAAQ,GAAG,YAAY,EACvB,QAAQ,GAAG,IAAI,EACf,SAAS,GAAG,EAAE,EACd,MAAM,GACS;IACf,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAEnE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;YAC/B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE;gBAClC,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,qBAAqB;aAC7B,CAAC,CAAC;YACH,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF,aAAa,EAAE,CAAC;IAClB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErB,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YACf,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,kBAAkB,SAAS,EAAE,aAC1C,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,6BAA6B,YAC1C,iBACE,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,mFAAmF,gBAClF,WAAW,YAEtB,KAAC,eAAe,IAAC,IAAI,EAAC,MAAM,YACzB,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,MAAM,CAAC,GAAG,IAET,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,YAElB,KAAC,OAAO,IAAC,SAAS,EAAC,4BAA4B,GAAG,IAL9C,OAAO,CAMA,CACd,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,CAAC,GAAG,IAET,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,YAElB,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,GAAG,IAL9B,MAAM,CAMC,CACd,GACe,GACX,GACL,CACP,EACD,cAAK,SAAS,EAAC,oNAAoN,YAChO,eAAe,CAAC,CAAC,CAAC,CACjB,cAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,GAAI,CAC9D,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,oEAAoE,YACjF,yBAAO,IAAI,GAAQ,GACf,CACP,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { VariantProps } from 'class-variance-authority';
2
+ declare const iconBadgeVariants: (props?: ({
3
+ variant?: "blue" | "gray" | "violet" | "rose" | "emerald" | null | undefined;
4
+ } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
5
+ export interface IconBadgeProps extends VariantProps<typeof iconBadgeVariants> {
6
+ icon: string;
7
+ className?: string;
8
+ iconClassName?: string;
9
+ }
10
+ export declare function IconBadge({ icon, variant, className, iconClassName, }: IconBadgeProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=IconBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconBadge.d.ts","sourceRoot":"","sources":["../../../src/components/display/IconBadge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK7D,QAAA,MAAM,iBAAiB;;mFAiBtB,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,YAAY,CAAC,OAAO,iBAAiB,CAAC;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,OAAgB,EAChB,SAAc,EACd,aAAkB,GACnB,EAAE,cAAc,2CAmBhB"}
@@ -0,0 +1,26 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from '../../lib/utils';
5
+ import { ICON_REGISTRY } from '../../lib/constants/icons';
6
+ const iconBadgeVariants = cva('w-8 h-8 rounded-lg flex items-center justify-center border', {
7
+ variants: {
8
+ variant: {
9
+ gray: 'bg-gray-800/50 border-white/5',
10
+ violet: 'bg-violet-600 border-violet-500/50 shadow-[0_0_15px_rgba(124,58,237,0.5)]',
11
+ blue: 'bg-blue-600/20 border-blue-500/20',
12
+ emerald: 'bg-emerald-600/20 border-emerald-500/20',
13
+ rose: 'bg-rose-600/20 border-rose-500/20',
14
+ },
15
+ },
16
+ defaultVariants: {
17
+ variant: 'gray',
18
+ },
19
+ });
20
+ const getIconColor = (variant) => variant === 'gray' ? 'text-gray-400' : 'text-white';
21
+ export function IconBadge({ icon, variant = 'gray', className = '', iconClassName = '', }) {
22
+ const IconComponent = ICON_REGISTRY[icon];
23
+ const iconColor = getIconColor(variant);
24
+ return (_jsx("div", { className: cn(iconBadgeVariants({ variant }), className), children: IconComponent ? (_jsx(IconComponent, { size: 18, className: cn(iconColor, iconClassName), strokeWidth: 2 })) : (_jsx("span", { className: cn('text-[18px]', iconColor, iconClassName), children: icon })) }));
25
+ }
26
+ //# sourceMappingURL=IconBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconBadge.js","sourceRoot":"","sources":["../../../src/components/display/IconBadge.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,iBAAiB,GAAG,GAAG,CAC3B,4DAA4D,EAC5D;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,IAAI,EAAE,+BAA+B;YACrC,MAAM,EACJ,2EAA2E;YAC7E,IAAI,EAAE,mCAAmC;YACzC,OAAO,EAAE,yCAAyC;YAClD,IAAI,EAAE,mCAAmC;SAC1C;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,MAAM;KAChB;CACF,CACF,CAAC;AAQF,MAAM,YAAY,GAAG,CAAC,OAAsB,EAAE,EAAE,CAC9C,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC;AAEtD,MAAM,UAAU,SAAS,CAAC,EACxB,IAAI,EACJ,OAAO,GAAG,MAAM,EAChB,SAAS,GAAG,EAAE,EACd,aAAa,GAAG,EAAE,GACH;IACf,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,YAC1D,aAAa,CAAC,CAAC,CAAC,CACf,KAAC,aAAa,IACZ,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EACvC,WAAW,EAAE,CAAC,GACd,CACH,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,YACzD,IAAI,GACA,CACR,GACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type SourceType = 'web' | 'cctv' | 'social';
2
+ export interface SourceIconProps {
3
+ source: SourceType;
4
+ size?: 'sm' | 'md';
5
+ }
6
+ export declare function SourceIcon({ source, size }: SourceIconProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=SourceIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourceIcon.d.ts","sourceRoot":"","sources":["../../../src/components/display/SourceIcon.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AAoBD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAW,EAAE,EAAE,eAAe,2CAalE"}
@@ -0,0 +1,23 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Globe, MessageCircle, Video } from 'lucide-react';
4
+ const sourceConfig = {
5
+ web: { icon: Globe, color: '#60A5FA', bg: 'rgba(96, 165, 250, 0.15)' },
6
+ cctv: { icon: Video, color: '#F87171', bg: 'rgba(248, 113, 113, 0.15)' },
7
+ social: {
8
+ icon: MessageCircle,
9
+ color: '#A78BFA',
10
+ bg: 'rgba(167, 139, 250, 0.15)',
11
+ },
12
+ };
13
+ const sizeConfig = {
14
+ sm: { containerClass: 'w-8 h-8', iconSize: 16 },
15
+ md: { containerClass: 'w-10 h-10', iconSize: 20 },
16
+ };
17
+ export function SourceIcon({ source, size = 'sm' }) {
18
+ const sourceStyle = sourceConfig[source];
19
+ const IconComponent = sourceStyle.icon;
20
+ const { containerClass, iconSize } = sizeConfig[size];
21
+ return (_jsx("div", { className: `${containerClass} rounded-lg flex items-center justify-center`, style: { background: sourceStyle.bg }, children: _jsx(IconComponent, { size: iconSize, color: sourceStyle.color }) }));
22
+ }
23
+ //# sourceMappingURL=SourceIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourceIcon.js","sourceRoot":"","sources":["../../../src/components/display/SourceIcon.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAS3D,MAAM,YAAY,GAGd;IACF,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,0BAA0B,EAAE;IACtE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,2BAA2B,EAAE;IACxE,MAAM,EAAE;QACN,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,SAAS;QAChB,EAAE,EAAE,2BAA2B;KAChC;CACF,CAAC;AAEF,MAAM,UAAU,GAAG;IACjB,EAAE,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC/C,EAAE,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;CACzC,CAAC;AAEX,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,EAAmB;IACjE,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC;IACvC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAEtD,OAAO,CACL,cACE,SAAS,EAAE,GAAG,cAAc,8CAA8C,EAC1E,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,YAErC,KAAC,aAAa,IAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,GAAI,GACvD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { VariantProps } from 'class-variance-authority';
2
+ declare const badgeVariants: (props?: ({
3
+ variant?: "high" | "medium" | "low" | "positive" | "negative" | "neutral" | "warning" | "info" | null | undefined;
4
+ size?: "default" | "sm" | null | undefined;
5
+ } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
6
+ export interface StatusBadgeProps extends VariantProps<typeof badgeVariants> {
7
+ children: React.ReactNode;
8
+ className?: string;
9
+ uppercase?: boolean;
10
+ tracking?: boolean;
11
+ }
12
+ export declare function StatusBadge({ children, variant, size, className, uppercase, tracking, }: StatusBadgeProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=StatusBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/display/StatusBadge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D,QAAA,MAAM,aAAa;;;mFAsBjB,CAAC;AAEH,MAAM,WAAW,gBAAiB,SAAQ,YAAY,CAAC,OAAO,aAAa,CAAC;IAC1E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,OAAmB,EACnB,IAAgB,EAChB,SAAc,EACd,SAAiB,EACjB,QAAgB,GACjB,EAAE,gBAAgB,2CAalB"}
@@ -0,0 +1,30 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from '../../lib/utils';
5
+ const badgeVariants = cva('inline-flex items-center rounded font-medium', {
6
+ variants: {
7
+ variant: {
8
+ positive: 'bg-emerald-500/10 text-emerald-400 border border-emerald-500/20',
9
+ negative: 'bg-rose-500/10 text-rose-400 border border-rose-500/20',
10
+ warning: 'bg-yellow-500/10 text-yellow-400 border border-yellow-500/20',
11
+ neutral: 'bg-gray-500/10 text-gray-400 border border-gray-500/20',
12
+ info: 'bg-violet-500/10 text-violet-300 border border-violet-500/20',
13
+ high: 'bg-violet-500/20 text-violet-300 border border-violet-500/20',
14
+ medium: 'bg-violet-500/10 text-violet-400 border border-violet-500/10',
15
+ low: 'bg-gray-500/10 text-gray-400 border border-gray-500/10',
16
+ },
17
+ size: {
18
+ default: 'px-2 py-0.5 text-[10px]',
19
+ sm: 'px-1.5 py-0.5 text-[9px]',
20
+ },
21
+ },
22
+ defaultVariants: {
23
+ variant: 'neutral',
24
+ size: 'default',
25
+ },
26
+ });
27
+ export function StatusBadge({ children, variant = 'neutral', size = 'default', className = '', uppercase = false, tracking = false, }) {
28
+ return (_jsx("span", { className: cn(badgeVariants({ variant, size }), uppercase && 'uppercase', tracking && 'tracking-wider', className), children: children }));
29
+ }
30
+ //# sourceMappingURL=StatusBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.js","sourceRoot":"","sources":["../../../src/components/display/StatusBadge.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,MAAM,aAAa,GAAG,GAAG,CAAC,8CAA8C,EAAE;IACxE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,QAAQ,EACN,iEAAiE;YACnE,QAAQ,EAAE,wDAAwD;YAClE,OAAO,EAAE,8DAA8D;YACvE,OAAO,EAAE,wDAAwD;YACjE,IAAI,EAAE,8DAA8D;YACpE,IAAI,EAAE,8DAA8D;YACpE,MAAM,EAAE,8DAA8D;YACtE,GAAG,EAAE,wDAAwD;SAC9D;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,yBAAyB;YAClC,EAAE,EAAE,0BAA0B;SAC/B;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS;KAChB;CACF,CAAC,CAAC;AASH,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,EACR,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,SAAS,EAChB,SAAS,GAAG,EAAE,EACd,SAAS,GAAG,KAAK,EACjB,QAAQ,GAAG,KAAK,GACC;IACjB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAChC,SAAS,IAAI,WAAW,EACxB,QAAQ,IAAI,gBAAgB,EAC5B,SAAS,CACV,YAEA,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC"}