+ {/* Button column: spacer matches label row height so input + button baselines align */}
+
+
diff --git a/frontend/src/styles/index.css b/frontend/src/styles/index.css
index c06f5a2..504c9aa 100644
--- a/frontend/src/styles/index.css
+++ b/frontend/src/styles/index.css
@@ -67,6 +67,7 @@
* DESIGN.md component recipes.
* Buttons stay sharp (rounded-md = 4px); cards stay soft (rounded-xl = 16px).
*/
+
.btn-primary {
@apply inline-flex items-center justify-center gap-xs bg-primary text-white uppercase tracking-[0.7px] font-semibold text-[14px] leading-[1.4] rounded-md px-xl py-sm h-11 transition-colors;
}
@@ -77,11 +78,13 @@
@apply bg-steel cursor-not-allowed;
}
+ /* btn-ink uses fixed dark slab so it doesn't invert in dark mode */
.btn-ink {
- @apply inline-flex items-center justify-center gap-xs bg-ink text-white uppercase tracking-[0.7px] font-semibold text-[14px] leading-[1.4] rounded-md px-xl py-sm h-11 transition-colors;
+ @apply inline-flex items-center justify-center gap-xs text-white uppercase tracking-[0.7px] font-semibold text-[14px] leading-[1.4] rounded-md px-xl py-sm h-11 transition-colors;
+ background-color: #111827;
}
.btn-ink:hover {
- @apply bg-ink-soft;
+ background-color: #1f2937;
}
.btn-ink:disabled {
@apply bg-steel cursor-not-allowed;
@@ -115,6 +118,14 @@
.card-product {
@apply bg-canvas rounded-xl p-xl shadow-soft-lift;
}
+ .dark .card-product {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.32);
+ }
+
+ /* Fixed-color modal backdrop — must not use themed ink (inverts in dark mode) */
+ .modal-backdrop {
+ background-color: rgba(0, 0, 0, 0.6);
+ }
.badge-pill-ink {
@apply inline-flex items-center bg-ink text-white rounded-lg px-3 py-[6px] text-[14px] leading-[1.3] font-medium;
diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts
index 947e025..2fee123 100644
--- a/frontend/tailwind.config.ts
+++ b/frontend/tailwind.config.ts
@@ -34,6 +34,10 @@ const config: Config = {
},
charcoal: 'var(--color-charcoal)',
graphite: 'var(--color-graphite)',
+ // Fixed dark slab — never inverts in dark mode (utility strip, footer, dark bands)
+ slab: '#111827',
+ 'slab-text': '#f9fafb',
+ 'slab-muted': '#6b7280',
// Semantic / decorative — fixed (not themeable)
bloom: {
coral: '#ff5050',
@@ -91,6 +95,8 @@ const config: Config = {
boxShadow: {
'soft-lift': '0 2px 8px rgba(26, 26, 26, 0.08)',
floating: '0 8px 24px rgba(26, 26, 26, 0.12)',
+ 'soft-lift-dark': '0 2px 8px rgba(0, 0, 0, 0.32)',
+ 'floating-dark': '0 8px 24px rgba(0, 0, 0, 0.48)',
},
maxWidth: {
page: '1366px',
diff --git a/frontend/tests/MitreMatrixModal.test.tsx b/frontend/tests/MitreMatrixModal.test.tsx
index 937caaf..6d8a851 100644
--- a/frontend/tests/MitreMatrixModal.test.tsx
+++ b/frontend/tests/MitreMatrixModal.test.tsx
@@ -306,7 +306,7 @@ describe('MitreMatrixModal', () => {
/>,
);
- const backdrop = document.querySelector('.bg-ink\\/60') as HTMLElement;
+ const backdrop = document.querySelector('.modal-backdrop') as HTMLElement;
if (backdrop) await user.click(backdrop);
expect(onCancel).toHaveBeenCalled();