:root{--primary-color: #4361ee;--primary-hover: #3a0ca3;--secondary-color: #4cc9f0;--secondary-hover: #4895ef;--accent-color: #f72585;--text-primary: #2b2d42;--text-secondary: #6c757d;--text-light: #f8f9fa;--background-light: #f8f9fa;--background-white: #ffffff;--border-color: #e9ecef;--shadow-sm: 0 2px 8px rgba(0,0,0,.08);--shadow-md: 0 4px 16px rgba(0,0,0,.12);--shadow-lg: 0 8px 32px rgba(0,0,0,.15);--shadow-xl: 0 12px 48px rgba(0,0,0,.18);--border-radius: 12px;--border-radius-sm: 8px;--transition: all .3s cubic-bezier(.4, 0, .2, 1);--gradient-primary: linear-gradient(135deg, #4361ee 0%, #4cc9f0 100%);--gradient-secondary: linear-gradient(135deg, #f72585 0%, #4361ee 100%);--gradient-accent: linear-gradient(135deg, #4cc9f0 0%, #f72585 100%)}*{margin:0;padding:0;box-sizing:border-box;font-family:Microsoft YaHei,Arial,sans-serif}.app{min-height:100vh;background-color:var(--background-light);background-image:linear-gradient(135deg,#f8f9fa 0%,#e9ecef 100%)}:root{--primary-color: #1e88e5;--primary-light: #42a5f5;--primary-dark: #1565c0;--primary-gradient: linear-gradient(135deg, #1e88e5 0%, #2196f3 50%, #42a5f5 100%);--primary-gradient-hover: linear-gradient(135deg, #1565c0 0%, #1e88e5 50%, #2196f3 100%);--secondary-color: #66bb6a;--secondary-light: #81c784;--secondary-dark: #4caf50;--secondary-gradient: linear-gradient(135deg, #66bb6a 0%, #81c784 100%);--success-color: #4caf50;--success-light: #66bb6a;--success-dark: #388e3c;--warning-color: #ff9800;--warning-light: #ffb74d;--warning-dark: #f57c00;--error-color: #f44336;--error-light: #ef5350;--error-dark: #c62828;--info-color: #2196f3;--info-light: #42a5f5;--info-dark: #1565c0;--accent-color: #7c4dff;--accent-light: #9575cd;--accent-dark: #5e35b1;--text-primary: #1a202c;--text-secondary: #4a5568;--text-muted: #718096;--text-light: #a0aec0;--text-white: #ffffff;--text-disabled: #cbd5e0;--background-white: #ffffff;--bg-primary: #ffffff;--bg-secondary: #f7fafc;--bg-tertiary: #edf2f7;--bg-dark: #1a202c;--bg-darker: #171923;--bg-light: #fafafa;--bg-overlay: rgba(0, 0, 0, .5);--bg-glass: rgba(255, 255, 255, .8);--border-color: #e2e8f0;--border-light: #edf2f7;--border-primary: #1e88e5;--border-success: #4caf50;--border-warning: #ff9800;--border-error: #f44336;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .1), 0 10px 10px -5px rgba(0, 0, 0, .04);--shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, .25);--shadow-glow: 0 0 20px rgba(30, 136, 229, .3);--shadow-inset: inset 0 2px 4px 0 rgba(0, 0, 0, .06);--border-radius-sm: 6px;--border-radius-md: 8px;--border-radius: 12px;--border-radius-lg: 16px;--border-radius-xl: 20px;--border-radius-2xl: 24px;--border-radius-full: 9999px;--spacing-xs: 4px;--spacing-sm: 8px;--spacing-md: 16px;--spacing-lg: 24px;--spacing-xl: 32px;--spacing-xxl: 48px;--spacing-3xl: 64px;--transition-fast: all .15s cubic-bezier(.4, 0, .2, 1);--transition: all .25s cubic-bezier(.4, 0, .2, 1);--transition-slow: all .4s cubic-bezier(.4, 0, .2, 1);--transition-bounce: all .5s cubic-bezier(.34, 1.56, .64, 1);--font-family: "Inter", "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-family-mono: "SF Mono", "Monaco", "Inconsolata", "Fira Mono", "Roboto Mono", monospace;--font-size-xs: 12px;--font-size-sm: 14px;--font-size-base: 15px;--font-size-md: 16px;--font-size-lg: 18px;--font-size-xl: 20px;--font-size-2xl: 24px;--font-size-3xl: 30px;--font-size-4xl: 36px;--font-size-5xl: 48px;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--line-height-tight: 1.25;--line-height-snug: 1.375;--line-height-normal: 1.5;--line-height-relaxed: 1.625;--line-height-loose: 2;--header-height: 64px;--sidebar-width: 260px;--sidebar-width-collapsed: 80px;--content-max-width: 1440px;--content-padding: 24px;--container-max-width: 1280px;--z-dropdown: 100;--z-sticky: 200;--z-modal: 300;--z-toast: 400;--z-loading: 500}[data-theme=dark]{--text-primary: #f7fafc;--text-secondary: #e2e8f0;--text-muted: #a0aec0;--text-light: #718096;--bg-primary: #1a202c;--bg-secondary: #2d3748;--bg-tertiary: #4a5568;--bg-light: #374151;--border-color: #4a5568;--border-light: #2d3748}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:9999;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.modal-content{background-color:var(--bg-primary);padding:24px;border-radius:8px;width:500px;max-width:90%;max-height:80vh;overflow-y:auto;box-shadow:0 8px 32px #0003;animation:modalSlideIn .3s ease;border:1px solid var(--border-color)}@keyframes modalSlideIn{0%{opacity:0;transform:translateY(-30px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}.modal-content h2{margin-top:0;margin-bottom:20px;color:var(--text-primary);font-size:20px;font-weight:600}.form-group{margin-bottom:15px}.form-group label{display:block;margin-bottom:5px;font-weight:700;color:var(--text-primary)}.form-group input,.form-group textarea,.form-group select{width:100%;padding:10px;border:1px solid var(--border-color);border-radius:4px;font-size:14px;background:var(--bg-primary);color:var(--text-primary)}.form-group textarea{resize:vertical;min-height:100px}.form-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:24px}.form-actions button{padding:8px 16px;border:1px solid #ddd;border-radius:4px;cursor:pointer;font-size:14px}.save-button{background-color:#4caf50;color:#fff;border:none}.save-button:hover{background-color:#45a049}@media (max-width: 768px){.modal-content{width:95%;padding:20px}.form-actions{flex-direction:column}.form-actions button{width:100%}}.table-sticky-actions .th-actions,.table-sticky-actions .td-actions,.table-sticky-actions th.actions-column,.table-sticky-actions td.actions-column{position:sticky;right:0;z-index:1;background:var(--bg-primary);box-shadow:-6px 0 12px #0f172a0f;text-align:left;vertical-align:middle}.table-sticky-actions thead .th-actions,.table-sticky-actions thead th.actions-column{z-index:3;background:var(--bg-secondary)}.table-sticky-actions tbody tr:nth-child(2n) .td-actions,.table-sticky-actions tbody tr:nth-child(2n) td.actions-column{background:#fafcff}.table-sticky-actions tbody tr:hover .td-actions,.table-sticky-actions tbody tr:hover td.actions-column{background:#f1f5f9}.table-sticky-actions tbody tr.prt-row-group-striped td.actions-column{background:#fafcfd}.table-sticky-actions tbody tr.prt-row-group-hover td.actions-column{background:#eef6f8}.table-sticky-actions tbody tr.table-row:nth-child(2n) td.actions-column{background:var(--bg-secondary)}.table-sticky-actions tbody tr.table-row:hover td.actions-column{background:var(--bg-light)}.table-sticky-actions .action-buttons,.table-sticky-actions .row-action-buttons{display:flex;gap:6px;justify-content:flex-start;flex-wrap:nowrap;align-items:center}:global(html[data-theme=dark]) .table-sticky-actions .th-actions,:global(html[data-theme=dark]) .table-sticky-actions .td-actions,:global(html[data-theme=dark]) .table-sticky-actions th.actions-column,:global(html[data-theme=dark]) .table-sticky-actions td.actions-column{background:var(--bg-primary);box-shadow:-6px 0 12px #00000059}:global(html[data-theme=dark]) .table-sticky-actions thead .th-actions,:global(html[data-theme=dark]) .table-sticky-actions thead th.actions-column{background:var(--bg-secondary)}:global(html[data-theme=dark]) .table-sticky-actions tbody tr:nth-child(2n) .td-actions,:global(html[data-theme=dark]) .table-sticky-actions tbody tr:nth-child(2n) td.actions-column{background:rgba(30,41,59,.35)}:global(html[data-theme=dark]) .table-sticky-actions tbody tr:hover .td-actions,:global(html[data-theme=dark]) .table-sticky-actions tbody tr:hover td.actions-column,:global(html[data-theme=dark]) .table-sticky-actions tbody tr.prt-row-group-hover td.actions-column,:global(html[data-theme=dark]) .table-sticky-actions tbody tr.table-row:hover td.actions-column{background:rgba(51,65,85,.45)}:global(html[data-theme=dark]) .table-sticky-actions tbody tr.table-row:nth-child(2n) td.actions-column{background:rgba(30,41,59,.35)}*{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth;font-size:var(--font-size-base)}body{font-family:var(--font-family);font-size:var(--font-size-base);line-height:var(--line-height-normal);color:var(--text-primary);background:var(--bg-secondary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-height:100vh}a{color:var(--primary-color);text-decoration:none;transition:var(--transition)}a:hover{color:var(--primary-dark);text-decoration:none}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--spacing-sm);padding:var(--spacing-sm) var(--spacing-lg);border:none;border-radius:var(--border-radius);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:var(--transition);text-align:center;white-space:nowrap;position:relative;overflow:hidden;font-family:inherit}.btn:before{content:"";position:absolute;top:50%;left:50%;width:0;height:0;background:rgba(255,255,255,.3);border-radius:50%;transform:translate(-50%,-50%);transition:width .6s ease-out,height .6s ease-out}.btn:active:before{width:300px;height:300px}.btn:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}.btn:active{transform:translateY(0)}.btn:disabled{opacity:.6;cursor:not-allowed;transform:none;box-shadow:none}.btn-primary{background:var(--primary-gradient);color:var(--text-white)}.btn-primary:hover{background:var(--primary-gradient-hover);box-shadow:0 8px 25px #1e88e559}.btn-secondary{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border-color)}.btn-secondary:hover{background:var(--border-color);border-color:var(--primary-color);color:var(--primary-color)}.btn-outline-secondary{background:transparent;color:var(--text-secondary);border:1px solid var(--border-color)}.btn-outline-secondary:hover{background:var(--bg-tertiary);border-color:var(--primary-color);color:var(--primary-color)}.btn-outline-primary{background:transparent;color:var(--primary-color);border:1px solid var(--primary-color)}.btn-outline-primary:hover{background:var(--primary-color);color:var(--text-white)}.btn-success{background:var(--success-color);color:var(--text-white)}.btn-success:hover{background:var(--success-dark);box-shadow:0 4px 16px #4caf5066}.btn-danger{background:var(--error-color);color:var(--text-white)}.btn-danger:hover{background:var(--error-dark);box-shadow:0 4px 16px #f4433666}.btn-warning{background:var(--warning-color);color:var(--text-white)}.btn-warning:hover{background:var(--warning-dark);box-shadow:0 4px 16px #ff980066}.btn-info{background:var(--info-color);color:var(--text-white)}.btn-info:hover{background:var(--info-dark);box-shadow:0 4px 16px #2196f366}.btn-sm{padding:6px 12px;font-size:var(--font-size-xs);border-radius:var(--border-radius-sm)}.btn-md{padding:10px 20px;font-size:var(--font-size-sm)}.btn-lg{padding:14px 28px;font-size:var(--font-size-md);border-radius:var(--border-radius-lg)}.btn-block{width:100%}.form-group{margin-bottom:var(--spacing-md)}.form-group label{display:block;margin-bottom:var(--spacing-xs);font-weight:var(--font-weight-medium);color:var(--text-primary);font-size:var(--font-size-sm)}.form-group label.required:after{content:"*";color:var(--error-color);margin-left:4px}.form-control{width:100%;padding:var(--spacing-sm) var(--spacing-md);border:1px solid var(--border-color);border-radius:var(--border-radius);font-size:var(--font-size-sm);transition:var(--transition);background:var(--bg-primary);color:var(--text-primary);font-family:inherit}.form-control:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #1e88e51a}.form-control:hover{border-color:var(--primary-light)}.form-control::placeholder{color:var(--text-light)}.form-control:disabled{background:var(--bg-tertiary);cursor:not-allowed;opacity:.7}.form-control.error{border-color:var(--error-color)}.form-control.success{border-color:var(--success-color)}.form-text{font-size:var(--font-size-xs);color:var(--text-muted);margin-top:4px;display:block}.form-text.error{color:var(--error-color)}.card{background:var(--bg-primary);border-radius:var(--border-radius-lg);box-shadow:var(--shadow-sm);border:1px solid var(--border-light);overflow:hidden;transition:var(--transition)}.card:hover{box-shadow:var(--shadow-md)}.card-header{padding:var(--spacing-lg);border-bottom:1px solid var(--border-light);background:var(--bg-secondary);display:flex;align-items:center;justify-content:space-between}.card-header h3{font-size:var(--font-size-lg);color:var(--text-primary);font-weight:var(--font-weight-semibold);margin:0}.card-body{padding:var(--spacing-lg)}.card-footer{padding:var(--spacing-md) var(--spacing-lg);border-top:1px solid var(--border-light);background:var(--bg-secondary)}.card-actions{display:flex;gap:var(--spacing-sm);justify-content:flex-end}.table-container{overflow-x:auto;border-radius:var(--border-radius)}.data-table{width:100%;border-collapse:collapse;background:var(--bg-primary)}.data-table th,.data-table td{padding:var(--spacing-md);text-align:left;border-bottom:1px solid var(--border-light)}.data-table th{background:var(--bg-secondary);font-weight:var(--font-weight-semibold);color:var(--text-primary);font-size:var(--font-size-sm);text-transform:uppercase;letter-spacing:.5px}.data-table tbody tr{transition:var(--transition-fast)}.data-table tbody tr:hover{background:var(--bg-tertiary)}.data-table tbody tr:last-child td{border-bottom:none}.data-table tbody tr.selected{background:rgba(30,136,229,.08)}.loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(255,255,255,.9);display:flex;align-items:center;justify-content:center;z-index:var(--z-loading);border-radius:var(--border-radius);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.loading-spinner{width:48px;height:48px;border:4px solid var(--bg-tertiary);border-top-color:var(--primary-color);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{margin-top:var(--spacing-md);font-size:var(--font-size-sm);color:var(--text-muted)}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--bg-overlay);display:flex;align-items:center;justify-content:center;z-index:var(--z-modal);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.modal{background:var(--bg-primary);border-radius:var(--border-radius-lg);width:500px;max-width:90%;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-2xl);animation:modalSlideIn .3s var(--transition-bounce)}@keyframes modalSlideIn{0%{opacity:0;transform:translateY(-20px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:var(--spacing-lg);border-bottom:1px solid var(--border-light);background:var(--bg-secondary)}.modal-header h3{margin:0;color:var(--text-primary);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold)}.modal-close{background:none;border:none;font-size:24px;cursor:pointer;color:var(--text-muted);transition:var(--transition);width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius-sm);line-height:1}.modal-close:hover{color:var(--error-color);background:var(--bg-tertiary)}.modal-body{padding:var(--spacing-lg)}.modal-footer{display:flex;gap:var(--spacing-sm);justify-content:flex-end;padding:var(--spacing-md) var(--spacing-lg);border-top:1px solid var(--border-light);background:var(--bg-secondary)}.tag{display:inline-flex;align-items:center;padding:4px 12px;border-radius:var(--border-radius-full);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);transition:var(--transition)}.tag-primary{background:rgba(30,136,229,.1);color:var(--primary-color)}.tag-success{background:rgba(76,175,80,.1);color:var(--success-color)}.tag-warning{background:rgba(255,152,0,.1);color:var(--warning-color)}.tag-danger{background:rgba(244,67,54,.1);color:var(--error-color)}.tag-info{background:rgba(33,150,243,.1);color:var(--info-color)}.empty-state{text-align:center;padding:var(--spacing-3xl);color:var(--text-secondary)}.empty-state-icon{width:80px;height:80px;margin:0 auto var(--spacing-lg);background:var(--bg-tertiary);border-radius:50%;display:flex;align-items:center;justify-content:center;color:var(--primary-color);font-size:2.5rem}.empty-state h3{font-size:var(--font-size-lg);color:var(--text-primary);margin-bottom:var(--spacing-sm)}.empty-state p{color:var(--text-muted);margin-bottom:var(--spacing-lg)}.badge{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:var(--border-radius-full);font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);background:var(--primary-color);color:var(--text-white)}.badge-success{background:var(--success-color)}.badge-warning{background:var(--warning-color)}.badge-danger{background:var(--error-color)}.divider{height:1px;background:var(--border-color);margin:var(--spacing-md) 0}@media (max-width: 768px){.btn{padding:var(--spacing-xs) var(--spacing-md);font-size:var(--font-size-xs)}.card{border-radius:var(--border-radius)}.card-header,.card-body{padding:var(--spacing-md)}.modal{width:95%;margin:var(--spacing-md);border-radius:var(--border-radius)}.modal-header,.modal-body,.modal-footer{padding:var(--spacing-md)}.data-table th,.data-table td{padding:var(--spacing-sm);font-size:var(--font-size-xs)}}.text-center{text-align:center}.text-right{text-align:right}.text-left{text-align:left}.text-primary{color:var(--primary-color)}.text-secondary{color:var(--text-secondary)}.text-muted{color:var(--text-muted)}.text-success{color:var(--success-color)}.text-warning{color:var(--warning-color)}.text-danger{color:var(--error-color)}.text-info{color:var(--info-color)}.font-bold{font-weight:var(--font-weight-bold)}.font-semibold{font-weight:var(--font-weight-semibold)}.font-medium{font-weight:var(--font-weight-medium)}.font-normal{font-weight:var(--font-weight-normal)}.text-xs{font-size:var(--font-size-xs)}.text-sm{font-size:var(--font-size-sm)}.text-base{font-size:var(--font-size-base)}.text-md{font-size:var(--font-size-md)}.text-lg{font-size:var(--font-size-lg)}.text-xl{font-size:var(--font-size-xl)}.text-2xl{font-size:var(--font-size-2xl)}.text-3xl{font-size:var(--font-size-3xl)}.mt-1{margin-top:var(--spacing-xs)}.mt-2{margin-top:var(--spacing-sm)}.mt-3{margin-top:var(--spacing-md)}.mt-4{margin-top:var(--spacing-lg)}.mt-5{margin-top:var(--spacing-xl)}.mb-1{margin-bottom:var(--spacing-xs)}.mb-2{margin-bottom:var(--spacing-sm)}.mb-3{margin-bottom:var(--spacing-md)}.mb-4{margin-bottom:var(--spacing-lg)}.mb-5{margin-bottom:var(--spacing-xl)}.ml-1{margin-left:var(--spacing-xs)}.ml-2{margin-left:var(--spacing-sm)}.ml-3{margin-left:var(--spacing-md)}.ml-4{margin-left:var(--spacing-lg)}.mr-1{margin-right:var(--spacing-xs)}.mr-2{margin-right:var(--spacing-sm)}.mr-3{margin-right:var(--spacing-md)}.mr-4{margin-right:var(--spacing-lg)}.mx-auto{margin-left:auto;margin-right:auto}.p-1{padding:var(--spacing-xs)}.p-2{padding:var(--spacing-sm)}.p-3{padding:var(--spacing-md)}.p-4{padding:var(--spacing-lg)}.p-5{padding:var(--spacing-xl)}.px-1{padding-left:var(--spacing-xs);padding-right:var(--spacing-xs)}.px-2{padding-left:var(--spacing-sm);padding-right:var(--spacing-sm)}.px-3{padding-left:var(--spacing-md);padding-right:var(--spacing-md)}.px-4{padding-left:var(--spacing-lg);padding-right:var(--spacing-lg)}.py-1{padding-top:var(--spacing-xs);padding-bottom:var(--spacing-xs)}.py-2{padding-top:var(--spacing-sm);padding-bottom:var(--spacing-sm)}.py-3{padding-top:var(--spacing-md);padding-bottom:var(--spacing-md)}.py-4{padding-top:var(--spacing-lg);padding-bottom:var(--spacing-lg)}.flex{display:flex}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-end{justify-content:flex-end}.flex-wrap{flex-wrap:wrap}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.gap-1{gap:var(--spacing-xs)}.gap-2{gap:var(--spacing-sm)}.gap-3{gap:var(--spacing-md)}.gap-4{gap:var(--spacing-lg)}.w-full{width:100%}.w-auto{width:auto}.max-w-full{max-width:100%}.max-w-md{max-width:400px}.max-w-lg{max-width:500px}.max-w-xl{max-width:600px}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--bg-secondary);border-radius:4px}::-webkit-scrollbar-thumb{background:var(--text-light);border-radius:4px;transition:var(--transition)}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}@keyframes fadeInUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}.animate-fadeInUp{animation:fadeInUp .4s ease-out}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-bounce{animation:bounce 1s infinite}button:focus,a:focus,input:focus,select:focus,textarea:focus{outline:2px solid var(--primary-color);outline-offset:2px}.no-select{user-select:none;-webkit-user-select:none}.cursor-pointer{cursor:pointer}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.line-clamp-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
