@klodd/ds 1.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/css/00-primitives.css +62 -0
  2. package/css/10-semantic.css +81 -20
  3. package/css/apps/ekonom.css +9 -0
  4. package/css/base/layout.css +45 -0
  5. package/css/components/auth.css +28 -0
  6. package/css/components/avatar.css +31 -0
  7. package/css/components/badge.css +2 -2
  8. package/css/components/banner.css +63 -0
  9. package/css/components/chip.css +257 -0
  10. package/css/components/collapsible.css +64 -0
  11. package/css/components/divider.css +25 -0
  12. package/css/components/dropdown.css +88 -0
  13. package/css/components/feedback.css +6 -0
  14. package/css/components/form.css +67 -0
  15. package/css/components/hbar.css +64 -0
  16. package/css/components/hero.css +85 -0
  17. package/css/components/hub-card.css +100 -0
  18. package/css/components/inline-edit.css +67 -0
  19. package/css/components/input.css +1 -1
  20. package/css/components/list-row.css +115 -0
  21. package/css/components/overlay.css +3 -0
  22. package/css/components/panel.css +95 -0
  23. package/css/components/progress.css +39 -0
  24. package/css/components/setting-row.css +186 -0
  25. package/css/components/split-bar.css +53 -0
  26. package/css/components/stat.css +55 -0
  27. package/css/components/swipe-stack.css +200 -0
  28. package/css/components/tab-bar.css +58 -0
  29. package/css/components/table.css +39 -0
  30. package/css/components/tooltip.css +50 -0
  31. package/css/components/upload-spinner.css +55 -0
  32. package/css/index.css +32 -0
  33. package/css/utilities.css +81 -0
  34. package/js/bar-styles.js +37 -0
  35. package/js/hero-roll.js +287 -0
  36. package/js/index.js +95 -0
  37. package/js/lucide-init.js +27 -0
  38. package/js/nav-optimistic.js +74 -0
  39. package/js/pull-to-refresh.js +162 -0
  40. package/js/pwa-register.js +132 -0
  41. package/js/sheet-drag.js +163 -0
  42. package/js/turbo-nav.js +353 -0
  43. package/package.json +4 -3
@@ -0,0 +1,64 @@
1
+ /* ================================================================
2
+ components/collapsible.css
3
+ Panel som expanderar pa klick. Anvands for budget-sektioner,
4
+ kategori-grupper, FAQ-rader.
5
+
6
+ Element: .collapsible-card (root) som ar bas.
7
+ - .collapsible__header klickbar header (button-element)
8
+ - .collapsible__body expanderat innehall (hidden default)
9
+ - .collapsible__chev chevron som roterar 180deg
10
+
11
+ State drivs via [data-expanded] attribut pa root - JS togglar.
12
+ ================================================================ */
13
+ .collapsible-card {
14
+ background: var(--surface-raised);
15
+ border: 1px solid var(--border-subtle);
16
+ border-radius: var(--radius-20);
17
+ margin-bottom: var(--space-14);
18
+ padding: 0;
19
+ }
20
+
21
+ .collapsible__header {
22
+ display: flex;
23
+ align-items: flex-start;
24
+ justify-content: space-between;
25
+ gap: var(--space-12);
26
+ width: 100%;
27
+ padding: var(--space-16) var(--space-18);
28
+ background: transparent;
29
+ border: 0;
30
+ color: inherit;
31
+ text-align: left;
32
+ cursor: pointer;
33
+ font: inherit;
34
+ border-radius: inherit;
35
+ }
36
+
37
+ .collapsible__header:focus-visible {
38
+ outline: 2px solid var(--border-focus);
39
+ outline-offset: -2px;
40
+ }
41
+
42
+ .collapsible__header-text {
43
+ flex: 1;
44
+ min-width: 0;
45
+ }
46
+
47
+ .collapsible__chev {
48
+ flex-shrink: 0;
49
+ margin-top: var(--space-4);
50
+ color: var(--text-muted);
51
+ transition: transform var(--dur-medium) var(--ease-default);
52
+ }
53
+
54
+ .collapsible-card[data-expanded] .collapsible__chev {
55
+ transform: rotate(180deg);
56
+ }
57
+
58
+ .collapsible__body {
59
+ padding: 0 var(--space-18) var(--space-16);
60
+ }
61
+
62
+ @media (prefers-reduced-motion: reduce) {
63
+ .collapsible__chev { transition: none; }
64
+ }
@@ -0,0 +1,25 @@
1
+ /* ================================================================
2
+ components/divider.css
3
+ Horisontell eller vertikal separator. Anvands mellan sektioner,
4
+ list-grupper, eller inom sheets/cards. Tva styrkor (subtle/strong).
5
+
6
+ Default ar horisontell. Modifier --vertical for sidled. Modifier
7
+ --strong for hogre kontrast (anvand sparsamt - subtle ar default).
8
+ ================================================================ */
9
+ .divider {
10
+ border: none;
11
+ border-top: 1px solid var(--border-subtle);
12
+ margin: var(--space-16) 0;
13
+ }
14
+
15
+ .divider--vertical {
16
+ border-top: none;
17
+ border-left: 1px solid var(--border-subtle);
18
+ height: 100%;
19
+ margin: 0 var(--space-16);
20
+ align-self: stretch;
21
+ }
22
+
23
+ .divider--strong {
24
+ border-color: var(--border-default);
25
+ }
@@ -0,0 +1,88 @@
1
+ /* ================================================================
2
+ components/dropdown.css
3
+ Kontextuell meny. Wrapper med trigger + .dropdown-menu som
4
+ visas via .is-open-toggling fran JS.
5
+
6
+ Markup-pattern:
7
+ <div class="dropdown" data-dropdown>
8
+ <button class="btn btn--icon" data-dropdown-trigger>...</button>
9
+ <div class="dropdown-menu" role="menu">
10
+ <button class="dropdown-item" role="menuitem">Item 1</button>
11
+ <hr class="dropdown-divider">
12
+ <button class="dropdown-item dropdown-item--danger">Ta bort</button>
13
+ </div>
14
+ </div>
15
+
16
+ JS togglar .is-open pa .dropdown-element. Inga inline-styles
17
+ (CSP-safe). Stang via klick utanfor / Escape via JS-helper.
18
+ ================================================================ */
19
+ .dropdown {
20
+ position: relative;
21
+ display: inline-flex;
22
+ }
23
+
24
+ .dropdown-menu {
25
+ position: absolute;
26
+ top: calc(100% + var(--space-4));
27
+ left: 0;
28
+ min-width: 160px;
29
+ background: var(--surface-overlay);
30
+ border: 1px solid var(--border-default);
31
+ border-radius: var(--radius-10);
32
+ padding: var(--space-4) 0;
33
+ box-shadow: 0 4px 16px color-mix(in oklch, black 40%, transparent);
34
+ z-index: var(--z-dropdown, 100);
35
+ display: none;
36
+ }
37
+
38
+ .dropdown.is-open .dropdown-menu {
39
+ display: block;
40
+ }
41
+
42
+ .dropdown-item {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: var(--space-8);
46
+ width: 100%;
47
+ padding: var(--space-8) var(--space-12);
48
+ font-family: inherit;
49
+ font-size: var(--fs-14);
50
+ color: var(--text-default);
51
+ background: transparent;
52
+ border: 0;
53
+ text-align: left;
54
+ cursor: pointer;
55
+ transition: background var(--dur-fast) var(--ease-out);
56
+ }
57
+
58
+ @media (hover: hover) and (pointer: fine) {
59
+ .dropdown-item:hover {
60
+ background: var(--surface-hover);
61
+ }
62
+ }
63
+
64
+ .dropdown-item:active {
65
+ background: var(--surface-active);
66
+ }
67
+
68
+ .dropdown-item:focus-visible {
69
+ outline: 2px solid var(--border-focus);
70
+ outline-offset: -2px;
71
+ }
72
+
73
+ .dropdown-item[disabled],
74
+ .dropdown-item:disabled {
75
+ opacity: 0.5;
76
+ cursor: not-allowed;
77
+ pointer-events: none;
78
+ }
79
+
80
+ .dropdown-item--danger {
81
+ color: var(--bg-danger);
82
+ }
83
+
84
+ .dropdown-divider {
85
+ border: none;
86
+ border-top: 1px solid var(--border-subtle);
87
+ margin: var(--space-4) 0;
88
+ }
@@ -53,6 +53,12 @@
53
53
  100% { opacity: 1; transform: translateY(0) scale(1); }
54
54
  }
55
55
 
56
+ @media (prefers-reduced-motion: reduce) {
57
+ .toast {
58
+ animation: none;
59
+ }
60
+ }
61
+
56
62
 
57
63
  /* ================================================================
58
64
  ==== EMPTY-STATE
@@ -0,0 +1,67 @@
1
+ /* ================================================================
2
+ components/form.css
3
+ Form-skelett. .form-section, .form-group, .form-row.
4
+
5
+ Skiljer sig fran input.css (input-elementen). form.css ar
6
+ wrapper-strukturen som gor formularet komplett.
7
+ ================================================================ */
8
+ .form-card {
9
+ background: var(--surface-raised);
10
+ border: 1px solid var(--border-subtle);
11
+ border-radius: var(--radius-20);
12
+ padding: var(--space-20);
13
+ max-width: 480px;
14
+ margin-bottom: var(--space-14);
15
+ }
16
+
17
+ .form-section {
18
+ margin-bottom: var(--space-20);
19
+ }
20
+
21
+ .form-section__title {
22
+ font-size: var(--fs-10);
23
+ font-weight: var(--fw-medium);
24
+ letter-spacing: 0.12em;
25
+ text-transform: uppercase;
26
+ color: var(--text-muted);
27
+ margin: 0 0 var(--space-12);
28
+ padding-bottom: var(--space-8);
29
+ border-bottom: 1px solid var(--border-subtle);
30
+ }
31
+
32
+ .form-group {
33
+ margin-bottom: var(--space-14);
34
+ }
35
+
36
+ .form-group__label {
37
+ display: block;
38
+ font-size: var(--fs-11);
39
+ color: var(--text-subtle);
40
+ margin-bottom: var(--space-6);
41
+ letter-spacing: 0.01em;
42
+ }
43
+
44
+ .form-hint {
45
+ font-size: var(--fs-11);
46
+ color: var(--text-muted);
47
+ margin-top: var(--space-6);
48
+ }
49
+
50
+ .form-row {
51
+ display: grid;
52
+ grid-template-columns: 1fr;
53
+ gap: var(--space-12);
54
+ }
55
+
56
+ .form-row--inline {
57
+ flex-wrap: wrap;
58
+ align-items: flex-end;
59
+ }
60
+ .form-row--inline > .form-group {
61
+ margin-bottom: 0;
62
+ flex: 1;
63
+ min-width: 0;
64
+ }
65
+ .form-row--inline > .form-group.is-fixed {
66
+ flex: 0 0 auto;
67
+ }
@@ -0,0 +1,64 @@
1
+ /* ================================================================
2
+ components/hbar.css
3
+ Horisontell bar - generic single-bar med label + value + track + fill.
4
+ Anvands for kategori-utfall, score-distribution, kostnadsfordelningar.
5
+
6
+ .hbar ar bas. .hbar__track ar fyllbar bakgrund. .hbar__fill ar
7
+ det procent-fyllda overlayet. .hbar__label och .hbar__value ar
8
+ text-element under/over baren.
9
+
10
+ Bredd pa .hbar__fill satts via data-bar-width + bar-styles.js
11
+ (CSP-safe). Manuell override-class kan ocksa anvandas (.hbar__fill-50).
12
+ ================================================================ */
13
+ .hbar {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: var(--space-6);
17
+ margin-bottom: var(--space-12);
18
+ }
19
+
20
+ .hbar__item {
21
+ display: flex;
22
+ align-items: baseline;
23
+ justify-content: space-between;
24
+ gap: var(--space-10);
25
+ }
26
+
27
+ .hbar__label {
28
+ font-size: var(--fs-13);
29
+ color: var(--text-subtle);
30
+ flex: 1;
31
+ min-width: 0;
32
+ }
33
+
34
+ .hbar__value {
35
+ font-size: var(--fs-13);
36
+ font-weight: var(--fw-medium);
37
+ color: var(--text-default);
38
+ font-variant-numeric: tabular-nums;
39
+ white-space: nowrap;
40
+ flex-shrink: 0;
41
+ }
42
+
43
+ .hbar__track {
44
+ width: 100%;
45
+ height: var(--space-6);
46
+ background: var(--surface-active);
47
+ border-radius: var(--radius-full);
48
+ overflow: hidden;
49
+ }
50
+
51
+ .hbar__fill {
52
+ height: 100%;
53
+ background: var(--accent-9);
54
+ border-radius: var(--radius-full);
55
+ transition: width var(--dur-medium) var(--ease-spring-snappy);
56
+ }
57
+
58
+ .hbar__fill--positive { background: var(--positive); }
59
+ .hbar__fill--warning { background: var(--warning); }
60
+ .hbar__fill--negative { background: var(--negative); }
61
+
62
+ @media (prefers-reduced-motion: reduce) {
63
+ .hbar__fill { transition: none; }
64
+ }
@@ -0,0 +1,85 @@
1
+ /* ================================================================
2
+ components/hero.css
3
+ Stora display-rubriker med amount + meta. Anvands pa dashboard,
4
+ detaljvyer, primary-page-toppar.
5
+
6
+ Element: .hero (wrapper), .hero__heading, .hero__amount (default 80px),
7
+ .hero__amount--card (40px sekundar), .hero__amount-row, .hero__label,
8
+ .hero__label--muted, .hero__meta, .hero__actions.
9
+
10
+ .hero-amount och .hero__amount-roll anvands av hero-roll-animation
11
+ - se components/hero-roll.css for animation-styling.
12
+ ================================================================ */
13
+ .hero {
14
+ padding: var(--space-20) var(--space-4) var(--space-24);
15
+ text-align: left;
16
+ }
17
+
18
+ .hero__heading {
19
+ font-size: var(--fs-17);
20
+ font-weight: var(--fw-medium);
21
+ letter-spacing: var(--ls-tight);
22
+ color: var(--text-default);
23
+ margin: 0 0 var(--space-4);
24
+ }
25
+
26
+ .hero__label {
27
+ font-size: var(--fs-12);
28
+ font-weight: var(--fw-medium);
29
+ color: var(--text-muted);
30
+ letter-spacing: var(--ls-wider, 0.04em);
31
+ text-transform: uppercase;
32
+ margin: 0 0 var(--space-8);
33
+ }
34
+
35
+ .hero__label--muted {
36
+ font-size: var(--fs-10);
37
+ font-weight: var(--fw-regular);
38
+ color: var(--text-disabled);
39
+ letter-spacing: 0.03em;
40
+ text-transform: lowercase;
41
+ opacity: 0.7;
42
+ }
43
+
44
+ .hero__amount {
45
+ font-size: var(--fs-80);
46
+ font-weight: var(--fw-medium);
47
+ letter-spacing: var(--ls-tightest, -0.04em);
48
+ color: var(--text-default);
49
+ line-height: var(--lh-tight);
50
+ margin: 0 0 var(--space-8);
51
+ font-variant-numeric: tabular-nums;
52
+ }
53
+
54
+ .hero__amount--card {
55
+ font-size: var(--fs-40);
56
+ letter-spacing: var(--ls-tighter, -0.035em);
57
+ line-height: var(--lh-snug);
58
+ }
59
+
60
+ .hero__amount--fluid {
61
+ font-size: clamp(40px, 12vw, 80px);
62
+ }
63
+
64
+ .hero__amount-row {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: var(--space-10);
68
+ margin-bottom: var(--space-8);
69
+ }
70
+
71
+ .hero__amount-row .hero__amount,
72
+ .hero__amount-row .hero__amount--card { margin-bottom: 0; }
73
+
74
+ .hero__meta {
75
+ font-size: var(--fs-13);
76
+ color: var(--text-subtle);
77
+ margin: 0 0 var(--space-20);
78
+ }
79
+
80
+ .hero__actions {
81
+ display: flex;
82
+ gap: var(--space-8);
83
+ align-items: center;
84
+ flex-wrap: wrap;
85
+ }
@@ -0,0 +1,100 @@
1
+ /* ================================================================
2
+ components/hub-card.css
3
+ Stora settings-hub-kort. Anvands i settings-hub-vyer dar varje
4
+ kort lankar till en sub-sida. Layout: ikon + titel + subtitle +
5
+ chev. Hela kortet ar klickbart.
6
+
7
+ .hub-list samlar flera hub-cards i en kolumn.
8
+ .hub-category ar group-rubrik over flera kort.
9
+ ================================================================ */
10
+ .hub-list {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: var(--space-8);
14
+ margin: 0;
15
+ padding: 0;
16
+ list-style: none;
17
+ }
18
+
19
+ .hub-card {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: var(--space-14);
23
+ padding: var(--space-16) var(--space-18);
24
+ background: var(--surface-raised);
25
+ border: 1px solid var(--border-subtle);
26
+ border-radius: var(--radius-16);
27
+ color: var(--text-default);
28
+ text-decoration: none;
29
+ cursor: pointer;
30
+ -webkit-tap-highlight-color: transparent;
31
+ touch-action: manipulation;
32
+ transition:
33
+ background var(--dur-base) var(--ease-spring-snappy),
34
+ transform var(--press-out-duration) var(--press-out-easing);
35
+ }
36
+
37
+ @media (hover: hover) and (pointer: fine) {
38
+ .hub-card:hover {
39
+ background: var(--surface-overlay);
40
+ }
41
+ }
42
+
43
+ .hub-card:active {
44
+ transform: scale(0.99);
45
+ transition: transform var(--press-in-duration) var(--press-in-easing);
46
+ }
47
+
48
+ .hub-card:focus-visible {
49
+ outline: 2px solid var(--border-focus);
50
+ outline-offset: 2px;
51
+ }
52
+
53
+ .hub-card__icon {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ width: 36px;
58
+ height: 36px;
59
+ background: var(--surface-default);
60
+ color: var(--accent-text);
61
+ border-radius: var(--radius-12);
62
+ flex-shrink: 0;
63
+ }
64
+
65
+ .hub-card__text {
66
+ flex: 1;
67
+ min-width: 0;
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: var(--space-2);
71
+ }
72
+
73
+ .hub-card__title {
74
+ font-size: var(--fs-15);
75
+ font-weight: var(--fw-medium);
76
+ color: var(--text-default);
77
+ line-height: var(--lh-snug);
78
+ }
79
+
80
+ .hub-card__subtitle {
81
+ font-size: var(--fs-12);
82
+ color: var(--text-muted);
83
+ line-height: var(--lh-snug);
84
+ }
85
+
86
+ .hub-card__chev {
87
+ flex-shrink: 0;
88
+ color: var(--text-disabled);
89
+ }
90
+
91
+ .hub-category {
92
+ font-size: var(--fs-11);
93
+ font-weight: var(--fw-medium);
94
+ color: var(--text-muted);
95
+ letter-spacing: 0.08em;
96
+ text-transform: uppercase;
97
+ margin: var(--space-20) 0 var(--space-8);
98
+ padding: 0 var(--space-4);
99
+ }
100
+ .hub-category:first-child { margin-top: 0; }
@@ -0,0 +1,67 @@
1
+ /* ================================================================
2
+ components/inline-edit.css
3
+ Inline-edit-monstret for klickbart text-falt som expanderas till
4
+ input vid pencil-click. Anvands for profil-namn, etiketter, taggar.
5
+
6
+ Tidigare hette komponenten .profile-name-edit (Ekonom-domain).
7
+ Nu generaliserad till .inline-edit.
8
+ ================================================================ */
9
+ .inline-edit {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ gap: var(--space-6);
13
+ }
14
+
15
+ .inline-edit__text {
16
+ font-size: var(--fs-17);
17
+ font-weight: var(--fw-medium);
18
+ color: var(--text-default);
19
+ letter-spacing: var(--ls-tight);
20
+ }
21
+
22
+ .inline-edit__btn {
23
+ display: inline-flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ width: 28px;
27
+ height: 28px;
28
+ padding: 0;
29
+ background: transparent;
30
+ border: 0;
31
+ color: var(--text-muted);
32
+ cursor: pointer;
33
+ border-radius: 50%;
34
+ transition: background var(--dur-fast) var(--ease-default);
35
+ }
36
+
37
+ @media (hover: hover) and (pointer: fine) {
38
+ .inline-edit__btn:hover {
39
+ background: var(--surface-hover);
40
+ color: var(--text-default);
41
+ }
42
+ }
43
+
44
+ .inline-edit__form {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ gap: var(--space-6);
48
+ margin: 0;
49
+ }
50
+
51
+ .inline-edit__input {
52
+ display: inline-block;
53
+ height: 32px;
54
+ padding: 0 var(--space-10);
55
+ background: var(--surface-sunken);
56
+ border: 1px solid var(--border-default);
57
+ border-radius: var(--radius-8);
58
+ color: var(--text-default);
59
+ font-family: inherit;
60
+ font-size: 16px;
61
+ outline: none;
62
+ }
63
+
64
+ .inline-edit__input:focus {
65
+ border-color: var(--accent-9);
66
+ box-shadow: 0 0 0 3px var(--accent-a3);
67
+ }
@@ -65,7 +65,7 @@
65
65
  .textarea:focus,
66
66
  .select:focus {
67
67
  border-color: var(--accent-9);
68
- box-shadow: 0 0 0 3px var(--accent-a20);
68
+ box-shadow: 0 0 0 3px var(--accent-a3);
69
69
  background: var(--surface-default);
70
70
  }
71
71
 
@@ -0,0 +1,115 @@
1
+ /* ================================================================
2
+ components/list-row.css
3
+ Generisk list-rad med ikon + body + amount. Anvands for transaktioner,
4
+ subscriptions, audit-logs, jobblistor.
5
+
6
+ Tidigare hette komponenten .tx-row (transaction) - nu generaliserad
7
+ till .list-row sa inte affarsdomanen sipprar in i namnet.
8
+
9
+ Element: .list-row__icon, .list-row__body, .list-row__desc,
10
+ .list-row__amount, .list-row__date, .list-row__meta.
11
+
12
+ Modifiers: --excluded (greyed out), --pending (with dashed border).
13
+
14
+ App-specifika domain-overrides (kategori-fargade ikoner) lever i
15
+ app-repots egna CSS - inte i paketet.
16
+ ================================================================ */
17
+ .list {
18
+ list-style: none;
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+
23
+ .list-row {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: var(--space-12);
27
+ padding: var(--space-10) 0;
28
+ border-bottom: 1px solid var(--border-subtle);
29
+ min-height: 56px;
30
+ }
31
+
32
+ .list-row:last-child { border-bottom: none; }
33
+
34
+ .list-row__icon {
35
+ width: 36px;
36
+ height: 36px;
37
+ border-radius: var(--radius-12);
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ flex-shrink: 0;
42
+ background: var(--surface-default);
43
+ color: var(--text-subtle);
44
+ }
45
+
46
+ .list-row__icon svg {
47
+ width: 18px;
48
+ height: 18px;
49
+ stroke: currentColor;
50
+ fill: none;
51
+ stroke-width: 2;
52
+ }
53
+
54
+ .list-row__body {
55
+ flex: 1;
56
+ min-width: 0;
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: var(--space-2);
60
+ }
61
+
62
+ .list-row__desc {
63
+ font-size: var(--fs-14);
64
+ color: var(--text-default);
65
+ white-space: nowrap;
66
+ overflow: hidden;
67
+ text-overflow: ellipsis;
68
+ }
69
+
70
+ .list-row__desc a { color: inherit; }
71
+
72
+ .list-row__meta {
73
+ font-size: var(--fs-12);
74
+ color: var(--text-muted);
75
+ }
76
+
77
+ .list-row__date {
78
+ font-size: var(--fs-12);
79
+ color: var(--text-muted);
80
+ white-space: nowrap;
81
+ min-width: 3.5rem;
82
+ font-variant-numeric: tabular-nums;
83
+ }
84
+
85
+ .list-row__amount {
86
+ font-size: var(--fs-14);
87
+ font-weight: var(--fw-medium);
88
+ color: var(--text-default);
89
+ text-align: right;
90
+ white-space: nowrap;
91
+ min-width: 5rem;
92
+ font-variant-numeric: tabular-nums;
93
+ }
94
+
95
+ .list-row__amount--positive { color: var(--positive); }
96
+ .list-row__amount--negative { color: var(--negative); }
97
+
98
+ .list-row--excluded {
99
+ opacity: 0.5;
100
+ }
101
+
102
+ .list-row--pending .list-row__icon {
103
+ border: 1px dashed var(--border-default);
104
+ background: transparent;
105
+ }
106
+
107
+ .list-row--clickable {
108
+ cursor: pointer;
109
+ -webkit-tap-highlight-color: transparent;
110
+ touch-action: manipulation;
111
+ }
112
+
113
+ @media (hover: hover) and (pointer: fine) {
114
+ .list-row--clickable:hover { background: var(--surface-hover); }
115
+ }
@@ -21,6 +21,9 @@ dialog.sheet::backdrop {
21
21
  background: color-mix(in oklch, var(--surface-page) 60%, transparent);
22
22
  -webkit-backdrop-filter: blur(4px);
23
23
  backdrop-filter: blur(4px);
24
+ /* Klickbar yta - JS lyssnar pa backdrop-klick for stang-action.
25
+ Signalerar interaktivitet visuellt via cursor. */
26
+ cursor: pointer;
24
27
  }
25
28
 
26
29