@sdata/web-vue 3.22.3 → 3.24.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.
Files changed (131) hide show
  1. package/dist/sd.css +128 -0
  2. package/dist/sd.min.css +1 -1
  3. package/es/components.d.ts +14 -0
  4. package/es/index.css +128 -0
  5. package/es/index.d.ts +4 -2
  6. package/es/index.js +17 -1
  7. package/es/index.scss +1 -0
  8. package/es/model-selector/assets/logos/aihubmix.js +4 -0
  9. package/es/model-selector/assets/logos/alibaba-cn.js +4 -0
  10. package/es/model-selector/assets/logos/alibaba.js +4 -0
  11. package/es/model-selector/assets/logos/amazon-bedrock.js +4 -0
  12. package/es/model-selector/assets/logos/anthropic.js +4 -0
  13. package/es/model-selector/assets/logos/azure.js +4 -0
  14. package/es/model-selector/assets/logos/baseten.js +4 -0
  15. package/es/model-selector/assets/logos/cerebras.js +4 -0
  16. package/es/model-selector/assets/logos/chutes.js +4 -0
  17. package/es/model-selector/assets/logos/cloudflare-workers-ai.js +4 -0
  18. package/es/model-selector/assets/logos/cortecs.js +4 -0
  19. package/es/model-selector/assets/logos/deepinfra.js +4 -0
  20. package/es/model-selector/assets/logos/deepseek.js +4 -0
  21. package/es/model-selector/assets/logos/default.js +4 -0
  22. package/es/model-selector/assets/logos/fastrouter.js +4 -0
  23. package/es/model-selector/assets/logos/fireworks-ai.js +4 -0
  24. package/es/model-selector/assets/logos/github-copilot.js +4 -0
  25. package/es/model-selector/assets/logos/github-models.js +4 -0
  26. package/es/model-selector/assets/logos/google-vertex-anthropic.js +4 -0
  27. package/es/model-selector/assets/logos/google-vertex.js +4 -0
  28. package/es/model-selector/assets/logos/google.js +4 -0
  29. package/es/model-selector/assets/logos/groq.js +4 -0
  30. package/es/model-selector/assets/logos/huggingface.js +4 -0
  31. package/es/model-selector/assets/logos/iflowcn.js +4 -0
  32. package/es/model-selector/assets/logos/inception.js +4 -0
  33. package/es/model-selector/assets/logos/inference.js +4 -0
  34. package/es/model-selector/assets/logos/llama.js +4 -0
  35. package/es/model-selector/assets/logos/lucidquery.js +4 -0
  36. package/es/model-selector/assets/logos/mistral.js +4 -0
  37. package/es/model-selector/assets/logos/modelscope.js +4 -0
  38. package/es/model-selector/assets/logos/moonshotai-cn.js +4 -0
  39. package/es/model-selector/assets/logos/moonshotai.js +4 -0
  40. package/es/model-selector/assets/logos/nebius.js +4 -0
  41. package/es/model-selector/assets/logos/nvidia.js +4 -0
  42. package/es/model-selector/assets/logos/openai.js +4 -0
  43. package/es/model-selector/assets/logos/opencode.js +4 -0
  44. package/es/model-selector/assets/logos/openrouter.js +4 -0
  45. package/es/model-selector/assets/logos/perplexity.js +4 -0
  46. package/es/model-selector/assets/logos/scaleway.js +4 -0
  47. package/es/model-selector/assets/logos/submodel.js +4 -0
  48. package/es/model-selector/assets/logos/togetherai.js +4 -0
  49. package/es/model-selector/assets/logos/upstage.js +4 -0
  50. package/es/model-selector/assets/logos/v0.js +4 -0
  51. package/es/model-selector/assets/logos/venice.js +4 -0
  52. package/es/model-selector/assets/logos/vercel.js +4 -0
  53. package/es/model-selector/assets/logos/vultr.js +4 -0
  54. package/es/model-selector/assets/logos/xai.js +4 -0
  55. package/es/model-selector/assets/logos/zai-coding-plan.js +4 -0
  56. package/es/model-selector/assets/logos/zai.js +4 -0
  57. package/es/model-selector/assets/logos/zenmux.js +4 -0
  58. package/es/model-selector/assets/logos/zhipuai-coding-plan.js +4 -0
  59. package/es/model-selector/assets/logos/zhipuai.js +4 -0
  60. package/es/model-selector/context.d.ts +25 -0
  61. package/es/model-selector/context.js +5 -0
  62. package/es/model-selector/index.d.ts +436 -0
  63. package/es/model-selector/index.js +57 -0
  64. package/es/model-selector/model-selector-content.js +5 -0
  65. package/es/model-selector/model-selector-content.vue.d.ts +21 -0
  66. package/es/model-selector/model-selector-content.vue_vue_type_script_setup_true_lang.js +65 -0
  67. package/es/model-selector/model-selector-dialog.js +5 -0
  68. package/es/model-selector/model-selector-dialog.vue.d.ts +36 -0
  69. package/es/model-selector/model-selector-dialog.vue_vue_type_script_setup_true_lang.js +98 -0
  70. package/es/model-selector/model-selector-empty.js +5 -0
  71. package/es/model-selector/model-selector-empty.vue.d.ts +13 -0
  72. package/es/model-selector/model-selector-empty.vue_vue_type_script_setup_true_lang.js +25 -0
  73. package/es/model-selector/model-selector-group.js +5 -0
  74. package/es/model-selector/model-selector-group.vue.d.ts +18 -0
  75. package/es/model-selector/model-selector-group.vue_vue_type_script_setup_true_lang.js +32 -0
  76. package/es/model-selector/model-selector-input.js +5 -0
  77. package/es/model-selector/model-selector-input.vue.d.ts +11 -0
  78. package/es/model-selector/model-selector-input.vue_vue_type_script_setup_true_lang.js +80 -0
  79. package/es/model-selector/model-selector-item.js +5 -0
  80. package/es/model-selector/model-selector-item.vue.d.ts +35 -0
  81. package/es/model-selector/model-selector-item.vue_vue_type_script_setup_true_lang.js +101 -0
  82. package/es/model-selector/model-selector-list.js +5 -0
  83. package/es/model-selector/model-selector-list.vue.d.ts +13 -0
  84. package/es/model-selector/model-selector-list.vue_vue_type_script_setup_true_lang.js +36 -0
  85. package/es/model-selector/model-selector-logo-group.js +5 -0
  86. package/es/model-selector/model-selector-logo-group.vue.d.ts +13 -0
  87. package/es/model-selector/model-selector-logo-group.vue_vue_type_script_setup_true_lang.js +15 -0
  88. package/es/model-selector/model-selector-logo.js +5 -0
  89. package/es/model-selector/model-selector-logo.vue.d.ts +10 -0
  90. package/es/model-selector/model-selector-logo.vue_vue_type_script_setup_true_lang.js +146 -0
  91. package/es/model-selector/model-selector-name.js +5 -0
  92. package/es/model-selector/model-selector-name.vue.d.ts +13 -0
  93. package/es/model-selector/model-selector-name.vue_vue_type_script_setup_true_lang.js +15 -0
  94. package/es/model-selector/model-selector-separator.js +5 -0
  95. package/es/model-selector/model-selector-separator.vue.d.ts +3 -0
  96. package/es/model-selector/model-selector-separator.vue_vue_type_script_setup_true_lang.js +16 -0
  97. package/es/model-selector/model-selector-shortcut.js +5 -0
  98. package/es/model-selector/model-selector-shortcut.vue.d.ts +13 -0
  99. package/es/model-selector/model-selector-shortcut.vue_vue_type_script_setup_true_lang.js +15 -0
  100. package/es/model-selector/model-selector-trigger.js +5 -0
  101. package/es/model-selector/model-selector-trigger.vue.d.ts +20 -0
  102. package/es/model-selector/model-selector-trigger.vue_vue_type_script_setup_true_lang.js +39 -0
  103. package/es/model-selector/model-selector.js +5 -0
  104. package/es/model-selector/model-selector.vue.d.ts +34 -0
  105. package/es/model-selector/model-selector.vue_vue_type_script_setup_true_lang.js +179 -0
  106. package/es/model-selector/style/css.js +2 -0
  107. package/es/model-selector/style/index.css +144 -0
  108. package/es/model-selector/style/index.d.ts +2 -0
  109. package/es/model-selector/style/index.js +2 -0
  110. package/es/model-selector/style/index.scss +157 -0
  111. package/es/model-selector/style/token.scss +24 -0
  112. package/es/model-selector/types.d.ts +16 -0
  113. package/es/model-selector/types.js +61 -0
  114. package/es/model-selector/use-model-selector-context.d.ts +1 -0
  115. package/es/model-selector/use-model-selector-context.js +10 -0
  116. package/es/rich-text-editor/rich-text-editor.vue_vue_type_script_setup_true_lang.js +16 -18
  117. package/es/sd-vue.js +2 -0
  118. package/es/sender/index.d.ts +3 -1
  119. package/es/sender/index.js +2 -1
  120. package/es/sender/recorder-core.d.ts +25 -0
  121. package/es/sender/recorder-core.js +26 -0
  122. package/es/sender/sender.vue_vue_type_script_setup_true_lang.js +16 -18
  123. package/es/sender/types.d.ts +8 -60
  124. package/es/sender/use-recorder.d.ts +16 -0
  125. package/es/sender/use-recorder.js +117 -0
  126. package/json/vetur-attributes.json +96 -1
  127. package/json/vetur-tags.json +75 -0
  128. package/json/web-types.json +291 -2
  129. package/package.json +2 -1
  130. package/es/sender/use-speech.d.ts +0 -19
  131. package/es/sender/use-speech.js +0 -381
@@ -0,0 +1,144 @@
1
+ /******** borderSize *******/
2
+ /******** borderStyle *******/
3
+ /******** radius *******/
4
+ /******** shadow distance *******/
5
+ /******** size *******/
6
+ /******** spacing *******/
7
+ /******** shadow *******/
8
+ /******** opacity *******/
9
+ /******** fontSize *******/
10
+ /******** fontWeight ********/
11
+ /******** Primary *******/
12
+ /******** success *******/
13
+ /******** warning *******/
14
+ /******** danger *******/
15
+ /******** link *******/
16
+ /******** radius *******/
17
+ /********* icon hover *********/
18
+ .sd-model-selector {
19
+ display: flex;
20
+ flex-direction: column;
21
+ box-sizing: border-box;
22
+ min-width: 0;
23
+ overflow: hidden;
24
+ color: var(--sd-color-text-1);
25
+ font-size: 14px;
26
+ background: var(--sd-color-bg-popup);
27
+ border-radius: var(--sd-border-radius-medium);
28
+ }
29
+ .sd-model-selector-modal {
30
+ padding: 0;
31
+ overflow: hidden;
32
+ border: 1px solid var(--sd-color-fill-3);
33
+ border-radius: var(--sd-border-radius-medium);
34
+ }
35
+ .sd-model-selector-modal .sd-modal-header {
36
+ position: absolute;
37
+ width: 1px;
38
+ height: 1px;
39
+ margin: -1px;
40
+ padding: 0;
41
+ overflow: hidden;
42
+ white-space: nowrap;
43
+ border: 0;
44
+ clip-path: inset(50%);
45
+ }
46
+ .sd-model-selector-body {
47
+ padding: 0;
48
+ }
49
+ .sd-model-selector-trigger {
50
+ flex: none;
51
+ }
52
+ .sd-model-selector-input-container {
53
+ box-sizing: border-box;
54
+ width: 100%;
55
+ min-width: 0;
56
+ padding: 6px 12px;
57
+ }
58
+ .sd-model-selector-list {
59
+ --sd-model-selector-list-max-height: 400px;
60
+ --sd-model-selector-list-viewport-offset: 160px;
61
+ }
62
+ .sd-model-selector-list-content {
63
+ padding: 6px;
64
+ overscroll-behavior: contain;
65
+ }
66
+ .sd-model-selector-group + .sd-model-selector-group {
67
+ margin-top: 6px;
68
+ }
69
+ .sd-model-selector-group-heading {
70
+ padding: 6px 12px;
71
+ color: var(--sd-color-text-3);
72
+ font-weight: 500;
73
+ font-size: 12px;
74
+ }
75
+ .sd-model-selector-group-content {
76
+ display: flex;
77
+ flex-direction: column;
78
+ gap: 2px;
79
+ }
80
+ .sd-model-selector-item {
81
+ display: flex;
82
+ gap: 8px;
83
+ align-items: center;
84
+ box-sizing: border-box;
85
+ min-height: 40px;
86
+ padding: 0 12px;
87
+ border-radius: var(--sd-border-radius-medium);
88
+ cursor: pointer;
89
+ user-select: none;
90
+ }
91
+ .sd-model-selector-item--active:not(.sd-model-selector-item--disabled) {
92
+ background: var(--sd-color-fill-2);
93
+ }
94
+ .sd-model-selector-item--disabled {
95
+ color: var(--sd-color-text-4);
96
+ cursor: not-allowed;
97
+ }
98
+ .sd-model-selector-item--selected {
99
+ font-weight: 500;
100
+ }
101
+ .sd-model-selector-empty {
102
+ padding: 40px 12px;
103
+ }
104
+ .sd-model-selector-separator {
105
+ margin: 6px 0;
106
+ }
107
+ .sd-model-selector-shortcut {
108
+ flex: none;
109
+ order: 2;
110
+ margin-left: auto;
111
+ color: var(--sd-color-text-3);
112
+ font: inherit;
113
+ font-size: 12px;
114
+ }
115
+ .sd-model-selector-name {
116
+ flex: 1;
117
+ min-width: 0;
118
+ overflow: hidden;
119
+ white-space: nowrap;
120
+ text-align: left;
121
+ text-overflow: ellipsis;
122
+ }
123
+ .sd-model-selector-logo {
124
+ display: block;
125
+ flex: none;
126
+ object-fit: contain;
127
+ }
128
+ .sd-model-selector-logo-group {
129
+ display: inline-flex;
130
+ flex: none;
131
+ align-items: center;
132
+ order: 1;
133
+ margin-left: auto;
134
+ }
135
+ .sd-model-selector-logo-group > .sd-model-selector-logo {
136
+ box-sizing: content-box;
137
+ padding: 1px;
138
+ background: var(--sd-color-bg-popup);
139
+ border: 1px solid var(--sd-color-fill-3);
140
+ border-radius: 50%;
141
+ }
142
+ .sd-model-selector-logo-group > .sd-model-selector-logo + .sd-model-selector-logo {
143
+ margin-left: -6px;
144
+ }
@@ -0,0 +1,2 @@
1
+ import '../../style/index.scss';
2
+ import './index.scss';
@@ -0,0 +1,2 @@
1
+ import "../../style/index.scss";
2
+ import "./index.scss";
@@ -0,0 +1,157 @@
1
+ @use '@style/theme/index.scss' as theme;
2
+ @use 'sass:string';
3
+ @use '@components/model-selector/style/token.scss' as *;
4
+
5
+ $model-selector-prefix-cls: string.unquote('#{theme.$prefix}-model-selector');
6
+
7
+ .#{$model-selector-prefix-cls} {
8
+ display: flex;
9
+ flex-direction: column;
10
+ box-sizing: border-box;
11
+ min-width: 0;
12
+ overflow: hidden;
13
+ color: $model-selector-color-text;
14
+ font-size: $model-selector-font-size;
15
+ background: $model-selector-color-bg;
16
+ border-radius: $model-selector-border-radius;
17
+
18
+ &-modal {
19
+ padding: 0;
20
+ overflow: hidden;
21
+ border: 1px solid $model-selector-color-border;
22
+ border-radius: $model-selector-border-radius;
23
+ }
24
+
25
+ &-modal .#{theme.$prefix}-modal-header {
26
+ position: absolute;
27
+ width: 1px;
28
+ height: 1px;
29
+ margin: -1px;
30
+ padding: 0;
31
+ overflow: hidden;
32
+ white-space: nowrap;
33
+ border: 0;
34
+ clip-path: inset(50%);
35
+ }
36
+
37
+ &-body {
38
+ padding: 0;
39
+ }
40
+
41
+ &-trigger {
42
+ flex: none;
43
+ }
44
+
45
+ &-input-container {
46
+ box-sizing: border-box;
47
+ width: 100%;
48
+ min-width: 0;
49
+ padding: $model-selector-padding $model-selector-padding-horizontal;
50
+ }
51
+
52
+ &-list {
53
+ --#{$model-selector-prefix-cls}-list-max-height: #{$model-selector-list-max-height};
54
+ --#{$model-selector-prefix-cls}-list-viewport-offset: #{$model-selector-list-viewport-offset};
55
+
56
+ &-content {
57
+ padding: $model-selector-padding;
58
+ overscroll-behavior: contain;
59
+ }
60
+ }
61
+
62
+ &-group {
63
+ & + & {
64
+ margin-top: $model-selector-padding;
65
+ }
66
+
67
+ &-heading {
68
+ padding: $model-selector-padding $model-selector-padding-horizontal;
69
+ color: $model-selector-color-text-secondary;
70
+ font-weight: theme.$font-weight-500;
71
+ font-size: $model-selector-font-size-secondary;
72
+ }
73
+
74
+ &-content {
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: theme.$spacing-1;
78
+ }
79
+ }
80
+
81
+ &-item {
82
+ display: flex;
83
+ gap: $model-selector-gap;
84
+ align-items: center;
85
+ box-sizing: border-box;
86
+ min-height: $model-selector-item-height;
87
+ padding: 0 $model-selector-padding-horizontal;
88
+ border-radius: $model-selector-border-radius;
89
+ cursor: pointer;
90
+ user-select: none;
91
+
92
+ &--active:not(&--disabled) {
93
+ background: $model-selector-color-fill-hover;
94
+ }
95
+
96
+ &--disabled {
97
+ color: $model-selector-color-text-disabled;
98
+ cursor: not-allowed;
99
+ }
100
+
101
+ &--selected {
102
+ font-weight: theme.$font-weight-500;
103
+ }
104
+ }
105
+
106
+ &-empty {
107
+ padding: theme.$spacing-12 $model-selector-padding-horizontal;
108
+ }
109
+
110
+ &-separator {
111
+ margin: $model-selector-padding 0;
112
+ }
113
+
114
+ &-shortcut {
115
+ flex: none;
116
+ order: 2;
117
+ margin-left: auto;
118
+ color: $model-selector-color-text-secondary;
119
+ font: inherit;
120
+ font-size: $model-selector-font-size-secondary;
121
+ }
122
+
123
+ &-name {
124
+ flex: 1;
125
+ min-width: 0;
126
+ overflow: hidden;
127
+ white-space: nowrap;
128
+ text-align: left;
129
+ text-overflow: ellipsis;
130
+ }
131
+
132
+ &-logo {
133
+ display: block;
134
+ flex: none;
135
+ object-fit: contain;
136
+ }
137
+
138
+ &-logo-group {
139
+ display: inline-flex;
140
+ flex: none;
141
+ align-items: center;
142
+ order: 1;
143
+ margin-left: auto;
144
+
145
+ > .#{$model-selector-prefix-cls}-logo {
146
+ box-sizing: content-box;
147
+ padding: 1px;
148
+ background: $model-selector-color-bg;
149
+ border: 1px solid $model-selector-color-border;
150
+ border-radius: 50%;
151
+
152
+ & + .#{$model-selector-prefix-cls}-logo {
153
+ margin-left: -#{theme.$spacing-3};
154
+ }
155
+ }
156
+ }
157
+ }
@@ -0,0 +1,24 @@
1
+ @use '@style/theme/index.scss' as global;
2
+ @use 'sass:string';
3
+
4
+ @forward '@style/theme/index.scss';
5
+
6
+ $model-selector-color-bg: var(string.unquote('#{global.$sd-cssvars-prefix}-color-bg-popup'));
7
+ $model-selector-color-border: var(string.unquote('#{global.$sd-cssvars-prefix}-color-fill-3'));
8
+ $model-selector-color-text: var(string.unquote('#{global.$sd-cssvars-prefix}-color-text-1'));
9
+ $model-selector-color-text-secondary: var(
10
+ string.unquote('#{global.$sd-cssvars-prefix}-color-text-3')
11
+ );
12
+ $model-selector-color-text-disabled: var(
13
+ string.unquote('#{global.$sd-cssvars-prefix}-color-text-4')
14
+ );
15
+ $model-selector-color-fill-hover: var(string.unquote('#{global.$sd-cssvars-prefix}-color-fill-2'));
16
+ $model-selector-border-radius: global.$radius-medium;
17
+ $model-selector-item-height: global.$size-10;
18
+ $model-selector-list-max-height: global.$size-50 * 2;
19
+ $model-selector-list-viewport-offset: global.$size-40;
20
+ $model-selector-padding: global.$spacing-3;
21
+ $model-selector-padding-horizontal: global.$spacing-6;
22
+ $model-selector-gap: global.$spacing-4;
23
+ $model-selector-font-size: global.$font-size-body-3;
24
+ $model-selector-font-size-secondary: global.$font-size-body-1;
@@ -0,0 +1,16 @@
1
+ import type { LiteralUnion } from 'type-fest';
2
+ export declare const MODEL_SELECTOR_PROVIDERS: readonly ["moonshotai-cn", "lucidquery", "moonshotai", "zai-coding-plan", "alibaba", "xai", "vultr", "nvidia", "upstage", "groq", "github-copilot", "mistral", "vercel", "nebius", "deepseek", "alibaba-cn", "google-vertex-anthropic", "venice", "chutes", "cortecs", "github-models", "togetherai", "azure", "baseten", "huggingface", "opencode", "fastrouter", "google", "google-vertex", "cloudflare-workers-ai", "inception", "wandb", "openai", "zhipuai-coding-plan", "perplexity", "openrouter", "zenmux", "v0", "iflowcn", "synthetic", "deepinfra", "zhipuai", "submodel", "zai", "inference", "requesty", "morph", "lmstudio", "anthropic", "aihubmix", "fireworks-ai", "modelscope", "llama", "scaleway", "amazon-bedrock", "cerebras"];
3
+ export type ModelSelectorKnownProvider = (typeof MODEL_SELECTOR_PROVIDERS)[number];
4
+ export type ModelSelectorProvider = LiteralUnion<ModelSelectorKnownProvider, string>;
5
+ export interface ModelSelectorItemData {
6
+ disabled: boolean;
7
+ domId: string;
8
+ element?: HTMLElement;
9
+ groupId?: symbol;
10
+ id: symbol;
11
+ keywords: string[];
12
+ label: string;
13
+ select: (event: Event) => void;
14
+ shortcut?: string;
15
+ value: string;
16
+ }
@@ -0,0 +1,61 @@
1
+ //#region components/model-selector/types.ts
2
+ var MODEL_SELECTOR_PROVIDERS = [
3
+ "moonshotai-cn",
4
+ "lucidquery",
5
+ "moonshotai",
6
+ "zai-coding-plan",
7
+ "alibaba",
8
+ "xai",
9
+ "vultr",
10
+ "nvidia",
11
+ "upstage",
12
+ "groq",
13
+ "github-copilot",
14
+ "mistral",
15
+ "vercel",
16
+ "nebius",
17
+ "deepseek",
18
+ "alibaba-cn",
19
+ "google-vertex-anthropic",
20
+ "venice",
21
+ "chutes",
22
+ "cortecs",
23
+ "github-models",
24
+ "togetherai",
25
+ "azure",
26
+ "baseten",
27
+ "huggingface",
28
+ "opencode",
29
+ "fastrouter",
30
+ "google",
31
+ "google-vertex",
32
+ "cloudflare-workers-ai",
33
+ "inception",
34
+ "wandb",
35
+ "openai",
36
+ "zhipuai-coding-plan",
37
+ "perplexity",
38
+ "openrouter",
39
+ "zenmux",
40
+ "v0",
41
+ "iflowcn",
42
+ "synthetic",
43
+ "deepinfra",
44
+ "zhipuai",
45
+ "submodel",
46
+ "zai",
47
+ "inference",
48
+ "requesty",
49
+ "morph",
50
+ "lmstudio",
51
+ "anthropic",
52
+ "aihubmix",
53
+ "fireworks-ai",
54
+ "modelscope",
55
+ "llama",
56
+ "scaleway",
57
+ "amazon-bedrock",
58
+ "cerebras"
59
+ ];
60
+ //#endregion
61
+ export { MODEL_SELECTOR_PROVIDERS };
@@ -0,0 +1 @@
1
+ export declare function useModelSelectorContext(componentName: string): import("./context").ModelSelectorContext;
@@ -0,0 +1,10 @@
1
+ import { modelSelectorInjectionKey } from "./context.js";
2
+ import { inject } from "vue";
3
+ //#region components/model-selector/use-model-selector-context.ts
4
+ function useModelSelectorContext(componentName) {
5
+ const context = inject(modelSelectorInjectionKey, void 0);
6
+ if (!context) throw new Error(`[${componentName}] 必须在 ModelSelector 内使用。`);
7
+ return context;
8
+ }
9
+ //#endregion
10
+ export { useModelSelectorContext };
@@ -209,6 +209,20 @@ var rich_text_editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
209
209
  return content;
210
210
  })) !== null && _editorRef$value$getE !== void 0 ? _editorRef$value$getE : [];
211
211
  };
212
+ /**
213
+ * 将折叠选区向前扩展到待替换文本,后续 insertText/insertNodes 会在同一次
214
+ * Lexical 更新中原子删除选区并插入新内容,避免 spliceText 后继续使用旧选区。
215
+ * @param selection 当前 Lexical 文本选区。
216
+ * @param replaceCharacters 光标前需要被替换的文本。
217
+ */
218
+ const selectReplacementCharacters = (selection, replaceCharacters) => {
219
+ if (!replaceCharacters || !selection.isCollapsed()) return;
220
+ const anchorNode = selection.anchor.getNode();
221
+ const offset = selection.anchor.offset;
222
+ if (!$isTextNode(anchorNode) || !anchorNode.getTextContent().slice(0, offset).endsWith(replaceCharacters)) return;
223
+ const start = offset - replaceCharacters.length;
224
+ selection.setTextNodeRange(anchorNode, start, anchorNode, offset);
225
+ };
212
226
  const insertContent = (content, options = {}) => {
213
227
  var _editorRef$value3;
214
228
  const { position = "cursor", replaceCharacters } = options, updateOptions = _objectWithoutProperties(options, _excluded);
@@ -218,15 +232,7 @@ var rich_text_editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
218
232
  if (position === "end") root.selectEnd();
219
233
  const selection = $getSelection();
220
234
  if ($isRangeSelection(selection)) {
221
- if (replaceCharacters && selection.isCollapsed()) {
222
- const anchorNode = selection.anchor.getNode();
223
- const offset = selection.anchor.offset;
224
- if ($isTextNode(anchorNode) && anchorNode.getTextContent().slice(0, offset).endsWith(replaceCharacters)) {
225
- const start = offset - replaceCharacters.length;
226
- anchorNode.spliceText(start, replaceCharacters.length, "", true);
227
- anchorNode.select(start, start);
228
- }
229
- }
235
+ selectReplacementCharacters(selection, replaceCharacters);
230
236
  selection.insertNodes(createContentNodes(content));
231
237
  return;
232
238
  }
@@ -293,15 +299,7 @@ var rich_text_editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
293
299
  if (position === "end") root.selectEnd();
294
300
  const selection = $getSelection();
295
301
  if ($isRangeSelection(selection)) {
296
- if (replaceCharacters && selection.isCollapsed()) {
297
- const anchorNode = selection.anchor.getNode();
298
- const offset = selection.anchor.offset;
299
- if ($isTextNode(anchorNode) && anchorNode.getTextContent().slice(0, offset).endsWith(replaceCharacters)) {
300
- const start = offset - replaceCharacters.length;
301
- anchorNode.spliceText(start, replaceCharacters.length, "", true);
302
- anchorNode.select(start, start);
303
- }
304
- }
302
+ selectReplacementCharacters(selection, replaceCharacters);
305
303
  selection.insertText(text);
306
304
  return;
307
305
  }
package/es/sd-vue.js CHANGED
@@ -115,6 +115,7 @@ import item_default from "./menu/item.js";
115
115
  import item_group_default from "./menu/item-group.js";
116
116
  import sub_menu_default from "./menu/sub-menu.js";
117
117
  import Menu from "./menu/index.js";
118
+ import ModelSelector from "./model-selector/index.js";
118
119
  import Notification from "./notification/index.js";
119
120
  import OverflowList from "./overflow-list/index.js";
120
121
  import PageHeader from "./page-header/index.js";
@@ -213,6 +214,7 @@ var components = {
213
214
  Drawer,
214
215
  Message,
215
216
  Modal,
217
+ ModelSelector,
216
218
  Notification,
217
219
  Popconfirm,
218
220
  Progress,
@@ -112,8 +112,10 @@ export declare const SenderSwitch: {
112
112
  unchecked?: (props: {}) => any;
113
113
  };
114
114
  });
115
+ export { default as RecorderCore } from './recorder-core';
116
+ export type { RecorderCore as RecorderCoreConstructor, RecorderCoreInstance, RecorderCoreOptions, } from './recorder-core';
115
117
  export type SenderInstance = InstanceType<typeof _Sender>;
116
118
  export type SenderHeaderInstance = InstanceType<typeof _SenderHeader>;
117
119
  export type SenderSwitchInstance = InstanceType<typeof _SenderSwitch>;
118
- export type { SenderActionContext, SenderAllowSpeech, SenderComponents, SenderContentSlotConfig, SenderControlledSpeechConfig, SenderCustomSlotConfig, SenderCustomSlotRender, SenderCustomSlotState, SenderEmits, SenderFocusOptions, SenderHeaderSemanticType, SenderHeaderProps, SenderInsertPosition, SenderInputSlotConfig, SenderProps, SenderRef, SenderResolvedSlotConfig, SenderSelectSlotConfig, SenderSemanticType, SenderSkill, SenderSkillClosableConfig, SenderSpeechConfig, SenderSpeechDataEvent, SenderSpeechEndEvent, SenderSpeechEndReason, SenderSpeechErrorEvent, SenderSpeechErrorPhase, SenderSpeechStartEvent, SenderSpeechTransportCloseEvent, SenderSpeechTransportMessageEvent, SenderSpeechTransportOpenEvent, SenderSlotConfig, SenderSlotConfigBase, SenderSubmitType, SenderSuffixPlacement, SenderSwitchProps, SenderTagSlotConfig, SenderTextSlotConfig, SenderValue, } from './types';
120
+ export type { SenderActionContext, SenderAllowSpeech, SenderComponents, SenderContentSlotConfig, SenderCustomSlotConfig, SenderCustomSlotRender, SenderCustomSlotState, SenderEmits, SenderFocusOptions, SenderHeaderSemanticType, SenderHeaderProps, SenderInsertPosition, SenderInputSlotConfig, SenderProps, SenderRef, SenderResolvedSlotConfig, SenderSelectSlotConfig, SenderSemanticType, SenderSkill, SenderSkillClosableConfig, SenderSlotConfig, SenderSlotConfigBase, SenderSubmitType, SenderSuffixPlacement, SenderSwitchProps, SenderTagSlotConfig, SenderTextSlotConfig, SenderValue, } from './types';
119
121
  export default Sender;
@@ -1,6 +1,7 @@
1
1
  import { getComponentPrefix, setGlobalConfig } from "../_utils/global-config.js";
2
2
  import sender_header_default from "./sender-header.js";
3
3
  import sender_switch_default from "./sender-switch.js";
4
+ import recorder_core_default from "./recorder-core.js";
4
5
  import sender_default from "./sender.js";
5
6
  //#region components/sender/index.ts
6
7
  var Sender = Object.assign(sender_default, {
@@ -17,4 +18,4 @@ var Sender = Object.assign(sender_default, {
17
18
  var SenderHeader = sender_header_default;
18
19
  var SenderSwitch = sender_switch_default;
19
20
  //#endregion
20
- export { SenderHeader, SenderSwitch, Sender as default };
21
+ export { recorder_core_default as RecorderCore, SenderHeader, SenderSwitch, Sender as default };
@@ -0,0 +1,25 @@
1
+ import Recorder from 'recorder-core';
2
+ import 'recorder-core/src/engine/beta-amr';
3
+ import 'recorder-core/src/engine/beta-amr-engine';
4
+ import 'recorder-core/src/engine/beta-ogg';
5
+ import 'recorder-core/src/engine/beta-ogg-engine';
6
+ import 'recorder-core/src/engine/beta-webm';
7
+ import 'recorder-core/src/engine/g711x';
8
+ import 'recorder-core/src/engine/mp3';
9
+ import 'recorder-core/src/engine/mp3-engine';
10
+ import 'recorder-core/src/engine/pcm';
11
+ import 'recorder-core/src/engine/wav';
12
+ import 'recorder-core/src/extensions/asr.aliyun.short';
13
+ import 'recorder-core/src/extensions/buffer_stream.player';
14
+ import 'recorder-core/src/extensions/create-audio.nmn2pcm';
15
+ import 'recorder-core/src/extensions/lib.fft';
16
+ import 'recorder-core/src/extensions/dtmf.decode';
17
+ import 'recorder-core/src/extensions/dtmf.encode';
18
+ import 'recorder-core/src/extensions/frequency.histogram.view';
19
+ import 'recorder-core/src/extensions/sonic';
20
+ import 'recorder-core/src/extensions/wavesurfer.view';
21
+ import 'recorder-core/src/extensions/waveview';
22
+ export type RecorderCore = typeof Recorder;
23
+ export type RecorderCoreInstance = ReturnType<RecorderCore>;
24
+ export type RecorderCoreOptions = Parameters<RecorderCore>[0];
25
+ export default Recorder;
@@ -0,0 +1,26 @@
1
+ import Recorder from "recorder-core";
2
+ import "recorder-core/src/engine/beta-amr";
3
+ import "recorder-core/src/engine/beta-amr-engine";
4
+ import "recorder-core/src/engine/beta-ogg";
5
+ import "recorder-core/src/engine/beta-ogg-engine";
6
+ import "recorder-core/src/engine/beta-webm";
7
+ import "recorder-core/src/engine/g711x";
8
+ import "recorder-core/src/engine/mp3";
9
+ import "recorder-core/src/engine/mp3-engine";
10
+ import "recorder-core/src/engine/pcm";
11
+ import "recorder-core/src/engine/wav";
12
+ import "recorder-core/src/extensions/asr.aliyun.short";
13
+ import "recorder-core/src/extensions/buffer_stream.player";
14
+ import "recorder-core/src/extensions/create-audio.nmn2pcm";
15
+ import "recorder-core/src/extensions/lib.fft";
16
+ import "recorder-core/src/extensions/dtmf.decode";
17
+ import "recorder-core/src/extensions/dtmf.encode";
18
+ import "recorder-core/src/extensions/frequency.histogram.view";
19
+ import "recorder-core/src/extensions/sonic";
20
+ import "recorder-core/src/extensions/wavesurfer.view";
21
+ import "recorder-core/src/extensions/waveview";
22
+ //#region components/sender/recorder-core.ts
23
+ Recorder.TrafficImgUrl = "";
24
+ var recorder_core_default = Recorder;
25
+ //#endregion
26
+ export { recorder_core_default as default };
@@ -11,7 +11,7 @@ import { senderInjectionKey } from "./context.js";
11
11
  import IconArrowUp from "../icon/icon-arrow-up/index.js";
12
12
  import IconMute from "../icon/icon-mute/index.js";
13
13
  import IconVoice from "../icon/icon-voice/index.js";
14
- import { useSpeech } from "./use-speech.js";
14
+ import { useRecorder } from "./use-recorder.js";
15
15
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, getCurrentInstance, h, mergeProps, nextTick, normalizeClass, normalizeStyle, openBlock, provide, renderSlot, resolveDynamicComponent, shallowRef, toRef, unref, useAttrs, watch, withCtx } from "vue";
16
16
  import { createReusableTemplate } from "@vueuse/core";
17
17
  import { INSERT_LINE_BREAK_COMMAND } from "lexical";
@@ -56,13 +56,8 @@ var sender_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
56
56
  "pasteFile",
57
57
  "focus",
58
58
  "blur",
59
- "speechStart",
60
- "speechData",
61
59
  "speechEnd",
62
- "speechError",
63
- "speechTransportOpen",
64
- "speechTransportMessage",
65
- "speechTransportClose"
60
+ "speechError"
66
61
  ],
67
62
  setup(__props, { expose: __expose, emit: __emit }) {
68
63
  const props = __props;
@@ -404,24 +399,19 @@ var sender_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
404
399
  if (cancelDisabled.value || props.disabled) return;
405
400
  emit("cancel");
406
401
  };
407
- const { available: speechAvailable, recording, requesting: speechRequesting, statusText: speechStatusText, trigger: triggerSpeech } = useSpeech(toRef(props, "allowSpeech"), {
408
- onStart: (event) => emit("speechStart", event),
409
- onData: (event) => emit("speechData", event),
410
- onEnd: (event) => emit("speechEnd", event),
411
- onError: (event) => emit("speechError", event),
412
- onTransportOpen: (event) => emit("speechTransportOpen", event),
413
- onTransportMessage: (event) => emit("speechTransportMessage", event),
414
- onTransportClose: (event) => emit("speechTransportClose", event)
402
+ const { Recorder, available: speechAvailable, recorder, recording, requesting: speechRequesting, stopping: speechStopping, statusText: speechStatusText, trigger: triggerSpeech } = useRecorder(toRef(props, "allowSpeech"), {
403
+ onStop: (blob, duration, mime) => emit("speechEnd", blob, duration, mime),
404
+ onError: (message, isUserNotAllow) => emit("speechError", message, isUserNotAllow)
415
405
  });
416
406
  const actionContext = computed(() => ({
417
407
  send: triggerSend,
418
408
  clear: triggerClear,
419
409
  cancel: triggerCancel,
420
- speech: () => triggerSpeech(false),
410
+ speech: triggerSpeech,
421
411
  submitDisabled: Boolean(props.disabled || submitDisabled.value),
422
412
  clearDisabled: Boolean(props.disabled || clearDisabled.value),
423
413
  cancelDisabled: Boolean(props.disabled || cancelDisabled.value),
424
- speechDisabled: Boolean(props.disabled || !speechAvailable.value || speechRequesting.value),
414
+ speechDisabled: Boolean(props.disabled || !speechAvailable.value || speechRequesting.value || speechStopping.value),
425
415
  recording: recording.value,
426
416
  loading: Boolean(props.loading)
427
417
  }));
@@ -657,6 +647,14 @@ var sender_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
657
647
  }
658
648
  });
659
649
  __expose({
650
+ Recorder,
651
+ get recorder() {
652
+ var _recorder$value;
653
+ return (_recorder$value = recorder.value) !== null && _recorder$value !== void 0 ? _recorder$value : null;
654
+ },
655
+ get recording() {
656
+ return recording.value;
657
+ },
660
658
  get inputElement() {
661
659
  var _slotInputRef$value$r, _slotInputRef$value9;
662
660
  return isSlotMode.value ? (_slotInputRef$value$r = (_slotInputRef$value9 = slotInputRef.value) === null || _slotInputRef$value9 === void 0 ? void 0 : _slotInputRef$value9.rootElement) !== null && _slotInputRef$value$r !== void 0 ? _slotInputRef$value$r : null : getNativeTextarea();
@@ -681,7 +679,7 @@ var sender_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
681
679
  }, [renderSlot(_ctx.$slots, "suffix", { actions: actionContext.value }, () => [createElementVNode("div", { class: normalizeClass(`${unref(prefixCls)}-actions-list-presets`) }, [__props.allowSpeech ? (openBlock(), createBlock(unref(Button), {
682
680
  key: 0,
683
681
  type: "text",
684
- loading: unref(speechRequesting),
682
+ loading: unref(speechRequesting) || unref(speechStopping),
685
683
  disabled: actionContext.value.speechDisabled,
686
684
  title: unref(speechStatusText),
687
685
  class: normalizeClass([`${unref(prefixCls)}-actions-btn`, { [`${unref(prefixCls)}-actions-btn-disabled`]: actionContext.value.speechDisabled }]),