:root{--ff-primary: #4f46e5;--ff-primary-hover: #4338ca;--ff-primary-soft: #eef2ff;--ff-danger: #dc2626;--ff-danger-soft: #fef2f2;--ff-success: #16a34a;--ff-success-soft: #f0fdf4;--ff-warning: #d97706;--ff-warning-soft: #fffbeb;--ff-info: #0284c7;--ff-info-soft: #f0f9ff;--ff-text: #111827;--ff-text-muted: #6b7280;--ff-border: #e5e7eb;--ff-bg: #ffffff;--ff-bg-subtle: #f9fafb;--ff-radius: 10px;--ff-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .04)}.ff-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:var(--ff-radius);border:1px solid transparent;font-weight:600;font-size:14px;padding:10px 16px;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,opacity .15s ease}.ff-btn:disabled{opacity:.55;cursor:not-allowed}.ff-btn--sm{padding:6px 10px;font-size:13px}.ff-btn--lg{padding:13px 22px;font-size:16px}.ff-btn--primary{background:var(--ff-primary);color:#fff}.ff-btn--primary:hover:not(:disabled){background:var(--ff-primary-hover)}.ff-btn--secondary{background:var(--ff-bg);color:var(--ff-text);border-color:var(--ff-border)}.ff-btn--secondary:hover:not(:disabled){background:var(--ff-bg-subtle)}.ff-btn--danger{background:var(--ff-danger);color:#fff}.ff-btn--ghost{background:transparent;color:var(--ff-primary)}.ff-btn--ghost:hover:not(:disabled){background:var(--ff-primary-soft)}.ff-btn__spinner{width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:ff-spin .6s linear infinite}@keyframes ff-spin{to{transform:rotate(360deg)}}.ff-field{display:flex;flex-direction:column;gap:6px;width:100%}.ff-field__label{font-size:13px;font-weight:600;color:var(--ff-text)}.ff-input{display:flex;align-items:center;border:1px solid var(--ff-border);border-radius:var(--ff-radius);background:var(--ff-bg);transition:border-color .15s ease,box-shadow .15s ease}.ff-input:focus-within{border-color:var(--ff-primary);box-shadow:0 0 0 3px var(--ff-primary-soft)}.ff-input input{border:none;outline:none;background:transparent;width:100%;padding:10px 14px;font-size:14px;color:var(--ff-text)}.ff-input--prefix .ff-input__prefix{padding-left:14px;color:var(--ff-text-muted);font-weight:600}.ff-field__error{font-size:12px;color:var(--ff-danger)}.ff-field__hint{font-size:12px;color:var(--ff-text-muted)}.ff-card{background:var(--ff-bg);border:1px solid var(--ff-border);border-radius:14px;box-shadow:var(--ff-shadow)}.ff-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:16px 20px;border-bottom:1px solid var(--ff-border)}.ff-card__title{margin:0;font-size:15px;font-weight:700;color:var(--ff-text)}.ff-card__subtitle{margin:2px 0 0;font-size:13px;color:var(--ff-text-muted)}.ff-card__actions{display:flex;gap:8px;align-items:center}.ff-card__body{padding:20px}.ff-badge{display:inline-flex;align-items:center;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:600;background:var(--ff-bg-subtle);color:var(--ff-text-muted);border:1px solid var(--ff-border)}.ff-badge--success{background:var(--ff-success-soft);color:var(--ff-success);border-color:transparent}.ff-badge--warning{background:var(--ff-warning-soft);color:var(--ff-warning);border-color:transparent}.ff-badge--danger{background:var(--ff-danger-soft);color:var(--ff-danger);border-color:transparent}.ff-badge--info{background:var(--ff-info-soft);color:var(--ff-info);border-color:transparent}.ff-spinner{display:inline-block;border:3px solid var(--ff-border);border-top-color:var(--ff-primary);border-radius:50%;animation:ff-spin .7s linear infinite}.ff-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center;gap:4px}.ff-empty__icon{font-size:36px;margin-bottom:8px}.ff-empty__title{margin:0;font-weight:600;color:var(--ff-text);font-size:15px}.ff-empty__desc{margin:0;color:var(--ff-text-muted);font-size:13px;max-width:320px}.ff-table{width:100%;border-collapse:collapse;font-size:14px}.ff-table th,.ff-table td{text-align:left;padding:12px 14px;border-bottom:1px solid var(--ff-border)}.ff-table th{color:var(--ff-text-muted);font-size:12px;text-transform:uppercase;letter-spacing:.04em}.ff-table tr:last-child td{border-bottom:none}*{box-sizing:border-box}html,body,#root{margin:0;min-height:100vh}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;background:#f3f4f6;color:#111827}.muted{color:var(--ff-text-muted)}.mb{margin-bottom:16px}.link{color:var(--ff-primary);text-decoration:none;font-weight:600;font-size:13px}.align-right{text-align:right!important}.app-shell{display:flex;min-height:100vh}.app-sidebar{width:240px;background:#fff;border-right:1px solid var(--ff-border);display:flex;flex-direction:column;position:sticky;top:0;height:100vh;flex-shrink:0}.app-brand{display:flex;align-items:center;gap:10px;padding:20px;border-bottom:1px solid var(--ff-border)}.app-brand__logo{font-size:24px}.app-brand__name{font-weight:800;font-size:18px;color:var(--ff-text)}.app-nav{display:flex;flex-direction:column;padding:12px;gap:2px;flex:1}.app-nav__link{display:block;padding:10px 14px;border-radius:8px;color:var(--ff-text-muted);text-decoration:none;font-weight:600;font-size:14px;transition:background-color .15s ease,color .15s ease}.app-nav__link:hover{background:var(--ff-bg-subtle);color:var(--ff-text)}.app-nav__link--active{background:var(--ff-primary-soft);color:var(--ff-primary)}.app-sidebar__footer{padding:16px;border-top:1px solid var(--ff-border);display:flex;flex-direction:column;gap:12px}.app-user{display:flex;align-items:center;gap:10px}.app-user__avatar{width:36px;height:36px;border-radius:50%;background:var(--ff-primary);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;flex-shrink:0}.app-user__meta{display:flex;flex-direction:column;min-width:0}.app-user__name{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.app-user__email{font-size:12px;color:var(--ff-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.app-main{flex:1;padding:32px;max-width:1100px}.page-center{display:flex;align-items:center;justify-content:center;padding:48px}.page-center--full{min-height:100vh}.page-header{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:24px}.page-title{margin:0;font-size:26px;font-weight:800}.page-subtitle{color:var(--ff-text-muted);font-size:14px}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;margin-bottom:24px}.stat-card{background:#fff;border:1px solid var(--ff-border);border-radius:14px;padding:20px;display:flex;flex-direction:column;gap:6px}.stat-card__label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ff-text-muted)}.stat-card__value{font-size:24px;font-weight:800}.stat-card__value--income{color:var(--ff-success)}.stat-card__value--expense{color:var(--ff-danger)}.dash-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px;margin-bottom:16px}.cat-breakdown{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.cat-breakdown__row{display:flex;align-items:center;gap:10px}.cat-breakdown__dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.cat-breakdown__name{font-size:13px;font-weight:600;width:120px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cat-breakdown__bar-wrap{flex:1;height:8px;background:var(--ff-bg-subtle);border-radius:999px;overflow:hidden}.cat-breakdown__bar{height:100%;border-radius:999px}.cat-breakdown__pct{font-size:12px;color:var(--ff-text-muted);width:36px;text-align:right}.cat-breakdown__amount{font-size:13px;font-weight:700;width:90px;text-align:right}.trend-chart{display:flex;align-items:flex-end;gap:12px;height:180px}.trend-chart__col{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;height:100%}.trend-chart__bars{display:flex;align-items:flex-end;gap:4px;flex:1;width:100%}.trend-chart__bar{flex:1;border-radius:4px 4px 0 0;min-width:8px;transition:height .3s ease}.trend-chart__bar--income{background:var(--ff-success)}.trend-chart__bar--expense{background:var(--ff-danger)}.trend-chart__label{font-size:11px;color:var(--ff-text-muted)}.trend-chart__legend{display:flex;gap:16px;font-size:12px;color:var(--ff-text-muted)}.trend-chart__legend-item{display:inline-flex;align-items:center;gap:6px}.trend-chart__swatch{width:10px;height:10px;border-radius:3px;display:inline-block}.trend-chart__swatch--income{background:var(--ff-success)}.trend-chart__swatch--expense{background:var(--ff-danger)}.tx-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.tx-list__row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--ff-border)}.tx-list__row:last-child{border-bottom:none}.tx-list__icon{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0}.tx-list__meta{flex:1;display:flex;flex-direction:column;min-width:0}.tx-list__name{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tx-list__sub{font-size:12px;color:var(--ff-text-muted)}.table-wrap{overflow-x:auto}.tx-cat{display:inline-flex;align-items:center;gap:8px}.tx-cat__dot{width:9px;height:9px;border-radius:50%}.tx-amount{font-weight:700}.tx-amount--income{color:var(--ff-success)}.tx-amount--expense{color:var(--ff-danger)}.row-actions{display:flex;gap:4px;justify-content:flex-end}.filters{display:flex;align-items:flex-end;gap:16px;margin-bottom:16px}.segmented{display:inline-flex;background:var(--ff-bg-subtle);border:1px solid var(--ff-border);border-radius:10px;padding:3px;gap:2px}.segmented__btn{border:none;background:transparent;padding:8px 14px;border-radius:8px;font-size:13px;font-weight:600;color:var(--ff-text-muted);cursor:pointer}.segmented__btn--active{background:#fff;color:var(--ff-primary);box-shadow:0 1px 2px #00000014}.pagination{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:20px}.pagination__info{font-size:13px;color:var(--ff-text-muted)}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#11182780;display:flex;align-items:center;justify-content:center;z-index:100;padding:16px}.modal{background:#fff;border-radius:16px;padding:24px;width:100%;max-width:460px;box-shadow:0 20px 40px #0003}.modal__title{margin:0 0 16px;font-size:18px;font-weight:800}.modal__actions{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.ff-select{width:100%;padding:10px 14px;border:1px solid var(--ff-border);border-radius:var(--ff-radius);font-size:14px;background:#fff;color:var(--ff-text);font-family:inherit}.auth-page{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(160deg,#eef2ff,#f3f4f6);padding:16px}.auth-card{width:100%;max-width:420px}.auth-form{display:flex;flex-direction:column;gap:14px}.auth-error{margin:0;color:var(--ff-danger);font-size:13px;font-weight:600;background:var(--ff-danger-soft);border-radius:8px;padding:10px 12px}.auth-success{margin:0;color:var(--ff-success);font-size:13px;font-weight:600;background:var(--ff-success-soft);border-radius:8px;padding:10px 12px}.auth-alt{margin:16px 0 0;font-size:13px;color:var(--ff-text-muted);text-align:center}.auth-link{color:var(--ff-primary);font-weight:600;text-decoration:none}.color-picker{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.color-picker__swatch{width:28px;height:28px;border-radius:8px;border:2px solid transparent;cursor:pointer}.color-picker__swatch--active{border-color:var(--ff-text)}.color-picker input[type=color]{width:28px;height:28px;border:none;border-radius:8px;cursor:pointer;padding:0;background:transparent}.cat-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.cat-list__row{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--ff-border)}.cat-list__row:last-child{border-bottom:none}.cat-list__icon{width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:16px}.cat-list__name{flex:1;font-size:14px;font-weight:600}.budget-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px}.budget-set-row{display:flex;gap:8px;align-items:flex-end;margin-top:16px}.budget-meter{display:flex;flex-direction:column;gap:8px}.budget-meter--compact{gap:4px}.budget-meter__label{font-size:13px;font-weight:600}.budget-meter__top,.budget-meter__bottom{display:flex;justify-content:space-between;font-size:13px}.budget-meter__spent{font-weight:700}.budget-meter__remaining{font-weight:600;color:var(--ff-text-muted)}.budget-meter__track{height:10px;border-radius:999px;background:var(--ff-bg-subtle);overflow:hidden}.budget-meter__fill{height:100%;border-radius:999px;background:var(--ff-success);transition:width .3s ease}.budget-meter__fill--warn{background:var(--ff-warning)}.budget-meter__fill--over{background:var(--ff-danger)}.budget-meter__pct{font-weight:700}.cat-budgets{list-style:none;margin:16px 0 0;padding:0;display:flex;flex-direction:column;gap:12px}.cat-budgets__row{display:flex;align-items:flex-start;gap:8px}
