Snapshot of the working tree exactly as it stood, no edits. This is the predecessor
PRICEGOD was rewritten from ("kept intact, untouched" per pricegod/README.md), and it
is still the only place the DYMO scale is actually implemented —
rfid-daemon/index.js:1068-1265: HID discovery, parseScaleReport, one-shot read, and a
streaming /weight + /scale/start|stop session whose JSON shape PRICEGOD's daemon.js
already speaks.
Preserved verbatim on purpose (hence -og), including the known bug: DYMO_PIDS at
index.js:1082 is [0x8003, 0x8004], so it cannot see the bench M25 (0x8009). Fix that
in whatever daemon inherits the scale, not here.
node_modules stays ignored (22M of the 24M tree). No credentials in the import: the
two PEM markers in utils.js/sheets.js only strip headers off a key read from settings,
and mrpadmin / johnking are an SSH and a Postgres username, both key/trust auth.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
379 lines
6.3 KiB
CSS
379 lines
6.3 KiB
CSS
/* Text Label Tab Styles */
|
|
|
|
.textlabel-container {
|
|
padding: 20px;
|
|
max-width: 900px;
|
|
margin: 0 auto;
|
|
}
|
|
|
|
.textlabel-header {
|
|
margin-bottom: 20px;
|
|
text-align: center;
|
|
}
|
|
|
|
.textlabel-header h3 {
|
|
margin: 0 0 10px 0;
|
|
color: #333;
|
|
}
|
|
|
|
.textlabel-header p {
|
|
margin: 0;
|
|
color: #666;
|
|
font-size: 14px;
|
|
}
|
|
|
|
#current-label-size {
|
|
color: #4CAF50;
|
|
}
|
|
|
|
/* Formatting Toolbar */
|
|
.formatting-toolbar {
|
|
background: #f5f5f5;
|
|
border: 1px solid #ddd;
|
|
border-radius: 8px;
|
|
padding: 15px;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.toolbar-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 20px;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.toolbar-row:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.toolbar-group {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
.toolbar-group label {
|
|
font-weight: 500;
|
|
font-size: 14px;
|
|
color: #333;
|
|
}
|
|
|
|
#text-font-family {
|
|
padding: 6px 10px;
|
|
border: 1px solid #ccc;
|
|
border-radius: 4px;
|
|
font-size: 14px;
|
|
min-width: 180px;
|
|
}
|
|
|
|
#text-font-size {
|
|
width: 60px;
|
|
padding: 6px 8px;
|
|
border: 1px solid #ccc;
|
|
border-radius: 4px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.format-button {
|
|
width: 36px;
|
|
height: 36px;
|
|
border: 1px solid #ccc;
|
|
background: white;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
font-size: 16px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
transition: all 0.2s;
|
|
}
|
|
|
|
.format-button:hover {
|
|
background: #e0e0e0;
|
|
border-color: #999;
|
|
}
|
|
|
|
.format-button.active {
|
|
background: #4CAF50;
|
|
color: white;
|
|
border-color: #4CAF50;
|
|
}
|
|
|
|
/* Workspace - Input and Preview side by side */
|
|
.textlabel-workspace {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 20px;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.input-section,
|
|
.preview-section {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.input-section label,
|
|
.preview-section label {
|
|
font-weight: 600;
|
|
font-size: 14px;
|
|
color: #333;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
/* Text Input Area */
|
|
#text-input-area {
|
|
width: 100%;
|
|
height: 80px;
|
|
padding: 12px;
|
|
border: 2px solid #ddd;
|
|
border-radius: 8px;
|
|
font-family: Arial;
|
|
font-size: 14px;
|
|
line-height: 1.5;
|
|
resize: vertical;
|
|
outline: none;
|
|
}
|
|
|
|
#text-input-area:focus {
|
|
border-color: #4CAF50;
|
|
}
|
|
|
|
/* Label Preview Box - Fixed Size */
|
|
.label-preview-box {
|
|
/* Large label: 25mm x 54mm */
|
|
width: 54mm;
|
|
height: 25mm;
|
|
border: 2px solid #4CAF50;
|
|
border-radius: 4px;
|
|
background: white;
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
overflow: hidden;
|
|
position: relative;
|
|
}
|
|
|
|
.label-preview-box.small {
|
|
/* Small label: 19mm x 51mm */
|
|
width: 51mm;
|
|
height: 19mm;
|
|
}
|
|
|
|
.label-preview-content {
|
|
width: 100%;
|
|
height: 100%;
|
|
padding: 2mm;
|
|
box-sizing: border-box;
|
|
font-family: Arial;
|
|
font-size: 12pt;
|
|
overflow: hidden;
|
|
word-wrap: break-word;
|
|
white-space: pre-wrap;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.label-preview-content.no-wrap {
|
|
white-space: pre;
|
|
}
|
|
|
|
.label-preview-content.bold {
|
|
font-weight: bold;
|
|
}
|
|
|
|
.label-preview-content.underline {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
/* Horizontal alignment */
|
|
.label-preview-content.align-left {
|
|
align-items: flex-start;
|
|
}
|
|
|
|
.label-preview-content.align-center {
|
|
align-items: center;
|
|
}
|
|
|
|
.label-preview-content.align-right {
|
|
align-items: flex-end;
|
|
}
|
|
|
|
/* Vertical alignment */
|
|
.label-preview-content.valign-top {
|
|
justify-content: flex-start;
|
|
}
|
|
|
|
.label-preview-content.valign-middle {
|
|
justify-content: center;
|
|
}
|
|
|
|
.label-preview-content.valign-bottom {
|
|
justify-content: flex-end;
|
|
}
|
|
|
|
.preview-note {
|
|
margin-top: 8px;
|
|
font-size: 12px;
|
|
color: #666;
|
|
font-style: italic;
|
|
}
|
|
|
|
/* Actions */
|
|
.textlabel-actions {
|
|
display: flex;
|
|
gap: 10px;
|
|
justify-content: center;
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
.textlabel-actions .action-button {
|
|
min-width: 150px;
|
|
}
|
|
|
|
/* Status */
|
|
#text-label-status {
|
|
text-align: center;
|
|
min-height: 20px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
/* Responsive adjustments */
|
|
@media (max-width: 768px) {
|
|
.textlabel-workspace {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.label-preview-box {
|
|
margin: 0 auto;
|
|
}
|
|
}
|
|
|
|
/* Print styles for text labels */
|
|
@media print {
|
|
body * {
|
|
visibility: hidden;
|
|
}
|
|
|
|
#text-label-print-area,
|
|
#text-label-print-area * {
|
|
visibility: visible;
|
|
}
|
|
|
|
#text-label-print-area {
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
}
|
|
|
|
/* QR Code Tab Styles */
|
|
.qrcode-container {
|
|
padding: 20px;
|
|
max-width: 900px;
|
|
margin: 0 auto;
|
|
}
|
|
|
|
.qrcode-header {
|
|
margin-bottom: 20px;
|
|
text-align: center;
|
|
}
|
|
|
|
.qrcode-header h3 {
|
|
margin: 0 0 10px 0;
|
|
color: #333;
|
|
}
|
|
|
|
.qrcode-header p {
|
|
margin: 0;
|
|
color: #666;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.qrcode-input-section {
|
|
margin-bottom: 20px;
|
|
text-align: center;
|
|
}
|
|
|
|
.qrcode-input-section label {
|
|
display: block;
|
|
font-weight: 600;
|
|
font-size: 14px;
|
|
color: #333;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
#qrcode-integer-input {
|
|
padding: 10px 15px;
|
|
border: 2px solid #ddd;
|
|
border-radius: 8px;
|
|
font-size: 18px;
|
|
width: 200px;
|
|
text-align: center;
|
|
outline: none;
|
|
}
|
|
|
|
#qrcode-integer-input:focus {
|
|
border-color: #4CAF50;
|
|
}
|
|
|
|
.qrcode-preview-section {
|
|
margin-bottom: 20px;
|
|
text-align: center;
|
|
}
|
|
|
|
.qrcode-preview-section label {
|
|
display: block;
|
|
font-weight: 600;
|
|
font-size: 14px;
|
|
color: #333;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
/* QR Code Preview Box - Large label size */
|
|
.qrcode-preview-box {
|
|
width: 54mm;
|
|
height: 25mm;
|
|
border: 2px solid #4CAF50;
|
|
border-radius: 4px;
|
|
background: white;
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
margin: 0 auto;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.qrcode-preview-box img {
|
|
max-width: 90%;
|
|
max-height: 90%;
|
|
object-fit: contain;
|
|
}
|
|
|
|
.qrcode-preview-section .preview-note {
|
|
margin-top: 8px;
|
|
font-size: 12px;
|
|
color: #666;
|
|
font-style: italic;
|
|
}
|
|
|
|
.qrcode-actions {
|
|
display: flex;
|
|
gap: 10px;
|
|
justify-content: center;
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
.qrcode-actions .action-button {
|
|
min-width: 150px;
|
|
}
|
|
|
|
#qrcode-status {
|
|
text-align: center;
|
|
min-height: 20px;
|
|
font-size: 14px;
|
|
} |