.toast-bar { position: fixed; top: 0; left: 0; right: 0; z-index: 9999; padding: 12px 24px; text-align: center; font-size: 14px; font-weight: 600; color: #fff; opacity: 0; transform: translateY(-100%); transition: opacity .3s, transform .3s; pointer-events: none; }
.toast-bar.show { opacity: 1; transform: translateY(0); pointer-events: auto; }
.toast-bar.error { background: #dc3545; }
.toast-bar.success { background: #28a745; }
.loading-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 10000; background: rgba(0,0,0,0.3); display: none; }
.loading-mask .spinner { position: absolute; top: 50%; left: 50%; margin: -20px 0 0 -20px; width: 40px; height: 40px; border: 4px solid rgba(255,255,255,0.3); border-top-color: #fff; border-radius: 50%; animation: spin .6s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
.table-gifts th, .table-gifts td { border: 1px solid rgba(0,0,0,0.06) !important; }
.table-gifts th.sortable { cursor: pointer; user-select: none; }
.table-gifts th.sortable:hover { background: rgba(0,0,0,0.04); }
.table-gifts th.sortable::after { margin-left: 4px; font-size: 10px; content: '⇅'; color: rgba(0,0,0,0.3); }
.table-gifts th.sort-asc::after { content: '▲'; opacity: 1; color: #000; }
.table-gifts th.sort-desc::after { content: '▼'; opacity: 1; color: #000; }
.table-gifts th.sort-asc, .table-gifts th.sort-desc { font-weight: 700; }
.input-error { border-color: #dc3545 !important; }
.status-filter { display: inline-block; width: auto; margin-left: 4px; }
input.num-format { text-align: right; }
