// ============================================ // BILLIT - Component Styles // Industrial, Dense, McMaster-Carr Inspired // ============================================ @use 'sass:color'; @use 'variables' as *; // ============================================ // LAYOUT // ============================================ .container { width: 100%; max-width: $max-width-xl; margin: 0 auto; padding: 0 $spacing-8; } .container-sm { max-width: $max-width-sm; } .container-md { max-width: $max-width-md; } .page { padding: $spacing-8 0; } .page-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: $spacing-8; padding-bottom: $spacing-4; border-bottom: $border-width-2 solid $color-black; } .page-title { font-size: $font-size-xl; font-weight: $font-weight-bold; text-transform: uppercase; letter-spacing: 0.5px; } // ============================================ // HEADER / NAV // ============================================ .header { background: $header-bg; color: $header-text; height: $header-height; position: sticky; top: 0; z-index: 100; } .header-inner { display: flex; align-items: center; justify-content: space-between; height: 100%; max-width: $max-width-xl; margin: 0 auto; padding: 0 $spacing-8; } .header-logo { font-size: $font-size-lg; font-weight: $font-weight-bold; color: $color-primary; text-decoration: none; text-transform: uppercase; letter-spacing: 1px; &:hover { color: $color-primary-light; text-decoration: none; } } .header-nav { display: flex; align-items: center; gap: $spacing-1; } .header-link { display: inline-flex; align-items: center; height: $header-height; padding: 0 $spacing-6; color: $color-gray-300; font-size: $font-size-sm; font-weight: $font-weight-medium; text-decoration: none; text-transform: uppercase; letter-spacing: 0.5px; border-bottom: 2px solid transparent; transition: all $transition-fast; &:hover { color: $color-white; background: rgba(255, 255, 255, 0.1); text-decoration: none; } &.active { color: $color-primary; border-bottom-color: $color-primary; } } // ============================================ // BUTTONS // ============================================ .btn { display: inline-flex; align-items: center; justify-content: center; height: $btn-height; padding: $btn-padding; font-size: $font-size-sm; font-weight: $font-weight-semibold; text-transform: uppercase; letter-spacing: 0.5px; text-decoration: none; border: $border-width solid transparent; border-radius: $border-radius; cursor: pointer; transition: all $transition-fast; white-space: nowrap; &:hover { text-decoration: none; } &:disabled { opacity: 0.5; cursor: not-allowed; } } .btn-primary { background: $color-primary; color: $color-white; border-color: $color-primary; &:hover:not(:disabled) { background: $color-primary-dark; border-color: $color-primary-dark; } } .btn-secondary { background: $color-gray-800; color: $color-white; border-color: $color-gray-800; &:hover:not(:disabled) { background: $color-black; border-color: $color-black; } } .btn-outline { background: transparent; color: $color-gray-800; border-color: $color-gray-400; &:hover:not(:disabled) { background: $color-gray-100; border-color: $color-gray-600; } } .btn-danger { background: $color-error; color: $color-white; border-color: $color-error; &:hover:not(:disabled) { background: color.adjust($color-error, $lightness: -10%); border-color: color.adjust($color-error, $lightness: -10%); } } .btn-link { background: none; color: $color-accent; border: none; padding: 0; height: auto; text-transform: none; letter-spacing: normal; font-weight: $font-weight-normal; &:hover:not(:disabled) { text-decoration: underline; } } .btn-sm { height: 24px; padding: $spacing-1 $spacing-4; font-size: $font-size-xs; } .btn-lg { height: 36px; padding: $spacing-4 $spacing-8; font-size: $font-size-md; } // ============================================ // FORMS // ============================================ .form-group { margin-bottom: $spacing-6; } .form-row { display: grid; gap: $spacing-6; &.cols-2 { grid-template-columns: repeat(2, 1fr); } &.cols-3 { grid-template-columns: repeat(3, 1fr); } &.cols-4 { grid-template-columns: repeat(4, 1fr); } &.cols-5 { grid-template-columns: repeat(5, 1fr); } } .form-label { display: block; margin-bottom: $spacing-2; font-size: $font-size-xs; font-weight: $font-weight-semibold; text-transform: uppercase; letter-spacing: 0.5px; color: $color-gray-700; } .form-input, .form-select, .form-textarea { display: block; width: 100%; height: $input-height; padding: $input-padding; font-size: $font-size-base; color: $color-gray-900; background: $input-bg; border: $border-width solid $input-border; border-radius: $border-radius; transition: border-color $transition-fast; &:focus { border-color: $input-focus-border; outline: none; } &::placeholder { color: $color-gray-400; } &:disabled { background: $color-gray-100; cursor: not-allowed; } } .form-select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%23757575' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right $spacing-2 center; background-size: 16px; padding-right: $spacing-12; } .form-textarea { height: auto; min-height: 80px; resize: vertical; } .form-hint { margin-top: $spacing-2; font-size: $font-size-xs; color: $color-gray-500; } .form-error { margin-top: $spacing-2; font-size: $font-size-xs; color: $color-error; } // ============================================ // TABLES - Dense, Data-focused // ============================================ .table-wrapper { overflow-x: auto; border: $border-width solid $table-border; } .table { width: 100%; border-collapse: collapse; font-size: $font-size-sm; } .table th, .table td { padding: $table-cell-padding; text-align: left; border-bottom: $border-width solid $table-border; vertical-align: middle; } .table th { background: $table-header-bg; font-weight: $font-weight-semibold; text-transform: uppercase; letter-spacing: 0.3px; font-size: $font-size-xs; color: $color-gray-700; white-space: nowrap; } .table tbody tr:hover { background: $table-row-hover; } .table tbody tr:last-child td { border-bottom: none; } .table-numeric { text-align: right; font-family: $font-family-mono; font-size: $font-size-sm; } .table-actions { text-align: right; white-space: nowrap; } .table-empty { padding: $spacing-12 !important; text-align: center; color: $color-gray-500; } // ============================================ // CARDS / PANELS // ============================================ .card { background: $color-white; border: $border-width solid $border-color; } .card-header { display: flex; align-items: center; justify-content: space-between; padding: $spacing-4 $spacing-6; background: $color-gray-100; border-bottom: $border-width solid $border-color; } .card-title { font-size: $font-size-sm; font-weight: $font-weight-bold; text-transform: uppercase; letter-spacing: 0.5px; } .card-body { padding: $spacing-6; } .panel { background: $color-white; border: $border-width solid $border-color; margin-bottom: $spacing-8; } .panel-header { padding: $spacing-3 $spacing-4; background: $color-black; color: $color-white; font-size: $font-size-xs; font-weight: $font-weight-bold; text-transform: uppercase; letter-spacing: 0.5px; } .panel-body { padding: $spacing-4; } // ============================================ // ALERTS / MESSAGES // ============================================ .alert { padding: $spacing-4 $spacing-6; border: $border-width solid; margin-bottom: $spacing-6; font-size: $font-size-sm; } .alert-error { background: color.adjust($color-error, $lightness: 45%); border-color: $color-error; color: $color-error; } .alert-success { background: color.adjust($color-success, $lightness: 50%); border-color: $color-success; color: $color-success; } .alert-warning { background: color.adjust($color-warning, $lightness: 40%); border-color: $color-warning; color: color.adjust($color-warning, $lightness: -15%); } .alert-info { background: color.adjust($color-info, $lightness: 45%); border-color: $color-info; color: $color-info; } // ============================================ // BADGES / TAGS // ============================================ .badge { display: inline-block; padding: $spacing-1 $spacing-3; font-size: $font-size-xs; font-weight: $font-weight-semibold; text-transform: uppercase; letter-spacing: 0.3px; background: $color-gray-200; color: $color-gray-700; } .badge-primary { background: $color-primary; color: $color-white; } .badge-success { background: $color-success; color: $color-white; } // ============================================ // INVOICE SPECIFIC // ============================================ .invoice { background: $color-white; } .invoice-header { display: flex; justify-content: space-between; padding-bottom: $spacing-6; margin-bottom: $spacing-6; border-bottom: $border-width-2 solid $color-black; } .invoice-title { font-size: $font-size-2xl; font-weight: $font-weight-bold; text-transform: uppercase; letter-spacing: 1px; } .invoice-meta { text-align: right; font-size: $font-size-md; color: $color-gray-600; } .invoice-table { width: 100%; margin-bottom: $spacing-8; border: $border-width solid $color-black; th, td { padding: $spacing-3 $spacing-4; border: $border-width solid $color-gray-300; } th { background: $color-black; color: $color-white; font-size: $font-size-xs; font-weight: $font-weight-bold; text-transform: uppercase; letter-spacing: 0.3px; text-align: left; } tbody tr:nth-child(even) { background: $color-gray-50; } } .invoice-summary { display: flex; justify-content: flex-end; } .invoice-totals { width: 300px; margin-left: auto; border: $border-width solid $color-black; .row { display: flex; justify-content: space-between; padding: $spacing-3 $spacing-4; border-bottom: $border-width solid $color-gray-300; font-size: $font-size-sm; &:last-child { border-bottom: none; } } .row-total { background: $color-black; color: $color-white; font-weight: $font-weight-bold; font-size: $font-size-md; } } .invoice-qr { display: flex; justify-content: flex-end; padding: $spacing-8; } // ============================================ // PRODUCT ROW (for billing form) // ============================================ .product-row { padding: $spacing-4; border: $border-width solid $border-color; margin-bottom: $spacing-2; background: $color-gray-50; &:hover { background: $color-white; } } .product-row-grid { display: grid; grid-template-columns: 3fr 1fr auto; gap: $spacing-4; align-items: end; } // ============================================ // LOGIN / AUTH // ============================================ .auth-page { display: flex; align-items: center; justify-content: center; min-height: 100vh; background: $color-gray-100; } .auth-card { width: 100%; max-width: 380px; background: $color-white; border: $border-width-2 solid $color-black; } .auth-header { padding: $spacing-8 $spacing-8 $spacing-6; text-align: center; border-bottom: $border-width solid $border-color; } .auth-logo { font-size: $font-size-3xl; font-weight: $font-weight-bold; color: $color-primary; text-transform: uppercase; letter-spacing: 2px; margin-bottom: $spacing-2; } .auth-subtitle { font-size: $font-size-sm; color: $color-gray-600; text-transform: uppercase; letter-spacing: 0.5px; } .auth-body { padding: $spacing-8; } .auth-footer { padding: $spacing-4 $spacing-8; text-align: center; background: $color-gray-50; border-top: $border-width solid $border-color; font-size: $font-size-sm; } // ============================================ // HOME // ============================================ .home-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: $spacing-6; } .home-card { display: block; padding: $spacing-6; background: $color-white; border: $border-width-2 solid $border-color; text-decoration: none; transition: all $transition-fast; &:hover { border-color: $color-black; text-decoration: none; } } .home-card-icon { width: 32px; height: 32px; margin-bottom: $spacing-4; color: $color-primary; } .home-card-title { font-size: $font-size-lg; font-weight: $font-weight-bold; color: $color-black; margin-bottom: $spacing-2; } .home-card-desc { font-size: $font-size-sm; color: $color-gray-600; } .logged-in-as { font-size: $font-size-sm; color: $color-gray-600; strong { color: $color-black; font-weight: $font-weight-medium; } } .home-sections { margin-top: $spacing-8; display: flex; flex-direction: column; gap: $spacing-8; } .home-section { background: $color-white; border: $border-width solid $border-color; padding: $spacing-6; } .section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: $spacing-4; } .section-title { font-size: $font-size-lg; font-weight: $font-weight-semibold; color: $color-black; margin: 0; } .recent-list { display: flex; flex-direction: column; gap: $spacing-3; } .recent-item { display: flex; justify-content: space-between; align-items: center; padding: $spacing-3; background: $color-gray-50; border: $border-width solid $border-color; transition: background $transition-fast; &:hover { background: $color-gray-100; } } .recent-item-main { display: flex; flex-direction: column; gap: $spacing-1; text-decoration: none; color: inherit; } a.recent-item-main { &:hover { text-decoration: none; } } .recent-item-title { font-weight: $font-weight-medium; color: $color-black; } .recent-item-sub { font-size: $font-size-sm; color: $color-gray-500; } .recent-item-value { font-weight: $font-weight-medium; color: $color-black; font-family: $font-family-mono; } .text-accent { color: $color-primary; text-decoration: none; &:hover { text-decoration: underline; } } .text-muted { color: $color-gray-600; font-size: $font-size-sm; } // ============================================ // RESPONSIVE // ============================================ @media (max-width: 768px) { .container { padding: 0 $spacing-4; } .header-inner { padding: 0 $spacing-4; } .form-row { &.cols-2, &.cols-3, &.cols-4, &.cols-5 { grid-template-columns: 1fr; } } .page-header { flex-direction: column; align-items: flex-start; gap: $spacing-4; } .product-row-grid { grid-template-columns: 1fr; } } // ============================================ // ERROR PAGE // ============================================ .error-page { display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: $spacing-8; background: $color-gray-100; } .error-card { text-align: center; padding: $spacing-12 $spacing-8; background: $color-white; border: $border-width solid $border-color; max-width: 500px; width: 100%; } .error-code { font-size: 6rem; font-weight: $font-weight-bold; line-height: 1; color: $color-gray-300; margin-bottom: $spacing-4; } .error-title { font-size: $font-size-xl; font-weight: $font-weight-bold; color: $color-black; margin-bottom: $spacing-4; } .error-message { font-size: $font-size-md; color: $color-gray-600; margin-bottom: $spacing-8; line-height: 1.5; } .error-actions { display: flex; gap: $spacing-4; justify-content: center; } // ============================================ // ACCOUNT PAGE // ============================================ .account-grid { display: grid; grid-template-columns: 1fr; gap: $spacing-6; @media (min-width: 768px) { grid-template-columns: 1fr 1fr; } } .account-section { background: $color-white; border: $border-width solid $border-color; padding: $spacing-6; display: flex; flex-direction: column; } .account-details { display: flex; flex-direction: column; gap: $spacing-4; } .account-actions { display: flex; justify-content: flex-end; margin-top: auto; padding-top: $spacing-4; } .detail-row { display: flex; justify-content: space-between; align-items: center; padding: $spacing-3 0; border-bottom: 1px solid $color-gray-200; &:last-child { border-bottom: none; } } .detail-label { font-weight: $font-weight-medium; color: $color-gray-600; } .detail-value { color: $color-black; } .password-form { display: flex; flex-direction: column; gap: $spacing-4; } // ============================================ // EMPTY STATE // ============================================ .empty-state { text-align: center; padding: $spacing-12 $spacing-6; background: $color-white; border: $border-width solid $border-color; } .empty-state-icon { font-size: 3rem; margin-bottom: $spacing-4; } .empty-state-title { font-size: $font-size-lg; font-weight: $font-weight-bold; color: $color-black; margin-bottom: $spacing-2; } .empty-state-desc { font-size: $font-size-md; color: $color-gray-600; margin-bottom: $spacing-6; } // ============================================ // DIALOG / MODAL // ============================================ .dialog-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; opacity: 0; visibility: hidden; transition: opacity 0.15s ease, visibility 0.15s ease; } .dialog-overlay.dialog-open { opacity: 1; visibility: visible; } .dialog-box { background: $color-white; border: $border-width-2 solid $color-black; width: 100%; max-width: 400px; margin: $spacing-4; transform: scale(0.95); transition: transform 0.15s ease; } .dialog-open .dialog-box { transform: scale(1); } .dialog-header { padding: $spacing-4 $spacing-6; border-bottom: $border-width solid $border-color; background: $color-gray-100; } .dialog-title { font-size: $font-size-md; font-weight: $font-weight-bold; text-transform: uppercase; letter-spacing: 0.5px; margin: 0; } .dialog-body { padding: $spacing-6; } .dialog-message { font-size: $font-size-md; color: $color-gray-800; margin: 0; line-height: 1.5; } .dialog-footer { display: flex; gap: $spacing-3; justify-content: flex-end; padding: $spacing-4 $spacing-6; border-top: $border-width solid $border-color; background: $color-gray-100; } // Disclaimer specific styles .disclaimer-content { font-size: $font-size-sm; line-height: 1.6; ul { list-style: none; padding-left: 0; margin: 0; } li { padding: $spacing-2 0; padding-left: $spacing-4; border-left: 3px solid $color-primary; margin-bottom: $spacing-2; background: $color-gray-50; } }