vue-element-ui-x 0.1.10-beta → 0.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-element-ui-x",
3
- "version": "0.1.10-beta",
3
+ "version": "0.2.0",
4
4
  "description": "基于Vue 2 + Element UI的AI聊天组件库",
5
5
  "main": "lib/index.esm.js",
6
6
  "module": "lib/index.umd.js",
package/src/index.js CHANGED
@@ -5,7 +5,6 @@ import ElXConversations from './components/Conversations/index.js';
5
5
  import ElXFilesCard from './components/FilesCard/index.js';
6
6
  import ElXPrompts from './components/Prompts/index.js';
7
7
  import ElXSender from './components/Sender/index.js';
8
- import ElXThink from './components/Think/index.js';
9
8
  import ElXThinking from './components/Thinking/index.js';
10
9
  import ElXThoughtChain from './components/ThoughtChain/index.js';
11
10
  import ElXTypewriter from './components/Typewriter/index.js';
@@ -52,7 +51,6 @@ export {
52
51
  ElXFilesCard,
53
52
  ElXPrompts,
54
53
  ElXSender,
55
- ElXThink,
56
54
  ElXThinking,
57
55
  ElXThoughtChain,
58
56
  ElXTypewriter,
@@ -20,7 +20,7 @@
20
20
  .el-x-bubble-start {
21
21
  .el-x-bubble-content-wrapper {
22
22
  .el-x-bubble-content-corner {
23
- border-start-start-radius: calc($--el-x-border-radius-base - 2px);
23
+ border-start-start-radius: $--el-x-border-radius-base - 2px;
24
24
  }
25
25
  }
26
26
  }
@@ -33,7 +33,7 @@
33
33
  align-items: flex-end;
34
34
 
35
35
  .el-x-bubble-content-corner {
36
- border-start-end-radius: calc($--el-x-border-radius-base - 2px);
36
+ border-start-end-radius: $--el-x-border-radius-base - 2px;
37
37
  }
38
38
  }
39
39
  }
@@ -70,7 +70,7 @@
70
70
  .el-x-bubble-content {
71
71
  background-color: $--el-x-fill-color;
72
72
  padding: $--el-x-padding-md $--el-x-padding-lg;
73
- border-radius: calc($--el-x-border-radius-base + 4px);
73
+ border-radius: $--el-x-border-radius-base + 4px;
74
74
  position: relative;
75
75
  box-sizing: border-box;
76
76
  min-width: 0;
@@ -10,7 +10,7 @@
10
10
  height: 100%;
11
11
  width: var(--el-x-thinking-button-width);
12
12
  gap: $--el-x-spacing-xs;
13
- padding: $--el-x-padding-sm calc($--el-x-padding-sm + 4px);
13
+ padding: $--el-x-padding-sm calc(#{$--el-x-padding-sm} + 4px);
14
14
  border: $--el-x-border-width $--border-style-base $--el-x-border-color;
15
15
  border-radius: $--el-x-border-radius-md;
16
16
  background: $--color-white;
@@ -88,7 +88,7 @@
88
88
  .content pre {
89
89
  border: $--el-x-border-width $--border-style-base $--el-x-border-color;
90
90
  background: var(--el-x-thinking-content-wrapper-background-color);
91
- padding: $--el-x-padding-sm calc($--el-x-padding-sm + 4px);
91
+ padding: $--el-x-padding-sm calc(#{$--el-x-padding-sm} + 4px);
92
92
  border-radius: $--el-x-border-radius-lg;
93
93
  max-width: var(--el-x-thinking-content-wrapper-width);
94
94
  font-size: $--el-x-font-size-base;
@@ -1,8 +0,0 @@
1
- import ElXThink from './src/main.vue';
2
-
3
- /* istanbul ignore next */
4
- ElXThink.install = function (Vue) {
5
- Vue.component(ElXThink.name, ElXThink);
6
- };
7
-
8
- export default ElXThink;
@@ -1,190 +0,0 @@
1
- <template>
2
- <div
3
- class="el-x-think"
4
- :style="{
5
- '--el-x-think-button-width': buttonWidth,
6
- '--el-x-think-animation-duration': duration,
7
- '--el-x-think-content-wrapper-width': maxWidth,
8
- '--el-x-think-content-wrapper-background-color': backgroundColor,
9
- '--el-x-think-content-wrapper-color': color,
10
- }"
11
- >
12
- <!-- 触发按钮 -->
13
- <button
14
- class="trigger"
15
- :class="[status, { disabled: !disabled }]"
16
- :disabled="disabled"
17
- @click="changeExpand"
18
- >
19
- <span class="status-icon">
20
- <slot
21
- name="status-icon"
22
- :status="status"
23
- >
24
- <i
25
- v-if="status === 'thinking'"
26
- class="is-loading el-icon-center el-icon-loading"
27
- ></i>
28
-
29
- <i
30
- v-if="status === 'start'"
31
- class="el-icon-center start-color el-icon-opportunity"
32
- ></i>
33
-
34
- <i
35
- v-if="status === 'end'"
36
- class="el-icon-center end-color el-icon-success"
37
- ></i>
38
-
39
- <i
40
- v-if="status === 'error'"
41
- class="el-icon-center error-color el-icon-circle-close"
42
- ></i>
43
- </slot>
44
- </span>
45
-
46
- <span class="label">
47
- <slot
48
- name="label"
49
- :status="status"
50
- >
51
- {{
52
- status === 'thinking'
53
- ? '思考中...'
54
- : status === 'error'
55
- ? '思考遇到问题'
56
- : status === 'end'
57
- ? '思考完成'
58
- : '开始思考'
59
- }}
60
- </slot>
61
- </span>
62
-
63
- <transition name="rotate">
64
- <span
65
- v-if="!disabled"
66
- class="arrow el-icon-center"
67
- :class="{ expanded: isExpanded }"
68
- >
69
- <slot name="arrow">
70
- <i class="el-icon-center el-icon-arrow-up"></i>
71
- </slot>
72
- </span>
73
- </transition>
74
- </button>
75
-
76
- <!-- 内容区域 -->
77
- <transition name="slide">
78
- <div
79
- v-show="isExpanded"
80
- v-if="displayedContent"
81
- class="content-wrapper"
82
- :class="{ 'error-state': status === 'error' }"
83
- >
84
- <div class="content">
85
- <slot
86
- v-if="status !== 'error'"
87
- name="content"
88
- :content="displayedContent"
89
- >
90
- <pre>{{ displayedContent }}</pre>
91
- </slot>
92
-
93
- <slot
94
- v-else
95
- name="error"
96
- :error-content="displayedContent"
97
- >
98
- <div class="error-message">{{ displayedContent }}</div>
99
- </slot>
100
- </div>
101
- </div>
102
- </transition>
103
- </div>
104
- </template>
105
-
106
- <script>
107
- export default {
108
- name: 'ElXThink',
109
- props: {
110
- content: {
111
- type: String,
112
- default: '',
113
- },
114
- modelValue: {
115
- type: Boolean,
116
- default: true,
117
- },
118
- status: {
119
- type: String,
120
- default: 'start',
121
- validator: function (value) {
122
- return ['start', 'thinking', 'end', 'error'].indexOf(value) !== -1;
123
- },
124
- },
125
- disabled: {
126
- type: Boolean,
127
- default: false,
128
- },
129
- autoCollapse: {
130
- type: Boolean,
131
- default: false,
132
- },
133
- buttonWidth: {
134
- type: String,
135
- default: '160px',
136
- },
137
- duration: {
138
- type: String,
139
- default: '0.2s',
140
- },
141
- maxWidth: {
142
- type: String,
143
- default: '500px',
144
- },
145
- backgroundColor: {
146
- type: String,
147
- default: '#fcfcfc',
148
- },
149
- color: {
150
- type: String,
151
- default: 'var(--el-color-info)',
152
- },
153
- },
154
- data() {
155
- return {
156
- isExpanded: this.modelValue,
157
- };
158
- },
159
- computed: {
160
- displayedContent() {
161
- return this.status === 'error' ? '思考过程中出现错误' : this.content;
162
- },
163
- },
164
- watch: {
165
- modelValue(newVal) {
166
- this.isExpanded = newVal;
167
- },
168
- status(newVal) {
169
- if (newVal === 'end' && this.autoCollapse) {
170
- this.isExpanded = false;
171
- }
172
- },
173
- },
174
- methods: {
175
- changeExpand() {
176
- if (this.disabled) return;
177
- this.isExpanded = !this.isExpanded;
178
- this.$emit('change', {
179
- value: this.isExpanded,
180
- status: this.status,
181
- });
182
- this.$emit('update:expanded', this.isExpanded);
183
- },
184
- },
185
- };
186
- </script>
187
-
188
- <style lang="scss">
189
- @import '../../../styles/Think.scss';
190
- </style>
@@ -1,134 +0,0 @@
1
- @import '../theme/var.scss';
2
-
3
- .el-x-think {
4
- font-family: system-ui, sans-serif;
5
- margin: 0 auto;
6
-
7
- .trigger {
8
- display: flex;
9
- align-items: center;
10
- height: 100%;
11
- width: var(--el-x-think-button-width);
12
- gap: 8px;
13
- padding: $--el-x-padding-sm $--el-x-padding-sm + 4px;
14
- border: $--el-x-border-width solid $--el-x-border-color;
15
- border-radius: $--el-x-border-radius-md;
16
- background: $--color-white;
17
- cursor: pointer;
18
- margin-bottom: $--el-x-spacing-sm;
19
-
20
- /* 居中 */
21
- .el-icon-center {
22
- height: 100%;
23
- display: flex;
24
- align-items: center;
25
- }
26
-
27
- /* 开始颜色 */
28
- .start-color {
29
- color: $--color-warning;
30
- }
31
-
32
- /* 完成颜色 */
33
- .end-color {
34
- color: $--color-success;
35
- }
36
-
37
- /* 思考中颜色 */
38
- .is-loading {
39
- color: $--color-primary;
40
- }
41
-
42
- /* 思考失败颜色 */
43
- .error-color {
44
- color: $--color-danger;
45
- }
46
-
47
- &:hover {
48
- background: #f8f8f8;
49
- }
50
-
51
- &.disabled {
52
- cursor: pointer;
53
- }
54
-
55
- &:disabled {
56
- cursor: not-allowed;
57
- opacity: 0.7;
58
- }
59
- }
60
-
61
- .status-icon {
62
- font-size: 1.2em;
63
- }
64
-
65
- .arrow {
66
- margin-left: auto;
67
- transition: transform var(--el-x-think-animation-duration);
68
-
69
- &.expanded {
70
- transform: rotate(180deg);
71
- }
72
- }
73
-
74
- /* 滑动动画 */
75
- .slide-enter-active,
76
- .slide-leave-active {
77
- transition: height var(--el-x-think-animation-duration) ease-in-out,
78
- opacity var(--el-x-think-animation-duration) ease-in-out;
79
- overflow: hidden;
80
- }
81
-
82
- .slide-enter,
83
- .slide-leave-to {
84
- height: 0 !important;
85
- opacity: 0;
86
- }
87
-
88
- /* 内容区域样式 */
89
- .content-wrapper {
90
- box-sizing: border-box;
91
- min-width: 0;
92
-
93
- &.error-state {
94
- border-color: #ffd0d0;
95
- background: #fff0f0;
96
- }
97
- }
98
-
99
- .content {
100
- pre {
101
- border: $--el-x-border-width solid $--el-x-border-color;
102
- background: var(--el-x-think-content-wrapper-background-color);
103
- padding: $--el-x-padding-sm $--el-x-padding-sm + 4px;
104
- border-radius: $--el-x-border-radius-md;
105
- max-width: var(--el-x-think-content-wrapper-width);
106
- font-size: $--el-x-font-size-base;
107
- color: var(--el-x-think-content-wrapper-color);
108
- white-space: pre-wrap;
109
- font-family: system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue,
110
- sans-serif;
111
- margin: 0;
112
- line-height: $--el-x-font-line-height-primary;
113
- }
114
- }
115
-
116
- .error-message {
117
- color: $--color-danger;
118
- height: fit-content;
119
- padding: $--el-x-spacing-sm;
120
- background: #ffeef0;
121
- border-radius: $--el-x-border-radius-base;
122
- }
123
-
124
- /* 旋转动画 */
125
- .rotate-enter-active,
126
- .rotate-leave-active {
127
- transition: transform var(--el-x-think-animation-duration);
128
- }
129
-
130
- .rotate-enter,
131
- .rotate-leave-to {
132
- transform: rotate(0deg);
133
- }
134
- }