Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

711 строки
17 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. max-width: 66%;
  383. }
  384. .report-filter__heading {
  385. font-size: $font-size-xs;
  386. font-weight: $font-weight-bold;
  387. color: $color-text-muted;
  388. text-transform: uppercase;
  389. letter-spacing: 0.06em;
  390. margin-bottom: $space-3;
  391. }
  392. // ─── Filter-Row ───────────────────────────────────────────────────────────────
  393. .filter-row {
  394. display: grid;
  395. grid-template-columns: 160px 1fr;
  396. align-items: flex-start;
  397. gap: $space-3;
  398. padding: $space-2 0;
  399. border-bottom: 1px solid rgba($color-border, 0.6);
  400. &:last-child {
  401. border-bottom: none;
  402. }
  403. // Ausgegraut wenn inaktiv – aber klickbar!
  404. &--inactive {
  405. .filter-select,
  406. .filter-note-input,
  407. .filter-period-select {
  408. opacity: 0.5;
  409. color: $color-text-muted;
  410. }
  411. .filter-row__add {
  412. opacity: 0.4;
  413. }
  414. .filter-radio {
  415. opacity: 0.5;
  416. }
  417. .filter-neg {
  418. opacity: 0.4;
  419. pointer-events: none;
  420. }
  421. }
  422. }
  423. .filter-row__label {
  424. display: flex;
  425. align-items: center;
  426. gap: $space-2;
  427. cursor: pointer;
  428. font-size: $font-size-sm;
  429. color: $color-text-base;
  430. padding-top: 7px; // optisch mit den Selects ausrichten
  431. user-select: none;
  432. }
  433. .filter-row__checkbox {
  434. width: 14px;
  435. height: 14px;
  436. cursor: pointer;
  437. flex-shrink: 0;
  438. accent-color: $color-primary;
  439. }
  440. // ─── Body: Controls + Meta nebeneinander ────────────────────────────────────
  441. .filter-row__body {
  442. display: flex;
  443. align-items: flex-start;
  444. gap: $space-3;
  445. }
  446. .filter-row__controls {
  447. display: flex;
  448. flex-direction: column;
  449. gap: $space-2;
  450. min-width: 0;
  451. flex: 1;
  452. }
  453. .filter-row__control-group {
  454. display: flex;
  455. align-items: center;
  456. gap: $space-2;
  457. .filter-select,
  458. .filter-note-input {
  459. width: 300px;
  460. max-width: 100%;
  461. }
  462. &--period {
  463. flex-direction: column;
  464. align-items: flex-start;
  465. gap: $space-2;
  466. }
  467. &--radio {
  468. padding-top: 7px;
  469. gap: $space-4;
  470. }
  471. }
  472. // ─── Meta: Plus-Button + Negativfilter ──────────────────────────────────────
  473. .filter-row__meta {
  474. display: flex;
  475. align-items: center;
  476. gap: $space-3;
  477. padding-top: 7px; // vertikal mit Select ausrichten
  478. flex-shrink: 0;
  479. white-space: nowrap;
  480. &--no-add {
  481. padding-left: calc(22px + #{$space-3}); // Platz für fehlenden Add-Button
  482. }
  483. }
  484. // ─── Plus- und Minus-Button ───────────────────────────────────────────────────
  485. .filter-row__add {
  486. width: 22px;
  487. height: 22px;
  488. border: 1px solid $color-input-border;
  489. background: $color-white;
  490. border-radius: $radius-sm;
  491. cursor: pointer;
  492. font-size: $font-size-md;
  493. line-height: 1;
  494. color: $color-text-muted;
  495. display: flex;
  496. align-items: center;
  497. justify-content: center;
  498. flex-shrink: 0;
  499. transition: border-color $transition-fast, color $transition-fast;
  500. &:hover {
  501. border-color: $color-primary;
  502. color: $color-primary;
  503. }
  504. }
  505. .filter-row__remove {
  506. width: 20px;
  507. height: 20px;
  508. border: none;
  509. background: none;
  510. cursor: pointer;
  511. font-size: $font-size-md;
  512. line-height: 1;
  513. color: $color-text-light;
  514. display: flex;
  515. align-items: center;
  516. justify-content: center;
  517. border-radius: $radius-sm;
  518. flex-shrink: 0;
  519. transition: color $transition-fast, background $transition-fast;
  520. &:hover {
  521. color: $color-error;
  522. background: rgba($color-error, 0.08);
  523. }
  524. }
  525. // ─── Zeitraum: Custom-Datumsfelder ───────────────────────────────────────────
  526. .filter-custom-dates {
  527. display: flex;
  528. flex-direction: column;
  529. gap: $space-2;
  530. margin-top: $space-2;
  531. // [hidden] wird durch display:flex überschrieben – explizit gegensteuern
  532. &[hidden] {
  533. display: none;
  534. }
  535. }
  536. .filter-date-group {
  537. display: flex;
  538. align-items: center;
  539. gap: $space-2;
  540. }
  541. .filter-date-label {
  542. font-size: $font-size-sm;
  543. color: $color-text-muted;
  544. width: 26px;
  545. flex-shrink: 0;
  546. }
  547. .filter-date-select {
  548. width: auto;
  549. display: inline-block;
  550. &--sm {
  551. padding-right: $space-6;
  552. min-width: 60px;
  553. }
  554. &--month {
  555. padding-right: $space-6;
  556. min-width: 100px;
  557. }
  558. }
  559. // ─── Radio-Filter (Abgeschlossen?) ────────────────────────────────────────────
  560. .filter-radio {
  561. display: inline-flex;
  562. align-items: center;
  563. gap: $space-1;
  564. font-size: $font-size-sm;
  565. color: $color-text-base;
  566. cursor: pointer;
  567. user-select: none;
  568. accent-color: $color-primary;
  569. }
  570. // ─── Filter-Footer ────────────────────────────────────────────────────────────
  571. .report-filter__footer {
  572. display: flex;
  573. align-items: center;
  574. gap: $space-4;
  575. padding: $space-4 0;
  576. }
  577. .filter-footer__link {
  578. background: none;
  579. border: none;
  580. padding: 0;
  581. cursor: pointer;
  582. font-family: $font-family-base;
  583. font-size: $font-size-sm;
  584. color: $color-text-muted;
  585. text-decoration: underline;
  586. text-underline-offset: 2px;
  587. transition: color $transition-fast;
  588. &:hover {
  589. color: $color-text-base;
  590. }
  591. }
  592. // ─── Negativfilter-Checkbox ───────────────────────────────────────────────────
  593. .filter-neg {
  594. display: inline-flex;
  595. align-items: center;
  596. gap: $space-1;
  597. font-size: $font-size-sm;
  598. color: $color-text-muted;
  599. cursor: pointer;
  600. user-select: none;
  601. white-space: nowrap;
  602. input[type="checkbox"] {
  603. width: 13px;
  604. height: 13px;
  605. cursor: pointer;
  606. accent-color: $color-warning;
  607. flex-shrink: 0;
  608. }
  609. &:has(input:checked) {
  610. color: $color-warning;
  611. font-weight: $font-weight-medium;
  612. }
  613. }