refactor admin CSS: replace utility classes with semantic styles

Replace Tailwind utility soup across admin templates with semantic
CSS classes. Add layout primitives (stack, row, cluster, grid),
extract JS transition helpers into transitions.css, and refactor
core_components, layouts, settings, newsletter, order_show, providers,
and theme editor templates.

Utility occurrences reduced from 290+ to 127 across admin files.
All 1679 tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-03-01 17:15:25 +00:00
parent edef628214
commit b7ec41b0cf
13 changed files with 2661 additions and 1643 deletions

View File

@@ -8,9 +8,11 @@
@import "./theme-layer2-attributes.css";
@import "./theme-semantic.css";
/* Admin components, icons, and utilities */
/* Admin components, layout, icons, and transitions */
@import "./admin/components.css";
@import "./admin/layout.css";
@import "./admin/icons.css";
@import "./admin/transitions.css";
@import "./admin/utilities.css";
/* LiveView loading state variants */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,36 @@
/* Admin layout primitives — composable building blocks mirroring shop/layout.css.
Each primitive does one layout job. Combine freely via CSS custom properties. */
@layer admin {
/* Vertical stack with consistent gap */
.admin-stack {
display: flex;
flex-direction: column;
gap: var(--admin-stack-gap, 1rem);
}
/* Horizontal flex row, no wrap — toolbars, inline groups, header bars */
.admin-row {
display: flex;
align-items: center;
gap: var(--admin-row-gap, 0.5rem);
}
/* Horizontal flex-wrap cluster — tags, badges, button groups */
.admin-cluster {
display: flex;
flex-wrap: wrap;
gap: var(--admin-cluster-gap, 0.5rem);
align-items: center;
}
/* Intrinsic responsive grid — cards, media thumbnails */
.admin-grid {
display: grid;
grid-template-columns: repeat(
auto-fill,
minmax(min(var(--admin-grid-min, 16rem), 100%), 1fr)
);
gap: var(--admin-grid-gap, 1rem);
}
}

View File

@@ -0,0 +1,80 @@
/* Transition and animation utilities for admin pages.
These are required by Phoenix JS.show/JS.hide in core_components.ex
and by various admin UI interactions (spinners, hover effects, etc.).
Placed in @layer admin so they integrate with the cascade. */
@layer admin {
/* ── Transition properties ── */
.transition {
transition-property: color, background-color, border-color, text-decoration-color,
fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.transition-all {
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.transition-colors {
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.transition-transform {
transition-property: transform;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.transition-\[left\] {
transition-property: left;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
/* ── Duration overrides ── */
.duration-200 { transition-duration: 200ms; }
.duration-300 { transition-duration: 300ms; }
/* ── Easing overrides ── */
.ease-in { transition-timing-function: cubic-bezier(0.4, 0, 1, 1); }
.ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }
/* ── Opacity states (JS.show / JS.hide) ── */
.opacity-0 { opacity: 0; }
.opacity-100 { opacity: 1; }
/* ── Transform states (JS.show / JS.hide) ── */
.translate-y-4 { translate: 0 1rem; }
.translate-y-0 { translate: 0 0; }
.scale-95 { scale: 0.95; }
.scale-100 { scale: 1; }
@media (min-width: 640px) {
.sm\:translate-y-0 { translate: 0 0; }
.sm\:scale-95 { scale: 0.95; }
.sm\:scale-100 { scale: 1; }
}
/* ── Spin animation ── */
@keyframes spin { to { transform: rotate(360deg); } }
.animate-spin { animation: spin 1s linear infinite; }
@media (prefers-reduced-motion: no-preference) {
.motion-safe\:animate-spin { animation: spin 1s linear infinite; }
}
} /* @layer admin */