@composy/chat-core 0.0.1
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/README.md +123 -0
- package/dist/index.js +1868 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +1868 -0
- package/es/constants/dom.d.ts +41 -0
- package/es/constants/dom.d.ts.map +1 -0
- package/es/constants/dom.js +30 -0
- package/es/constants/dom.js.map +1 -0
- package/es/core/chat-manager.d.ts +34 -0
- package/es/core/chat-manager.d.ts.map +1 -0
- package/es/core/chat-manager.js +93 -0
- package/es/core/chat-manager.js.map +1 -0
- package/es/core/event-emitter.d.ts +48 -0
- package/es/core/event-emitter.d.ts.map +1 -0
- package/es/core/event-emitter.js +75 -0
- package/es/core/event-emitter.js.map +1 -0
- package/es/core/mention-engine.d.ts +41 -0
- package/es/core/mention-engine.d.ts.map +1 -0
- package/es/core/mention-engine.js +117 -0
- package/es/core/mention-engine.js.map +1 -0
- package/es/index.d.ts +28 -0
- package/es/index.d.ts.map +1 -0
- package/es/index.js +140 -0
- package/es/index.js.map +1 -0
- package/es/renderer/dom-renderer.d.ts +79 -0
- package/es/renderer/dom-renderer.d.ts.map +1 -0
- package/es/renderer/dom-renderer.js +677 -0
- package/es/renderer/dom-renderer.js.map +1 -0
- package/es/renderer/style-manager.d.ts +58 -0
- package/es/renderer/style-manager.d.ts.map +1 -0
- package/es/renderer/style-manager.js +641 -0
- package/es/renderer/style-manager.js.map +1 -0
- package/es/theme/theme-manager.d.ts +33 -0
- package/es/theme/theme-manager.d.ts.map +1 -0
- package/es/theme/theme-manager.js +70 -0
- package/es/theme/theme-manager.js.map +1 -0
- package/es/theme/tokens.d.ts +57 -0
- package/es/theme/tokens.d.ts.map +1 -0
- package/es/theme/tokens.js +108 -0
- package/es/theme/tokens.js.map +1 -0
- package/es/types/index.d.ts +204 -0
- package/es/types/index.d.ts.map +1 -0
- package/es/types/index.js +10 -0
- package/esm/constants/dom.d.ts +41 -0
- package/esm/constants/dom.d.ts.map +1 -0
- package/esm/constants/dom.js +30 -0
- package/esm/constants/dom.js.map +1 -0
- package/esm/core/chat-manager.d.ts +34 -0
- package/esm/core/chat-manager.d.ts.map +1 -0
- package/esm/core/chat-manager.js +93 -0
- package/esm/core/chat-manager.js.map +1 -0
- package/esm/core/event-emitter.d.ts +48 -0
- package/esm/core/event-emitter.d.ts.map +1 -0
- package/esm/core/event-emitter.js +75 -0
- package/esm/core/event-emitter.js.map +1 -0
- package/esm/core/mention-engine.d.ts +41 -0
- package/esm/core/mention-engine.d.ts.map +1 -0
- package/esm/core/mention-engine.js +117 -0
- package/esm/core/mention-engine.js.map +1 -0
- package/esm/index.d.ts +28 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +140 -0
- package/esm/index.js.map +1 -0
- package/esm/renderer/dom-renderer.d.ts +79 -0
- package/esm/renderer/dom-renderer.d.ts.map +1 -0
- package/esm/renderer/dom-renderer.js +677 -0
- package/esm/renderer/dom-renderer.js.map +1 -0
- package/esm/renderer/style-manager.d.ts +58 -0
- package/esm/renderer/style-manager.d.ts.map +1 -0
- package/esm/renderer/style-manager.js +641 -0
- package/esm/renderer/style-manager.js.map +1 -0
- package/esm/theme/theme-manager.d.ts +33 -0
- package/esm/theme/theme-manager.d.ts.map +1 -0
- package/esm/theme/theme-manager.js +70 -0
- package/esm/theme/theme-manager.js.map +1 -0
- package/esm/theme/tokens.d.ts +57 -0
- package/esm/theme/tokens.d.ts.map +1 -0
- package/esm/theme/tokens.js +108 -0
- package/esm/theme/tokens.js.map +1 -0
- package/esm/types/index.d.ts +204 -0
- package/esm/types/index.d.ts.map +1 -0
- package/esm/types/index.js +10 -0
- package/lib/constants/dom.cjs +36 -0
- package/lib/constants/dom.cjs.map +1 -0
- package/lib/constants/dom.d.ts +41 -0
- package/lib/constants/dom.d.ts.map +1 -0
- package/lib/core/chat-manager.cjs +94 -0
- package/lib/core/chat-manager.cjs.map +1 -0
- package/lib/core/chat-manager.d.ts +34 -0
- package/lib/core/chat-manager.d.ts.map +1 -0
- package/lib/core/event-emitter.cjs +76 -0
- package/lib/core/event-emitter.cjs.map +1 -0
- package/lib/core/event-emitter.d.ts +48 -0
- package/lib/core/event-emitter.d.ts.map +1 -0
- package/lib/core/mention-engine.cjs +118 -0
- package/lib/core/mention-engine.cjs.map +1 -0
- package/lib/core/mention-engine.d.ts +41 -0
- package/lib/core/mention-engine.d.ts.map +1 -0
- package/lib/index.cjs +160 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.d.ts +28 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/package.json +3 -0
- package/lib/renderer/dom-renderer.cjs +678 -0
- package/lib/renderer/dom-renderer.cjs.map +1 -0
- package/lib/renderer/dom-renderer.d.ts +79 -0
- package/lib/renderer/dom-renderer.d.ts.map +1 -0
- package/lib/renderer/style-manager.cjs +646 -0
- package/lib/renderer/style-manager.cjs.map +1 -0
- package/lib/renderer/style-manager.d.ts +58 -0
- package/lib/renderer/style-manager.d.ts.map +1 -0
- package/lib/theme/theme-manager.cjs +71 -0
- package/lib/theme/theme-manager.cjs.map +1 -0
- package/lib/theme/theme-manager.d.ts +33 -0
- package/lib/theme/theme-manager.d.ts.map +1 -0
- package/lib/theme/tokens.cjs +110 -0
- package/lib/theme/tokens.cjs.map +1 -0
- package/lib/theme/tokens.d.ts +57 -0
- package/lib/theme/tokens.d.ts.map +1 -0
- package/lib/types/index.cjs +11 -0
- package/lib/types/index.d.ts +204 -0
- package/lib/types/index.d.ts.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-renderer.js","names":["row"],"sources":["../../src/renderer/dom-renderer.ts"],"sourcesContent":["import type { ChatConfig, ChatMessage, MentionItem, MessageStatus } from '../types';\nimport { EventEmitter } from '../core/event-emitter';\nimport { MentionEngine } from '../core/mention-engine';\nimport { DEFAULT_CLASS_PREFIX, cx, normalizeClassPrefix } from '../constants/dom';\n\nconst SEND_ICON_SVG = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line><polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon></svg>';\nconst ICON_IMAGE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>';\nconst ICON_PAPERCLIP = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\"/></svg>';\nconst ICON_MIC = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/></svg>';\nconst ICON_MIC_OFF = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/><path d=\"M18.89 13.23A7.12 7.12 0 0 0 19 12v-2\"/><path d=\"M5 10v2a7 7 0 0 0 12 5.29\"/><path d=\"M15 9.34V5a3 3 0 0 0-5.68-1.33\"/><path d=\"M9 9v3a3 3 0 0 0 5.12 2.12\"/><line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/></svg>';\nconst FILE_ICON = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/></svg>';\n\nconst STATUS_MAP: Record<MessageStatus, string> = {\n sending: '...',\n sent: '✓',\n delivered: '✓✓',\n read: '✓✓',\n failed: '!',\n};\n\nexport class DOMRenderer {\n private container: HTMLElement;\n private config: ChatConfig;\n private emitter: EventEmitter;\n private mentionEngine: MentionEngine;\n private prefix: string;\n\n private root!: HTMLElement;\n private messageListEl!: HTMLElement;\n private inputArea: HTMLElement | null = null;\n private textareaEl: HTMLTextAreaElement | null = null;\n private sendBtn: HTMLButtonElement | null = null;\n private mentionPanel: HTMLElement | null = null;\n private loadMoreEl: HTMLElement | null = null;\n private toolbarEl: HTMLElement | null = null;\n private dropOverlay: HTMLElement | null = null;\n private voiceBtn: HTMLElement | null = null;\n private loadingMore = false;\n private isRecording = false;\n private recognition: any = null;\n private lastVoiceTranscript = '';\n\n constructor(\n container: HTMLElement,\n config: ChatConfig,\n emitter: EventEmitter,\n mentionEngine: MentionEngine,\n ) {\n this.container = container;\n this.config = config;\n this.emitter = emitter;\n this.mentionEngine = mentionEngine;\n this.prefix = normalizeClassPrefix(config.classPrefix ?? DEFAULT_CLASS_PREFIX);\n }\n\n init(): void {\n this.container.innerHTML = '';\n this.root = this.el('div', `${this.prefix}-container`);\n this.messageListEl = this.el('div', `${this.prefix}-message-list`);\n this.root.appendChild(this.messageListEl);\n\n if (this.config.showInput !== false) {\n this.renderInputArea();\n }\n\n this.container.appendChild(this.root);\n this.setupEventListeners();\n }\n\n updateMessageContent(id: string, content: string): void {\n const rowEl = this.messageListEl.querySelector(`[data-msg-id=\"${this.escapeAttr(id)}\"]`) as HTMLElement | null;\n const bubble = rowEl?.querySelector(`.${this.prefix}-bubble`) as HTMLElement | null;\n if (!bubble) return;\n bubble.innerHTML = this.renderTextContent(content);\n }\n\n renderMessages(messages: ChatMessage[]): void {\n this.messageListEl.innerHTML = '';\n\n if (this.config.enableLoadMore) {\n this.renderLoadMoreButton();\n }\n\n if (messages.length === 0) {\n this.renderEmpty();\n return;\n }\n\n let lastTimestamp = 0;\n const interval = this.config.timeGroupInterval ?? 300000;\n for (const message of messages) {\n if (this.config.showTimestamp !== false && message.timestamp - lastTimestamp > interval) {\n this.renderTimeDivider(message.timestamp);\n lastTimestamp = message.timestamp;\n }\n this.renderMessageRow(message);\n }\n }\n\n appendMessage(message: ChatMessage): void {\n this.removeEmpty();\n const messageEls = this.getMessageElements();\n const lastTime = messageEls.length > 0\n ? Number.parseInt(messageEls[messageEls.length - 1].dataset.timestamp ?? '0', 10)\n : 0;\n const interval = this.config.timeGroupInterval ?? 300000;\n\n if (this.config.showTimestamp !== false && message.timestamp - lastTime > interval) {\n this.renderTimeDivider(message.timestamp);\n }\n\n this.renderMessageRow(message);\n }\n\n prependMessages(messages: ChatMessage[]): void {\n if (!messages.length) return;\n this.removeEmpty();\n\n const scrollHeight = this.messageListEl.scrollHeight;\n const scrollTop = this.messageListEl.scrollTop;\n const fragment = document.createDocumentFragment();\n let lastTimestamp = 0;\n const interval = this.config.timeGroupInterval ?? 300000;\n\n for (const message of messages) {\n if (this.config.showTimestamp !== false && message.timestamp - lastTimestamp > interval) {\n fragment.appendChild(this.createTimeDivider(message.timestamp));\n lastTimestamp = message.timestamp;\n }\n fragment.appendChild(this.createMessageRow(message));\n }\n\n const firstMessage = this.messageListEl.querySelector(`.${this.prefix}-message-row, .${this.prefix}-time-divider`);\n if (firstMessage) {\n firstMessage.before(fragment);\n } else if (this.loadMoreEl) {\n this.loadMoreEl.after(fragment);\n } else {\n this.messageListEl.appendChild(fragment);\n }\n\n this.messageListEl.scrollTop = scrollTop + (this.messageListEl.scrollHeight - scrollHeight);\n }\n\n updateMessage(id: string, message: ChatMessage): void {\n const rowEl = this.messageListEl.querySelector(`[data-msg-id=\"${this.escapeAttr(id)}\"]`);\n if (!rowEl) return;\n rowEl.replaceWith(this.createMessageRow(message));\n }\n\n removeMessage(id: string): void {\n this.messageListEl.querySelector(`[data-msg-id=\"${this.escapeAttr(id)}\"]`)?.remove();\n if (this.getMessageElements().length === 0) {\n this.renderEmpty();\n }\n }\n\n scrollToBottom(smooth = true): void {\n if (typeof this.messageListEl.scrollTo === 'function') {\n this.messageListEl.scrollTo({\n top: this.messageListEl.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n return;\n }\n this.messageListEl.scrollTop = this.messageListEl.scrollHeight;\n }\n\n isAtBottom(threshold = 4): boolean {\n const distance = this.messageListEl.scrollHeight - this.messageListEl.scrollTop - this.messageListEl.clientHeight;\n return distance <= threshold;\n }\n\n setLoadingMore(loading: boolean): void {\n this.loadingMore = loading;\n if (!this.loadMoreEl) return;\n this.loadMoreEl.textContent = loading ? '加载中...' : (this.config.loadMoreText ?? '加载更多');\n this.loadMoreEl.classList.toggle(`${this.prefix}-load-more--loading`, loading);\n }\n\n focusInput(): void {\n this.textareaEl?.focus();\n }\n\n setInputContent(content: string): void {\n if (!this.textareaEl) return;\n this.textareaEl.value = this.limitInput(content);\n this.autoResize();\n this.updateSendButtonState();\n this.config.onInputChange?.(this.textareaEl.value);\n }\n\n getInputContent(): string {\n return this.textareaEl?.value ?? '';\n }\n\n clearInput(): void {\n this.setInputContent('');\n }\n\n renderMentionPanel(members: MentionItem[], activeIndex: number): void {\n if (!this.mentionPanel) return;\n\n if (members.length === 0) {\n this.mentionPanel.style.display = 'none';\n return;\n }\n\n this.mentionPanel.style.display = 'block';\n this.mentionPanel.innerHTML = '';\n\n members.forEach((member, index) => {\n const item = this.el(\n 'div',\n cx(`${this.prefix}-mention-item`, index === activeIndex && `${this.prefix}-mention-item--active`),\n );\n item.setAttribute('role', 'option');\n item.setAttribute('aria-selected', String(index === activeIndex));\n\n const avatar = this.el('div', `${this.prefix}-mention-item-avatar`);\n if (member.avatar) {\n const img = document.createElement('img');\n img.src = member.avatar;\n img.alt = '';\n avatar.appendChild(img);\n } else {\n avatar.textContent = member.name[0]?.toUpperCase() ?? '';\n }\n item.appendChild(avatar);\n\n const name = this.el('span', `${this.prefix}-mention-item-name`);\n name.textContent = member.name;\n item.appendChild(name);\n\n item.addEventListener('click', () => {\n this.mentionEngine.select(index);\n });\n\n this.mentionPanel?.appendChild(item);\n });\n }\n\n hideMentionPanel(): void {\n if (this.mentionPanel) {\n this.mentionPanel.style.display = 'none';\n }\n }\n\n destroy(): void {\n this.stopVoice();\n this.container.innerHTML = '';\n }\n\n private renderInputArea(): void {\n this.inputArea = this.el('div', `${this.prefix}-input-area`);\n const wrapper = this.el('div', `${this.prefix}-input-wrapper`);\n\n this.mentionPanel = this.el('div', `${this.prefix}-mention-panel`);\n this.mentionPanel.style.display = 'none';\n this.mentionPanel.setAttribute('role', 'listbox');\n wrapper.appendChild(this.mentionPanel);\n\n if (this.config.enableToolbar !== false) {\n this.renderToolbar(wrapper);\n }\n\n this.textareaEl = document.createElement('textarea');\n this.textareaEl.className = `${this.prefix}-textarea`;\n this.textareaEl.placeholder = this.config.inputPlaceholder ?? '输入消息...';\n this.textareaEl.rows = 1;\n if (this.config.maxInputLength && this.config.maxInputLength > 0) {\n this.textareaEl.maxLength = this.config.maxInputLength;\n }\n wrapper.appendChild(this.textareaEl);\n\n this.dropOverlay = this.el('div', `${this.prefix}-drop-overlay`);\n this.dropOverlay.innerHTML = '<span>拖放文件到这里</span>';\n this.dropOverlay.style.display = 'none';\n wrapper.appendChild(this.dropOverlay);\n\n this.inputArea.appendChild(wrapper);\n\n this.sendBtn = document.createElement('button');\n this.sendBtn.className = `${this.prefix}-send-btn`;\n this.sendBtn.innerHTML = SEND_ICON_SVG;\n this.sendBtn.title = '发送';\n this.sendBtn.type = 'button';\n this.sendBtn.disabled = true;\n this.inputArea.appendChild(this.sendBtn);\n\n this.root.appendChild(this.inputArea);\n }\n\n private renderToolbar(wrapper: HTMLElement): void {\n const toolbar = this.config.toolbarConfig ?? {};\n this.toolbarEl = this.el('div', `${this.prefix}-toolbar`);\n\n if (toolbar.image !== false) {\n const imageBtn = this.createToolbarBtn(ICON_IMAGE, '插入图片');\n imageBtn.addEventListener('click', () => this.openFilePicker('image/*'));\n this.toolbarEl.appendChild(imageBtn);\n }\n\n if (toolbar.file !== false) {\n const fileBtn = this.createToolbarBtn(ICON_PAPERCLIP, '插入文件');\n fileBtn.addEventListener('click', () => this.openFilePicker('*/*'));\n this.toolbarEl.appendChild(fileBtn);\n }\n\n if (toolbar.voice !== false) {\n this.voiceBtn = this.createToolbarBtn(ICON_MIC, '语音输入');\n this.voiceBtn.addEventListener('click', () => this.toggleVoice());\n this.toolbarEl.appendChild(this.voiceBtn);\n }\n\n wrapper.insertBefore(this.toolbarEl, wrapper.firstChild);\n }\n\n private createToolbarBtn(iconSvg: string, title: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = `${this.prefix}-toolbar-btn`;\n btn.innerHTML = iconSvg;\n btn.title = title;\n btn.type = 'button';\n return btn;\n }\n\n private openFilePicker(accept: string): void {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept;\n input.multiple = true;\n input.style.display = 'none';\n input.addEventListener('change', () => {\n const files = Array.from(input.files ?? []);\n input.remove();\n if (!files.length) return;\n const isImage = accept.startsWith('image');\n this.emitter.emit(isImage ? 'toolbar-image' : 'toolbar-file', files);\n if (isImage) {\n this.config.onImageUpload?.(files);\n } else {\n this.config.onFileUpload?.(files);\n }\n });\n document.body.appendChild(input);\n input.click();\n }\n\n private toggleVoice(): void {\n if (this.isRecording) {\n this.stopVoice();\n } else {\n this.startVoice();\n }\n }\n\n private startVoice(): void {\n if (typeof window === 'undefined') return;\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n if (!SpeechRecognition) {\n this.emitter.emit('toolbar-voice-unsupported');\n this.config.onVoiceUnsupported?.();\n return;\n }\n\n try {\n this.lastVoiceTranscript = '';\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = false;\n this.recognition.interimResults = true;\n this.recognition.lang = this.config.voiceLang ?? 'zh-CN';\n\n this.recognition.onresult = (event: any) => {\n let transcript = '';\n for (let i = 0; i < event.results.length; i++) {\n transcript += event.results[i][0].transcript;\n }\n this.lastVoiceTranscript = transcript;\n const lastResult = event.results[event.results.length - 1];\n if (lastResult?.isFinal && this.textareaEl) {\n this.insertTextAtCursor(transcript);\n }\n };\n\n this.recognition.onend = () => {\n this.finishVoice();\n this.emitter.emit('toolbar-voice-end', this.lastVoiceTranscript);\n this.config.onVoiceEnd?.(this.lastVoiceTranscript);\n };\n\n this.recognition.onerror = (error: unknown) => {\n this.finishVoice();\n this.emitter.emit('toolbar-voice-error', error);\n this.config.onVoiceError?.(error);\n };\n\n this.isRecording = true;\n this.voiceBtn?.classList.add(`${this.prefix}-toolbar-btn--active`);\n if (this.voiceBtn) this.voiceBtn.innerHTML = ICON_MIC_OFF;\n this.recognition.start();\n this.emitter.emit('toolbar-voice-start');\n this.config.onVoiceStart?.();\n } catch (error) {\n this.finishVoice();\n this.emitter.emit('toolbar-voice-error', error);\n this.config.onVoiceError?.(error);\n }\n }\n\n private stopVoice(): void {\n if (!this.recognition) return;\n const recognition = this.recognition;\n this.recognition = null;\n try {\n recognition.stop();\n } catch {\n this.finishVoice();\n }\n }\n\n private finishVoice(): void {\n this.isRecording = false;\n this.recognition = null;\n this.voiceBtn?.classList.remove(`${this.prefix}-toolbar-btn--active`);\n if (this.voiceBtn) this.voiceBtn.innerHTML = ICON_MIC;\n }\n\n private setupEventListeners(): void {\n if (this.textareaEl) {\n this.textareaEl.addEventListener('input', () => {\n const limited = this.limitInput(this.textareaEl?.value ?? '');\n if (this.textareaEl && limited !== this.textareaEl.value) {\n this.textareaEl.value = limited;\n }\n this.autoResize();\n this.updateSendButtonState();\n this.config.onInputChange?.(this.textareaEl?.value ?? '');\n if (this.config.enableMention && this.textareaEl) {\n this.mentionEngine.handleInput(this.textareaEl.value, this.textareaEl.selectionStart);\n }\n });\n\n this.textareaEl.addEventListener('keydown', (event) => {\n const mentionState = this.mentionEngine.getState();\n\n if (mentionState.active) {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.mentionEngine.moveUp();\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.mentionEngine.moveDown();\n } else if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n const member = this.mentionEngine.selectCurrent();\n if (member) this.insertMention(member);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.mentionEngine.deactivate();\n }\n return;\n }\n\n if (this.config.enterToSend !== false && event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.handleSend();\n }\n });\n\n this.textareaEl.addEventListener('paste', (event) => {\n const items = event.clipboardData?.items;\n if (!items) return;\n const files: File[] = [];\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n if (file) files.push(file);\n }\n }\n if (files.length > 0) {\n event.preventDefault();\n this.emitter.emit('toolbar-paste', files);\n this.config.onPaste?.(files);\n }\n });\n }\n\n if (this.inputArea) {\n const wrapper = this.inputArea.querySelector(`.${this.prefix}-input-wrapper`) as HTMLElement | null;\n if (wrapper) this.setupDropEvents(wrapper);\n }\n\n this.sendBtn?.addEventListener('click', () => {\n this.handleSend();\n });\n\n this.emitter.on('mention-filter', (state: { filtered: MentionItem[]; activeIndex: number }) => {\n this.renderMentionPanel(state.filtered, state.activeIndex);\n });\n this.emitter.on('mention-active-change', (index: number) => {\n const items = this.mentionPanel?.querySelectorAll(`.${this.prefix}-mention-item`);\n items?.forEach((el, i) => {\n el.classList.toggle(`${this.prefix}-mention-item--active`, i === index);\n el.setAttribute('aria-selected', String(i === index));\n });\n });\n this.emitter.on('mention-deactivate', () => {\n this.hideMentionPanel();\n });\n }\n\n private setupDropEvents(wrapper: HTMLElement): void {\n let dragCounter = 0;\n wrapper.addEventListener('dragenter', (event) => {\n event.preventDefault();\n dragCounter++;\n if (this.dropOverlay) this.dropOverlay.style.display = 'flex';\n });\n wrapper.addEventListener('dragleave', (event) => {\n event.preventDefault();\n dragCounter--;\n if (dragCounter <= 0) {\n dragCounter = 0;\n if (this.dropOverlay) this.dropOverlay.style.display = 'none';\n }\n });\n wrapper.addEventListener('dragover', (event) => {\n event.preventDefault();\n });\n wrapper.addEventListener('drop', (event) => {\n event.preventDefault();\n dragCounter = 0;\n if (this.dropOverlay) this.dropOverlay.style.display = 'none';\n const files = Array.from(event.dataTransfer?.files ?? []);\n if (files.length > 0) {\n this.emitter.emit('toolbar-drop', files);\n this.config.onDrop?.(files);\n }\n });\n }\n\n private handleSend(): void {\n const rawContent = this.textareaEl?.value ?? '';\n const content = rawContent.trim();\n if (!content) return;\n\n const mentions = this.mentionEngine.parseMentions(content);\n this.emitter.emit('send', content, mentions);\n this.config.onSend?.(content, mentions);\n\n if (this.config.clearInputOnSend !== false) {\n this.clearInput();\n }\n this.mentionEngine.resetSelected();\n }\n\n private insertMention(member: MentionItem): void {\n if (!this.textareaEl) return;\n const state = this.mentionEngine.getState();\n const text = this.textareaEl.value;\n const pos = this.textareaEl.selectionStart;\n const insertText = this.mentionEngine.getInsertText(member);\n\n const before = text.slice(0, state.triggerPosition);\n const after = text.slice(pos);\n this.textareaEl.value = this.limitInput(before + insertText + after);\n const newPos = Math.min(before.length + insertText.length, this.textareaEl.value.length);\n this.textareaEl.setSelectionRange(newPos, newPos);\n this.textareaEl.focus();\n this.autoResize();\n this.updateSendButtonState();\n this.config.onInputChange?.(this.textareaEl.value);\n }\n\n private insertTextAtCursor(text: string): void {\n if (!this.textareaEl) return;\n const current = this.textareaEl.value;\n const start = this.textareaEl.selectionStart;\n const end = this.textareaEl.selectionEnd;\n this.textareaEl.value = this.limitInput(current.slice(0, start) + text + current.slice(end));\n const nextCursor = Math.min(start + text.length, this.textareaEl.value.length);\n this.textareaEl.setSelectionRange(nextCursor, nextCursor);\n this.autoResize();\n this.updateSendButtonState();\n this.config.onInputChange?.(this.textareaEl.value);\n }\n\n private autoResize(): void {\n if (!this.textareaEl) return;\n this.textareaEl.style.height = 'auto';\n const maxHeight = this.getCssSizeValue('--ldesign-chat-textarea-max-height', 120);\n this.textareaEl.style.height = `${Math.min(this.textareaEl.scrollHeight, maxHeight)}px`;\n }\n\n private updateSendButtonState(): void {\n if (!this.sendBtn) return;\n this.sendBtn.disabled = !this.getInputContent().trim();\n }\n\n private renderLoadMoreButton(): void {\n this.loadMoreEl = this.el('div', `${this.prefix}-load-more`);\n this.loadMoreEl.textContent = this.config.loadMoreText ?? '加载更多';\n this.loadMoreEl.addEventListener('click', () => {\n if (this.loadingMore) return;\n this.setLoadingMore(true);\n this.emitter.emit('load-more');\n Promise.resolve(this.config.onLoadMore?.()).finally(() => {\n this.setLoadingMore(false);\n });\n });\n this.messageListEl.appendChild(this.loadMoreEl);\n }\n\n private renderTimeDivider(timestamp: number): void {\n this.messageListEl.appendChild(this.createTimeDivider(timestamp));\n }\n\n private createTimeDivider(timestamp: number): HTMLElement {\n const divider = this.el('div', `${this.prefix}-time-divider`);\n const span = document.createElement('span');\n span.textContent = this.formatTime(timestamp);\n divider.appendChild(span);\n return divider;\n }\n\n private renderMessageRow(message: ChatMessage): void {\n this.messageListEl.appendChild(this.createMessageRow(message));\n }\n\n private createMessageRow(message: ChatMessage): HTMLElement {\n const p = this.prefix;\n\n if (message.type === 'system') {\n const row = this.el('div', cx(`${p}-message-row`, `${p}-message-row--system`));\n row.dataset.msgId = message.id;\n row.dataset.timestamp = String(message.timestamp);\n const system = this.el('div', `${p}-system-message`);\n system.textContent = message.content ?? '';\n row.appendChild(system);\n return row;\n }\n\n const isOutgoing = message.direction === 'outgoing';\n const row = this.el('div', cx(`${p}-message-row`, isOutgoing && `${p}-message-row--outgoing`));\n row.dataset.msgId = message.id;\n row.dataset.timestamp = String(message.timestamp);\n\n if (this.config.showAvatar !== false) {\n row.appendChild(this.createAvatar(message.sender.nickname, message.sender.avatar));\n }\n\n const body = this.el('div', `${p}-message-body`);\n if (this.config.showNickname !== false && !isOutgoing) {\n const nickname = this.el('div', `${p}-nickname`);\n nickname.textContent = message.sender.nickname;\n body.appendChild(nickname);\n }\n\n body.appendChild(this.createBubble(message, isOutgoing));\n body.appendChild(this.createMessageFooter(message, isOutgoing));\n row.appendChild(body);\n\n row.addEventListener('click', () => {\n this.emitter.emit('message-click', message);\n this.config.onMessageClick?.(message);\n });\n\n return row;\n }\n\n private createAvatar(name: string, avatarUrl?: string): HTMLElement {\n const avatar = this.el('div', `${this.prefix}-avatar`);\n if (avatarUrl) {\n const img = document.createElement('img');\n img.src = avatarUrl;\n img.alt = name;\n avatar.appendChild(img);\n } else {\n avatar.textContent = name[0]?.toUpperCase() ?? '';\n }\n return avatar;\n }\n\n private createMessageFooter(message: ChatMessage, isOutgoing: boolean): HTMLElement {\n const footer = this.el('div', `${this.prefix}-message-footer`);\n if (this.config.showTimestamp !== false) {\n const time = this.el('span', `${this.prefix}-timestamp`);\n time.textContent = this.formatShortTime(message.timestamp);\n footer.appendChild(time);\n }\n if (this.config.showStatus !== false && isOutgoing && message.status) {\n const status = this.el('span', cx(`${this.prefix}-status`, `${this.prefix}-status--${message.status}`));\n status.textContent = STATUS_MAP[message.status] ?? '';\n if (message.status === 'failed') {\n status.addEventListener('click', (event) => {\n event.stopPropagation();\n this.emitter.emit('message-retry', message);\n });\n }\n footer.appendChild(status);\n }\n return footer;\n }\n\n private createBubble(message: ChatMessage, isOutgoing: boolean): HTMLElement {\n const p = this.prefix;\n const dirClass = isOutgoing ? `${p}-bubble--outgoing` : `${p}-bubble--incoming`;\n\n if (message.revoked) {\n const bubble = this.el('div', cx(`${p}-bubble`, dirClass, `${p}-bubble--revoked`));\n bubble.textContent = '消息已撤回';\n return bubble;\n }\n\n switch (message.type) {\n case 'image': {\n const bubble = this.el('div', cx(`${p}-bubble`, dirClass, `${p}-bubble--image`));\n if (message.image) {\n const img = document.createElement('img');\n img.src = message.image.thumbUrl ?? message.image.url;\n img.alt = message.content ?? '';\n if (message.image.width) img.width = Math.min(message.image.width, 240);\n bubble.appendChild(img);\n }\n return bubble;\n }\n\n case 'file': {\n const bubble = this.el('div', cx(`${p}-bubble`, dirClass, `${p}-bubble--file`));\n const icon = this.el('div', `${p}-file-icon`);\n icon.innerHTML = FILE_ICON;\n bubble.appendChild(icon);\n\n const info = this.el('div', `${p}-file-info`);\n const name = this.el('div', `${p}-file-name`);\n name.textContent = message.file?.name ?? 'file';\n info.appendChild(name);\n\n if (message.file?.size) {\n const size = this.el('div', `${p}-file-size`);\n size.textContent = this.formatFileSize(message.file.size);\n info.appendChild(size);\n }\n bubble.appendChild(info);\n return bubble;\n }\n\n case 'custom': {\n const bubble = this.el('div', cx(`${p}-bubble`, dirClass));\n if (message.customHtml) {\n bubble.innerHTML = message.customHtml;\n } else {\n bubble.textContent = message.content ?? '';\n }\n return bubble;\n }\n\n default: {\n const bubble = this.el('div', cx(`${p}-bubble`, dirClass, message.streaming && `${p}-bubble--streaming`));\n bubble.innerHTML = this.renderTextContent(message.content ?? '', message.mentions);\n return bubble;\n }\n }\n }\n\n private renderTextContent(content: string, mentions?: MentionItem[]): string {\n let html = this.escapeHtml(content);\n\n if (mentions?.length) {\n for (const mention of mentions) {\n const tag = `<span class=\"${this.prefix}-mention-tag\" data-mention-id=\"${this.escapeAttr(mention.id)}\">@${this.escapeHtml(mention.name)}</span>`;\n html = html.replace(new RegExp(`@${this.escapeRegex(mention.name)}`, 'g'), tag);\n }\n }\n\n return html.replace(\n /(https?:\\/\\/[^\\s<]+)/g,\n `<a class=\"${this.prefix}-link\" href=\"$1\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>`,\n );\n }\n\n private renderEmpty(): void {\n if (this.messageListEl.querySelector(`.${this.prefix}-empty`)) return;\n const empty = this.el('div', `${this.prefix}-empty`);\n empty.textContent = '暂无消息';\n this.messageListEl.appendChild(empty);\n }\n\n private removeEmpty(): void {\n this.messageListEl.querySelector(`.${this.prefix}-empty`)?.remove();\n }\n\n private el(tag: string, className: string): HTMLElement {\n const el = document.createElement(tag);\n el.className = className;\n return el;\n }\n\n private getMessageElements(): HTMLElement[] {\n return Array.from(this.messageListEl.querySelectorAll<HTMLElement>(`.${this.prefix}-message-row`));\n }\n\n private formatTime(timestamp: number): string {\n if (this.config.formatTime) return this.config.formatTime(timestamp);\n const date = new Date(timestamp);\n const now = new Date();\n const isToday = date.toDateString() === now.toDateString();\n if (isToday) {\n return date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' });\n }\n return date.toLocaleDateString('zh-CN', {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n\n private formatShortTime(timestamp: number): string {\n return new Date(timestamp).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' });\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n private limitInput(content: string): string {\n const max = this.config.maxInputLength;\n if (!max || max <= 0) return content;\n return content.slice(0, max);\n }\n\n private getCssSizeValue(name: string, fallback: number): number {\n if (typeof window === 'undefined' || !this.root) return fallback;\n const value = window.getComputedStyle(this.root).getPropertyValue(name).trim();\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n\n private escapeHtml(str: string): string {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n private escapeAttr(str: string): string {\n return str\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file style-manager.ts
|
|
3
|
+
* @description style-manager 模块
|
|
4
|
+
*/
|
|
5
|
+
import type { ThemeTokens } from '../theme/tokens';
|
|
6
|
+
import { cx } from '../constants/dom';
|
|
7
|
+
/**
|
|
8
|
+
* injectStyles 函数
|
|
9
|
+
* @param tokens - 参数
|
|
10
|
+
* @param prefix - 参数
|
|
11
|
+
* @returns 返回值
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* injectStyles - inject Styles function
|
|
15
|
+
* @param tokens - 参数说明
|
|
16
|
+
* @param prefix - 参数说明
|
|
17
|
+
* @returns 返回值说明
|
|
18
|
+
*/
|
|
19
|
+
export declare function injectStyles(tokens: ThemeTokens, prefix?: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* updateStyles 函数
|
|
22
|
+
* @param tokens - 参数
|
|
23
|
+
* @param prefix - 参数
|
|
24
|
+
* @returns 返回值
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* updateStyles - update Styles function
|
|
28
|
+
* @param tokens - 参数说明
|
|
29
|
+
* @param prefix - 参数说明
|
|
30
|
+
* @returns 返回值说明
|
|
31
|
+
*/
|
|
32
|
+
export declare function updateStyles(tokens: ThemeTokens, prefix?: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* removeStyles 函数
|
|
35
|
+
* @param prefix - 参数
|
|
36
|
+
* @returns 返回值
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* removeStyles - remove Styles function
|
|
40
|
+
* @param prefix - 参数说明
|
|
41
|
+
* @returns 返回值说明
|
|
42
|
+
*/
|
|
43
|
+
export declare function removeStyles(prefix?: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* cls 函数
|
|
46
|
+
* @param prefix - 参数
|
|
47
|
+
* @param ...parts - 参数
|
|
48
|
+
* @returns 返回值
|
|
49
|
+
*/
|
|
50
|
+
/**
|
|
51
|
+
* cls - cls function
|
|
52
|
+
* @param prefix - 参数说明
|
|
53
|
+
* @param ...parts - 参数说明
|
|
54
|
+
* @returns 返回值说明
|
|
55
|
+
*/
|
|
56
|
+
export declare function cls(prefix: string, ...parts: string[]): string;
|
|
57
|
+
export declare const clsx: typeof cx;
|
|
58
|
+
//# sourceMappingURL=style-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-manager.d.ts","sourceRoot":"","sources":["../../src/renderer/style-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAGL,EAAE,EAGH,MAAM,kBAAkB,CAAC;AAI1B;;;;;GAKG;AACH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,MAA6B,GAAG,IAAI,CAK7F;AAED;;;;;GAKG;AACH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,MAA6B,GAAG,IAAI,CAI7F;AAED;;;;GAIG;AACH;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,MAA6B,GAAG,IAAI,CAUxE;AAED;;;;;GAKG;AACH;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAG9D;AAED,eAAO,MAAM,IAAI,WAAK,CAAC"}
|