donobu 5.48.0 → 5.49.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.
@@ -1722,7 +1722,7 @@ function renderHtml(report, triage, outputDir) {
1722
1722
  </div>
1723
1723
  </div>
1724
1724
  ${test.plan ? `<span class="inline-reason" style="color:${reasonCfg(test.plan.plan.failureReason).color}" title="${esc(test.plan.plan.failureReason)}">${esc(reasonCfg(test.plan.plan.failureReason).label)}</span>` : ''}
1725
- ${test.tags.map((t) => `<span class="test-tag">${esc(t)}</span>`).join('')}
1725
+ ${test.tags.map((t) => `<span class="test-tag" data-copy-tag="${esc(t)}" title="Click to copy"><span class="tag-label">${esc(t)}</span><span class="tag-copy-glyph"><svg viewBox="0 0 24 24"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg></span></span>`).join('')}
1726
1726
  ${totalStepCount > 0 ? `<span class="test-step-count" title="${totalStepCount} steps">${totalStepCount} steps</span>` : ''}
1727
1727
  <span class="test-duration">${fmtDuration(totalTestDuration)}</span>
1728
1728
  </div>
@@ -1870,7 +1870,13 @@ body::before{content:'';position:fixed;top:-750px;left:50%;transform:translateX(
1870
1870
  .copy-flow-id .check-icon{color:#22c55e}
1871
1871
  .inline-reason{font-size:11px;font-weight:500;flex-shrink:0;padding:1px 8px;border-radius:4px;background:var(--overlay-light)}
1872
1872
  .test-step-count{font-size:11px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,255,255,.04);border-radius:4px}
1873
- .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px}
1873
+ .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;transition:background .15s,border-color .15s}
1874
+ .test-tag:hover{background:rgba(255,127,58,.16);border-color:rgba(255,127,58,.45)}
1875
+ .tag-copy-glyph{display:inline-flex;align-items:center;width:0;margin-left:0;opacity:0;overflow:hidden;transition:width .15s,opacity .15s,margin-left .15s}
1876
+ .test-tag:hover .tag-copy-glyph,.test-tag.copied .tag-copy-glyph{width:11px;margin-left:4px;opacity:.75}
1877
+ .tag-copy-glyph svg{width:11px;height:11px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
1878
+ .test-tag.copied{color:#22c55e;border-color:rgba(34,197,94,.45);background:rgba(34,197,94,.12)}
1879
+ .test-tag.copied .tag-copy-glyph{opacity:1}
1874
1880
  .test-duration{font-size:12px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono)}
1875
1881
  .flow-id-detail{display:flex;align-items:center;gap:10px;margin-bottom:4px;padding:8px 12px;background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:var(--radius)}
1876
1882
  .flow-id-detail .detail-label{margin-bottom:0;font-size:10px;letter-spacing:.8px}
@@ -2540,6 +2546,10 @@ details.ai-invocation[open]>summary .native-step-chevron{transform:rotate(90deg)
2540
2546
  // Copy buttons (flow ID + JSON + inline text via data-copy-text)
2541
2547
  var copyTextBtn=e.target.closest('.copy-text[data-copy-text]');
2542
2548
  if(copyTextBtn){e.stopPropagation();e.preventDefault();navigator.clipboard.writeText(copyTextBtn.getAttribute('data-copy-text'));var copyTextSvg=copyTextBtn.innerHTML;copyTextBtn.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';setTimeout(function(){copyTextBtn.innerHTML=copyTextSvg},2000);return}
2549
+ // Tag chip: click anywhere on the chip copies its tag text. The hover glyph
2550
+ // briefly becomes a check; stopPropagation keeps the card from expanding.
2551
+ var tagChip=e.target.closest('.test-tag[data-copy-tag]');
2552
+ if(tagChip){e.stopPropagation();navigator.clipboard.writeText(tagChip.getAttribute('data-copy-tag'));var glyph=tagChip.querySelector('.tag-copy-glyph');if(glyph){var glyphSvg=glyph.innerHTML;glyph.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';tagChip.classList.add('copied');setTimeout(function(){glyph.innerHTML=glyphSvg;tagChip.classList.remove('copied')},1500)}return}
2543
2553
  var flowBtn=e.target.closest('.copy-flow-id');
2544
2554
  if(flowBtn){e.stopPropagation();navigator.clipboard.writeText(flowBtn.getAttribute('data-flow-id'));var copySvg=flowBtn.innerHTML;flowBtn.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';setTimeout(function(){flowBtn.innerHTML=copySvg},2000);return}
2545
2555
  var jsonBtn=e.target.closest('.copy-json');
@@ -1722,7 +1722,7 @@ function renderHtml(report, triage, outputDir) {
1722
1722
  </div>
1723
1723
  </div>
1724
1724
  ${test.plan ? `<span class="inline-reason" style="color:${reasonCfg(test.plan.plan.failureReason).color}" title="${esc(test.plan.plan.failureReason)}">${esc(reasonCfg(test.plan.plan.failureReason).label)}</span>` : ''}
1725
- ${test.tags.map((t) => `<span class="test-tag">${esc(t)}</span>`).join('')}
1725
+ ${test.tags.map((t) => `<span class="test-tag" data-copy-tag="${esc(t)}" title="Click to copy"><span class="tag-label">${esc(t)}</span><span class="tag-copy-glyph"><svg viewBox="0 0 24 24"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg></span></span>`).join('')}
1726
1726
  ${totalStepCount > 0 ? `<span class="test-step-count" title="${totalStepCount} steps">${totalStepCount} steps</span>` : ''}
1727
1727
  <span class="test-duration">${fmtDuration(totalTestDuration)}</span>
1728
1728
  </div>
@@ -1870,7 +1870,13 @@ body::before{content:'';position:fixed;top:-750px;left:50%;transform:translateX(
1870
1870
  .copy-flow-id .check-icon{color:#22c55e}
1871
1871
  .inline-reason{font-size:11px;font-weight:500;flex-shrink:0;padding:1px 8px;border-radius:4px;background:var(--overlay-light)}
1872
1872
  .test-step-count{font-size:11px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,255,255,.04);border-radius:4px}
1873
- .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px}
1873
+ .test-tag{font-size:11px;color:var(--accent);flex-shrink:0;font-family:var(--mono);padding:2px 8px;background:rgba(255,127,58,.08);border:1px solid rgba(255,127,58,.2);border-radius:4px;cursor:pointer;display:inline-flex;align-items:center;transition:background .15s,border-color .15s}
1874
+ .test-tag:hover{background:rgba(255,127,58,.16);border-color:rgba(255,127,58,.45)}
1875
+ .tag-copy-glyph{display:inline-flex;align-items:center;width:0;margin-left:0;opacity:0;overflow:hidden;transition:width .15s,opacity .15s,margin-left .15s}
1876
+ .test-tag:hover .tag-copy-glyph,.test-tag.copied .tag-copy-glyph{width:11px;margin-left:4px;opacity:.75}
1877
+ .tag-copy-glyph svg{width:11px;height:11px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
1878
+ .test-tag.copied{color:#22c55e;border-color:rgba(34,197,94,.45);background:rgba(34,197,94,.12)}
1879
+ .test-tag.copied .tag-copy-glyph{opacity:1}
1874
1880
  .test-duration{font-size:12px;color:var(--text-dim);flex-shrink:0;font-family:var(--mono)}
1875
1881
  .flow-id-detail{display:flex;align-items:center;gap:10px;margin-bottom:4px;padding:8px 12px;background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:var(--radius)}
1876
1882
  .flow-id-detail .detail-label{margin-bottom:0;font-size:10px;letter-spacing:.8px}
@@ -2540,6 +2546,10 @@ details.ai-invocation[open]>summary .native-step-chevron{transform:rotate(90deg)
2540
2546
  // Copy buttons (flow ID + JSON + inline text via data-copy-text)
2541
2547
  var copyTextBtn=e.target.closest('.copy-text[data-copy-text]');
2542
2548
  if(copyTextBtn){e.stopPropagation();e.preventDefault();navigator.clipboard.writeText(copyTextBtn.getAttribute('data-copy-text'));var copyTextSvg=copyTextBtn.innerHTML;copyTextBtn.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';setTimeout(function(){copyTextBtn.innerHTML=copyTextSvg},2000);return}
2549
+ // Tag chip: click anywhere on the chip copies its tag text. The hover glyph
2550
+ // briefly becomes a check; stopPropagation keeps the card from expanding.
2551
+ var tagChip=e.target.closest('.test-tag[data-copy-tag]');
2552
+ if(tagChip){e.stopPropagation();navigator.clipboard.writeText(tagChip.getAttribute('data-copy-tag'));var glyph=tagChip.querySelector('.tag-copy-glyph');if(glyph){var glyphSvg=glyph.innerHTML;glyph.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';tagChip.classList.add('copied');setTimeout(function(){glyph.innerHTML=glyphSvg;tagChip.classList.remove('copied')},1500)}return}
2543
2553
  var flowBtn=e.target.closest('.copy-flow-id');
2544
2554
  if(flowBtn){e.stopPropagation();navigator.clipboard.writeText(flowBtn.getAttribute('data-flow-id'));var copySvg=flowBtn.innerHTML;flowBtn.innerHTML='<svg class="check-icon" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';setTimeout(function(){flowBtn.innerHTML=copySvg},2000);return}
2545
2555
  var jsonBtn=e.target.closest('.copy-json');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "donobu",
3
- "version": "5.48.0",
3
+ "version": "5.49.0",
4
4
  "description": "Create browser automations with an LLM agent and replay them as Playwright scripts.",
5
5
  "main": "dist/main.js",
6
6
  "module": "dist/esm/main.js",