/* Disclaimer Modal */ .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.7); display: flex; align-items: center; justify-content: center; z-index: 9999; backdrop-filter: blur(4px); } .modal-overlay.hidden { display: none; } .modal { background-color: var(--md-sys-color-surface, #fff); color: var(--md-sys-color-on-surface, #1C1B1F); border-radius: 24px; padding: 32px; max-width: 400px; margin: 16px; text-align: center; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); animation: modalIn 0.3s ease-out; } @keyframes modalIn { from { opacity: 0; transform: scale(0.9) translateY(20px); } to { opacity: 1; transform: scale(1) translateY(0); } } .modal-icon { width: 64px; height: 64px; background-color: #FFF3E0; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 16px; } .modal-icon .material-icons { font-size: 32px; color: #E65100; } .modal h2 { font-size: 1.5rem; font-weight: 500; margin-bottom: 16px; } .modal p { font-size: 1.1rem; margin-bottom: 8px; } .modal .modal-sub { font-size: 0.875rem; color: var(--md-sys-color-on-surface-variant, #49454F); margin-bottom: 24px; } .modal .checkbox-label { display: flex; align-items: center; justify-content: center; gap: 8px; margin-bottom: 16px; font-size: 0.875rem; cursor: pointer; color: var(--md-sys-color-on-surface-variant, #49454F); } .modal .checkbox-label input[type="checkbox"] { width: 18px; height: 18px; cursor: pointer; accent-color: var(--md-sys-color-primary, #1976D2); } .modal .btn { min-width: 160px; } @media (prefers-color-scheme: dark) { .modal-icon { background-color: #3E2723; } .modal-icon .material-icons { color: #FFB74D; } } /* CSS Custom Properties - Material Design 3 inspired */ :root { /* Light theme (default) */ --md-sys-color-primary: #ffa31a; --md-sys-color-primary-dark: #e8920f; --md-sys-color-on-primary: #1b1b1b; --md-sys-color-surface: #ffffff; --md-sys-color-surface-container: #ffffff; --md-sys-color-surface-variant: #E3E3E3; --md-sys-color-on-surface: #1b1b1b; --md-sys-color-on-surface-variant: #292929; --md-sys-color-outline: #808080; --md-sys-color-outline-variant: #CAC4D0; --md-sys-color-background: #F5F5F5; --md-sys-color-error: #B3261E; --md-sys-color-success: #2E7D32; --md-sys-color-preview-bg: #E8E8E8; --md-sys-color-preview-pattern: #D0D0D0; --md-sys-elevation-1: 0 1px 2px rgba(0,0,0,0.1), 0 1px 3px rgba(0,0,0,0.08); --md-sys-elevation-2: 0 2px 4px rgba(0,0,0,0.1), 0 4px 8px rgba(0,0,0,0.1); --md-sys-elevation-3: 0 4px 8px rgba(0,0,0,0.1), 0 8px 16px rgba(0,0,0,0.1); --md-sys-shape-corner-medium: 12px; --md-sys-shape-corner-large: 16px; --md-sys-typescale-headline-large: 500 2rem/2.5rem 'Roboto', sans-serif; --md-sys-typescale-headline-medium: 500 1.5rem/2rem 'Roboto', sans-serif; --md-sys-typescale-body-large: 400 1rem/1.5rem 'Roboto', sans-serif; --md-sys-typescale-body-medium: 400 0.875rem/1.25rem 'Roboto', sans-serif; --md-sys-typescale-label-large: 500 0.875rem/1.25rem 'Roboto', sans-serif; } /* Dark theme - follows system preference */ @media (prefers-color-scheme: dark) { :root { --md-sys-color-primary: #ffa31a; --md-sys-color-primary-dark: #e8920f; --md-sys-color-on-primary: #1b1b1b; --md-sys-color-surface: #1b1b1b; --md-sys-color-surface-container: #292929; --md-sys-color-surface-variant: #292929; --md-sys-color-on-surface: #ffffff; --md-sys-color-on-surface-variant: #CAC4D0; --md-sys-color-outline: #808080; --md-sys-color-outline-variant: #404040; --md-sys-color-background: #1b1b1b; --md-sys-color-error: #F2B8B5; --md-sys-color-success: #81C784; --md-sys-color-preview-bg: #292929; --md-sys-color-preview-pattern: #1b1b1b; --md-sys-elevation-1: 0 1px 2px rgba(0,0,0,0.3), 0 1px 3px rgba(0,0,0,0.24); --md-sys-elevation-2: 0 2px 4px rgba(0,0,0,0.3), 0 4px 8px rgba(0,0,0,0.3); --md-sys-elevation-3: 0 4px 8px rgba(0,0,0,0.3), 0 8px 16px rgba(0,0,0,0.3); } } /* Reset */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { font-family: 'Roboto', sans-serif; background-color: var(--md-sys-color-background); color: var(--md-sys-color-on-surface); min-height: 100vh; line-height: 1.5; } /* App Container */ .app-container { min-height: 100vh; display: flex; flex-direction: column; } /* App Bar */ .app-bar { background-color: var(--md-sys-color-surface); color: var(--md-sys-color-on-surface); padding: 16px 24px; box-shadow: var(--md-sys-elevation-2); position: sticky; top: 0; z-index: 100; border-bottom: 1px solid var(--md-sys-color-outline-variant); } .app-bar-content { max-width: 1200px; margin: 0 auto; display: flex; align-items: center; gap: 12px; } .app-bar h1 { font: var(--md-sys-typescale-headline-medium); font-weight: 500; } .app-bar .material-icons { font-size: 28px; color: var(--md-sys-color-primary); } .app-bar .git-link { margin-left: auto; display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; color: var(--md-sys-color-on-surface-variant); text-decoration: none; transition: background-color 0.2s, color 0.2s; } .app-bar .git-link:hover { background-color: var(--md-sys-color-surface-variant); color: var(--md-sys-color-primary); } .app-bar .git-link .material-icons { font-size: 24px; color: inherit; } /* Main Content */ .main-content { flex: 1; padding: 24px; max-width: 1200px; margin: 0 auto; width: 100%; display: grid; grid-template-columns: 1fr 1fr; gap: 24px; align-items: start; } .main-content.three-column { max-width: 1400px; grid-template-columns: 1fr 1fr 1fr; } /* Card Body */ .card-body { padding: 24px; display: flex; flex-direction: column; gap: 20px; } /* Cards */ .card { background-color: var(--md-sys-color-surface); border-radius: var(--md-sys-shape-corner-large); box-shadow: var(--md-sys-elevation-1); overflow: hidden; } .card-header { display: flex; align-items: center; gap: 12px; padding: 20px 24px; border-bottom: 1px solid var(--md-sys-color-outline-variant); background-color: var(--md-sys-color-surface-container); } .card-header h2 { font: var(--md-sys-typescale-headline-medium); font-size: 1.25rem; color: var(--md-sys-color-on-surface); } .card-header .material-icons { color: var(--md-sys-color-primary); font-size: 24px; } /* Form Styles */ .form-card form { padding: 24px; display: flex; flex-direction: column; gap: 20px; } .form-group { display: flex; flex-direction: column; gap: 6px; } .form-label { font: var(--md-sys-typescale-label-large); color: var(--md-sys-color-on-surface-variant); } .form-input, .form-select { font: var(--md-sys-typescale-body-large); padding: 14px 16px; border: 1px solid var(--md-sys-color-outline-variant); border-radius: var(--md-sys-shape-corner-medium); background-color: var(--md-sys-color-surface-container); color: var(--md-sys-color-on-surface); transition: border-color 0.2s, box-shadow 0.2s; width: 100%; } .form-input:focus, .form-select:focus { outline: none; border-color: var(--md-sys-color-primary); box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.15); } .form-input:read-only { background-color: var(--md-sys-color-surface-variant); color: var(--md-sys-color-on-surface-variant); } .form-input::placeholder { color: var(--md-sys-color-outline); } .form-hint { font: var(--md-sys-typescale-body-medium); font-size: 0.75rem; color: var(--md-sys-color-outline); } /* Select Wrapper */ .select-wrapper { position: relative; } .select-wrapper .form-select { appearance: none; padding-right: 44px; cursor: pointer; } .select-wrapper .select-icon { position: absolute; right: 14px; top: 50%; transform: translateY(-50%); color: var(--md-sys-color-outline); pointer-events: none; } /* Form Row */ .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } /* Form Divider */ .form-divider { display: flex; align-items: center; text-align: center; color: var(--md-sys-color-outline); font-size: 0.875rem; } .form-divider::before, .form-divider::after { content: ''; flex: 1; border-bottom: 1px solid var(--md-sys-color-outline-variant); } .form-divider span { padding: 0 16px; } /* Button Styles */ .btn { font: var(--md-sys-typescale-label-large); padding: 14px 24px; border: none; border-radius: var(--md-sys-shape-corner-medium); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 8px; transition: all 0.2s; text-transform: none; } .btn-primary { background-color: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); box-shadow: var(--md-sys-elevation-1); } .btn-primary:hover { background-color: var(--md-sys-color-primary-dark); box-shadow: var(--md-sys-elevation-2); } .btn-primary:active { transform: scale(0.98); } .btn-outline { background-color: transparent; color: var(--md-sys-color-primary); border: 2px solid var(--md-sys-color-primary); cursor: pointer; } .btn-outline:hover { background-color: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); } .btn-outline.loading { pointer-events: none; opacity: 0.7; } .btn .material-icons { font-size: 20px; } /* Preview Card */ .preview-card { position: sticky; top: 88px; } .preview-container { padding: 24px; display: flex; justify-content: center; background-color: var(--md-sys-color-preview-bg); background-image: linear-gradient(45deg, var(--md-sys-color-preview-pattern) 25%, transparent 25%), linear-gradient(-45deg, var(--md-sys-color-preview-pattern) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--md-sys-color-preview-pattern) 75%), linear-gradient(-45deg, transparent 75%, var(--md-sys-color-preview-pattern) 75%); background-size: 20px 20px; background-position: 0 0, 0 10px, 10px -10px, -10px 0px; } /* Sticker Preview Container */ .sticker-preview { background-color: var(--md-sys-color-surface-container); padding: 8px; box-shadow: var(--md-sys-elevation-2); } /* Sticker styles are loaded dynamically from templates/*.css */ /* Snackbar */ .snackbar { visibility: hidden; min-width: 280px; background-color: var(--md-sys-color-surface-variant); color: var(--md-sys-color-on-surface); text-align: center; border-radius: var(--md-sys-shape-corner-medium); padding: 16px 24px; position: fixed; z-index: 1000; right: 24px; top: 80px; font: var(--md-sys-typescale-body-medium); box-shadow: var(--md-sys-elevation-3); } @media (prefers-color-scheme: light) { .snackbar { background-color: #323232; color: #fff; } } .snackbar.show { visibility: visible; animation: slidein 0.3s, slideout 0.3s 2.7s; } .snackbar.success { background-color: var(--md-sys-color-success); color: #fff; } .snackbar.error { background-color: var(--md-sys-color-error); color: #fff; } @keyframes slidein { from { right: -100%; opacity: 0; } to { right: 24px; opacity: 1; } } @keyframes slideout { from { right: 24px; opacity: 1; } to { right: -100%; opacity: 0; } } /* Responsive Styles */ @media (max-width: 1200px) { .main-content.three-column { grid-template-columns: 1fr 1fr; } .main-content.three-column .preview-card { grid-column: span 2; } } @media (max-width: 900px) { .main-content, .main-content.three-column { grid-template-columns: 1fr; } .main-content.three-column .preview-card { grid-column: span 1; order: -1; } .preview-card { position: static; order: -1; } .app-bar h1 { font-size: 1.25rem; } } @media (max-width: 600px) { .app-bar { padding: 12px 16px; } .app-bar h1 { font-size: 1.1rem; } .main-content { padding: 16px; gap: 16px; } .card-header { padding: 16px; } .card-header h2 { font-size: 1.1rem; } .form-card form { padding: 16px; gap: 16px; } .form-row { grid-template-columns: 1fr; } .form-input, .form-select { padding: 12px 14px; } .btn { padding: 12px 20px; width: 100%; } .preview-container { padding: 16px; } } /* Print Styles for PDF Export */ @media print { .app-bar, .form-card, .card-header, .snackbar { display: none !important; } .main-content { display: block; padding: 0; } .preview-card { box-shadow: none; border: none; } .preview-container { background: none; padding: 0; } } /* Loading State */ .btn.loading { pointer-events: none; opacity: 0.7; } .btn.loading .material-icons { animation: spin 1s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }