USB label batch: brand colors + print-color-adjust; document migration strategy

- USBLabelBatch.vue: recolor controls/selection/cell borders to the app CSS
  variables (was hardcoded #667eea/#28a745/#dc3545) and add
  `print-color-adjust: exact` so barcodes print even with "Background graphics"
  off. (Barcodes render as vector SVG, so no canvas->img change needed.)
- ADR-004: document the resolved migration strategy - single core Alembic chain
  (`flask db upgrade`), bundled plugin schema folded into core (7c04), resolving
  the Phase 7B per-plugin-chain conflict footgun. External plugins may still
  ship their own chains.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
cproudlock
2026-06-26 20:01:51 -04:00
parent a515c28e3b
commit 0ee4f5a6ba
2 changed files with 38 additions and 17 deletions

View File

@@ -207,26 +207,27 @@ function print() {
@page { size: letter; margin: 0; }
.no-print { margin-bottom: 20px; padding: 20px; }
.controls { background: white; padding: 20px; border-radius: 8px; margin-bottom: 20px; }
.controls { background: var(--bg-card); color: var(--text); padding: 20px; border-radius: 8px; margin-bottom: 20px; border: 1px solid var(--border); }
.controls h3 { margin-top: 0; }
.print-btn {
padding: 10px 30px;
font-size: 16px;
cursor: pointer;
background: #667eea;
background: var(--primary);
color: white;
border: none;
border-radius: 5px;
margin-right: 10px;
}
.print-btn:disabled { background: #ccc; cursor: not-allowed; }
.print-btn:hover:not(:disabled) { background: var(--primary-dark); }
.print-btn:disabled { background: var(--text-light); cursor: not-allowed; }
.clear-btn {
padding: 10px 20px;
font-size: 14px;
cursor: pointer;
background: #dc3545;
background: var(--danger);
color: white;
border: none;
border-radius: 5px;
@@ -237,7 +238,7 @@ function print() {
padding: 10px 20px;
font-size: 14px;
cursor: pointer;
background: #28a745;
background: var(--success);
color: white;
border: none;
border-radius: 5px;
@@ -249,31 +250,32 @@ function print() {
gap: 10px;
max-height: 300px;
overflow-y: auto;
border: 1px solid #ddd;
border: 1px solid var(--border);
padding: 10px;
background: #fafafa;
background: var(--bg);
}
.usb-item {
display: flex;
align-items: center;
padding: 8px;
background: white;
border: 1px solid #ddd;
background: var(--bg-card);
color: var(--text);
border: 1px solid var(--border);
border-radius: 4px;
cursor: pointer;
}
.usb-item:hover { background: #f0f0f0; }
.usb-item.selected { background: #e7f1ff; border-color: #667eea; }
.usb-item:hover { border-color: var(--primary); }
.usb-item.selected { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
.usb-item input { margin-right: 10px; }
.usb-item label { cursor: pointer; flex: 1; }
.usb-item .alias { font-size: 11px; color: #666; }
.usb-item .alias { font-size: 11px; color: var(--text-light); }
.selected-count { font-weight: bold; margin: 10px 0; }
.selected-count .count { color: #667eea; }
.selected-count .pages { color: #28a745; }
.selected-count { font-weight: bold; margin: 10px 0; color: var(--text); }
.selected-count .count { color: var(--primary); }
.selected-count .pages { color: var(--success); }
.loading-msg { text-align: center; padding: 2rem; color: #666; }
.loading-msg { text-align: center; padding: 2rem; color: var(--text-light); }
.sheets-container { display: flex; flex-direction: column; gap: 20px; }
@@ -298,7 +300,7 @@ function print() {
border: 1px dashed #ccc;
overflow: hidden;
}
.label-cell.has-content { border: 1px solid #667eea; }
.label-cell.has-content { border: 1px solid var(--primary); }
.label-cell.empty { background: #fafafa; }
.cell-1 { top: 0.875in; left: 1.1875in; }
@@ -353,6 +355,12 @@ function print() {
}
@media print {
/* Force the barcodes/borders to print even when "Background graphics" is
off. */
body, .print-sheet, .label-cell, .mini-label, .barcode-container {
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
body { padding: 0; margin: 0; background: white; }
.no-print { display: none !important; }
.sheets-container { gap: 0; }