@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.
Files changed (2) hide show
  1. package/lib/client.js +49 -25
  2. 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
- '.dts-sub{font-size:12px;color:var(--dsw-alias-label-secondary)}' +
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
- React.createElement('div', { className: 'dts-h' }, t('title')),
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-row' },
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('div',
577
- {
578
- className: 'dts-wrap',
579
- style: { border: '1px solid var(--dsw-alias-border-l2)', borderRadius: '8px', marginBottom: '10px' },
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
- React.createElement('button',
582
- {
583
- type: 'button',
584
- 'aria-expanded': open ? 'true' : 'false',
585
- onClick: () => setOpen((v) => !v),
586
- style: { display: 'flex', width: '100%', gap: '8px', alignItems: 'baseline', background: 'none', border: 'none', padding: '10px 12px', cursor: 'pointer', textAlign: 'left' },
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
- React.createElement('strong', null, t('title')),
589
- React.createElement('span', { className: 'dts-sub' }, t('cardHint')),
590
- React.createElement('span', { style: { marginLeft: 'auto', color: 'var(--dsw-alias-label-secondary)' } }, open ? '\u25be' : '\u25b8'),
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(TtsSection, props) : null,
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.2",
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",