From 4854d74c5acdf7ead3aae1d54c4ea92778696195 Mon Sep 17 00:00:00 2001
From: Bryan Van Deusen
Date: Tue, 9 Jun 2026 23:08:15 -0400
Subject: [PATCH] refactor(ui): SampleNameGrid primitive for maintenance-card
previews (DRY pattern sweep)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The preview sample-name grid (scrollable monospace chip grid) was hand-rolled
5 times with verbatim-duplicated markup + CSS — TagMaintenanceCard (×4) and
PostMaintenanceCard. Consolidate to (components/common): pass
:names for the plain case, default slot for the normalize from→to chips
(styled via :slotted .fc-name). Removed the duplicated .fc-name-grid/.fc-name
CSS from both cards.
Over-DRY guard: only the verbatim-duplicated grid is merged — each card's
preview/commit logic and result-count lines genuinely differ and stay put;
MinDimensionCard's typed-token confirm is a separate variant, untouched.
§8b: fc-name-grid now lives only in SampleNameGrid. Catalog updated.
Co-Authored-By: Claude Opus 4.8 (1M context)
---
.../src/components/common/SampleNameGrid.vue | 32 ++++++++++++++
.../settings/PostMaintenanceCard.vue | 21 +++------
.../settings/TagMaintenanceCard.vue | 43 +++++++------------
3 files changed, 52 insertions(+), 44 deletions(-)
create mode 100644 frontend/src/components/common/SampleNameGrid.vue
diff --git a/frontend/src/components/common/SampleNameGrid.vue b/frontend/src/components/common/SampleNameGrid.vue
new file mode 100644
index 0000000..4488e55
--- /dev/null
+++ b/frontend/src/components/common/SampleNameGrid.vue
@@ -0,0 +1,32 @@
+
+
+
+
+ {{ n }}
+
+
+
+
+
+
+
diff --git a/frontend/src/components/settings/PostMaintenanceCard.vue b/frontend/src/components/settings/PostMaintenanceCard.vue
index 8c41f11..7e2c348 100644
--- a/frontend/src/components/settings/PostMaintenanceCard.vue
+++ b/frontend/src/components/settings/PostMaintenanceCard.vue
@@ -36,11 +36,10 @@
Nothing to clean up.
-
-
- {{ n }}
-
-
+
.fc-post-maint { border-radius: 8px; }
-.fc-name-grid {
- display: flex; flex-wrap: wrap; gap: 4px 8px;
- max-height: 200px; overflow-y: auto;
- padding: 8px; border-radius: 4px;
- background: rgb(var(--v-theme-surface-light));
-}
-.fc-name {
- font-family: 'JetBrains Mono', monospace;
- font-size: 12px;
- color: rgb(var(--v-theme-on-surface-variant));
-}
diff --git a/frontend/src/components/settings/TagMaintenanceCard.vue b/frontend/src/components/settings/TagMaintenanceCard.vue
index 46e2f8f..dca22a6 100644
--- a/frontend/src/components/settings/TagMaintenanceCard.vue
+++ b/frontend/src/components/settings/TagMaintenanceCard.vue
@@ -31,11 +31,10 @@
Showing first 50 names.
-
-
- {{ n }}
-
-
+
-
-
- {{ n }}
-
-
+
{{ resetPreview.applications }} image
application(s).
-
-
- {{ n }}
-
-
+
{{ normPreview.collisions }} collision(s) merging
{{ normPreview.tags_to_merge }} tag(s) away.
-
+
{{ s.from.join(' + ') }} → {{ s.to }}
-
+
.fc-tag-maint { border-radius: 8px; }
-.fc-name-grid {
- display: flex; flex-wrap: wrap; gap: 4px 8px;
- max-height: 200px; overflow-y: auto;
- padding: 8px; border-radius: 4px;
- background: rgb(var(--v-theme-surface-light));
-}
-.fc-name {
- font-family: 'JetBrains Mono', monospace;
- font-size: 12px;
- color: rgb(var(--v-theme-on-surface-variant));
-}