@templmf/temp-solf-lmf 0.0.53 → 0.0.55

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 (87) hide show
  1. package/guanwang/README.md +95 -0
  2. package/guanwang/docs/changelog.md +145 -0
  3. package/guanwang/docs/doc-maintenance.md +229 -0
  4. package/guanwang/docs/product.md +181 -0
  5. package/guanwang/docs/test-cases.md +395 -0
  6. package/guanwang/docs/usage.md +291 -0
  7. package/guanwang/env.example +27 -0
  8. package/guanwang/index.html +13 -0
  9. package/guanwang/package-lock.json +3825 -0
  10. package/guanwang/package.json +32 -0
  11. package/guanwang/public/favicon.svg +4 -0
  12. package/guanwang/public/react-runtime/babel.min.js +4 -0
  13. package/guanwang/public/react-runtime/react-dom.min.js +267 -0
  14. package/guanwang/public/react-runtime/react.min.js +31 -0
  15. package/guanwang/public/vue-repl-assets/compiler-sfc.esm-browser.js +50795 -0
  16. package/guanwang/public/vue-repl-assets/runtime-dom.esm-browser.js +12758 -0
  17. package/guanwang/public/vue-repl-assets/server-renderer.esm-browser.js +8600 -0
  18. package/guanwang/public/vue-repl-assets/vue.esm-browser.js +18672 -0
  19. package/guanwang/src/App.vue +61 -0
  20. package/guanwang/src/chat-sdk/core/components/ChatBox.vue +305 -0
  21. package/guanwang/src/chat-sdk/core/components/ChatSidebar.vue +84 -0
  22. package/guanwang/src/chat-sdk/core/components/InputBar.vue +354 -0
  23. package/guanwang/src/chat-sdk/core/components/MessageBubble.vue +703 -0
  24. package/guanwang/src/chat-sdk/core/useTheme.js +31 -0
  25. package/guanwang/src/chat-sdk/features/artifact/ArtifactCard.vue +172 -0
  26. package/guanwang/src/chat-sdk/features/artifact/ArtifactPanel.vue +963 -0
  27. package/guanwang/src/chat-sdk/features/artifact/index.js +13 -0
  28. package/guanwang/src/chat-sdk/features/artifact/useArtifactStore.js +275 -0
  29. package/guanwang/src/chat-sdk/features/codepreview/CodePreview.vue +523 -0
  30. package/guanwang/src/chat-sdk/features/codepreview/index.js +7 -0
  31. package/guanwang/src/chat-sdk/features/markdown/index.js +13 -0
  32. package/guanwang/src/chat-sdk/features/markdown/useMarkdown.js +724 -0
  33. package/guanwang/src/chat-sdk/features/mermaid/MermaidZoom.vue +254 -0
  34. package/guanwang/src/chat-sdk/features/upload/FileAttachment.vue +142 -0
  35. package/guanwang/src/chat-sdk/features/upload/index.js +17 -0
  36. package/guanwang/src/chat-sdk/features/upload/useFileHandler.js +336 -0
  37. package/guanwang/src/chat-sdk/headless/api/adapters/openai.js +76 -0
  38. package/guanwang/src/chat-sdk/headless/api/chatApi.js +126 -0
  39. package/guanwang/src/chat-sdk/headless/buildSystemPrompt.js +351 -0
  40. package/guanwang/src/chat-sdk/headless/index.js +15 -0
  41. package/guanwang/src/chat-sdk/headless/useChat.js +77 -0
  42. package/guanwang/src/chat-sdk/headless/useChatDB.js +147 -0
  43. package/guanwang/src/chat-sdk/headless/useChatStore.js +529 -0
  44. package/guanwang/src/chat-sdk/index.js +79 -0
  45. package/guanwang/src/chat-sdk/modes/architect.js +27 -0
  46. package/guanwang/src/chat-sdk/modes/ask.js +26 -0
  47. package/guanwang/src/chat-sdk/modes/code.js +25 -0
  48. package/guanwang/src/chat-sdk/modes/index.js +36 -0
  49. package/guanwang/src/chat-sdk/modes/requirements.js +175 -0
  50. package/guanwang/src/chat-sdk/settings/SettingsPanel.vue +170 -0
  51. package/guanwang/src/chat-sdk/settings/index.js +9 -0
  52. package/guanwang/src/chat-sdk/settings/useSettings.js +122 -0
  53. package/guanwang/src/chat-sdk/tools/defaults.js +89 -0
  54. package/guanwang/src/chat-sdk/tools/index.js +16 -0
  55. package/guanwang/src/chat-sdk/tools/parser.js +116 -0
  56. package/guanwang/src/components/CustomCursor.vue +69 -0
  57. package/guanwang/src/components/Footer.vue +24 -0
  58. package/guanwang/src/components/LoginModal.vue +109 -0
  59. package/guanwang/src/components/Navbar.vue +193 -0
  60. package/guanwang/src/components/ThemeToggle.vue +25 -0
  61. package/guanwang/src/composables/useArtifactStore.js +253 -0
  62. package/guanwang/src/composables/useAuth.js +88 -0
  63. package/guanwang/src/composables/useChatDB.js +147 -0
  64. package/guanwang/src/composables/useCountUp.js +24 -0
  65. package/guanwang/src/composables/useFileHandler.js +345 -0
  66. package/guanwang/src/composables/useTheme.js +31 -0
  67. package/guanwang/src/config/api.js +71 -0
  68. package/guanwang/src/main.js +23 -0
  69. package/guanwang/src/router/index.js +23 -0
  70. package/guanwang/src/services/authApi.js +27 -0
  71. package/guanwang/src/services/chatApi.js +66 -0
  72. package/guanwang/src/styles/global.css +478 -0
  73. package/guanwang/src/tracker/analyze.js +73 -0
  74. package/guanwang/src/tracker/config.js +82 -0
  75. package/guanwang/src/tracker/index.js +18 -0
  76. package/guanwang/src/tracker/service.js +102 -0
  77. package/guanwang/src/tracker/useChatTracker.js +179 -0
  78. package/guanwang/src/tracker/useTracker.js +45 -0
  79. package/guanwang/src/views/ChatView.vue +65 -0
  80. package/guanwang/src/views/HomeView.vue +156 -0
  81. package/guanwang/src/views/MarketView.vue +143 -0
  82. package/guanwang/src/views/PracticesView.vue +190 -0
  83. package/guanwang/src/views/SkillsView.vue +129 -0
  84. package/guanwang/temp +19 -0
  85. package/guanwang/vite.config.js +6 -0
  86. package/package.json +1 -1
  87. package/guanwang.zip +0 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * useTheme.js
3
+ * 主题(深色/浅色)管理,provide/inject 模式
4
+ */
5
+ import { ref, watch, provide, inject } from 'vue'
6
+
7
+ const THEME_KEY = Symbol('theme')
8
+
9
+ export function createTheme() {
10
+ const theme = ref('light')
11
+
12
+ watch(theme, val => {
13
+ document.documentElement.setAttribute('data-theme', val)
14
+ }, { immediate: true })
15
+
16
+ function toggleTheme() {
17
+ theme.value = theme.value === 'dark' ? 'light' : 'dark'
18
+ }
19
+
20
+ return { theme, toggleTheme }
21
+ }
22
+
23
+ export function provideTheme() {
24
+ const themeStore = createTheme()
25
+ provide(THEME_KEY, themeStore)
26
+ return themeStore
27
+ }
28
+
29
+ export function useTheme() {
30
+ return inject(THEME_KEY)
31
+ }
@@ -0,0 +1,172 @@
1
+ <template>
2
+ <!--
3
+ 轻量卡片:替代消息气泡里的完整代码块
4
+ 只显示图标 + 文件名 + 语言标识 + 行数,点击打开右侧面板
5
+ -->
6
+ <div
7
+ class="artifact-card"
8
+ :class="{ 'is-active': isActive, 'is-streaming': artifact.streaming }"
9
+ @click="store.open(artifact.id)"
10
+ >
11
+ <!-- 左侧:图标 + 文件信息 -->
12
+ <div class="artifact-card__icon">
13
+ <component :is="langIcon" :size="18" color="var(--brand-400)" :stroke-width="1.5" />
14
+ </div>
15
+
16
+ <div class="artifact-card__info">
17
+ <span class="artifact-card__name">{{ artifact.fileName }}</span>
18
+ <span class="artifact-card__meta">
19
+ {{ langLabel }}
20
+ <template v-if="!artifact.streaming">
21
+ &nbsp;·&nbsp;{{ artifact.lines }} 行
22
+ </template>
23
+ <template v-else>
24
+ &nbsp;·&nbsp;<span class="streaming-dot-wrap"><span class="streaming-dot" />生成中</span>
25
+ </template>
26
+ </span>
27
+ </div>
28
+
29
+ <!-- 右侧:操作区 -->
30
+ <div class="artifact-card__actions" @click.stop>
31
+ <button class="art-btn" @click="copyCode" :disabled="artifact.streaming" title="复制代码">
32
+ <Check v-if="copied" :size="13" color="#4ade80" />
33
+ <Copy v-else :size="13" />
34
+ </button>
35
+ <button class="art-btn art-btn--primary" @click="store.open(artifact.id)">
36
+ <ExternalLink :size="13" />
37
+ {{ isActive ? '已展开' : '展开' }}
38
+ </button>
39
+ </div>
40
+ </div>
41
+ </template>
42
+
43
+ <script setup>
44
+ import { ref, computed } from 'vue'
45
+ import {
46
+ FileCode, FileText, Globe, Layers, BarChart2,
47
+ Braces, Terminal, Copy, Check, ExternalLink,
48
+ } from 'lucide-vue-next'
49
+ import { useArtifactStore } from './useArtifactStore.js'
50
+
51
+ const props = defineProps({
52
+ artifact: { type: Object, required: true },
53
+ })
54
+
55
+ const store = useArtifactStore()
56
+ const copied = ref(false)
57
+ const isActive = computed(() => store.activeId.value === props.artifact.id)
58
+
59
+ const langLabel = computed(() =>
60
+ store.LANG_LABEL[props.artifact.lang] || props.artifact.lang?.toUpperCase() || 'Code'
61
+ )
62
+
63
+ // 语言 → 图标
64
+ const ICON_MAP = {
65
+ vue: Layers, html: Globe, jsx: Layers, tsx: Layers,
66
+ javascript: FileCode, js: FileCode, typescript: FileCode, ts: FileCode,
67
+ python: FileCode, go: FileCode, rust: FileCode, java: FileCode,
68
+ css: Braces, scss: Braces, sass: Braces,
69
+ bash: Terminal, sh: Terminal, shell: Terminal,
70
+ sql: Braces, json: Braces, yaml: Braces,
71
+ mermaid: BarChart2, svg: Globe,
72
+ math: FileText, latex: FileText,
73
+ }
74
+ const langIcon = computed(() => ICON_MAP[props.artifact.lang] || FileCode)
75
+
76
+ function copyCode() {
77
+ navigator.clipboard?.writeText(props.artifact.code).catch(() => {})
78
+ copied.value = true
79
+ setTimeout(() => { copied.value = false }, 2000)
80
+ }
81
+ </script>
82
+
83
+ <style scoped>
84
+ .artifact-card {
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 10px;
88
+ padding: 10px 12px;
89
+ margin: 8px 0;
90
+ border-radius: 10px;
91
+ border: 1px solid var(--border-default);
92
+ background: var(--bg-card);
93
+ cursor: pointer;
94
+ transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;
95
+ user-select: none;
96
+ }
97
+ .artifact-card:hover {
98
+ border-color: rgba(26,111,196,0.45);
99
+ background: var(--bg-card-hover);
100
+ box-shadow: 0 2px 12px rgba(0,0,0,0.1);
101
+ }
102
+ .artifact-card.is-active {
103
+ border-color: var(--brand-500);
104
+ background: var(--tag-bg);
105
+ box-shadow: 0 0 0 2px rgba(26,111,196,0.15);
106
+ }
107
+ /* streaming时呼吸边框动画 */
108
+ .artifact-card.is-streaming {
109
+ animation: card-breathe 1.8s ease-in-out infinite;
110
+ }
111
+ @keyframes card-breathe {
112
+ 0%, 100% { border-color: rgba(26,111,196,0.25); box-shadow: none; }
113
+ 50% { border-color: rgba(26,111,196,0.6); box-shadow: 0 0 0 2px rgba(26,111,196,0.12); }
114
+ }
115
+
116
+ .artifact-card__icon {
117
+ width: 36px; height: 36px; flex-shrink: 0;
118
+ border-radius: 8px;
119
+ background: var(--tag-bg);
120
+ border: 1px solid var(--tag-border);
121
+ display: flex; align-items: center; justify-content: center;
122
+ }
123
+
124
+ .artifact-card__info {
125
+ flex: 1; min-width: 0;
126
+ display: flex; flex-direction: column; gap: 2px;
127
+ }
128
+ .artifact-card__name {
129
+ font-size: 13px; font-weight: 500;
130
+ font-family: 'Cascadia Code', 'Consolas', monospace;
131
+ color: var(--text-primary);
132
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
133
+ }
134
+ .artifact-card__meta {
135
+ font-size: 11px;
136
+ font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
137
+ color: var(--text-muted);
138
+ display: flex; align-items: center; gap: 2px;
139
+ }
140
+
141
+ .artifact-card__actions {
142
+ display: flex; align-items: center; gap: 6px; flex-shrink: 0;
143
+ }
144
+ .art-btn {
145
+ display: inline-flex; align-items: center; gap: 4px;
146
+ padding: 4px 8px; font-size: 11px;
147
+ font-family: Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
148
+ border: 1px solid var(--border-default);
149
+ border-radius: 6px; background: transparent;
150
+ color: var(--text-muted); cursor: pointer; transition: all 0.15s;
151
+ }
152
+ .art-btn:hover { border-color: rgba(26,111,196,0.4); color: var(--brand-400); background: var(--tag-bg); }
153
+ .art-btn:disabled { opacity: 0.4; cursor: not-allowed; }
154
+ .art-btn--primary {
155
+ background: var(--brand-500); color: white; border-color: var(--brand-500);
156
+ }
157
+ .art-btn--primary:hover { background: var(--brand-600); border-color: var(--brand-600); color: white; }
158
+
159
+ .streaming-dot-wrap {
160
+ display: inline-flex; align-items: center; gap: 4px;
161
+ color: var(--brand-400);
162
+ }
163
+ .streaming-dot {
164
+ width: 5px; height: 5px; border-radius: 50%;
165
+ background: #4ade80;
166
+ animation: pulseSlow 1.2s ease infinite;
167
+ }
168
+ @keyframes pulseSlow {
169
+ 0%, 100% { opacity: 1; transform: scale(1); }
170
+ 50% { opacity: 0.4; transform: scale(0.75); }
171
+ }
172
+ </style>