You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

654 line
15 KiB

  1. @use '../atoms/variables' as *;
  2. // ─── Page ─────────────────────────────────────────────────────────────────────
  3. .report-page {
  4. min-height: 100vh;
  5. background: $color-bg;
  6. display: flex;
  7. flex-direction: column;
  8. }
  9. // ─── Header ──────────────────────────────────────────────────────────────────
  10. .report-header {
  11. background: linear-gradient(135deg, $color-header-from 0%, $color-header-to 100%);
  12. padding: $space-4 $space-6;
  13. display: flex;
  14. align-items: center;
  15. justify-content: space-between;
  16. gap: $space-6;
  17. box-shadow: $shadow-header;
  18. }
  19. .report-header__title {
  20. font-size: $font-size-xl;
  21. font-weight: $font-weight-bold;
  22. color: $color-white;
  23. }
  24. .report-header__right {
  25. display: flex;
  26. align-items: center;
  27. gap: $space-4;
  28. }
  29. // ─── Account-Name Anzeige ────────────────────────────────────────────────────
  30. .report-account-name {
  31. display: inline-flex;
  32. align-items: center;
  33. gap: $space-2;
  34. padding: $space-2 $space-4;
  35. font-size: $font-size-sm;
  36. font-weight: $font-weight-medium;
  37. color: rgba($color-white, 0.9);
  38. background: rgba($color-white, 0.15);
  39. border: 1px solid rgba($color-white, 0.25);
  40. border-radius: $radius-pill;
  41. backdrop-filter: blur(6px);
  42. -webkit-backdrop-filter: blur(6px);
  43. white-space: nowrap;
  44. &__icon {
  45. width: 16px;
  46. height: 16px;
  47. flex-shrink: 0;
  48. }
  49. }
  50. // ─── Disabled Tab ────────────────────────────────────────────────────────────
  51. .account-tab--disabled {
  52. opacity: 0.45;
  53. pointer-events: none;
  54. cursor: default;
  55. }
  56. // ─── Content ─────────────────────────────────────────────────────────────────
  57. .report-content {
  58. flex: 1;
  59. max-width: 1200px;
  60. width: 100%;
  61. margin: $space-6 auto;
  62. padding: 0 $space-6;
  63. }
  64. // ─── Karte ───────────────────────────────────────────────────────────────────
  65. .report-card {
  66. background: $color-card-white;
  67. border-radius: $radius-lg;
  68. box-shadow: $shadow-card;
  69. overflow: hidden;
  70. }
  71. // ─── Toolbar ─────────────────────────────────────────────────────────────────
  72. .report-toolbar {
  73. display: flex;
  74. align-items: center;
  75. justify-content: space-between;
  76. padding: $space-3 $space-5;
  77. border-bottom: 1px solid $color-border;
  78. }
  79. .report-toolbar__left {
  80. display: flex;
  81. align-items: center;
  82. gap: $space-6;
  83. }
  84. .report-toolbar__action {
  85. display: inline-flex;
  86. align-items: center;
  87. gap: $space-2;
  88. font-size: $font-size-sm;
  89. font-weight: $font-weight-medium;
  90. color: $color-primary;
  91. cursor: pointer;
  92. text-decoration: none;
  93. svg {
  94. width: 14px;
  95. height: 14px;
  96. flex-shrink: 0;
  97. }
  98. &--disabled {
  99. color: $color-text-muted;
  100. pointer-events: none;
  101. cursor: default;
  102. }
  103. }
  104. // ─── Tabelle ─────────────────────────────────────────────────────────────────
  105. .report-table {
  106. width: 100%;
  107. }
  108. .report-table__head,
  109. .report-table__row {
  110. display: grid;
  111. grid-template-columns:
  112. 110px // Datum
  113. 140px // Kunde
  114. 130px // Projekt
  115. 120px // Leistung
  116. 140px // Benutzer
  117. 1fr // Bemerkung
  118. 80px // Stunden
  119. 100px // Umsatz
  120. 88px; // Aktionen (Edit + Delete + Schloss)
  121. align-items: center;
  122. border-bottom: 1px solid $color-border;
  123. padding: 0 $space-5;
  124. }
  125. .report-table__head {
  126. padding-top: $space-2;
  127. padding-bottom: $space-2;
  128. background: transparent;
  129. .report-table__cell {
  130. font-size: $font-size-xs;
  131. font-weight: $font-weight-bold;
  132. color: $color-text-base;
  133. text-transform: uppercase;
  134. letter-spacing: 0.03em;
  135. line-height: 1.3;
  136. }
  137. }
  138. .report-table__row {
  139. padding-top: $space-3;
  140. padding-bottom: $space-3;
  141. transition: background $transition-fast;
  142. &:hover {
  143. background: rgba($color-primary, 0.035);
  144. }
  145. &:hover .report-action-btn {
  146. opacity: 1;
  147. }
  148. &--invoiced {
  149. .report-table__cell--date { color: $color-text-light; }
  150. .report-table__cell--client { color: $color-text-light; }
  151. .report-table__cell--project { color: $color-text-light; }
  152. .report-table__cell--service { color: $color-text-light; }
  153. .report-table__cell--user { color: $color-text-light; }
  154. .report-table__cell--note { color: $color-text-light; }
  155. .report-table__cell--duration { color: $color-text-light; }
  156. .report-table__cell--revenue { color: $color-text-light; }
  157. }
  158. &--editing {
  159. background: rgba($color-primary, 0.04);
  160. .report-table__cell--actions {
  161. visibility: hidden;
  162. }
  163. }
  164. &:last-child {
  165. border-bottom: none;
  166. }
  167. }
  168. .report-table__cell {
  169. font-size: $font-size-base;
  170. color: $color-text-base;
  171. padding-right: $space-3;
  172. line-height: 1.4;
  173. min-width: 0;
  174. &--duration,
  175. &--revenue {
  176. text-align: right;
  177. padding-right: $space-4;
  178. white-space: nowrap;
  179. font-variant-numeric: tabular-nums;
  180. }
  181. &--actions {
  182. display: flex;
  183. align-items: center;
  184. justify-content: flex-end;
  185. gap: $space-1;
  186. padding-right: 0;
  187. }
  188. &--note {
  189. color: $color-text-muted;
  190. font-size: $font-size-sm;
  191. white-space: nowrap;
  192. overflow: hidden;
  193. text-overflow: ellipsis;
  194. }
  195. }
  196. .report-table__sort-icon {
  197. margin-left: 2px;
  198. font-size: $font-size-xs;
  199. }
  200. .report-table__summary {
  201. display: block;
  202. font-size: $font-size-xs;
  203. font-weight: $font-weight-regular;
  204. color: $color-text-muted;
  205. margin-top: 1px;
  206. }
  207. .report-table__empty {
  208. padding: $space-10 $space-5;
  209. text-align: center;
  210. color: $color-text-muted;
  211. font-size: $font-size-sm;
  212. }
  213. // ─── Aktions-Buttons (Edit / Delete) ─────────────────────────────────────────
  214. .report-action-btn {
  215. display: inline-flex;
  216. align-items: center;
  217. justify-content: center;
  218. width: 26px;
  219. height: 26px;
  220. border: none;
  221. background: none;
  222. cursor: pointer;
  223. color: $color-text-light;
  224. border-radius: $radius-sm;
  225. opacity: 0;
  226. transition: opacity $transition-fast, color $transition-fast, background $transition-fast;
  227. svg {
  228. width: 14px;
  229. height: 14px;
  230. }
  231. &:hover {
  232. color: $color-text-muted;
  233. background: rgba($color-text-dark, 0.06);
  234. }
  235. &--delete:hover {
  236. color: $color-error;
  237. background: rgba($color-error, 0.08);
  238. }
  239. }
  240. // ─── Schloss-Button ──────────────────────────────────────────────────────────
  241. .report-lock {
  242. display: inline-flex;
  243. align-items: center;
  244. justify-content: center;
  245. width: 24px;
  246. height: 24px;
  247. border: none;
  248. background: none;
  249. cursor: pointer;
  250. color: $color-text-light;
  251. border-radius: $radius-sm;
  252. transition: color $transition-fast, background $transition-fast;
  253. svg {
  254. width: 14px;
  255. height: 14px;
  256. }
  257. &:hover {
  258. color: $color-text-muted;
  259. background: rgba($color-text-dark, 0.06);
  260. }
  261. &--invoiced {
  262. color: $color-text-dark;
  263. &:hover {
  264. color: $color-text-dark;
  265. background: rgba($color-text-dark, 0.06);
  266. }
  267. }
  268. }
  269. // ─── Inline-Edit-Formular ────────────────────────────────────────────────────
  270. .report-row__edit {
  271. grid-column: 1 / -1;
  272. padding: $space-4 0;
  273. background: rgba($color-primary, 0.025);
  274. border-top: 1px solid $color-border;
  275. }
  276. .report-row__edit-grid {
  277. display: grid;
  278. grid-template-columns: 140px 1fr;
  279. gap: $space-3 $space-5;
  280. align-items: center;
  281. max-width: 680px;
  282. }
  283. .report-row__edit-label {
  284. font-size: $font-size-sm;
  285. color: $color-text-muted;
  286. text-align: right;
  287. padding-right: $space-2;
  288. white-space: nowrap;
  289. }
  290. .report-row__edit-field {
  291. display: flex;
  292. align-items: center;
  293. gap: $space-2;
  294. &--selects {
  295. gap: $space-3;
  296. .select {
  297. flex: 1;
  298. min-width: 160px;
  299. }
  300. }
  301. .textarea {
  302. width: 100%;
  303. }
  304. }
  305. .report-row__edit-actions {
  306. grid-column: 2;
  307. display: flex;
  308. gap: $space-3;
  309. padding-top: $space-2;
  310. }
  311. // ─── Pagination-Footer ────────────────────────────────────────────────────────
  312. .report-pagination {
  313. display: grid;
  314. grid-template-columns: 1fr 80px 100px 88px;
  315. align-items: center;
  316. padding: $space-3 $space-5;
  317. border-top: 1px solid $color-border;
  318. font-size: $font-size-sm;
  319. color: $color-text-muted;
  320. }
  321. .report-pagination__limits {
  322. display: flex;
  323. align-items: center;
  324. gap: $space-2;
  325. a {
  326. color: $color-primary;
  327. text-decoration: underline;
  328. cursor: pointer;
  329. &:hover {
  330. color: $color-primary-dark;
  331. }
  332. }
  333. strong {
  334. color: $color-text-dark;
  335. font-weight: $font-weight-bold;
  336. }
  337. }
  338. .report-pagination__duration,
  339. .report-pagination__revenue {
  340. text-align: right;
  341. padding-right: $space-4;
  342. font-weight: $font-weight-medium;
  343. color: $color-text-muted;
  344. font-variant-numeric: tabular-nums;
  345. white-space: nowrap;
  346. }
  347. .report-pagination__lock-spacer {
  348. // Platzhalter für die Aktions-Spalte – hält die Ausrichtung
  349. }
  350. // ─── Toolbar-Button (klickbar) ────────────────────────────────────────────────
  351. button.report-toolbar__action {
  352. background: none;
  353. border: none;
  354. cursor: pointer;
  355. font-family: $font-family-base;
  356. padding: $space-1 $space-3;
  357. margin: -$space-1 -$space-3;
  358. border-radius: $radius-pill;
  359. transition: background $transition-fast, color $transition-fast;
  360. &--active {
  361. background: $color-text-dark;
  362. color: $color-white;
  363. svg path,
  364. svg circle {
  365. stroke: $color-white;
  366. }
  367. }
  368. }
  369. // ─── Filter-Panel ─────────────────────────────────────────────────────────────
  370. .report-filter {
  371. background: $color-card;
  372. border-bottom: 1px solid $color-border;
  373. padding: $space-5 $space-5 0;
  374. }
  375. .report-filter__body {
  376. display: flex;
  377. gap: $space-10;
  378. }
  379. .report-filter__col {
  380. flex: 1;
  381. min-width: 0;
  382. }
  383. .report-filter__heading {
  384. font-size: $font-size-xs;
  385. font-weight: $font-weight-bold;
  386. color: $color-text-muted;
  387. text-transform: uppercase;
  388. letter-spacing: 0.06em;
  389. margin-bottom: $space-3;
  390. }
  391. // ─── Filter-Row ───────────────────────────────────────────────────────────────
  392. .filter-row {
  393. display: grid;
  394. grid-template-columns: 160px 1fr 28px;
  395. align-items: flex-start;
  396. gap: $space-3;
  397. padding: $space-2 0;
  398. border-bottom: 1px solid rgba($color-border, 0.6);
  399. &:last-child {
  400. border-bottom: none;
  401. }
  402. // Ausgegraut wenn inaktiv – aber klickbar!
  403. &--inactive {
  404. .filter-select,
  405. .filter-note-input,
  406. .filter-period-select {
  407. opacity: 0.5;
  408. color: $color-text-muted;
  409. }
  410. .filter-row__add {
  411. opacity: 0.4;
  412. }
  413. .filter-radio {
  414. opacity: 0.5;
  415. }
  416. }
  417. }
  418. .filter-row__label {
  419. display: flex;
  420. align-items: center;
  421. gap: $space-2;
  422. cursor: pointer;
  423. font-size: $font-size-sm;
  424. color: $color-text-base;
  425. padding-top: 7px; // optisch mit den Selects ausrichten
  426. user-select: none;
  427. }
  428. .filter-row__checkbox {
  429. width: 14px;
  430. height: 14px;
  431. cursor: pointer;
  432. flex-shrink: 0;
  433. accent-color: $color-primary;
  434. }
  435. .filter-row__controls {
  436. display: flex;
  437. flex-direction: column;
  438. gap: $space-2;
  439. min-width: 0;
  440. }
  441. .filter-row__control-group {
  442. display: flex;
  443. align-items: center;
  444. gap: $space-2;
  445. .filter-select,
  446. .filter-note-input {
  447. width: 300px;
  448. max-width: 100%;
  449. }
  450. &--period {
  451. flex-direction: column;
  452. align-items: flex-start;
  453. gap: $space-2;
  454. }
  455. &--radio {
  456. padding-top: 7px;
  457. gap: $space-4;
  458. }
  459. }
  460. // ─── Plus- und Minus-Button ───────────────────────────────────────────────────
  461. .filter-row__add {
  462. width: 22px;
  463. height: 22px;
  464. margin-top: 7px;
  465. border: 1px solid $color-input-border;
  466. background: $color-white;
  467. border-radius: $radius-sm;
  468. cursor: pointer;
  469. font-size: $font-size-md;
  470. line-height: 1;
  471. color: $color-text-muted;
  472. display: flex;
  473. align-items: center;
  474. justify-content: center;
  475. flex-shrink: 0;
  476. transition: border-color $transition-fast, color $transition-fast;
  477. &:hover {
  478. border-color: $color-primary;
  479. color: $color-primary;
  480. }
  481. }
  482. .filter-row__remove {
  483. width: 20px;
  484. height: 20px;
  485. border: none;
  486. background: none;
  487. cursor: pointer;
  488. font-size: $font-size-md;
  489. line-height: 1;
  490. color: $color-text-light;
  491. display: flex;
  492. align-items: center;
  493. justify-content: center;
  494. border-radius: $radius-sm;
  495. flex-shrink: 0;
  496. transition: color $transition-fast, background $transition-fast;
  497. &:hover {
  498. color: $color-error;
  499. background: rgba($color-error, 0.08);
  500. }
  501. }
  502. // ─── Zeitraum: Custom-Datumsfelder ───────────────────────────────────────────
  503. .filter-custom-dates {
  504. display: flex;
  505. flex-direction: column;
  506. gap: $space-2;
  507. margin-top: $space-2;
  508. }
  509. .filter-date-group {
  510. display: flex;
  511. align-items: center;
  512. gap: $space-2;
  513. }
  514. .filter-date-label {
  515. font-size: $font-size-sm;
  516. color: $color-text-muted;
  517. width: 26px;
  518. flex-shrink: 0;
  519. }
  520. .filter-date-select {
  521. width: auto;
  522. display: inline-block;
  523. &--sm {
  524. padding-right: $space-6;
  525. min-width: 60px;
  526. }
  527. &--month {
  528. padding-right: $space-6;
  529. min-width: 100px;
  530. }
  531. }
  532. // ─── Radio-Filter (Abgeschlossen?) ────────────────────────────────────────────
  533. .filter-radio {
  534. display: inline-flex;
  535. align-items: center;
  536. gap: $space-1;
  537. font-size: $font-size-sm;
  538. color: $color-text-base;
  539. cursor: pointer;
  540. user-select: none;
  541. accent-color: $color-primary;
  542. }
  543. // ─── Filter-Footer ────────────────────────────────────────────────────────────
  544. .report-filter__footer {
  545. display: flex;
  546. align-items: center;
  547. gap: $space-4;
  548. padding: $space-4 0;
  549. }
  550. .filter-footer__link {
  551. background: none;
  552. border: none;
  553. padding: 0;
  554. cursor: pointer;
  555. font-family: $font-family-base;
  556. font-size: $font-size-sm;
  557. color: $color-text-muted;
  558. text-decoration: underline;
  559. text-underline-offset: 2px;
  560. transition: color $transition-fast;
  561. &:hover {
  562. color: $color-text-base;
  563. }
  564. }