@orion-ds/react 4.0.0 → 4.2.0
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/contexts/ThemeContext.d.ts.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index10.cjs +1 -1
- package/dist/index10.mjs +1 -1
- package/dist/index100.cjs +1 -1
- package/dist/index100.mjs +20 -40
- package/dist/index100.mjs.map +1 -1
- package/dist/index101.cjs +1 -1
- package/dist/index101.mjs +28 -14
- package/dist/index101.mjs.map +1 -1
- package/dist/index102.cjs +1 -1
- package/dist/index102.mjs +44 -28
- package/dist/index102.mjs.map +1 -1
- package/dist/index103.cjs +1 -1
- package/dist/index103.mjs +42 -30
- package/dist/index103.mjs.map +1 -1
- package/dist/index104.cjs +1 -1
- package/dist/index104.mjs +56 -36
- package/dist/index104.mjs.map +1 -1
- package/dist/index105.cjs +1 -1
- package/dist/index105.mjs +26 -30
- package/dist/index105.mjs.map +1 -1
- package/dist/index106.cjs +1 -1
- package/dist/index106.mjs +64 -52
- package/dist/index106.mjs.map +1 -1
- package/dist/index107.cjs +1 -1
- package/dist/index107.mjs +20 -42
- package/dist/index107.mjs.map +1 -1
- package/dist/index108.cjs +1 -1
- package/dist/index108.mjs +45 -32
- package/dist/index108.mjs.map +1 -1
- package/dist/index109.cjs +1 -1
- package/dist/index109.mjs +24 -50
- package/dist/index109.mjs.map +1 -1
- package/dist/index11.cjs +1 -1
- package/dist/index11.mjs +1 -1
- package/dist/index110.cjs +1 -1
- package/dist/index110.mjs +40 -12
- package/dist/index110.mjs.map +1 -1
- package/dist/index111.cjs +1 -1
- package/dist/index111.mjs +18 -33
- package/dist/index111.mjs.map +1 -1
- package/dist/index112.cjs +1 -1
- package/dist/index112.mjs +55 -28
- package/dist/index112.mjs.map +1 -1
- package/dist/index113.cjs +1 -1
- package/dist/index113.mjs +36 -20
- package/dist/index113.mjs.map +1 -1
- package/dist/index114.cjs +1 -1
- package/dist/index114.mjs +62 -24
- package/dist/index114.mjs.map +1 -1
- package/dist/index115.cjs +1 -1
- package/dist/index115.mjs +65 -33
- package/dist/index115.mjs.map +1 -1
- package/dist/index116.cjs +1 -1
- package/dist/index116.mjs +234 -18
- package/dist/index116.mjs.map +1 -1
- package/dist/index117.cjs +1 -1
- package/dist/index117.cjs.map +1 -1
- package/dist/index117.mjs +34 -31
- package/dist/index117.mjs.map +1 -1
- package/dist/index118.cjs +1 -1
- package/dist/index118.cjs.map +1 -1
- package/dist/index118.mjs +44 -29
- package/dist/index118.mjs.map +1 -1
- package/dist/index119.cjs +1 -1
- package/dist/index119.cjs.map +1 -1
- package/dist/index119.mjs +170 -234
- package/dist/index119.mjs.map +1 -1
- package/dist/index12.cjs +1 -1
- package/dist/index12.mjs +1 -1
- package/dist/index120.cjs +1 -1
- package/dist/index120.cjs.map +1 -1
- package/dist/index120.mjs +184 -32
- package/dist/index120.mjs.map +1 -1
- package/dist/index121.cjs +1 -1
- package/dist/index121.cjs.map +1 -1
- package/dist/index121.mjs +24 -39
- package/dist/index121.mjs.map +1 -1
- package/dist/index122.cjs +1 -1
- package/dist/index122.cjs.map +1 -1
- package/dist/index122.mjs +78 -158
- package/dist/index122.mjs.map +1 -1
- package/dist/index123.cjs +1 -1
- package/dist/index123.cjs.map +1 -1
- package/dist/index123.mjs +47 -180
- package/dist/index123.mjs.map +1 -1
- package/dist/index124.cjs +1 -1
- package/dist/index124.cjs.map +1 -1
- package/dist/index124.mjs +64 -26
- package/dist/index124.mjs.map +1 -1
- package/dist/index125.cjs +1 -1
- package/dist/index125.cjs.map +1 -1
- package/dist/index125.mjs +115 -81
- package/dist/index125.mjs.map +1 -1
- package/dist/index126.cjs +1 -1
- package/dist/index126.cjs.map +1 -1
- package/dist/index126.mjs +108 -52
- package/dist/index126.mjs.map +1 -1
- package/dist/index127.cjs +1 -1
- package/dist/index127.cjs.map +1 -1
- package/dist/index127.mjs +105 -60
- package/dist/index127.mjs.map +1 -1
- package/dist/index128.cjs +1 -1
- package/dist/index128.cjs.map +1 -1
- package/dist/index128.mjs +112 -114
- package/dist/index128.mjs.map +1 -1
- package/dist/index129.cjs +1 -1
- package/dist/index129.cjs.map +1 -1
- package/dist/index129.mjs +212 -106
- package/dist/index129.mjs.map +1 -1
- package/dist/index13.cjs +1 -1
- package/dist/index13.mjs +1 -1
- package/dist/index130.cjs +1 -1
- package/dist/index130.cjs.map +1 -1
- package/dist/index130.mjs +44 -111
- package/dist/index130.mjs.map +1 -1
- package/dist/index131.cjs +1 -1
- package/dist/index131.cjs.map +1 -1
- package/dist/index131.mjs +40 -122
- package/dist/index131.mjs.map +1 -1
- package/dist/index132.cjs +1 -1
- package/dist/index132.cjs.map +1 -1
- package/dist/index132.mjs +106 -214
- package/dist/index132.mjs.map +1 -1
- package/dist/index133.cjs +1 -1
- package/dist/index133.mjs +22 -42
- package/dist/index133.mjs.map +1 -1
- package/dist/index134.cjs +1 -1
- package/dist/index134.mjs +30 -44
- package/dist/index134.mjs.map +1 -1
- package/dist/index135.cjs +1 -1
- package/dist/index135.mjs +46 -28
- package/dist/index135.mjs.map +1 -1
- package/dist/index136.cjs +1 -1
- package/dist/index136.mjs +12 -76
- package/dist/index136.mjs.map +1 -1
- package/dist/index137.cjs +1 -1
- package/dist/index137.mjs +32 -38
- package/dist/index137.mjs.map +1 -1
- package/dist/index138.cjs +1 -1
- package/dist/index138.mjs +27 -38
- package/dist/index138.mjs.map +1 -1
- package/dist/index139.cjs +1 -1
- package/dist/index139.mjs +33 -65
- package/dist/index139.mjs.map +1 -1
- package/dist/index14.cjs +1 -1
- package/dist/index14.mjs +1 -1
- package/dist/index140.cjs +1 -1
- package/dist/index140.mjs +57 -28
- package/dist/index140.mjs.map +1 -1
- package/dist/index141.cjs +1 -1
- package/dist/index141.mjs +30 -16
- package/dist/index141.mjs.map +1 -1
- package/dist/index142.cjs +1 -1
- package/dist/index142.mjs +32 -22
- package/dist/index142.mjs.map +1 -1
- package/dist/index143.cjs +1 -1
- package/dist/index143.mjs +50 -62
- package/dist/index143.mjs.map +1 -1
- package/dist/index144.cjs +1 -1
- package/dist/index144.mjs +16 -20
- package/dist/index144.mjs.map +1 -1
- package/dist/index145.cjs +1 -1
- package/dist/index145.mjs +30 -20
- package/dist/index145.mjs.map +1 -1
- package/dist/index146.cjs +1 -1
- package/dist/index146.mjs +46 -26
- package/dist/index146.mjs.map +1 -1
- package/dist/index147.cjs +1 -1
- package/dist/index147.mjs +42 -42
- package/dist/index148.cjs +1 -1
- package/dist/index148.mjs +28 -45
- package/dist/index148.mjs.map +1 -1
- package/dist/index149.cjs +1 -1
- package/dist/index149.mjs +28 -27
- package/dist/index15.cjs +1 -1
- package/dist/index15.mjs +1 -1
- package/dist/index150.cjs +1 -1
- package/dist/index150.mjs +30 -28
- package/dist/index150.mjs.map +1 -1
- package/dist/index151.cjs +1 -1
- package/dist/index151.mjs +24 -32
- package/dist/index151.mjs.map +1 -1
- package/dist/index152.cjs +1 -1
- package/dist/index152.mjs +21 -29
- package/dist/index152.mjs.map +1 -1
- package/dist/index153.cjs +1 -1
- package/dist/index153.mjs +36 -24
- package/dist/index153.mjs.map +1 -1
- package/dist/index154.cjs +1 -1
- package/dist/index154.mjs +38 -28
- package/dist/index154.mjs.map +1 -1
- package/dist/index155.cjs +1 -1
- package/dist/index155.mjs +12 -30
- package/dist/index155.mjs.map +1 -1
- package/dist/index156.cjs +1 -1
- package/dist/index156.mjs +28 -33
- package/dist/index156.mjs.map +1 -1
- package/dist/index157.cjs +1 -1
- package/dist/index157.mjs +38 -46
- package/dist/index157.mjs.map +1 -1
- package/dist/index158.cjs +1 -1
- package/dist/index158.mjs +33 -46
- package/dist/index158.mjs.map +1 -1
- package/dist/index159.cjs +1 -1
- package/dist/index159.mjs +28 -44
- package/dist/index159.mjs.map +1 -1
- package/dist/index16.cjs +1 -1
- package/dist/index16.mjs +1 -1
- package/dist/index160.cjs +1 -1
- package/dist/index160.mjs +13 -39
- package/dist/index160.mjs.map +1 -1
- package/dist/index161.cjs +1 -1
- package/dist/index161.mjs +18 -22
- package/dist/index161.mjs.map +1 -1
- package/dist/index162.cjs +1 -1
- package/dist/index162.mjs +28 -18
- package/dist/index162.mjs.map +1 -1
- package/dist/index163.cjs +1 -1
- package/dist/index163.mjs +18 -40
- package/dist/index163.mjs.map +1 -1
- package/dist/index164.cjs +1 -1
- package/dist/index164.mjs +65 -16
- package/dist/index164.mjs.map +1 -1
- package/dist/index165.cjs +1 -1
- package/dist/index165.mjs +30 -24
- package/dist/index165.mjs.map +1 -1
- package/dist/index166.cjs +1 -1
- package/dist/index166.mjs +44 -64
- package/dist/index166.mjs.map +1 -1
- package/dist/index167.cjs +1 -1
- package/dist/index167.mjs +51 -52
- package/dist/index167.mjs.map +1 -1
- package/dist/index168.cjs +1 -1
- package/dist/index168.cjs.map +1 -1
- package/dist/index168.mjs +37 -13
- package/dist/index168.mjs.map +1 -1
- package/dist/index169.cjs +1 -1
- package/dist/index169.mjs +28 -56
- package/dist/index169.mjs.map +1 -1
- package/dist/index17.cjs +1 -1
- package/dist/index17.mjs +1 -1
- package/dist/index170.cjs +1 -1
- package/dist/index170.mjs +18 -106
- package/dist/index170.mjs.map +1 -1
- package/dist/index171.cjs +1 -1
- package/dist/index171.mjs +33 -18
- package/dist/index171.mjs.map +1 -1
- package/dist/index172.cjs +1 -1
- package/dist/index172.mjs +20 -62
- package/dist/index172.mjs.map +1 -1
- package/dist/index173.cjs +1 -1
- package/dist/index173.mjs +24 -55
- package/dist/index173.mjs.map +1 -1
- package/dist/index174.cjs +1 -1
- package/dist/index174.mjs +64 -18
- package/dist/index174.mjs.map +1 -1
- package/dist/index175.cjs +1 -1
- package/dist/index175.mjs +76 -52
- package/dist/index175.mjs.map +1 -1
- package/dist/index176.cjs +1 -1
- package/dist/index176.mjs +40 -64
- package/dist/index176.mjs.map +1 -1
- package/dist/index177.cjs +1 -1
- package/dist/index177.cjs.map +1 -1
- package/dist/index177.mjs +53 -37
- package/dist/index177.mjs.map +1 -1
- package/dist/index178.cjs +1 -1
- package/dist/index178.mjs +53 -28
- package/dist/index178.mjs.map +1 -1
- package/dist/index179.cjs +1 -1
- package/dist/index179.mjs +18 -67
- package/dist/index179.mjs.map +1 -1
- package/dist/index18.cjs +1 -1
- package/dist/index18.mjs +1 -1
- package/dist/index180.cjs +1 -1
- package/dist/index180.mjs +42 -57
- package/dist/index180.mjs.map +1 -1
- package/dist/index181.cjs +1 -1
- package/dist/index181.mjs +28 -44
- package/dist/index181.mjs.map +1 -1
- package/dist/index185.cjs +1 -1
- package/dist/index185.mjs +1 -1
- package/dist/index19.cjs +1 -1
- package/dist/index19.mjs +2 -2
- package/dist/index20.cjs +1 -1
- package/dist/index20.mjs +14 -14
- package/dist/index21.cjs +1 -1
- package/dist/index21.mjs +1 -1
- package/dist/index22.cjs +1 -1
- package/dist/index22.mjs +1 -1
- package/dist/index23.cjs +1 -1
- package/dist/index23.mjs +1 -1
- package/dist/index24.cjs +1 -1
- package/dist/index24.mjs +1 -1
- package/dist/index25.cjs +1 -1
- package/dist/index25.mjs +1 -1
- package/dist/index26.cjs +1 -1
- package/dist/index26.cjs.map +1 -1
- package/dist/index26.mjs +1 -1
- package/dist/index27.cjs +1 -1
- package/dist/index27.mjs +1 -1
- package/dist/index28.cjs +1 -1
- package/dist/index28.mjs +1 -1
- package/dist/index30.cjs +1 -1
- package/dist/index30.mjs +1 -1
- package/dist/index31.cjs +1 -1
- package/dist/index31.mjs +1 -1
- package/dist/index32.cjs +1 -1
- package/dist/index32.mjs +1 -1
- package/dist/index33.cjs +1 -1
- package/dist/index33.mjs +1 -1
- package/dist/index34.cjs +1 -1
- package/dist/index34.mjs +1 -1
- package/dist/index35.cjs +1 -1
- package/dist/index35.mjs +1 -1
- package/dist/index36.cjs +1 -1
- package/dist/index36.mjs +1 -1
- package/dist/index37.cjs +1 -1
- package/dist/index37.mjs +1 -1
- package/dist/index38.cjs +1 -1
- package/dist/index38.mjs +1 -1
- package/dist/index39.cjs +1 -1
- package/dist/index39.mjs +1 -1
- package/dist/index40.cjs +1 -1
- package/dist/index40.mjs +1 -1
- package/dist/index42.cjs +1 -1
- package/dist/index42.mjs +1 -1
- package/dist/index43.cjs +1 -1
- package/dist/index43.cjs.map +1 -1
- package/dist/index43.mjs +1 -1
- package/dist/index44.cjs +1 -1
- package/dist/index44.mjs +1 -1
- package/dist/index46.cjs +1 -1
- package/dist/index46.mjs +1 -1
- package/dist/index47.cjs +1 -1
- package/dist/index47.mjs +1 -1
- package/dist/index49.cjs +1 -1
- package/dist/index49.mjs +1 -1
- package/dist/index5.cjs +1 -1
- package/dist/index5.mjs +1 -1
- package/dist/index50.cjs +1 -1
- package/dist/index50.mjs +1 -1
- package/dist/index51.cjs +1 -1
- package/dist/index51.mjs +1 -1
- package/dist/index52.cjs +1 -1
- package/dist/index52.mjs +1 -1
- package/dist/index53.cjs +1 -1
- package/dist/index53.mjs +1 -1
- package/dist/index54.cjs +1 -1
- package/dist/index54.mjs +1 -1
- package/dist/index55.cjs +1 -1
- package/dist/index55.mjs +1 -1
- package/dist/index56.cjs +1 -1
- package/dist/index56.mjs +1 -1
- package/dist/index57.cjs +1 -1
- package/dist/index57.mjs +1 -1
- package/dist/index58.cjs +1 -1
- package/dist/index58.mjs +1 -1
- package/dist/index59.cjs +1 -1
- package/dist/index59.mjs +1 -1
- package/dist/index6.cjs +1 -1
- package/dist/index6.mjs +1 -1
- package/dist/index60.cjs +1 -1
- package/dist/index60.mjs +1 -1
- package/dist/index61.cjs +1 -1
- package/dist/index61.mjs +1 -1
- package/dist/index62.cjs +1 -1
- package/dist/index62.mjs +1 -1
- package/dist/index64.cjs +1 -1
- package/dist/index64.mjs +1 -1
- package/dist/index65.cjs +1 -1
- package/dist/index65.mjs +1 -1
- package/dist/index66.cjs +1 -1
- package/dist/index66.mjs +1 -1
- package/dist/index67.cjs +1 -1
- package/dist/index67.mjs +1 -1
- package/dist/index68.cjs +1 -1
- package/dist/index68.mjs +1 -1
- package/dist/index69.cjs +1 -1
- package/dist/index69.mjs +1 -1
- package/dist/index7.cjs +1 -1
- package/dist/index7.mjs +1 -1
- package/dist/index70.cjs +1 -1
- package/dist/index70.mjs +1 -1
- package/dist/index71.cjs +1 -1
- package/dist/index71.mjs +1 -1
- package/dist/index72.cjs +1 -1
- package/dist/index72.mjs +1 -1
- package/dist/index73.cjs +1 -1
- package/dist/index73.mjs +1 -1
- package/dist/index75.cjs +7 -10
- package/dist/index75.cjs.map +1 -1
- package/dist/index75.mjs +18 -21
- package/dist/index75.mjs.map +1 -1
- package/dist/index76.cjs +1 -1
- package/dist/index76.mjs +1 -1
- package/dist/index77.cjs +1 -1
- package/dist/index77.mjs +1 -1
- package/dist/index78.cjs +1 -1
- package/dist/index78.mjs +1 -1
- package/dist/index79.cjs +1 -1
- package/dist/index79.mjs +1 -1
- package/dist/index8.cjs +1 -1
- package/dist/index8.mjs +1 -1
- package/dist/index80.cjs +1 -1
- package/dist/index80.mjs +1 -1
- package/dist/index81.cjs +1 -1
- package/dist/index81.mjs +1 -1
- package/dist/index82.cjs +1 -1
- package/dist/index82.mjs +2 -2
- package/dist/index9.cjs +1 -1
- package/dist/index9.mjs +1 -1
- package/dist/index97.cjs +1 -1
- package/dist/index97.cjs.map +1 -1
- package/dist/index97.mjs +62 -154
- package/dist/index97.mjs.map +1 -1
- package/dist/index98.cjs +1 -1
- package/dist/index98.cjs.map +1 -1
- package/dist/index98.mjs +138 -202
- package/dist/index98.mjs.map +1 -1
- package/dist/index99.cjs +1 -1
- package/dist/index99.cjs.map +1 -1
- package/dist/index99.mjs +218 -36
- package/dist/index99.mjs.map +1 -1
- package/dist/react.css +1 -1
- package/dist/styles.css +8 -1
- package/dist/theme.css +7 -0
- package/package.json +5 -8
package/dist/index128.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index128.cjs","sources":["../src/components/Chat/components/
|
|
1
|
+
{"version":3,"file":"index128.cjs","sources":["../src/components/Chat/components/ChatAttachment.tsx"],"sourcesContent":["/**\n * ChatAttachment Component\n *\n * Unified attachment preview component that renders the appropriate\n * display based on attachment type (image, audio, file, code).\n */\n\nimport React from \"react\";\nimport { FileText, Code, X, Image as ImageIcon, Music } from \"lucide-react\";\nimport type { ChatAttachmentPreviewProps, AttachmentType } from \"../Chat.types\";\nimport { ChatImagePreview } from \"./ChatImagePreview\";\nimport { ChatAudioPlayer } from \"./ChatAudioPlayer\";\nimport { ChatCodeBlock } from \"./ChatCodeBlock\";\nimport { formatFileSize } from \"../utils\";\nimport styles from \"../Chat.module.css\";\n\n// Get icon for attachment type\nconst getAttachmentIcon = (type: AttachmentType) => {\n switch (type) {\n case \"image\":\n return <ImageIcon size={18} />;\n case \"audio\":\n return <Music size={18} />;\n case \"code\":\n return <Code size={18} />;\n default:\n return <FileText size={18} />;\n }\n};\n\nexport const ChatAttachment: React.FC<ChatAttachmentPreviewProps> = ({\n attachment,\n removable = false,\n onRemove,\n onClick,\n className,\n ...rest\n}) => {\n const { type, name, url, content, language, size, duration, thumbnail } =\n attachment;\n\n // Render based on type\n switch (type) {\n case \"image\":\n if (url) {\n return (\n <div className={className} style={{ position: \"relative\" }} {...rest}>\n <ChatImagePreview\n src={url}\n alt={name}\n thumbnail={thumbnail}\n onClick={onClick}\n />\n {removable && onRemove && (\n <button\n className={styles.attachmentPreviewRemove}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label={`Remove ${name}`}\n style={{\n position: \"absolute\",\n top: 4,\n right: 4,\n background: \"var(--surface-base)\",\n }}\n >\n <X size={14} />\n </button>\n )}\n </div>\n );\n }\n break;\n\n case \"audio\":\n if (url) {\n return (\n <div className={className} style={{ position: \"relative\" }} {...rest}>\n <ChatAudioPlayer src={url} duration={duration} title={name} />\n {removable && onRemove && (\n <button\n className={styles.attachmentPreviewRemove}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label={`Remove ${name}`}\n >\n <X size={14} />\n </button>\n )}\n </div>\n );\n }\n break;\n\n case \"code\":\n if (content) {\n return (\n <ChatCodeBlock\n code={content}\n language={language}\n className={className}\n {...rest}\n />\n );\n }\n break;\n }\n\n // Default file preview for unhandled types or missing data\n return (\n <div\n className={[styles.attachmentPreview, className]\n .filter(Boolean)\n .join(\" \")}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n {...rest}\n >\n <div className={styles.attachmentPreviewIcon}>\n {getAttachmentIcon(type)}\n </div>\n\n <div className={styles.attachmentPreviewInfo}>\n <span className={styles.attachmentPreviewName}>{name}</span>\n {size && (\n <span className={styles.attachmentPreviewMeta}>\n {formatFileSize(size)}\n {duration &&\n ` · ${Math.floor(duration / 60)}:${(duration % 60).toString().padStart(2, \"0\")}`}\n </span>\n )}\n </div>\n\n {removable && onRemove && (\n <button\n className={styles.attachmentPreviewRemove}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label={`Remove ${name}`}\n >\n <X size={14} />\n </button>\n )}\n </div>\n );\n};\n\nChatAttachment.displayName = \"ChatAttachment\";\n"],"names":["getAttachmentIcon","type","jsx","ImageIcon","Music","Code","FileText","ChatAttachment","attachment","removable","onRemove","onClick","className","rest","name","url","content","language","size","duration","thumbnail","jsxs","ChatImagePreview","styles","e","X","ChatAudioPlayer","ChatCodeBlock","formatFileSize"],"mappings":"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"}
|
package/dist/index128.mjs
CHANGED
|
@@ -1,128 +1,126 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { jsx as e, jsxs as o } from "react/jsx-runtime";
|
|
2
|
+
import { X as u, FileText as P, Code as w, Music as z, Image as y } from "lucide-react";
|
|
3
|
+
import { ChatImagePreview as C } from "./index124.mjs";
|
|
4
|
+
import { ChatAudioPlayer as N } from "./index125.mjs";
|
|
5
|
+
import { ChatCodeBlock as I } from "./index122.mjs";
|
|
6
|
+
import { formatFileSize as k } from "./index184.mjs";
|
|
7
|
+
import t from "./index116.mjs";
|
|
8
|
+
const x = (d) => {
|
|
9
|
+
switch (d) {
|
|
10
|
+
case "image":
|
|
11
|
+
return /* @__PURE__ */ e(y, { size: 18 });
|
|
12
|
+
case "audio":
|
|
13
|
+
return /* @__PURE__ */ e(z, { size: 18 });
|
|
14
|
+
case "code":
|
|
15
|
+
return /* @__PURE__ */ e(w, { size: 18 });
|
|
16
|
+
default:
|
|
17
|
+
return /* @__PURE__ */ e(P, { size: 18 });
|
|
18
|
+
}
|
|
19
|
+
}, $ = ({
|
|
20
|
+
attachment: d,
|
|
21
|
+
removable: h = !1,
|
|
22
|
+
onRemove: a,
|
|
23
|
+
onClick: n,
|
|
24
|
+
className: s,
|
|
25
|
+
...c
|
|
12
26
|
}) => {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
27
|
+
const { type: p, name: i, url: l, content: v, language: b, size: f, duration: m, thumbnail: g } = d;
|
|
28
|
+
switch (p) {
|
|
29
|
+
case "image":
|
|
30
|
+
if (l)
|
|
31
|
+
return /* @__PURE__ */ o("div", { className: s, style: { position: "relative" }, ...c, children: [
|
|
32
|
+
/* @__PURE__ */ e(
|
|
33
|
+
C,
|
|
34
|
+
{
|
|
35
|
+
src: l,
|
|
36
|
+
alt: i,
|
|
37
|
+
thumbnail: g,
|
|
38
|
+
onClick: n
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
h && a && /* @__PURE__ */ e(
|
|
42
|
+
"button",
|
|
43
|
+
{
|
|
44
|
+
className: t.attachmentPreviewRemove,
|
|
45
|
+
onClick: (r) => {
|
|
46
|
+
r.stopPropagation(), a();
|
|
47
|
+
},
|
|
48
|
+
"aria-label": `Remove ${i}`,
|
|
49
|
+
style: {
|
|
50
|
+
position: "absolute",
|
|
51
|
+
top: 4,
|
|
52
|
+
right: 4,
|
|
53
|
+
background: "var(--surface-base)"
|
|
54
|
+
},
|
|
55
|
+
children: /* @__PURE__ */ e(u, { size: 14 })
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
] });
|
|
59
|
+
break;
|
|
60
|
+
case "audio":
|
|
61
|
+
if (l)
|
|
62
|
+
return /* @__PURE__ */ o("div", { className: s, style: { position: "relative" }, ...c, children: [
|
|
63
|
+
/* @__PURE__ */ e(N, { src: l, duration: m, title: i }),
|
|
64
|
+
h && a && /* @__PURE__ */ e(
|
|
65
|
+
"button",
|
|
66
|
+
{
|
|
67
|
+
className: t.attachmentPreviewRemove,
|
|
68
|
+
onClick: (r) => {
|
|
69
|
+
r.stopPropagation(), a();
|
|
70
|
+
},
|
|
71
|
+
"aria-label": `Remove ${i}`,
|
|
72
|
+
children: /* @__PURE__ */ e(u, { size: 14 })
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
] });
|
|
76
|
+
break;
|
|
77
|
+
case "code":
|
|
78
|
+
if (v)
|
|
79
|
+
return /* @__PURE__ */ e(
|
|
80
|
+
I,
|
|
81
|
+
{
|
|
82
|
+
code: v,
|
|
83
|
+
language: b,
|
|
84
|
+
className: s,
|
|
85
|
+
...c
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
return /* @__PURE__ */ o(
|
|
66
91
|
"div",
|
|
67
92
|
{
|
|
68
|
-
className: [
|
|
69
|
-
|
|
93
|
+
className: [t.attachmentPreview, s].filter(Boolean).join(" "),
|
|
94
|
+
onClick: n,
|
|
95
|
+
role: n ? "button" : void 0,
|
|
96
|
+
tabIndex: n ? 0 : void 0,
|
|
97
|
+
...c,
|
|
70
98
|
children: [
|
|
71
|
-
/* @__PURE__ */
|
|
72
|
-
|
|
73
|
-
{
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
),
|
|
82
|
-
/* @__PURE__ */ r(
|
|
99
|
+
/* @__PURE__ */ e("div", { className: t.attachmentPreviewIcon, children: x(p) }),
|
|
100
|
+
/* @__PURE__ */ o("div", { className: t.attachmentPreviewInfo, children: [
|
|
101
|
+
/* @__PURE__ */ e("span", { className: t.attachmentPreviewName, children: i }),
|
|
102
|
+
f && /* @__PURE__ */ o("span", { className: t.attachmentPreviewMeta, children: [
|
|
103
|
+
k(f),
|
|
104
|
+
m && ` · ${Math.floor(m / 60)}:${(m % 60).toString().padStart(2, "0")}`
|
|
105
|
+
] })
|
|
106
|
+
] }),
|
|
107
|
+
h && a && /* @__PURE__ */ e(
|
|
83
108
|
"button",
|
|
84
109
|
{
|
|
85
|
-
className:
|
|
86
|
-
onClick:
|
|
87
|
-
|
|
88
|
-
|
|
110
|
+
className: t.attachmentPreviewRemove,
|
|
111
|
+
onClick: (r) => {
|
|
112
|
+
r.stopPropagation(), a();
|
|
113
|
+
},
|
|
114
|
+
"aria-label": `Remove ${i}`,
|
|
115
|
+
children: /* @__PURE__ */ e(u, { size: 14 })
|
|
89
116
|
}
|
|
90
|
-
)
|
|
91
|
-
/* @__PURE__ */ p("div", { className: o.audioPlayerProgress, children: [
|
|
92
|
-
y && /* @__PURE__ */ r("span", { className: o.attachmentPreviewName, children: y }),
|
|
93
|
-
/* @__PURE__ */ r(
|
|
94
|
-
"div",
|
|
95
|
-
{
|
|
96
|
-
className: o.audioPlayerTrack,
|
|
97
|
-
onClick: x,
|
|
98
|
-
onKeyDown: A,
|
|
99
|
-
role: "slider",
|
|
100
|
-
"aria-label": "Audio progress",
|
|
101
|
-
"aria-valuemin": 0,
|
|
102
|
-
"aria-valuemax": a,
|
|
103
|
-
"aria-valuenow": t,
|
|
104
|
-
"aria-valuetext": `${m(t)} of ${m(a)}`,
|
|
105
|
-
tabIndex: 0,
|
|
106
|
-
children: /* @__PURE__ */ r(
|
|
107
|
-
"div",
|
|
108
|
-
{
|
|
109
|
-
className: o.audioPlayerFill,
|
|
110
|
-
style: { width: `${E}%` }
|
|
111
|
-
}
|
|
112
|
-
)
|
|
113
|
-
}
|
|
114
|
-
),
|
|
115
|
-
/* @__PURE__ */ p("div", { className: o.audioPlayerTime, children: [
|
|
116
|
-
/* @__PURE__ */ r("span", { children: m(t) }),
|
|
117
|
-
/* @__PURE__ */ r("span", { children: m(a) })
|
|
118
|
-
] })
|
|
119
|
-
] })
|
|
117
|
+
)
|
|
120
118
|
]
|
|
121
119
|
}
|
|
122
120
|
);
|
|
123
121
|
};
|
|
124
|
-
|
|
122
|
+
$.displayName = "ChatAttachment";
|
|
125
123
|
export {
|
|
126
|
-
|
|
124
|
+
$ as ChatAttachment
|
|
127
125
|
};
|
|
128
126
|
//# sourceMappingURL=index128.mjs.map
|
package/dist/index128.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index128.mjs","sources":["../src/components/Chat/components/
|
|
1
|
+
{"version":3,"file":"index128.mjs","sources":["../src/components/Chat/components/ChatAttachment.tsx"],"sourcesContent":["/**\n * ChatAttachment Component\n *\n * Unified attachment preview component that renders the appropriate\n * display based on attachment type (image, audio, file, code).\n */\n\nimport React from \"react\";\nimport { FileText, Code, X, Image as ImageIcon, Music } from \"lucide-react\";\nimport type { ChatAttachmentPreviewProps, AttachmentType } from \"../Chat.types\";\nimport { ChatImagePreview } from \"./ChatImagePreview\";\nimport { ChatAudioPlayer } from \"./ChatAudioPlayer\";\nimport { ChatCodeBlock } from \"./ChatCodeBlock\";\nimport { formatFileSize } from \"../utils\";\nimport styles from \"../Chat.module.css\";\n\n// Get icon for attachment type\nconst getAttachmentIcon = (type: AttachmentType) => {\n switch (type) {\n case \"image\":\n return <ImageIcon size={18} />;\n case \"audio\":\n return <Music size={18} />;\n case \"code\":\n return <Code size={18} />;\n default:\n return <FileText size={18} />;\n }\n};\n\nexport const ChatAttachment: React.FC<ChatAttachmentPreviewProps> = ({\n attachment,\n removable = false,\n onRemove,\n onClick,\n className,\n ...rest\n}) => {\n const { type, name, url, content, language, size, duration, thumbnail } =\n attachment;\n\n // Render based on type\n switch (type) {\n case \"image\":\n if (url) {\n return (\n <div className={className} style={{ position: \"relative\" }} {...rest}>\n <ChatImagePreview\n src={url}\n alt={name}\n thumbnail={thumbnail}\n onClick={onClick}\n />\n {removable && onRemove && (\n <button\n className={styles.attachmentPreviewRemove}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label={`Remove ${name}`}\n style={{\n position: \"absolute\",\n top: 4,\n right: 4,\n background: \"var(--surface-base)\",\n }}\n >\n <X size={14} />\n </button>\n )}\n </div>\n );\n }\n break;\n\n case \"audio\":\n if (url) {\n return (\n <div className={className} style={{ position: \"relative\" }} {...rest}>\n <ChatAudioPlayer src={url} duration={duration} title={name} />\n {removable && onRemove && (\n <button\n className={styles.attachmentPreviewRemove}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label={`Remove ${name}`}\n >\n <X size={14} />\n </button>\n )}\n </div>\n );\n }\n break;\n\n case \"code\":\n if (content) {\n return (\n <ChatCodeBlock\n code={content}\n language={language}\n className={className}\n {...rest}\n />\n );\n }\n break;\n }\n\n // Default file preview for unhandled types or missing data\n return (\n <div\n className={[styles.attachmentPreview, className]\n .filter(Boolean)\n .join(\" \")}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n {...rest}\n >\n <div className={styles.attachmentPreviewIcon}>\n {getAttachmentIcon(type)}\n </div>\n\n <div className={styles.attachmentPreviewInfo}>\n <span className={styles.attachmentPreviewName}>{name}</span>\n {size && (\n <span className={styles.attachmentPreviewMeta}>\n {formatFileSize(size)}\n {duration &&\n ` · ${Math.floor(duration / 60)}:${(duration % 60).toString().padStart(2, \"0\")}`}\n </span>\n )}\n </div>\n\n {removable && onRemove && (\n <button\n className={styles.attachmentPreviewRemove}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label={`Remove ${name}`}\n >\n <X size={14} />\n </button>\n )}\n </div>\n );\n};\n\nChatAttachment.displayName = \"ChatAttachment\";\n"],"names":["getAttachmentIcon","type","jsx","ImageIcon","Music","Code","FileText","ChatAttachment","attachment","removable","onRemove","onClick","className","rest","name","url","content","language","size","duration","thumbnail","jsxs","ChatImagePreview","styles","e","X","ChatAudioPlayer","ChatCodeBlock","formatFileSize"],"mappings":"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"}
|
package/dist/index129.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),d=require("react"),c=require("lucide-react"),t=require("./index116.cjs"),O={today:"Today",yesterday:"Yesterday",previous7:"Previous 7 days",previous30:"Previous 30 days",older:"Older"},y=["today","yesterday","previous7","previous30","older"],C=a=>{const r=new Date,u=(new Date(r.getFullYear(),r.getMonth(),r.getDate()).getTime()-new Date(a.getFullYear(),a.getMonth(),a.getDate()).getTime())/(1e3*60*60*24);return u<1?"today":u<2?"yesterday":u<7?"previous7":u<30?"previous30":"older"},P=a=>{const r=C(a);return r==="today"?new Intl.DateTimeFormat("en-US",{hour:"numeric",minute:"2-digit"}).format(a):r==="yesterday"?"Yesterday":r==="previous7"?new Intl.DateTimeFormat("en-US",{weekday:"short"}).format(a):new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric"}).format(a)},z=a=>{const r=new Map;return y.forEach(n=>r.set(n,[])),a.forEach(n=>{const b=C(n.updatedAt);r.get(b)?.push(n)}),r},S=({conversations:a=[],activeConversationId:r,onSelectConversation:n,onNewConversation:b,onDeleteConversation:u,onSearch:x,header:w,footer:N,collapsed:m=!1,onCollapsedChange:f,className:I,...D})=>{const[h,T]=d.useState(""),[p,j]=d.useState(null),o=d.useRef(void 0);d.useEffect(()=>()=>{o.current&&clearTimeout(o.current)},[]);const g=d.useMemo(()=>{if(!h.trim())return a;const s=h.toLowerCase();return a.filter(l=>l.title.toLowerCase().includes(s)||l.preview?.toLowerCase().includes(s))},[a,h]),v=d.useMemo(()=>z(g),[g]),B=d.useCallback(s=>{const l=s.target.value;T(l),x?.(l)},[x]),k=d.useCallback(s=>{n?.(s),m&&f&&f(!0)},[n,m,f]),F=d.useCallback((s,l)=>{s.stopPropagation(),p===l?(u?.(l),j(null),o.current&&clearTimeout(o.current)):(j(l),o.current&&clearTimeout(o.current),o.current=setTimeout(()=>{j(null)},3e3))},[p,u]),M=y.some(s=>(v.get(s)?.length??0)>0);return e.jsxs(e.Fragment,{children:[!m&&e.jsx("div",{className:t.default.sidebarOverlay,onClick:()=>f?.(!0),"aria-hidden":"true"}),e.jsxs("aside",{className:[t.default.sidebar,m&&t.default.sidebarCollapsed,!m&&t.default.sidebarOpen,I].filter(Boolean).join(" "),...D,children:[e.jsx("div",{className:t.default.sidebarHeader,children:w||e.jsxs(e.Fragment,{children:[e.jsx("button",{className:[t.default.inputButton,t.default.inputButtonPrimary,t.default.sidebarNewButton].filter(Boolean).join(" "),onClick:b,"aria-label":"New conversation",children:e.jsxs("span",{className:t.default.sidebarNewButtonInner,children:[e.jsx(c.Plus,{size:18}),e.jsx("span",{children:"New Chat"})]})}),e.jsx("button",{className:[t.default.inputButton,t.default.sidebarCloseButton].join(" "),onClick:()=>f?.(!0),"aria-label":"Close sidebar",children:e.jsx(c.X,{size:20})})]})}),e.jsx("div",{className:t.default.sidebarSearch,children:e.jsxs("div",{className:t.default.sidebarSearchWrapper,children:[e.jsx(c.Search,{size:16,className:t.default.sidebarSearchIcon}),e.jsx("input",{type:"search",className:[t.default.sidebarSearchInput,t.default.sidebarSearchInputWithIcon].join(" "),placeholder:"Search conversations...",value:h,onChange:B,"aria-label":"Search conversations"})]})}),e.jsx("div",{className:t.default.sidebarList,role:"list","aria-label":"Conversations",children:M?y.map(s=>{const l=v.get(s)??[];return l.length===0?null:e.jsxs("div",{children:[e.jsx("div",{className:t.default.sidebarGroupHeader,children:O[s]}),l.map(i=>e.jsxs("button",{className:[t.default.sidebarItem,i.id===r&&t.default.sidebarItemActive].filter(Boolean).join(" "),onClick:()=>k(i.id),role:"listitem","aria-selected":i.id===r,"aria-label":`Conversation: ${i.title}`,children:[e.jsx(c.MessageSquare,{size:18,className:t.default.sidebarItemIcon}),e.jsxs("div",{className:t.default.sidebarItemContent,children:[e.jsx("span",{className:t.default.sidebarItemTitle,children:i.title}),i.preview&&e.jsx("span",{className:t.default.sidebarItemPreview,children:i.preview})]}),e.jsx("span",{className:t.default.sidebarItemDate,children:P(i.updatedAt)}),u&&e.jsx("button",{className:t.default.sidebarItemDelete,onClick:q=>F(q,i.id),"aria-label":p===i.id?`Confirm delete ${i.title}`:`Delete ${i.title}`,children:p===i.id?e.jsx("span",{className:t.default.sidebarItemDeleteConfirm,children:"Delete?"}):e.jsx(c.Trash2,{size:16})})]},i.id))]},s)}):e.jsxs("div",{className:t.default.sidebarEmpty,children:[e.jsx(c.MessageSquare,{size:32,className:t.default.sidebarEmptyIcon}),e.jsx("p",{children:h?"No conversations found":"No conversations yet"})]})}),N&&e.jsx("div",{className:t.default.sidebarFooter,children:N})]})]})};S.displayName="ChatSidebar";exports.ChatSidebar=S;
|
|
2
2
|
//# sourceMappingURL=index129.cjs.map
|
package/dist/index129.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index129.cjs","sources":["../src/components/Chat/components/ChatVoiceRecorder.tsx"],"sourcesContent":["/**\n * ChatVoiceRecorder Component\n *\n * Voice recording UI with waveform visualization.\n */\n\nimport React from \"react\";\nimport { Mic, Square, X, Send } from \"lucide-react\";\nimport type { ChatVoiceRecorderProps } from \"../Chat.types\";\nimport { useVoiceRecorder } from \"../hooks/useVoiceRecorder\";\nimport { formatTime } from \"../utils\";\nimport styles from \"../Chat.module.css\";\n\nexport const ChatVoiceRecorder: React.FC<ChatVoiceRecorderProps> = ({\n onRecordingComplete,\n onCancel,\n maxDuration = 300,\n className,\n ...rest\n}) => {\n const {\n isRecording,\n duration,\n audioBlob,\n error,\n startRecording,\n stopRecording,\n cancelRecording,\n reset,\n isSupported,\n } = useVoiceRecorder({\n maxDuration,\n onRecordingComplete,\n onError: (err) => console.error(\"Recording error:\", err),\n });\n\n const handleMainButtonClick = () => {\n if (isRecording) {\n stopRecording();\n } else if (audioBlob) {\n // Send the recorded audio\n onRecordingComplete?.(audioBlob);\n reset();\n } else {\n startRecording();\n }\n };\n\n const handleCancel = () => {\n cancelRecording();\n onCancel?.();\n };\n\n if (!isSupported) {\n return (\n <div\n className={[styles.voiceRecorder, className].filter(Boolean).join(\" \")}\n {...rest}\n >\n <div className={styles.voiceRecorderInfo}>\n <span className={styles.voiceRecorderLabel}>\n Voice recording is not supported in this browser\n </span>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className={[styles.voiceRecorder, className].filter(Boolean).join(\" \")}\n {...rest}\n >\n <div className={styles.voiceRecorderInfo}>\n <span\n className={[\n styles.voiceRecorderLabel,\n styles.voiceRecorderError,\n ].join(\" \")}\n >\n {error}\n </span>\n </div>\n <button\n className={styles.inputButton}\n onClick={reset}\n aria-label=\"Try again\"\n >\n <X size={20} />\n </button>\n </div>\n );\n }\n\n return (\n <div\n className={[styles.voiceRecorder, className].filter(Boolean).join(\" \")}\n {...rest}\n >\n {/* Main record/stop/send button */}\n <button\n className={[\n styles.voiceRecorderButton,\n !isRecording && !audioBlob && styles.voiceRecorderButtonIdle,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={handleMainButtonClick}\n aria-label={\n isRecording\n ? \"Stop recording\"\n : audioBlob\n ? \"Send recording\"\n : \"Start recording\"\n }\n >\n {isRecording ? (\n <Square size={20} />\n ) : audioBlob ? (\n <Send size={20} />\n ) : (\n <Mic size={20} />\n )}\n </button>\n\n {/* Info section */}\n <div className={styles.voiceRecorderInfo}>\n <span className={styles.voiceRecorderDuration}>\n {formatTime(duration)}\n </span>\n <span className={styles.voiceRecorderLabel}>\n {isRecording\n ? \"Recording...\"\n : audioBlob\n ? \"Recording ready\"\n : \"Click to record\"}\n </span>\n </div>\n\n {/* Waveform visualization (only when recording) */}\n {isRecording && (\n <div className={styles.voiceRecorderWaveform}>\n <div className={styles.voiceRecorderBar} />\n <div className={styles.voiceRecorderBar} />\n <div className={styles.voiceRecorderBar} />\n <div className={styles.voiceRecorderBar} />\n <div className={styles.voiceRecorderBar} />\n </div>\n )}\n\n {/* Cancel button */}\n {(isRecording || audioBlob) && (\n <div className={styles.voiceRecorderActions}>\n <button\n className={styles.inputButton}\n onClick={handleCancel}\n aria-label=\"Cancel recording\"\n >\n <X size={20} />\n </button>\n </div>\n )}\n </div>\n );\n};\n\nChatVoiceRecorder.displayName = \"ChatVoiceRecorder\";\n"],"names":["ChatVoiceRecorder","onRecordingComplete","onCancel","maxDuration","className","rest","isRecording","duration","audioBlob","error","startRecording","stopRecording","cancelRecording","reset","isSupported","useVoiceRecorder","err","handleMainButtonClick","handleCancel","jsxs","styles","jsx","X","Square","Send","Mic","formatTime"],"mappings":"kOAaaA,EAAsD,CAAC,CAClE,oBAAAC,EACA,SAAAC,EACA,YAAAC,EAAc,IACd,UAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CACJ,YAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,eAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,MAAAC,EACA,YAAAC,CAAA,EACEC,mBAAiB,CACnB,YAAAZ,EACA,oBAAAF,EACA,QAAUe,GAAQ,QAAQ,MAAM,mBAAoBA,CAAG,CAAA,CACxD,EAEKC,EAAwB,IAAM,CAC9BX,EACFK,EAAA,EACSH,GAETP,IAAsBO,CAAS,EAC/BK,EAAA,GAEAH,EAAA,CAEJ,EAEMQ,EAAe,IAAM,CACzBN,EAAA,EACAV,IAAA,CACF,EAEA,OAAKY,EAeDL,EAEAU,EAAAA,KAAC,MAAA,CACC,UAAW,CAACC,UAAO,cAAehB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACpE,GAAGC,EAEJ,SAAA,CAAAgB,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,kBACrB,SAAAC,EAAAA,IAAC,OAAA,CACC,UAAW,CACTD,EAAAA,QAAO,mBACPA,UAAO,kBAAA,EACP,KAAK,GAAG,EAET,SAAAX,CAAA,CAAA,EAEL,EACAY,EAAAA,IAAC,SAAA,CACC,UAAWD,EAAAA,QAAO,YAClB,QAASP,EACT,aAAW,YAEX,SAAAQ,EAAAA,IAACC,EAAAA,EAAA,CAAE,KAAM,EAAA,CAAI,CAAA,CAAA,CACf,CAAA,CAAA,EAMJH,EAAAA,KAAC,MAAA,CACC,UAAW,CAACC,UAAO,cAAehB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACpE,GAAGC,EAGJ,SAAA,CAAAgB,EAAAA,IAAC,SAAA,CACC,UAAW,CACTD,EAAAA,QAAO,oBACP,CAACd,GAAe,CAACE,GAAaY,UAAO,uBAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG,EACX,QAASH,EACT,aACEX,EACI,iBACAE,EACE,iBACA,kBAGP,SAAAF,EACCe,EAAAA,IAACE,EAAAA,OAAA,CAAO,KAAM,GAAI,EAChBf,EACFa,EAAAA,IAACG,EAAAA,KAAA,CAAK,KAAM,GAAI,EAEhBH,EAAAA,IAACI,MAAA,CAAI,KAAM,EAAA,CAAI,CAAA,CAAA,EAKnBN,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAAA,QAAO,kBACrB,SAAA,CAAAC,MAAC,QAAK,UAAWD,EAAAA,QAAO,sBACrB,SAAAM,EAAAA,WAAWnB,CAAQ,EACtB,EACAc,EAAAA,IAAC,QAAK,UAAWD,EAAAA,QAAO,mBACrB,SAAAd,EACG,eACAE,EACE,kBACA,iBAAA,CACR,CAAA,EACF,EAGCF,GACCa,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAAA,QAAO,sBACrB,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,gBAAA,CAAkB,EACzCC,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,gBAAA,CAAkB,EACzCC,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,gBAAA,CAAkB,EACzCC,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,gBAAA,CAAkB,EACzCC,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,gBAAA,CAAkB,CAAA,EAC3C,GAIAd,GAAeE,IACfa,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,qBACrB,SAAAC,EAAAA,IAAC,SAAA,CACC,UAAWD,EAAAA,QAAO,YAClB,QAASF,EACT,aAAW,mBAEX,SAAAG,EAAAA,IAACC,EAAAA,EAAA,CAAE,KAAM,EAAA,CAAI,CAAA,CAAA,CACf,CACF,CAAA,CAAA,CAAA,EA1GFD,EAAAA,IAAC,MAAA,CACC,UAAW,CAACD,UAAO,cAAehB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACpE,GAAGC,EAEJ,SAAAgB,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,kBACrB,SAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAAA,QAAO,mBAAoB,SAAA,kDAAA,CAE5C,CAAA,CACF,CAAA,CAAA,CAsGR,EAEApB,EAAkB,YAAc"}
|
|
1
|
+
{"version":3,"file":"index129.cjs","sources":["../src/components/Chat/components/ChatSidebar.tsx"],"sourcesContent":["/**\n * ChatSidebar Component\n *\n * Sidebar with conversation history, search, and management actions.\n * Conversations are grouped by date (Today, Yesterday, Previous 7 days, etc.)\n */\n\nimport React, {\n useState,\n useCallback,\n useMemo,\n useRef,\n useEffect,\n} from \"react\";\nimport { Plus, Search, Trash2, MessageSquare, X } from \"lucide-react\";\nimport type { ChatSidebarProps, ChatConversation } from \"../Chat.types\";\nimport styles from \"../Chat.module.css\";\n\n// Date grouping types\ntype DateGroup = \"today\" | \"yesterday\" | \"previous7\" | \"previous30\" | \"older\";\n\nconst groupLabels: Record<DateGroup, string> = {\n today: \"Today\",\n yesterday: \"Yesterday\",\n previous7: \"Previous 7 days\",\n previous30: \"Previous 30 days\",\n older: \"Older\",\n};\n\n// Order of date groups for rendering\nconst groupOrder: DateGroup[] = [\n \"today\",\n \"yesterday\",\n \"previous7\",\n \"previous30\",\n \"older\",\n];\n\n// Get the date group for a given date\nconst getDateGroup = (date: Date): DateGroup => {\n const now = new Date();\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const diff =\n startOfToday.getTime() -\n new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n const days = diff / (1000 * 60 * 60 * 24);\n\n if (days < 1) return \"today\";\n if (days < 2) return \"yesterday\";\n if (days < 7) return \"previous7\";\n if (days < 30) return \"previous30\";\n return \"older\";\n};\n\n// Format date for display (shown on individual items)\nconst formatDate = (date: Date): string => {\n const group = getDateGroup(date);\n\n if (group === \"today\") {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n } else if (group === \"yesterday\") {\n return \"Yesterday\";\n } else if (group === \"previous7\") {\n return new Intl.DateTimeFormat(\"en-US\", {\n weekday: \"short\",\n }).format(date);\n } else {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }).format(date);\n }\n};\n\n// Group conversations by date\nconst groupConversationsByDate = (\n conversations: ChatConversation[],\n): Map<DateGroup, ChatConversation[]> => {\n const groups = new Map<DateGroup, ChatConversation[]>();\n\n // Initialize all groups\n groupOrder.forEach((group) => groups.set(group, []));\n\n // Sort and group conversations\n conversations.forEach((conv) => {\n const group = getDateGroup(conv.updatedAt);\n groups.get(group)?.push(conv);\n });\n\n return groups;\n};\n\nexport const ChatSidebar: React.FC<ChatSidebarProps> = ({\n conversations = [],\n activeConversationId,\n onSelectConversation,\n onNewConversation,\n onDeleteConversation,\n onSearch,\n header,\n footer,\n collapsed = false,\n onCollapsedChange,\n className,\n ...rest\n}) => {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const confirmTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n\n // Clear confirm timer on unmount\n useEffect(() => {\n return () => {\n if (confirmTimerRef.current) {\n clearTimeout(confirmTimerRef.current);\n }\n };\n }, []);\n\n // Filter conversations based on search\n const filteredConversations = useMemo(() => {\n if (!searchQuery.trim()) return conversations;\n\n const query = searchQuery.toLowerCase();\n return conversations.filter(\n (conv) =>\n conv.title.toLowerCase().includes(query) ||\n conv.preview?.toLowerCase().includes(query),\n );\n }, [conversations, searchQuery]);\n\n // Group filtered conversations by date\n const groupedConversations = useMemo(() => {\n return groupConversationsByDate(filteredConversations);\n }, [filteredConversations]);\n\n // Handle search input\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setSearchQuery(value);\n onSearch?.(value);\n },\n [onSearch],\n );\n\n // Handle conversation selection\n const handleSelectConversation = useCallback(\n (id: string) => {\n onSelectConversation?.(id);\n // Close sidebar on mobile after selection\n if (collapsed && onCollapsedChange) {\n onCollapsedChange(true);\n }\n },\n [onSelectConversation, collapsed, onCollapsedChange],\n );\n\n // Handle delete with inline confirmation\n const handleDelete = useCallback(\n (e: React.MouseEvent, id: string) => {\n e.stopPropagation();\n\n if (confirmDeleteId === id) {\n // Second click: actually delete\n onDeleteConversation?.(id);\n setConfirmDeleteId(null);\n if (confirmTimerRef.current) {\n clearTimeout(confirmTimerRef.current);\n }\n } else {\n // First click: show confirmation\n setConfirmDeleteId(id);\n // Auto-reset after 3 seconds\n if (confirmTimerRef.current) {\n clearTimeout(confirmTimerRef.current);\n }\n confirmTimerRef.current = setTimeout(() => {\n setConfirmDeleteId(null);\n }, 3000);\n }\n },\n [confirmDeleteId, onDeleteConversation],\n );\n\n // Check if there are any conversations to show\n const hasConversations = groupOrder.some(\n (group) => (groupedConversations.get(group)?.length ?? 0) > 0,\n );\n\n return (\n <>\n {/* Mobile overlay */}\n {!collapsed && (\n <div\n className={styles.sidebarOverlay}\n onClick={() => onCollapsedChange?.(true)}\n aria-hidden=\"true\"\n />\n )}\n\n <aside\n className={[\n styles.sidebar,\n collapsed && styles.sidebarCollapsed,\n !collapsed && styles.sidebarOpen,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n {...rest}\n >\n {/* Header */}\n <div className={styles.sidebarHeader}>\n {header || (\n <>\n <button\n className={[\n styles.inputButton,\n styles.inputButtonPrimary,\n styles.sidebarNewButton,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={onNewConversation}\n aria-label=\"New conversation\"\n >\n <span className={styles.sidebarNewButtonInner}>\n <Plus size={18} />\n <span>New Chat</span>\n </span>\n </button>\n\n {/* Mobile close button */}\n <button\n className={[styles.inputButton, styles.sidebarCloseButton].join(\n \" \",\n )}\n onClick={() => onCollapsedChange?.(true)}\n aria-label=\"Close sidebar\"\n >\n <X size={20} />\n </button>\n </>\n )}\n </div>\n\n {/* Search */}\n <div className={styles.sidebarSearch}>\n <div className={styles.sidebarSearchWrapper}>\n <Search size={16} className={styles.sidebarSearchIcon} />\n <input\n type=\"search\"\n className={[\n styles.sidebarSearchInput,\n styles.sidebarSearchInputWithIcon,\n ].join(\" \")}\n placeholder=\"Search conversations...\"\n value={searchQuery}\n onChange={handleSearchChange}\n aria-label=\"Search conversations\"\n />\n </div>\n </div>\n\n {/* Conversation list with date grouping */}\n <div\n className={styles.sidebarList}\n role=\"list\"\n aria-label=\"Conversations\"\n >\n {!hasConversations ? (\n <div className={styles.sidebarEmpty}>\n <MessageSquare size={32} className={styles.sidebarEmptyIcon} />\n <p>\n {searchQuery\n ? \"No conversations found\"\n : \"No conversations yet\"}\n </p>\n </div>\n ) : (\n groupOrder.map((group) => {\n const groupConvs = groupedConversations.get(group) ?? [];\n if (groupConvs.length === 0) return null;\n\n return (\n <div key={group}>\n <div className={styles.sidebarGroupHeader}>\n {groupLabels[group]}\n </div>\n {groupConvs.map((conversation) => (\n <button\n key={conversation.id}\n className={[\n styles.sidebarItem,\n conversation.id === activeConversationId &&\n styles.sidebarItemActive,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => handleSelectConversation(conversation.id)}\n role=\"listitem\"\n aria-selected={conversation.id === activeConversationId}\n aria-label={`Conversation: ${conversation.title}`}\n >\n <MessageSquare\n size={18}\n className={styles.sidebarItemIcon}\n />\n\n <div className={styles.sidebarItemContent}>\n <span className={styles.sidebarItemTitle}>\n {conversation.title}\n </span>\n {conversation.preview && (\n <span className={styles.sidebarItemPreview}>\n {conversation.preview}\n </span>\n )}\n </div>\n\n <span className={styles.sidebarItemDate}>\n {formatDate(conversation.updatedAt)}\n </span>\n\n {onDeleteConversation && (\n <button\n className={styles.sidebarItemDelete}\n onClick={(e) => handleDelete(e, conversation.id)}\n aria-label={\n confirmDeleteId === conversation.id\n ? `Confirm delete ${conversation.title}`\n : `Delete ${conversation.title}`\n }\n >\n {confirmDeleteId === conversation.id ? (\n <span className={styles.sidebarItemDeleteConfirm}>\n Delete?\n </span>\n ) : (\n <Trash2 size={16} />\n )}\n </button>\n )}\n </button>\n ))}\n </div>\n );\n })\n )}\n </div>\n\n {/* Footer */}\n {footer && <div className={styles.sidebarFooter}>{footer}</div>}\n </aside>\n </>\n );\n};\n\nChatSidebar.displayName = \"ChatSidebar\";\n"],"names":["groupLabels","groupOrder","getDateGroup","date","now","days","formatDate","group","groupConversationsByDate","conversations","groups","conv","ChatSidebar","activeConversationId","onSelectConversation","onNewConversation","onDeleteConversation","onSearch","header","footer","collapsed","onCollapsedChange","className","rest","searchQuery","setSearchQuery","useState","confirmDeleteId","setConfirmDeleteId","confirmTimerRef","useRef","useEffect","filteredConversations","useMemo","query","groupedConversations","handleSearchChange","useCallback","e","value","handleSelectConversation","id","handleDelete","hasConversations","jsxs","Fragment","jsx","styles","Plus","X","Search","groupConvs","conversation","MessageSquare","Trash2"],"mappings":"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"}
|