diff --git a/assets/css/admin.css b/assets/css/admin.css index b0da78a..2452551 100644 --- a/assets/css/admin.css +++ b/assets/css/admin.css @@ -8,10 +8,11 @@ @import "./theme-layer2-attributes.css"; @import "./theme-semantic.css"; -/* Admin components, icons, and utilities */ +/* Admin components, layout, icons, transitions */ @import "./admin/components.css"; +@import "./admin/layout.css"; @import "./admin/icons.css"; -@import "./admin/utilities.css"; +@import "./admin/transitions.css"; /* LiveView loading state variants */ .phx-click-loading, .phx-submit-loading, .phx-change-loading { diff --git a/assets/css/admin/components.css b/assets/css/admin/components.css index dbc8d23..a1f66ce 100644 --- a/assets/css/admin/components.css +++ b/assets/css/admin/components.css @@ -252,6 +252,37 @@ flex: none; } +/* ── Filter / tab row (below page header) ── */ + +.admin-filter-row { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; + margin-top: 1.5rem; + margin-bottom: 1rem; +} + +.admin-filter-row-end { + display: flex; + flex-wrap: wrap; + align-items: flex-end; + gap: 0.5rem; + margin-top: 1.5rem; + margin-bottom: 1rem; +} + +/* ── Back link (breadcrumb-style return link) ── */ + +.admin-back-link { + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 400; + color: color-mix(in oklch, var(--t-text-primary) 60%, transparent); + + &:hover { text-decoration: underline; } +} + /* ── Cards ── */ .admin-card { @@ -619,6 +650,14 @@ border: 1px solid color-mix(in oklch, var(--t-status-error) 25%, var(--t-surface-base)); } +.admin-alert-close { + align-self: flex-start; + cursor: pointer; + opacity: 0.4; + + &:hover { opacity: 0.7; } +} + .admin-banner-warning { display: flex; align-items: center; @@ -2699,6 +2738,10 @@ opacity: 0.7; } +.media-card-size { + font-size: 0.75rem; +} + .media-card-no-alt { display: flex; align-items: center; @@ -3081,6 +3124,114 @@ color: color-mix(in oklch, var(--t-text-primary) 50%, transparent); } +/* ── Product thumbnail ── */ + +.admin-thumbnail { + width: 2.5rem; + height: 2.5rem; + border-radius: 0.25rem; + background-color: var(--t-surface-sunken); + overflow: hidden; + flex-shrink: 0; +} + +.admin-thumbnail img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.admin-thumbnail-placeholder { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; +} + +/* ── Provider badge (small metadata pill) ── */ + +.admin-provider-badge { + display: inline-flex; + align-items: center; + border-radius: 9999px; + background-color: var(--t-surface-sunken); + padding: 0.125rem 0.375rem; + font-size: 0.75rem; + color: color-mix(in oklch, var(--t-text-primary) 60%, transparent); + margin-top: 0.125rem; +} + +/* ── Sale tag ── */ + +.admin-sale-tag { + color: #dc2626; + font-size: 0.75rem; + font-weight: 500; + margin-inline-end: 0.25rem; +} + +/* ── Product show layout ── */ + +.admin-product-grid { + display: grid; + gap: 1.5rem; + margin-top: 1.5rem; + + @media (min-width: 1024px) { grid-template-columns: 2fr 1fr; } +} + +.admin-product-image-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0.5rem; + + @media (min-width: 640px) { grid-template-columns: repeat(4, 1fr); } +} + +.admin-product-image-tile { + aspect-ratio: 1; + border-radius: 0.25rem; + background-color: var(--t-surface-sunken); + overflow: hidden; + + & img { + width: 100%; + height: 100%; + object-fit: cover; + } +} + +/* ── Provider status indicator ── */ + +.admin-provider-dot { + display: inline-flex; + width: 0.75rem; + height: 0.75rem; + border-radius: 9999px; +} + +.admin-provider-dot-idle { background: color-mix(in oklch, var(--t-text-primary) 30%, transparent); } +.admin-provider-dot-syncing { background: var(--t-status-warning); animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } +.admin-provider-dot-ok { background: var(--t-status-success); } +.admin-provider-dot-error { background: var(--t-status-error); } + +@keyframes pulse { + 50% { opacity: 0.5; } +} + +/* ── Nav editor section heading ── */ + +.admin-nav-section-heading { + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: color-mix(in oklch, var(--t-text-primary) 50%, transparent); + margin-bottom: 0.75rem; +} + /* -- Activity feed -- */ .admin-activity-row { @@ -3100,6 +3251,10 @@ margin-top: 0.125rem; } +.admin-activity-icon-error { color: #ef4444; } +.admin-activity-icon-warning { color: #f59e0b; } +.admin-activity-icon-ok { color: #22c55e; } + .admin-activity-body { flex: 1; min-width: 0; @@ -3125,6 +3280,29 @@ white-space: nowrap; } +.admin-activity-link { + font-size: 0.75rem; + line-height: 1rem; + color: var(--t-accent); + margin-inline-start: 0.25rem; + + &:hover { text-decoration: underline; } +} + +/* Stream empty state (works with only:block pattern) */ +.admin-stream-empty { + display: none; + text-align: center; + padding-block: 2rem; + font-size: 0.875rem; + line-height: 1.25rem; + color: color-mix(in oklch, var(--t-text-primary) 60%, transparent); +} + +.admin-stream-empty:only-child { + display: block; +} + /* ── Generic admin helpers ── */ /* Main content area with responsive padding */ @@ -3150,6 +3328,8 @@ .admin-sidebar-header { padding: 1rem; border-bottom: 1px solid var(--t-border-default); + + & .admin-text-secondary { margin-top: 0.125rem; } } /* Sidebar footer (view shop, log out) */ @@ -3843,4 +4023,713 @@ color: var(--t-text-primary); } +/* Section-level spacing (lighter alternative to theme-panel — no background) */ +.theme-section { margin-bottom: 1.5rem; } + +/* Block-level label (theme-slider-label inline by default, sometimes needs block) */ +.theme-block-label { display: block; margin-bottom: 0.5rem; } + +/* Small text for checkbox/toggle labels in the sidebar */ +.theme-check-text { + font-size: 0.875rem; + color: color-mix(in oklch, var(--t-text-primary) 80%, transparent); +} + +/* Spacing between sub-controls within a panel */ +.theme-subfield { margin-top: 0.75rem; } +.theme-subfield-sm { margin-top: 0.5rem; } + +/* Customise accordion inner padding */ +.theme-customise-body { padding-top: 1rem; } + +/* Collapse button pulled flush to sidebar edge inside header */ +.theme-header .theme-collapse-btn { margin: -0.25rem -0.5rem 0 0; } + +/* Last group in a customise section (no border, tighter margin than theme-group) */ +.theme-group-flush { margin-bottom: 1rem; } + +/* ── Content width containers ── */ + +.admin-content-narrow { max-width: 32rem; } +.admin-content-medium { max-width: 42rem; } + +/* ── Badge count (inline in tab/filter buttons) ── */ + +.admin-badge-count { margin-inline-start: 0.25rem; } + +/* ── Help and warning text ── */ + +.admin-help-text { + font-size: 0.875rem; + color: color-mix(in oklch, var(--t-text-primary) 60%, transparent); +} + +.admin-warning-text { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.875rem; + color: #b45309; +} + +/* ── Callout warning (amber env-locked) ── */ + +.admin-callout-warning { + margin-top: 1.5rem; + border-radius: 0.375rem; + background: #fffbeb; + padding: 1rem; + box-shadow: inset 0 0 0 1px rgb(217 119 6 / 0.1); +} + +.admin-callout-warning-body { + display: flex; + gap: 0.75rem; +} + +.admin-callout-warning-icon { + color: #d97706; + flex-shrink: 0; + margin-top: 0.125rem; +} + +.admin-callout-warning-title { + font-size: 0.875rem; + font-weight: 500; + color: #92400e; +} + +.admin-callout-warning-desc { + margin-top: 0.25rem; + font-size: 0.875rem; + color: #b45309; +} + +/* ── Section heading variants ── */ + +.admin-section-heading { + font-size: 1.125rem; + font-weight: 600; +} + +.admin-section-subheading { + font-size: 1rem; + font-weight: 600; +} + +/* ── Section with border separator ── */ + +.admin-section-bordered { + margin-top: 2rem; + border-top: 1px solid var(--t-surface-sunken); + padding-top: 1.5rem; +} + +/* ── Email adapter config ── */ + +.admin-adapter-config { + margin-top: 1.5rem; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.admin-adapter-link { + font-weight: 400; +} + +/* ── Campaign form ── */ + +.admin-campaign-actions { + display: flex; + align-items: center; + gap: 0.75rem; + padding-top: 1rem; + border-top: 1px solid var(--t-surface-sunken); +} + +.admin-btn-success { + background-color: var(--color-green-600); +} + +.admin-preview-summary { + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; +} + +.admin-preview-body { + margin-top: 0.5rem; + padding: 1rem; + background: var(--t-surface-sunken); + border-radius: 0.5rem; + font-size: 0.875rem; + white-space: pre-wrap; + overflow: auto; + max-height: 16rem; +} + +/* ── Navigation editor ── */ + +.admin-nav-layout { + margin-top: 1.5rem; + max-width: 40rem; + display: flex; + flex-direction: column; + gap: 2rem; +} + +.admin-nav-empty { + font-size: 0.875rem; + color: color-mix(in oklch, var(--t-text-primary) 50%, transparent); + padding: 1rem 0; +} + +.admin-nav-actions { + margin-top: 0.75rem; + display: flex; + gap: 0.5rem; +} + +.nav-editor-dropdown-wrap { + position: relative; +} + +.nav-editor-dropdown-slug { + font-size: 0.75rem; + color: color-mix(in oklch, var(--t-text-primary) 40%, transparent); +} + +/* ── Page editor ── */ + +.admin-editor-badges { + margin-top: 1rem; + display: flex; + gap: 0.5rem; + flex-wrap: wrap; +} + +/* ── Product show ── */ + +.admin-product-header { + display: flex; + align-items: center; + gap: 0.75rem; + margin-top: 0.25rem; +} + +.admin-product-title { + font-size: 1.5rem; + font-weight: 700; +} + +.admin-card-spaced { + margin-top: 1.5rem; +} + +/* ── Products table ── */ + +.admin-product-name { + font-weight: 500; +} + +/* ── Visibility / availability icon colours ── */ + +.admin-icon-positive { color: #16a34a; } + +.admin-icon-muted { + color: color-mix(in oklch, var(--t-text-primary) 30%, transparent); +} + +/* ── Filter select label & wrapper ── */ + +.admin-filter-label { + font-size: 0.75rem; + margin-bottom: 0.125rem; + display: block; +} + +.admin-filter-select { + width: auto; +} + +.admin-filter-select-wide { + width: auto; + flex: 1; + min-width: 12rem; +} + +/* ── Table row clickable ── */ + +.admin-table-row-clickable { cursor: pointer; } + +/* ── Tab actions bar (right-aligned above table) ── */ + +.admin-tab-actions { + display: flex; + justify-content: flex-end; + margin-bottom: 1rem; +} + +/* ── Filter row with space-between ── */ + +.admin-filter-row-between { + justify-content: space-between; +} + +/* ── Form layout ── */ + +.admin-form-stack { + display: flex; + flex-direction: column; + gap: 1.5rem; + max-width: 32rem; +} + +.admin-form-sub { + display: flex; + flex-direction: column; + gap: 1rem; + padding-inline-start: 1.5rem; +} + +/* ── Inline input that fills remaining space ── */ + +.admin-input-fill { flex: 1; } + +/* ── Source list (dead links) ── */ + +.admin-source-list { + list-style: none; + padding: 0; + margin: 0; + + & li + li { margin-top: 0.25rem; } +} + +/* ── Truncated cell ── */ + +.admin-cell-truncate { max-width: 20rem; } + +/* ── Text weight modifier ── */ + +.admin-text-medium { font-weight: 500; } + +/* ── Read-only actions (campaign form) ── */ + +.admin-readonly-actions { + padding-top: 1rem; + border-top: 1px solid var(--t-surface-sunken); +} + +/* ── Row modifiers ── */ + +.admin-row-between { justify-content: space-between; } +.admin-row-sm { --admin-row-gap: 0.25rem; } +.admin-row-xl { --admin-row-gap: 1rem; } + +/* ── Bold text weight ── */ + +.admin-text-bold { font-weight: 700; } + +/* ── Semantic colour text ── */ + +.admin-text-warning { color: var(--t-status-warning, #d97706); } +.admin-text-error { color: var(--t-status-error, #ef4444); } + +/* ── Right-aligned table cells ── */ + +.admin-cell-end { text-align: end; } +.admin-cell-numeric { text-align: end; font-variant-numeric: tabular-nums; } + +/* ── Small inline code ── */ + +.admin-code-sm { font-size: 0.75rem; } +.admin-code-break { font-size: 0.75rem; word-break: break-all; } + +/* ── Section body flush (no top margin) ── */ + +.admin-section-desc-flush { margin-top: 0; } + +/* ── Separator (border-top with compact padding) ── */ + +.admin-separator { + border-top: 1px solid var(--t-surface-sunken); + padding-top: 0.75rem; +} + +.admin-separator-lg { + border-top: 1px solid var(--t-surface-sunken); + padding-top: 1rem; +} + +.admin-separator-xl { + border-top: 1px solid var(--t-surface-sunken); + padding-top: 1.5rem; +} + +/* ── Button body (compact top margin for form buttons) ── */ + +.admin-form-actions-sm { margin-top: 0.75rem; } + +/* ── Flex fill (take remaining space) ── */ + +.admin-fill { flex: 1; } + +/* ── Larger input (prominent fields like shop name) ── */ + +.admin-input-lg { padding: 0.75rem 1rem; font-size: 1rem; } + +/* ═══════════════════════════════════════════════════════════════════ + Analytics + ═══════════════════════════════════════════════════════════════════ */ + +.analytics-periods { + display: flex; + gap: 0.25rem; + margin-top: 1rem; + align-items: center; +} + +.analytics-export { margin-left: auto; } + +.analytics-filters { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; + align-items: center; + margin-top: 1rem; +} + +.analytics-filter-chip { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.25rem 0.5rem; + font-size: 0.75rem; + background: var(--color-base-200, #e5e5e5); + border-radius: 0.25rem; +} + +.analytics-filter-remove { + cursor: pointer; + opacity: 0.6; + line-height: 1; +} + +.analytics-tab-heading { + font-size: 0.875rem; + font-weight: 600; + margin-bottom: 0.75rem; +} + +.analytics-tab-heading-spaced { + font-size: 0.875rem; + font-weight: 600; + margin: 1.5rem 0 0.75rem; +} + +.analytics-chart-card { padding: 1rem; } + +.analytics-tab-bar { + display: flex; + gap: 0.25rem; + margin-top: 1.5rem; + flex-wrap: wrap; +} + +.analytics-tab-panel { + margin-top: 0.75rem; + padding: 1rem; +} + +.analytics-empty { + text-align: center; + padding: 1.5rem; + color: color-mix(in oklch, var(--color-base-content) 40%, transparent); +} + +/* Chart layout */ + +.analytics-chart-grid { + display: grid; + grid-template-columns: auto 1fr; + gap: 0 0.5rem; + position: relative; +} + +.analytics-tooltip { + display: none; + position: absolute; + top: -1.75rem; + z-index: 10; + padding: 0.25rem 0.5rem; + font-size: 0.75rem; + font-weight: 500; + white-space: nowrap; + background: var(--color-base-content, #1e1e1e); + color: var(--color-base-100, #fff); + border-radius: 0.25rem; + pointer-events: none; + font-variant-numeric: tabular-nums; +} + +.analytics-y-labels { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: flex-end; + height: 8rem; + font-size: 0.75rem; + color: color-mix(in oklch, var(--color-base-content) 50%, transparent); +} + +.analytics-chart-area { + position: relative; + height: 8rem; +} + +.analytics-gridline-mid { + position: absolute; + top: 50%; + left: 0; + right: 0; + border-top: 1px dashed color-mix(in oklch, var(--color-base-content) 12%, transparent); +} + +.analytics-gridline-bottom { + position: absolute; + bottom: 0; + left: 0; + right: 0; + border-top: 1px solid color-mix(in oklch, var(--color-base-content) 15%, transparent); +} + +.analytics-bars { + display: flex; + align-items: flex-end; + height: 100%; +} + +.analytics-bar { + flex: 1; + background: var(--color-primary, #4f46e5); + opacity: 0.8; + border-radius: 1px 1px 0 0; + min-width: 0; +} + +.analytics-x-labels { + display: flex; + justify-content: space-between; + padding-top: 0.25rem; + font-size: 0.75rem; + color: color-mix(in oklch, var(--color-base-content) 50%, transparent); +} + +.analytics-delta { + font-size: 0.75rem; + font-weight: 500; + white-space: nowrap; +} + +/* Funnel */ + +.analytics-funnel { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.analytics-funnel-step { + display: flex; + align-items: center; + gap: 0.75rem; +} + +.analytics-funnel-label { + width: 7rem; + font-size: 0.8125rem; + text-align: right; + flex-shrink: 0; +} + +.analytics-funnel-bar { + height: 2rem; + background: var(--color-primary, #4f46e5); + border-radius: 0.25rem; + display: flex; + align-items: center; + padding-left: 0.5rem; +} + +.analytics-funnel-value { + font-size: 0.75rem; + font-weight: 600; + color: white; +} + +.analytics-funnel-rate { + font-size: 0.8125rem; + font-weight: 600; +} + +.analytics-funnel-summary { + margin-top: 0.75rem; + font-size: 0.875rem; + display: flex; + gap: 0.5rem; + flex-wrap: wrap; +} + +/* ── Stat card (icon + value + label) ── */ + +.admin-stat-card-body { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 1rem; +} + +.admin-stat-icon { + background: var(--color-base-200, #e5e5e5); + border-radius: 0.5rem; + padding: 0.5rem; + flex-shrink: 0; +} + +.admin-stat-value-row { + display: flex; + align-items: baseline; + gap: 0.5rem; +} + +/* ═══════════════════════════════════════════════════════════════════ + Dashboard + ═══════════════════════════════════════════════════════════════════ */ + +.dashboard-section { margin-top: 2rem; } + +.dashboard-section-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 1rem; +} + +.dashboard-view-all { + font-size: 0.875rem; + color: color-mix(in oklch, var(--color-base-content) 60%, transparent); +} + +.dashboard-recent-orders { overflow-x: auto; } + +.dashboard-stat-link { + display: block; + text-decoration: none; + color: inherit; +} + +.setup-complete-actions { + display: flex; + gap: 0.5rem; + justify-content: center; + flex-wrap: wrap; +} + +.dashboard-empty-orders { + border: 1px solid var(--color-base-200, #e5e5e5); + border-radius: 0.5rem; + padding: 2rem; + text-align: center; + color: color-mix(in oklch, var(--color-base-content) 60%, transparent); +} + +.dashboard-empty-icon { + margin: 0 auto 0.75rem; + width: 2.5rem; + opacity: 0.3; +} + +/* ═══════════════════════════════════════════════════════════════════ + Order show + ═══════════════════════════════════════════════════════════════════ */ + +.order-detail-grid { + margin-top: 1.5rem; + + &.admin-grid { + --admin-grid-min: 20rem; + --admin-grid-gap: 1.5rem; + } +} + +.order-timeline-actions { + margin-top: 0.5rem; + margin-bottom: 1rem; +} + +.order-tracking { + margin-bottom: 1rem; + font-size: 0.875rem; +} + +.order-timeline-empty { + padding-block: 1rem; + margin-top: 0; +} + +.order-total-row { font-size: 1.125rem; } + +/* ── Foundational utilities ── */ +/* Classes that can't be replaced with inline styles because they're + passed via class attributes to components like <.icon> */ + +.size-3 { width: 0.75rem; height: 0.75rem; } +.size-4 { width: 1rem; height: 1rem; } +.size-5 { width: 1.25rem; height: 1.25rem; } +.size-6 { width: 1.5rem; height: 1.5rem; } +.size-8 { width: 2rem; height: 2rem; } +.size-10 { width: 2.5rem; height: 2.5rem; } +.size-12 { width: 3rem; height: 3rem; } + +.shrink-0 { flex-shrink: 0; } +.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.ml-1 { margin-inline-start: 0.25rem; } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +@keyframes spin { to { transform: rotate(360deg); } } +.animate-spin { animation: spin 1s linear infinite; } +@media (prefers-reduced-motion: reduce) { .animate-spin { animation: none; } } +@media (prefers-reduced-motion: no-preference) { + .motion-safe\:animate-spin { animation: spin 1s linear infinite; } +} + +/* Phoenix LiveView JS transition utilities */ +.transition-all { transition-property: all; } +.ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } +.ease-in { transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } +.duration-200 { transition-duration: 200ms; } +.duration-300 { transition-duration: 300ms; } +.opacity-0 { opacity: 0; } +.opacity-100 { opacity: 1; } +.translate-y-0 { translate: 0 0; } +.translate-y-4 { translate: 0 1rem; } +@media (min-width: 640px) { + .sm\:translate-y-0 { translate: 0 0; } + .sm\:scale-95 { scale: 0.95; } + .sm\:scale-100 { scale: 1; } +} + } /* @layer admin */ diff --git a/assets/css/admin/layout.css b/assets/css/admin/layout.css index abbe68d..173afa8 100644 --- a/assets/css/admin/layout.css +++ b/assets/css/admin/layout.css @@ -24,6 +24,15 @@ align-items: center; } + /* Stack gap variants */ + .admin-stack-sm { --admin-stack-gap: 0.5rem; } + .admin-stack-md { --admin-stack-gap: 0.75rem; } + .admin-stack-lg { --admin-stack-gap: 1.5rem; } + .admin-stack-xl { --admin-stack-gap: 2rem; } + + /* Row gap variants */ + .admin-row-lg { --admin-row-gap: 0.75rem; } + /* Intrinsic responsive grid — cards, media thumbnails */ .admin-grid { display: grid; diff --git a/assets/css/admin/utilities.css b/assets/css/admin/utilities.css deleted file mode 100644 index 2b76560..0000000 --- a/assets/css/admin/utilities.css +++ /dev/null @@ -1,701 +0,0 @@ -/* Admin utility classes — replaces Tailwind utilities for admin/auth pages. - Only classes actually used in templates are defined here. */ - -/* ======================================== - Shadow/Ring foundation - ======================================== */ - -:where(html) { - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-ring-color: currentColor; - --tw-ring-inset: ; -} - -/* ======================================== - Display - ======================================== */ - -.hidden { display: none; } -.block { display: block; } -.inline { display: inline; } -.inline-flex { display: inline-flex; } -.flex { display: flex; } -.grid { display: grid; } - -/* ======================================== - Position - ======================================== */ - -.relative { position: relative; } -.absolute { position: absolute; } -.fixed { position: fixed; } -.inset-0 { inset: 0; } -.inset-y-0 { top: 0; bottom: 0; } -.left-0 { left: 0; } -.right-0 { right: 0; } -.left-\[40rem\] { left: 40rem; } -.-right-1\.5 { right: -0.375rem; } -.-top-1\.5 { top: -0.375rem; } -.z-0 { z-index: 0; } - -/* ======================================== - Flexbox - ======================================== */ - -.flex-1 { flex: 1 1 0%; } -.flex-none { flex: none; } -.flex-col { flex-direction: column; } -.flex-row { flex-direction: row; } -.flex-wrap { flex-wrap: wrap; } -.flex-shrink-0, .shrink-0 { flex-shrink: 0; } -.items-center { align-items: center; } -.items-start { align-items: flex-start; } -.items-end { align-items: flex-end; } -.justify-between { justify-content: space-between; } -.justify-center { justify-content: center; } -.self-start { align-self: flex-start; } - -/* ======================================== - Grid - ======================================== */ - -.grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } -.grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } -.grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - -/* ======================================== - Gap - ======================================== */ - -.gap-1 { gap: 0.25rem; } -.gap-1\.5 { gap: 0.375rem; } -.gap-2 { gap: 0.5rem; } -.gap-3 { gap: 0.75rem; } -.gap-4 { gap: 1rem; } -.gap-6 { gap: 1.5rem; } -.gap-\[14px\] { gap: 14px; } -.gap-x-4 { column-gap: 1rem; } -.gap-x-6 { column-gap: 1.5rem; } -.gap-y-1 { row-gap: 0.25rem; } -.gap-y-4 { row-gap: 1rem; } - -/* ======================================== - Padding - ======================================== */ - -.p-0 { padding: 0; } -.p-1 { padding: 0.25rem; } -.p-2 { padding: 0.5rem; } -.p-3 { padding: 0.75rem; } -.p-4 { padding: 1rem; } -.p-6 { padding: 1.5rem; } -.p-8 { padding: 2rem; } -.px-1\.5 { padding-inline: 0.375rem; } -.px-2 { padding-inline: 0.5rem; } -.px-3 { padding-inline: 0.75rem; } -.px-4 { padding-inline: 1rem; } -.px-6 { padding-inline: 1.5rem; } -.px-\[14px\] { padding-inline: 14px; } -.py-0\.5 { padding-block: 0.125rem; } -.py-1 { padding-block: 0.25rem; } -.py-1\.5 { padding-block: 0.375rem; } -.py-2 { padding-block: 0.5rem; } -.py-2\.5 { padding-block: 0.625rem; } -.py-3 { padding-block: 0.75rem; } -.py-4 { padding-block: 1rem; } -.py-10 { padding-block: 2.5rem; } -.py-12 { padding-block: 3rem; } -.py-\[5px\] { padding-block: 5px; } -.py-\[10px\] { padding-block: 10px; } -.pb-2 { padding-bottom: 0.5rem; } -.pb-6 { padding-bottom: 1.5rem; } -.pb-8 { padding-bottom: 2rem; } -.pb-10 { padding-bottom: 2.5rem; } -.pl-10 { padding-inline-start: 2.5rem; } -.pt-3 { padding-top: 0.75rem; } -.pt-4 { padding-top: 1rem; } -.pt-6 { padding-top: 1.5rem; } - -/* ======================================== - Margin - ======================================== */ - -.mt-0\.5 { margin-top: 0.125rem; } -.mt-1 { margin-top: 0.25rem; } -.mt-1\.5 { margin-top: 0.375rem; } -.mt-2 { margin-top: 0.5rem; } -.mt-3 { margin-top: 0.75rem; } -.mt-4 { margin-top: 1rem; } -.mt-6 { margin-top: 1.5rem; } -.mt-8 { margin-top: 2rem; } -.mt-10 { margin-top: 2.5rem; } -.-mt-1 { margin-top: -0.25rem; } -.-mb-px { margin-bottom: -1px; } -.mb-0\.5 { margin-bottom: 0.125rem; } -.mb-2 { margin-bottom: 0.5rem; } -.mb-3 { margin-bottom: 0.75rem; } -.mb-4 { margin-bottom: 1rem; } -.mb-6 { margin-bottom: 1.5rem; } -.ml-1 { margin-inline-start: 0.25rem; } -.ml-3 { margin-inline-start: 0.75rem; } -.mr-1 { margin-inline-end: 0.25rem; } -.-mr-2 { margin-inline-end: -0.5rem; } -.mx-auto { margin-inline: auto; } -.-mx-2 { margin-inline: -0.5rem; } -.-my-0\.5 { margin-block: -0.125rem; } - -/* ======================================== - Space between (lobotomised owl) - ======================================== */ - -.space-y-1 > :not(:first-child) { margin-top: 0.25rem; } -.space-y-4 > :not(:first-child) { margin-top: 1rem; } -.space-y-6 > :not(:first-child) { margin-top: 1.5rem; } - -/* ======================================== - Sizing - ======================================== */ - -.w-0 { width: 0; } -.w-1\.5 { width: 0.375rem; } -.w-3 { width: 0.75rem; } -.w-4 { width: 1rem; } -.w-5 { width: 1.25rem; } -.w-6 { width: 1.5rem; } -.w-9 { width: 2.25rem; } -.w-10 { width: 2.5rem; } -.w-12 { width: 3rem; } -.w-16 { width: 4rem; } -.w-28 { width: 7rem; } -.w-1\/3 { width: 33.333333%; } -.w-auto { width: auto; } -.w-fit { width: fit-content; } -.w-80 { width: 20rem; } -.w-full { width: 100%; } -.w-\[14px\] { width: 14px; } -.w-\[18px\] { width: 18px; } - -.h-1\.5 { height: 0.375rem; } -.h-3 { height: 0.75rem; } -.h-4 { height: 1rem; } -.h-5 { height: 1.25rem; } -.h-6 { height: 1.5rem; } -.h-9 { height: 2.25rem; } -.h-10 { height: 2.5rem; } -.h-12 { height: 3rem; } -.h-full { height: 100%; } -.h-\[14px\] { height: 14px; } -.h-\[18px\] { height: 18px; } -.h-\[60px\] { height: 60px; } - -.size-3 { width: 0.75rem; height: 0.75rem; } -.size-4 { width: 1rem; height: 1rem; } -.size-5 { width: 1.25rem; height: 1.25rem; } -.size-6 { width: 1.5rem; height: 1.5rem; } -.size-10 { width: 2.5rem; height: 2.5rem; } -.size-12 { width: 3rem; height: 3rem; } -.size-16 { width: 4rem; height: 4rem; } - -.min-h-0 { min-height: 0; } -.min-h-screen { min-height: 100vh; } -.min-w-0 { min-width: 0; } -.min-w-48 { min-width: 12rem; } - -.max-h-full { max-height: 100%; } -.max-h-64 { max-height: 16rem; } -.max-w-80 { max-width: 20rem; } -.max-w-sm { max-width: 24rem; } -.max-w-md { max-width: 28rem; } -.max-w-lg { max-width: 32rem; } -.max-w-xl { max-width: 36rem; } -.max-w-2xl { max-width: 42rem; } -.max-w-5xl { max-width: 64rem; } -.max-w-full { max-width: 100%; } -.max-w-\[1200px\] { max-width: 1200px; } - -.aspect-square { aspect-ratio: 1 / 1; } - -/* ======================================== - Typography - ======================================== */ - -.text-xs { font-size: 0.75rem; line-height: 1rem; } -.text-sm { font-size: 0.875rem; line-height: 1.25rem; } -.text-base { font-size: 1rem; line-height: 1.5rem; } -.text-lg { font-size: 1.125rem; line-height: 1.75rem; } -.text-xl { font-size: 1.25rem; line-height: 1.75rem; } -.text-2xl { font-size: 1.5rem; line-height: 2rem; } -.text-\[2rem\] { font-size: 2rem; } - -.font-normal { font-weight: 400; } -.font-medium { font-weight: 500; } -.font-semibold { font-weight: 600; } -.font-bold { font-weight: 700; } -.font-mono { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -.text-left { text-align: start; } -.text-center { text-align: center; } -.text-right { text-align: end; } -.text-balance { text-wrap: balance; } - -.text-wrap { text-wrap: wrap; } -.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.whitespace-pre-wrap { white-space: pre-wrap; } -.break-all { word-break: break-all; } -.uppercase { text-transform: uppercase; } -.capitalize { text-transform: capitalize; } -.underline { text-decoration-line: underline; } - -.leading-6 { line-height: 1.5rem; } -.leading-7 { line-height: 1.75rem; } -.leading-8 { line-height: 2rem; } -.leading-10 { line-height: 2.5rem; } -.leading-none { line-height: 1; } -.leading-relaxed { line-height: 1.625; } - -.tracking-tight { letter-spacing: -0.025em; } -.tracking-tighter { letter-spacing: -0.05em; } -.tracking-wider { letter-spacing: 0.05em; } - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -/* ======================================== - Colours — theme tokens - ======================================== */ - -.bg-base-100 { background-color: var(--t-surface-base); } -.bg-base-200 { background-color: var(--t-surface-sunken); } -.bg-base-300 { background-color: var(--t-border-default); } -.bg-base-content { background-color: var(--t-text-primary); } -.bg-primary { background-color: var(--t-accent); } -.bg-white { background-color: #fff; } - -.text-base-100 { color: var(--t-surface-base); } -.text-base-content { color: var(--t-text-primary); } -.text-base-content\/30 { color: color-mix(in oklch, var(--t-text-primary) 30%, transparent); } -.text-base-content\/40 { color: color-mix(in oklch, var(--t-text-primary) 40%, transparent); } -.text-base-content\/50 { color: color-mix(in oklch, var(--t-text-primary) 50%, transparent); } -.text-base-content\/60 { color: color-mix(in oklch, var(--t-text-primary) 60%, transparent); } -.text-base-content\/70 { color: color-mix(in oklch, var(--t-text-primary) 70%, transparent); } -.text-base-content\/80 { color: color-mix(in oklch, var(--t-text-primary) 80%, transparent); } -.text-error { color: var(--t-status-error); } -.text-success { color: var(--t-status-success); } -.text-white { color: #fff; } -.text-brand { color: var(--t-accent); } - -.fill-base-content\/40 { fill: color-mix(in oklch, var(--t-text-primary) 40%, transparent); } - -/* ======================================== - Colours — status palette - ======================================== */ - -.bg-green-50 { background-color: #f0fdf4; } -.bg-green-500 { background-color: #22c55e; } -.bg-green-600 { background-color: #16a34a; } -.text-green-600 { color: #16a34a; } -.text-green-700 { color: #15803d; } -.text-green-900 { color: #14532d; } -.border-green-200 { border-color: #bbf7d0; } - -.bg-red-50 { background-color: #fef2f2; } -.bg-red-500 { background-color: #ef4444; } -.text-red-600 { color: #dc2626; } -.text-red-700 { color: #b91c1c; } - -.bg-amber-50 { background-color: #fffbeb; } -.bg-amber-100 { background-color: #fef3c7; } -.bg-amber-500 { background-color: #f59e0b; } -.text-amber-600 { color: #d97706; } -.text-amber-700 { color: #b45309; } -.text-amber-800 { color: #92400e; } -.text-amber-900 { color: #78350f; } - -.bg-blue-50 { background-color: #eff6ff; } -.bg-blue-500 { background-color: #3b82f6; } -.text-blue-700 { color: #1d4ed8; } - -.bg-purple-50 { background-color: #faf5ff; } -.text-purple-700 { color: #7e22ce; } - -/* Arbitrary background colours (macOS traffic lights in theme editor) */ -.bg-\[\#ff5f57\] { background-color: #ff5f57; } -.bg-\[\#ffbd2e\] { background-color: #ffbd2e; } -.bg-\[\#28c940\] { background-color: #28c940; } - -/* ======================================== - Borders - ======================================== */ - -.border { border: 1px solid; } -.border-0 { border-width: 0; } -.border-1 { border-width: 1px; } -.border-2 { border-width: 2px; } -.border-b { border-bottom: 1px solid; } -.border-t { border-top: 1px solid; } -.border-t-0 { border-top-width: 0; } -.border-dashed { border-style: dashed; } - -.border-transparent { border-color: transparent; } -.border-base-200 { border-color: var(--t-surface-sunken); } -.border-base-300 { border-color: var(--t-border-default); } -.border-base-content\/20 { border-color: color-mix(in oklch, var(--t-text-primary) 20%, transparent); } -.border-b-base-content\/30 { border-bottom-color: color-mix(in oklch, var(--t-text-primary) 30%, transparent); } - -/* Arbitrary border colours (macOS traffic lights) */ -.border-\[\#e14640\] { border-color: #e14640; } -.border-\[\#dfa123\] { border-color: #dfa123; } -.border-\[\#1aab29\] { border-color: #1aab29; } - -/* ======================================== - Border radius - ======================================== */ - -.rounded { border-radius: 0.25rem; } -.rounded-md { border-radius: 0.375rem; } -.rounded-lg { border-radius: 0.5rem; } -.rounded-xl { border-radius: 0.75rem; } -.rounded-full { border-radius: 9999px; } -.rounded-b-lg { - border-bottom-left-radius: 0.5rem; - border-bottom-right-radius: 0.5rem; -} -.rounded-t-\[10px\] { - border-top-left-radius: 10px; - border-top-right-radius: 10px; -} -.rounded-box { border-radius: var(--t-radius-card, 0.5rem); } - -/* ======================================== - Ring (outline via box-shadow) - ======================================== */ - -.ring-0 { - --tw-ring-shadow: 0 0 #0000; - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} -.ring-1 { - --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 1px var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} -.ring-inset { --tw-ring-inset: inset; } -.ring-base-300 { --tw-ring-color: var(--t-border-default); } -.ring-green-600\/20 { --tw-ring-color: rgb(22 163 74 / 0.2); } -.ring-red-600\/20 { --tw-ring-color: rgb(220 38 38 / 0.2); } -.ring-amber-600\/10 { --tw-ring-color: rgb(217 119 6 / 0.1); } -.ring-blue-600\/20 { --tw-ring-color: rgb(37 99 235 / 0.2); } -.ring-purple-600\/20 { --tw-ring-color: rgb(147 51 234 / 0.2); } - -/* ======================================== - Shadow - ======================================== */ - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} -.shadow-xs { - --tw-shadow: 0 1px rgb(0 0 0 / 0.05); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} -.shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} - -/* ======================================== - Overflow - ======================================== */ - -.overflow-auto { overflow: auto; } -.overflow-hidden { overflow: hidden; } -.overflow-x-auto { overflow-x: auto; } - -/* ======================================== - Object fit - ======================================== */ - -.object-cover { object-fit: cover; } -.object-contain { object-fit: contain; } - -/* ======================================== - Opacity - ======================================== */ - -.opacity-40 { opacity: 0.4; } -.opacity-75 { opacity: 0.75; } - -/* ======================================== - Cursor - ======================================== */ - -.cursor-pointer { cursor: pointer; } -.pointer-events-none { pointer-events: none; } - -/* ======================================== - Gradient - ======================================== */ - -.bg-gradient-to-b { - --tw-gradient-from: transparent; - --tw-gradient-to: transparent; - background-image: linear-gradient(to bottom, var(--tw-gradient-from), var(--tw-gradient-to)); -} -.from-base-300 { --tw-gradient-from: var(--t-border-default); } -.to-base-300\/80 { --tw-gradient-to: color-mix(in oklch, var(--t-border-default) 80%, transparent); } - -/* ======================================== - Filter - ======================================== */ - -.brightness-200 { filter: brightness(2); } - -/* ======================================== - Transitions & animation - ======================================== */ - -.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; -} - -@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; } -} - -/* ======================================== - Hover states - ======================================== */ - -.hover\:bg-base-200:hover { background-color: var(--t-surface-sunken); } -.hover\:bg-base-200\/50:hover { background-color: color-mix(in oklch, var(--t-surface-sunken) 50%, transparent); } -.hover\:bg-base-300:hover { background-color: var(--t-border-default); } -.hover\:bg-base-content\/80:hover { background-color: color-mix(in oklch, var(--t-text-primary) 80%, transparent); } -.hover\:bg-green-500:hover { background-color: #22c55e; } -.hover\:border-base-300:hover { border-color: var(--t-border-default); } -.hover\:border-base-content\/40:hover { border-color: color-mix(in oklch, var(--t-text-primary) 40%, transparent); } -.hover\:opacity-100:hover { opacity: 1; } -.hover\:text-base-content:hover { color: var(--t-text-primary); } -.hover\:text-base-content\/70:hover { color: color-mix(in oklch, var(--t-text-primary) 70%, transparent); } -.hover\:text-base-content\/80:hover { color: color-mix(in oklch, var(--t-text-primary) 80%, transparent); } -.hover\:text-red-800:hover { color: #991b1b; } -.hover\:underline:hover { text-decoration-line: underline; } -.hover\:cursor-pointer:hover { cursor: pointer; } - -/* ======================================== - Focus states - ======================================== */ - -.focus\:border-primary:focus { border-color: var(--t-accent); } -.focus\:outline-none:focus { outline: 2px solid transparent; outline-offset: 2px; } -.focus\:ring-1:focus { - --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 1px var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} -.focus\:ring-primary\/20:focus { --tw-ring-color: color-mix(in oklch, var(--t-accent) 20%, transparent); } - -/* ======================================== - Disabled states - ======================================== */ - -.disabled\:cursor-not-allowed:disabled { cursor: not-allowed; } -.disabled\:opacity-50:disabled { opacity: 0.5; } - -/* ======================================== - Group states - ======================================== */ - -.group { /* marker class — no styles */ } -.group:hover .group-hover\:bg-base-300 { background-color: var(--t-border-default); } -.group:hover .group-hover\:fill-base-content { fill: var(--t-text-primary); } -.group:hover .group-hover\:opacity-70 { opacity: 0.7; } -.group:hover .group-hover\:text-base-content { color: var(--t-text-primary); } -.group[open] .group-open\:rotate-180 { transform: rotate(180deg); } - -/* ======================================== - Pseudo-class selectors - ======================================== */ - -.only\:block:only-child { display: block; } -.last\:pb-0:last-child { padding-bottom: 0; } -.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker { display: none; } - -/* ======================================== - Responsive: sm (min-width: 640px) - ======================================== */ - -@media (min-width: 640px) { - .sm\:flex-col { flex-direction: column; } - .sm\:flex-row { flex-direction: row; } - .sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .sm\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .sm\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .sm\:p-6 { padding: 1.5rem; } - .sm\:px-6 { padding-inline: 1.5rem; } - .sm\:py-6 { padding-block: 1.5rem; } - .sm\:py-28 { padding-block: 7rem; } - .sm\:w-auto { width: auto; } - .sm\:w-96 { width: 24rem; } - .sm\:max-w-96 { max-width: 24rem; } - - /* JS transition scale (used in show/hide) */ - .sm\:translate-y-0 { translate: 0 0; } - .sm\:scale-95 { scale: 0.95; } - .sm\:scale-100 { scale: 1; } - - .sm\:group-hover\:scale-105 { /* defined below with group:hover */ } -} - -.group:hover .sm\:group-hover\:scale-105 { - @media (min-width: 640px) { scale: 1.05; } -} - -/* ======================================== - Responsive: lg (min-width: 1024px) - ======================================== */ - -@media (min-width: 1024px) { - .lg\:block { display: block; } - .lg\:col-span-2 { grid-column: span 2 / span 2; } - .lg\:flex-row { flex-direction: row; } - .lg\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .lg\:h-screen { height: 100vh; } - .lg\:mx-0 { margin-inline: 0; } - .lg\:p-8 { padding: 2rem; } - .lg\:px-8 { padding-inline: 2rem; } -} - -/* ======================================== - Responsive: xl (min-width: 1280px) - ======================================== */ - -@media (min-width: 1280px) { - .xl\:left-\[50rem\] { left: 50rem; } - .xl\:px-28 { padding-inline: 7rem; } - .xl\:py-32 { padding-block: 8rem; } -} - -/* ======================================== - JS transition helpers (used by core_components show/hide) - ======================================== */ - -.translate-y-4 { translate: 0 1rem; } -.translate-y-0 { translate: 0 0; } -.opacity-0 { opacity: 0; } -.opacity-100 { opacity: 1; } -.scale-95 { scale: 0.95; } -.scale-100 { scale: 1; } - -/* Duration classes used by JS.transition */ -.duration-200 { transition-duration: 200ms; } -.duration-300 { transition-duration: 300ms; } -.ease-in { transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } -.ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } - -/* ======================================== - DaisyUI component stubs (used in Phoenix home page and theme toggle) - ======================================== */ - -.card { - border-radius: var(--t-radius-card, 0.5rem); - overflow: hidden; -} - -.badge { - display: inline-flex; - align-items: center; - border-radius: var(--t-radius-button, 0.25rem); - padding-inline: 0.5rem; - font-size: 0.875rem; - line-height: 1.25rem; - border: 1px solid currentColor; - width: fit-content; -} -.badge-sm { font-size: 0.75rem; line-height: 1rem; padding-inline: 0.375rem; } -.badge-warning { - border-color: var(--t-status-warning); - color: var(--t-status-warning-content); - background-color: var(--t-status-warning); -} - -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - gap: 0.5rem; - padding: 0.5rem 1rem; - font-size: 0.875rem; - font-weight: 600; - border-radius: var(--t-radius-input, 0.25rem); - border: 1px solid transparent; - cursor: pointer; - transition: background-color 150ms, border-color 150ms; -} -.btn-primary { - background-color: var(--t-accent); - color: var(--t-text-inverse); -} -.btn-primary:hover { - filter: brightness(0.9); -} - -/* ======================================== - Prose (minimal typography block for instructions) - ======================================== */ - -.prose { - line-height: 1.75; -} -.prose p { margin-top: 1em; margin-bottom: 1em; } -.prose :first-child { margin-top: 0; } -.prose :last-child { margin-bottom: 0; } -.prose a { color: var(--t-accent); text-decoration: underline; } -.prose strong { font-weight: 600; } -.prose-sm { font-size: 0.875rem; line-height: 1.5; } - -/* ======================================== - List styles - ======================================== */ - -.list-decimal { list-style-type: decimal; } -.list-inside { list-style-position: inside; } -.list-none { list-style-type: none; } diff --git a/lib/berrypod_web/components/core_components.ex b/lib/berrypod_web/components/core_components.ex index 4319d1b..dc9ce0c 100644 --- a/lib/berrypod_web/components/core_components.ex +++ b/lib/berrypod_web/components/core_components.ex @@ -62,8 +62,8 @@ defmodule BerrypodWeb.CoreComponents do

{msg}

-
@@ -351,7 +351,7 @@ defmodule BerrypodWeb.CoreComponents do {render_slot(col, @row_item.(row))} diff --git a/lib/berrypod_web/components/layouts/admin.html.heex b/lib/berrypod_web/components/layouts/admin.html.heex index 6691757..da78aed 100644 --- a/lib/berrypod_web/components/layouts/admin.html.heex +++ b/lib/berrypod_web/components/layouts/admin.html.heex @@ -46,7 +46,7 @@ <.link navigate={~p"/admin"} class="admin-brand"> Berrypod -

+

{@current_scope.user.email}

diff --git a/lib/berrypod_web/live/admin/activity.ex b/lib/berrypod_web/live/admin/activity.ex index c478a27..721ec8a 100644 --- a/lib/berrypod_web/live/admin/activity.ex +++ b/lib/berrypod_web/live/admin/activity.ex @@ -132,7 +132,7 @@ defmodule BerrypodWeb.Admin.Activity do <%!-- tabs --%> -
+
<%!-- category chips + search --%> -
- <.category_chip category={nil} active={@category} label="All" /> - <.category_chip category="orders" active={@category} label="Orders" /> - <.category_chip category="syncs" active={@category} label="Syncs" /> - <.category_chip category="emails" active={@category} label="Emails" /> - <.category_chip category="carts" active={@category} label="Carts" /> -
- <.form for={%{}} phx-submit="search" as={:search} class="flex gap-2"> - - - +
+
+ <.category_chip category={nil} active={@category} label="All" /> + <.category_chip category="orders" active={@category} label="Orders" /> + <.category_chip category="syncs" active={@category} label="Syncs" /> + <.category_chip category="emails" active={@category} label="Emails" /> + <.category_chip category="carts" active={@category} label="Carts" />
+ <.form + for={%{}} + phx-submit="search" + as={:search} + class="admin-row" + > + + +
<%!-- entries --%>
-