From 7a3b81b6ea379e0087510edefd7121cd7d9742e8 Mon Sep 17 00:00:00 2001 From: 3dtours Date: Fri, 16 Oct 2026 08:56:49 +0700 Subject: [PATCH] feat(ui): compact Color Wheels & Match panel with MiniSlider rulers and 4-column color bands --- docker/frontend/src/App.tsx | 189 +++++++++++++++----------- docker/frontend/src/styles/app.css | 24 ++++ docker/frontend/src/ui/ChipColumn.tsx | 4 +- 3 files changed, 139 insertions(+), 78 deletions(-) diff --git a/docker/frontend/src/App.tsx b/docker/frontend/src/App.tsx index 7205aec..e338efb 100644 --- a/docker/frontend/src/App.tsx +++ b/docker/frontend/src/App.tsx @@ -4028,7 +4028,7 @@ export function Workspace() {
COLOR BANDS { const band = recipe.adjustments.hslBands?.[b.id]; const moved = !!band && (band[0] !== 0 || band[1] !== 0 || band[2] !== 0); @@ -4050,7 +4050,7 @@ export function Workspace() { {hslBand && (
-
+
BAND: {HSL_BANDS.find((b) => b.id === hslBand)?.label} {(recipe.adjustments.hslBands?.[hslBand]?.[0] || recipe.adjustments.hslBands?.[hslBand]?.[1] || recipe.adjustments.hslBands?.[hslBand]?.[2]) ? ( + ) : null}
+ v.toFixed(1)} + prefix="dev-hsl-master" + dataKey="dev-hsl-master-hue" + onChange={(v) => { + remember(); + setAdjustment({ hslHue: v }); + }} + onReset={() => { + remember(); + setAdjustment({ hslHue: 0 }); + }} + /> + v.toFixed(1)} + prefix="dev-hsl-master" + dataKey="dev-hsl-master-sat" + onChange={(v) => { + remember(); + setAdjustment({ hslSat: v }); + }} + onReset={() => { + remember(); + setAdjustment({ hslSat: 0 }); + }} + /> + v.toFixed(1)} + prefix="dev-hsl-master" + dataKey="dev-hsl-master-lum" + onChange={(v) => { + remember(); + setAdjustment({ hslLum: v }); + }} + onReset={() => { + remember(); + setAdjustment({ hslLum: 0 }); + }} + />
), diff --git a/docker/frontend/src/styles/app.css b/docker/frontend/src/styles/app.css index c796807..a484996 100644 --- a/docker/frontend/src/styles/app.css +++ b/docker/frontend/src/styles/app.css @@ -201,6 +201,30 @@ font-weight: 400; white-space: nowrap; } +.chip-row.grid-4 { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 4px; + width: 100%; +} +.chip-row.grid-4 .chip { + justify-content: center; + text-align: center; + flex-direction: column; + align-items: center; + gap: 2px; + padding: 4px 2px; + font-size: 10px; + font-weight: 400; + white-space: nowrap; +} +.chip-row.grid-4 .chip .chip-label { + font-size: 9.5px; +} +.chip-row.grid-4 .chip .chip-dot { + width: 8px; + height: 8px; +} .chip-label { font-weight: 400; letter-spacing: 0.02em; diff --git a/docker/frontend/src/ui/ChipColumn.tsx b/docker/frontend/src/ui/ChipColumn.tsx index a85ff75..b6c2176 100644 --- a/docker/frontend/src/ui/ChipColumn.tsx +++ b/docker/frontend/src/ui/ChipColumn.tsx @@ -72,19 +72,21 @@ export function ChipRow({ chips, grid, grid3, + grid4, list, glyph, }: { chips: ChipDef[]; grid?: boolean; grid3?: boolean; + grid4?: boolean; list?: boolean; // The mark drawn at the head of every row of a `list` (a frame, a look). It // is decoration and nothing else — the name beside it is the row. glyph?: string; }) { return ( -
+
{chips.map((chip) => chip.divider ? (