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 @@ + + + + + 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.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)); -}