Skip to content

Styling ​

Overview ​

Collage Admin uses SCSS with sass-embedded. Global styles live in app/assets/scss/. Vuetify 3 provides the component foundation with a fully overridden custom theme.

File Structure ​

app/assets/scss/
├── main.scss           # Entry point — imports all partials
├── _variables.scss     # Design tokens (colors, typography, spacing)
├── _vuetify.scss       # Vuetify theme overrides
├── _typography.scss    # Global font rules (Acumin Pro)
├── _utilities.scss     # Utility classes
├── _animations.scss    # Transition and animation keyframes
└── components/
    ├── _dam.scss        # DAM-specific layout rules
    ├── _sidebar.scss    # Navigation sidebar
    ├── _dialogs.scss    # Dialog overrides
    └── _forms.scss      # Form input overrides

Design Tokens (_variables.scss) ​

All values from the Collage brand system. The Admin-Frontend design system guide documents the full palette; the Nuxt 4 app uses CSS custom properties derived from the same tokens.

Colors ​

scss
// Brand
$color-brand:        #6473FF;
$color-brand-hover:  #3A47BB;
$color-brand-dark:   #383859;

// Surfaces
$color-page-bg:      #F6F6F6;
$color-card-bg:      #FFFFFF;
$color-panel-bg:     #E9E9EF;

// Text
$color-text-primary:   #3D3D3D;
$color-text-secondary: #525252;
$color-text-muted:     #8F8F8F;

// Status
$color-success:  #13B854;
$color-danger:   #FF5572;
$color-warning:  #FF9800;

// Border
$color-border:   #E0E0E0;

Typography ​

Acumin Pro is loaded via Adobe Typekit. The kit URL is configured in nuxt.config.ts under app.head.link.

scss
$font-family:   'acumin-pro', sans-serif;
$font-size-sm:  12px;
$font-size-base: 14px;
$font-size-md:  16px;
$font-size-lg:  18px;
$line-height-base: 1.4;

Vuetify 3 Theme ​

Vuetify's theme is configured in plugins/vuetify.ts — not via SCSS. The theme maps Vuetify semantic color names to Collage tokens:

ts
// plugins/vuetify.ts
createVuetify({
  theme: {
    themes: {
      light: {
        colors: {
          primary:   '#6473FF',
          secondary: '#3A47BB',
          error:     '#FF5572',
          success:   '#13B854',
          surface:   '#FFFFFF',
          background: '#F6F6F6',
        }
      }
    }
  }
})

Component Styling ​

In Vue SFCs, use <style scoped> for component-specific styles. Never use deep selectors (::v-deep) unless overriding a Vuetify internal that has no other option.

vue
<style scoped lang="scss">
.asset-card {
  border: 1px solid $color-border;
  border-radius: 8px;

  &:hover {
    border-color: $color-brand-hover;
  }
}
</style>

Utility Classes ​

_utilities.scss provides a small set of non-Vuetify helpers:

ClassDescription
.truncateSingle-line text truncation with ellipsis
.line-clamp-2Two-line clamp
.gap-4, .gap-8, .gap-16, .gap-24Flex/grid gap shortcuts
.text-mutedcolor: $color-text-muted
.text-dangercolor: $color-danger
.text-successcolor: $color-success

Animations ​

_animations.scss defines reusable keyframes referenced in component transitions:

NameDescription
fade-inOpacity 0 → 1
slide-uptranslateY(8px) + fade
skeleton-pulseBackground shimmer for skeleton loaders

Rules ​

  • Use SCSS variables from _variables.scss — never hardcode hex values
  • All component styles are scoped — avoid global class pollution
  • No !important except when overriding Vuetify internals (add a comment explaining why)
  • Spacing uses multiples of 4 px: 4, 8, 12, 16, 20, 24, 32, 40
  • Border radius: 4px (inputs), 8px (cards), 12px (dialogs), 9999px (pills)