@goodandready/dsh-tts 0.3.2 → 0.3.4
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/lib/client.js +49 -25
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -29,15 +29,26 @@ window.__ModuleLoader__.load({
|
|
|
29
29
|
'.dts-wrap{display:flex;flex-direction:column;gap:22px;padding:4px 0;max-width:720px}' +
|
|
30
30
|
'.dts-block{display:flex;flex-direction:column;gap:10px}' +
|
|
31
31
|
'.dts-h{font-size:14px;font-weight:600;color:var(--dsw-alias-label-primary)}' +
|
|
32
|
-
|
|
32
|
+
// Единый вид карточки «Настройки плагинов»: значения из канона
|
|
33
|
+
// (issue #19), цвета только переменными темы.
|
|
34
|
+
'.dts-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;list-style:none}' +
|
|
35
|
+
'.dts-head{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;display:flex;align-items:center;gap:12px;padding:14px 16px}' +
|
|
36
|
+
'.dts-headText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}' +
|
|
37
|
+
'.dts-title{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}' +
|
|
38
|
+
'.dts-sub{color:var(--dsw-alias-label-secondary);font-size:13px}' +
|
|
39
|
+
'.dts-chev{margin-left:auto;color:var(--dsw-alias-label-secondary);flex:none;transition:transform .16s}' +
|
|
40
|
+
'.dts-chevOpen{transform:rotate(180deg)}' +
|
|
41
|
+
'.dts-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding-bottom:8px}' +
|
|
42
|
+
'.dts-field{display:flex;flex-direction:column;gap:6px;padding:12px 0}' +
|
|
43
|
+
'.dts-input{height:34px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 12px;font-size:13px}' +
|
|
44
|
+
'.dts-foot{border-top:1px solid var(--dsw-alias-border-l2);display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px}' +
|
|
45
|
+
'.dts-save{appearance:none;font:inherit;cursor:pointer;border:1px solid transparent;border-radius:8px;padding:5px 14px;font-size:13px;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3)}' +
|
|
46
|
+
// Помощники внутренней формы (цепочка провайдеров).
|
|
33
47
|
'.dts-entry{display:flex;flex-direction:column;gap:8px;padding:10px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px}' +
|
|
34
48
|
'.dts-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}' +
|
|
35
|
-
'.dts-row select,.dts-row input,.dts-field input,.dts-field select{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);border-radius:6px;padding:6px 8px;font-size:13px}' +
|
|
36
49
|
'.dts-row .dts-model{flex:1;min-width:120px}' +
|
|
37
50
|
'.dts-row .dts-key{flex:1;min-width:180px}' +
|
|
38
|
-
'.dts-field{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--dsw-alias-label-secondary)}' +
|
|
39
51
|
'.dts-mini{border:1px solid var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-primary);border-radius:6px;width:28px;height:28px;cursor:pointer;flex:none}' +
|
|
40
|
-
'.dts-save{background:var(--dsw-alias-brand-primary);color:#fff;border:none;border-radius:6px;padding:7px 14px;font-size:13px;cursor:pointer}' +
|
|
41
52
|
'.dts-ok{font-size:12px;color:var(--dsw-alias-state-success-primary)}' +
|
|
42
53
|
'.dts-bad{font-size:12px;color:var(--dsw-alias-state-error-primary)}' +
|
|
43
54
|
'.dts-badge{font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);white-space:nowrap}' +
|
|
@@ -265,15 +276,16 @@ window.__ModuleLoader__.load({
|
|
|
265
276
|
return React.createElement('div', { className: 'dts-entry', key: i },
|
|
266
277
|
React.createElement('div', { className: 'dts-row' },
|
|
267
278
|
React.createElement('select', {
|
|
279
|
+
className: 'dts-input',
|
|
268
280
|
value: row.provider, disabled: !props.writable,
|
|
269
281
|
onChange: (e) => change(i, { provider: e.target.value }),
|
|
270
282
|
}, PROVIDERS.map((p) => React.createElement('option', { key: p, value: p }, p))),
|
|
271
283
|
React.createElement('input', {
|
|
272
|
-
className: 'dts-model', value: row.model || '', disabled: !props.writable,
|
|
284
|
+
className: 'dts-model dts-input', value: row.model || '', disabled: !props.writable,
|
|
273
285
|
placeholder: MODEL_HINT[row.provider] || '', onChange: (e) => change(i, { model: e.target.value }),
|
|
274
286
|
}),
|
|
275
287
|
React.createElement('input', {
|
|
276
|
-
className: 'dts-model', value: row.voice || '', disabled: !props.writable,
|
|
288
|
+
className: 'dts-model dts-input', value: row.voice || '', disabled: !props.writable,
|
|
277
289
|
placeholder: 'voice', onChange: (e) => change(i, { voice: e.target.value }),
|
|
278
290
|
}),
|
|
279
291
|
React.createElement('button', { type: 'button', className: 'dts-mini', title: t('up'), disabled: !props.writable, onClick: () => move(i, -1) }, '\u2191'),
|
|
@@ -282,7 +294,7 @@ window.__ModuleLoader__.load({
|
|
|
282
294
|
),
|
|
283
295
|
cloud ? React.createElement('div', { className: 'dts-row' },
|
|
284
296
|
React.createElement('input', {
|
|
285
|
-
className: 'dts-key', type: 'password', autoComplete: 'off',
|
|
297
|
+
className: 'dts-key dts-input', type: 'password', autoComplete: 'off',
|
|
286
298
|
value: draft, disabled: !props.writable || !cred.writable,
|
|
287
299
|
placeholder: cred.configured ? 'leave blank to keep' : 'paste API key',
|
|
288
300
|
onChange: (e) => props.onDraft(row.provider, e.target.value),
|
|
@@ -501,6 +513,7 @@ window.__ModuleLoader__.load({
|
|
|
501
513
|
const numberField = (key, label, hint, step) => React.createElement('label', { className: 'dts-field' }, label,
|
|
502
514
|
React.createElement('input', {
|
|
503
515
|
type: 'number', step: step || 1,
|
|
516
|
+
className: 'dts-input',
|
|
504
517
|
value: draft && draft[key] !== undefined ? draft[key] : '', disabled: !writable,
|
|
505
518
|
onChange: (e) => setTop(key, Number(e.target.value)),
|
|
506
519
|
}),
|
|
@@ -508,14 +521,17 @@ window.__ModuleLoader__.load({
|
|
|
508
521
|
|
|
509
522
|
const textField = (key, label, hint) => React.createElement('label', { className: 'dts-field' }, label,
|
|
510
523
|
React.createElement('input', {
|
|
524
|
+
className: 'dts-input',
|
|
511
525
|
value: draft && draft[key] !== undefined ? draft[key] : '', disabled: !writable,
|
|
512
526
|
onChange: (e) => setTop(key, e.target.value),
|
|
513
527
|
}),
|
|
514
528
|
React.createElement('span', { className: 'dts-sub' }, hint))
|
|
515
529
|
|
|
530
|
+
// В карточке заголовок рисует шапка — свой блок не дублируем.
|
|
531
|
+
const titleLine = props && props.compact ? null : React.createElement('div', { className: 'dts-h' }, t('title'))
|
|
516
532
|
return React.createElement('div', { className: 'dts-wrap' },
|
|
517
533
|
React.createElement('div', { className: 'dts-block' },
|
|
518
|
-
|
|
534
|
+
titleLine,
|
|
519
535
|
React.createElement('label', { className: 'dts-row' },
|
|
520
536
|
React.createElement('input', {
|
|
521
537
|
type: 'checkbox', checked: !!(draft && draft.speakReplies), disabled: !writable,
|
|
@@ -559,7 +575,7 @@ window.__ModuleLoader__.load({
|
|
|
559
575
|
textField('edgeBin', t('edgeBin'), t('edgeHint')),
|
|
560
576
|
textField('azureRegion', t('azureRegion'), t('azureHint')),
|
|
561
577
|
),
|
|
562
|
-
React.createElement('div', { className: 'dts-
|
|
578
|
+
React.createElement('div', { className: 'dts-foot' },
|
|
563
579
|
React.createElement('button', { type: 'button', className: 'dts-save', disabled: !writable, onClick: save }, t('save')),
|
|
564
580
|
saved ? React.createElement('span', { className: 'dts-ok' }, t('saved')) : null,
|
|
565
581
|
err ? React.createElement('span', { className: 'dts-bad' }, err) : null,
|
|
@@ -568,28 +584,36 @@ window.__ModuleLoader__.load({
|
|
|
568
584
|
}
|
|
569
585
|
|
|
570
586
|
|
|
571
|
-
// Карточка
|
|
572
|
-
//
|
|
587
|
+
// Карточка во вкладке «Настройки плагинов» — разметка и стили по
|
|
588
|
+
// единому канону (issue #19): li в списке ядра, шапка со сбросом темы,
|
|
589
|
+
// тело с чертой-разделителем. Шеврон — наш, ядро его не даёт.
|
|
573
590
|
function TtsCard(props) {
|
|
574
591
|
const t = (props && props.t) || ((key) => key)
|
|
575
592
|
const [open, setOpen] = React.useState(false)
|
|
576
|
-
return React.createElement('
|
|
577
|
-
{
|
|
578
|
-
|
|
579
|
-
|
|
593
|
+
return React.createElement('li', { className: 'dts-card' },
|
|
594
|
+
React.createElement('button', {
|
|
595
|
+
type: 'button',
|
|
596
|
+
className: 'dts-head',
|
|
597
|
+
onClick: () => setOpen(!open),
|
|
598
|
+
'aria-expanded': open,
|
|
580
599
|
},
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
600
|
+
React.createElement('div', { className: 'dts-headText' },
|
|
601
|
+
React.createElement('div', { className: 'dts-title' }, t('title')),
|
|
602
|
+
React.createElement('div', { className: 'dts-sub' }, t('cardHint')),
|
|
603
|
+
),
|
|
604
|
+
React.createElement('svg', {
|
|
605
|
+
className: 'dts-chev' + (open ? ' dts-chevOpen' : ''),
|
|
606
|
+
width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none',
|
|
587
607
|
},
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
608
|
+
React.createElement('path', {
|
|
609
|
+
d: 'M4 6l4 4 4-4', stroke: 'currentColor', 'stroke-width': 1.5,
|
|
610
|
+
'stroke-linecap': 'round', 'stroke-linejoin': 'round',
|
|
611
|
+
}),
|
|
612
|
+
),
|
|
591
613
|
),
|
|
592
|
-
open ? React.createElement(
|
|
614
|
+
open ? React.createElement('div', { className: 'dts-body' },
|
|
615
|
+
React.createElement(TtsSection, Object.assign({}, props, { compact: true })),
|
|
616
|
+
) : null,
|
|
593
617
|
)
|
|
594
618
|
}
|
|
595
619
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodandready/dsh-tts",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "Text-to-speech for DeepSeek Harness: speak agent replies in the Web UI with a provider fallback chain (OpenAI, ElevenLabs, Google, Azure, Groq, Deepgram, OpenRouter, Edge, Piper, eSpeak).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|