main
css 2,223 lines 47.3 KB
Raw
1 :root {
2 color-scheme: light;
3 --font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
4 --bg: #f5f7f9;
5 --bg-subtle: #edf1f4;
6 --surface: #ffffff;
7 --surface-raised: #ffffff;
8 --text: #111827;
9 --text-muted: #5f6f83;
10 --text-soft: #8390a3;
11 --line: #dce3ea;
12 --line-strong: #c4ced9;
13 --primary: #0f766e;
14 --primary-strong: #115e59;
15 --positive: #087443;
16 --negative: #b42318;
17 --warning: #a15c07;
18 --info: #2459a6;
19 --focus: #2563eb;
20 --research-option-bg: #f8fafc;
21 --research-option-hover: #e2e8f0;
22 --research-option-text: #18212f;
23 --research-option-muted: #526174;
24 --shadow: 0 16px 42px rgba(15, 23, 42, 0.08);
25 --space-1: 4px;
26 --space-2: 8px;
27 --space-3: 12px;
28 --space-4: 16px;
29 --space-5: 20px;
30 --space-6: 24px;
31 --space-8: 32px;
32 --radius: 8px;
33 }
34
35 @media (prefers-color-scheme: dark) {
36 :root[data-theme="system"] {
37 color-scheme: dark;
38 --bg: #0e141b;
39 --bg-subtle: #151e28;
40 --surface: #141c26;
41 --surface-raised: #192330;
42 --text: #eef3f8;
43 --text-muted: #a9b6c5;
44 --text-soft: #7f8ea1;
45 --line: #263342;
46 --line-strong: #354457;
47 --primary: #2dd4bf;
48 --primary-strong: #5eead4;
49 --positive: #4ade80;
50 --negative: #fb7185;
51 --warning: #facc15;
52 --info: #93c5fd;
53 --research-option-bg: #1e2b3a;
54 --research-option-hover: #334457;
55 --research-option-text: #f1f5f9;
56 --research-option-muted: #94a3b8;
57 --shadow: 0 18px 48px rgba(0, 0, 0, 0.28);
58 }
59 }
60
61 :root[data-theme="dark"] {
62 color-scheme: dark;
63 --bg: #0e141b;
64 --bg-subtle: #151e28;
65 --surface: #141c26;
66 --surface-raised: #192330;
67 --text: #eef3f8;
68 --text-muted: #a9b6c5;
69 --text-soft: #7f8ea1;
70 --line: #263342;
71 --line-strong: #354457;
72 --primary: #2dd4bf;
73 --primary-strong: #5eead4;
74 --positive: #4ade80;
75 --negative: #fb7185;
76 --warning: #facc15;
77 --info: #93c5fd;
78 --research-option-bg: #1e2b3a;
79 --research-option-hover: #334457;
80 --research-option-text: #f1f5f9;
81 --research-option-muted: #94a3b8;
82 --shadow: 0 18px 48px rgba(0, 0, 0, 0.28);
83 }
84
85 :root[data-theme="light"] {
86 color-scheme: light;
87 }
88
89 * {
90 box-sizing: border-box;
91 }
92
93 html {
94 min-width: 320px;
95 }
96
97 body {
98 margin: 0;
99 background: var(--bg);
100 color: var(--text);
101 font-family: var(--font-sans);
102 font-size: 15px;
103 line-height: 1.5;
104 }
105
106 button,
107 input,
108 select {
109 font: inherit;
110 }
111
112 button,
113 select {
114 cursor: pointer;
115 }
116
117 button:focus-visible,
118 input:focus-visible,
119 select:focus-visible {
120 outline: 3px solid color-mix(in srgb, var(--focus) 35%, transparent);
121 outline-offset: 2px;
122 }
123
124 code,
125 kbd {
126 font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
127 }
128
129 .sr-only {
130 position: absolute;
131 width: 1px;
132 height: 1px;
133 padding: 0;
134 margin: -1px;
135 overflow: hidden;
136 clip: rect(0, 0, 0, 0);
137 white-space: nowrap;
138 border: 0;
139 }
140
141 .signin-shell {
142 min-height: 100vh;
143 display: grid;
144 place-items: center;
145 padding: var(--space-6);
146 background: var(--bg);
147 }
148
149 .signin-panel {
150 width: min(440px, 100%);
151 display: grid;
152 gap: var(--space-5);
153 padding: var(--space-8);
154 border: 1px solid var(--line);
155 border-radius: var(--radius);
156 background: var(--surface);
157 box-shadow: var(--shadow);
158 }
159
160 .signin-panel h1 {
161 margin: 0;
162 font-size: 1.8rem;
163 }
164
165 .signin-panel p {
166 margin: 0;
167 color: var(--text-muted);
168 }
169
170 .signin-actions {
171 display: grid;
172 gap: var(--space-3);
173 }
174
175 .password-input { position: relative; display: block; }
176 .password-input input { width: 100%; padding-right: 3rem; }
177 .password-toggle { position: absolute; right: 0.35rem; top: 50%; width: 2.25rem; height: 2.25rem; transform: translateY(-50%); display: grid; place-items: center; padding: 0; border: 0; background: transparent; color: var(--text-muted); }
178
179 .app-shell {
180 min-height: 100vh;
181 display: grid;
182 grid-template-columns: 248px minmax(0, 1fr);
183 }
184
185 .sidebar {
186 position: sticky;
187 top: 0;
188 height: 100vh;
189 display: flex;
190 flex-direction: column;
191 gap: var(--space-6);
192 padding: var(--space-5);
193 border-right: 1px solid var(--line);
194 background: var(--surface);
195 }
196
197 .brand-lockup {
198 display: flex;
199 align-items: center;
200 gap: var(--space-3);
201 min-height: 44px;
202 }
203
204 .brand-mark {
205 width: 40px;
206 height: 40px;
207 display: grid;
208 place-items: center;
209 border: 1px solid var(--line-strong);
210 border-radius: var(--radius);
211 background: var(--bg-subtle);
212 color: var(--primary-strong);
213 font-weight: 800;
214 }
215
216 .brand-lockup strong,
217 .brand-lockup span {
218 display: block;
219 }
220
221 .brand-lockup span {
222 color: var(--text-muted);
223 font-size: 13px;
224 }
225
226 .sidebar nav {
227 display: grid;
228 gap: var(--space-1);
229 }
230
231 .nav-item {
232 width: 100%;
233 display: flex;
234 align-items: center;
235 gap: var(--space-3);
236 border: 0;
237 border-radius: var(--radius);
238 padding: 11px 12px;
239 background: transparent;
240 color: var(--text-muted);
241 text-align: left;
242 }
243
244 .nav-item:hover,
245 .nav-item-active {
246 background: var(--bg-subtle);
247 color: var(--text);
248 }
249
250 .nav-item-active {
251 box-shadow: inset 3px 0 0 var(--primary);
252 }
253
254 .sidebar-panel {
255 margin-top: auto;
256 border: 1px solid var(--line);
257 border-radius: var(--radius);
258 padding: var(--space-4);
259 background: var(--bg-subtle);
260 }
261
262 .sidebar-panel p {
263 margin: var(--space-3) 0 0;
264 color: var(--text-muted);
265 font-size: 13px;
266 }
267
268 .workspace {
269 min-width: 0;
270 }
271
272 .topbar {
273 position: sticky;
274 top: 0;
275 z-index: 20;
276 display: flex;
277 align-items: center;
278 gap: var(--space-4);
279 min-height: 72px;
280 padding: 0 var(--space-6);
281 border-bottom: 1px solid var(--line);
282 background: color-mix(in srgb, var(--surface) 92%, transparent);
283 backdrop-filter: blur(14px);
284 }
285
286 .command-bar {
287 flex: 1;
288 min-width: 220px;
289 max-width: 680px;
290 display: flex;
291 align-items: center;
292 gap: var(--space-2);
293 border: 1px solid var(--line);
294 border-radius: var(--radius);
295 padding: 0 var(--space-3);
296 background: var(--surface-raised);
297 }
298
299 .command-bar input,
300 .table-search input,
301 .research-search input,
302 .field input {
303 width: 100%;
304 min-width: 0;
305 border: 0;
306 background: transparent;
307 color: var(--text);
308 outline: 0;
309 }
310
311 .command-bar input {
312 height: 42px;
313 }
314
315 .command-bar kbd {
316 border: 1px solid var(--line);
317 border-radius: 6px;
318 padding: 1px 7px;
319 color: var(--text-soft);
320 font-size: 12px;
321 }
322
323 .topbar-actions {
324 display: flex;
325 align-items: center;
326 gap: var(--space-2);
327 }
328
329 .icon-button,
330 .account-button,
331 .mobile-menu {
332 border: 1px solid var(--line);
333 border-radius: var(--radius);
334 background: var(--surface-raised);
335 color: var(--text);
336 }
337
338 .icon-button {
339 width: 40px;
340 height: 40px;
341 display: grid;
342 place-items: center;
343 }
344
345 .account-button,
346 .theme-switch {
347 height: 40px;
348 display: inline-flex;
349 align-items: center;
350 gap: var(--space-2);
351 }
352
353 .account-button {
354 padding: 0 var(--space-3);
355 }
356
357 .theme-switch {
358 border: 1px solid var(--line);
359 border-radius: var(--radius);
360 padding: 0 var(--space-2);
361 background: var(--surface-raised);
362 color: var(--text-muted);
363 }
364
365 .theme-switch select,
366 .portfolio-select select,
367 .sort-control select {
368 border: 0;
369 background: transparent;
370 color: var(--text);
371 outline: 0;
372 }
373
374 .mobile-menu,
375 .sidebar-scrim {
376 display: none;
377 }
378
379 .content {
380 width: min(100% - 48px, 1480px);
381 margin: 0 auto;
382 padding: var(--space-8) 0 56px;
383 }
384
385 .page-header {
386 display: flex;
387 align-items: flex-end;
388 justify-content: space-between;
389 gap: var(--space-6);
390 margin-bottom: var(--space-6);
391 }
392
393 .page-header h1 {
394 margin: 0;
395 font-size: 32px;
396 line-height: 1.15;
397 letter-spacing: 0;
398 }
399
400 .page-header p,
401 .panel-header p,
402 .create-panel p,
403 .empty-state p,
404 .error-state p,
405 .settings-grid p {
406 margin: var(--space-1) 0 0;
407 color: var(--text-muted);
408 }
409
410 .eyebrow {
411 margin: 0 0 var(--space-2);
412 color: var(--primary-strong);
413 font-size: 12px;
414 font-weight: 800;
415 letter-spacing: 0;
416 text-transform: uppercase;
417 }
418
419 .portfolio-select,
420 .field {
421 display: grid;
422 gap: 6px;
423 }
424
425 .portfolio-select span,
426 .field span {
427 color: var(--text-muted);
428 font-size: 12px;
429 font-weight: 700;
430 text-transform: uppercase;
431 }
432
433 .portfolio-select select,
434 .field input {
435 height: 42px;
436 border: 1px solid var(--line);
437 border-radius: var(--radius);
438 padding: 0 var(--space-3);
439 background: var(--surface-raised);
440 }
441
442 .field small {
443 color: var(--text-soft);
444 }
445
446 .button {
447 min-height: 40px;
448 display: inline-flex;
449 align-items: center;
450 justify-content: center;
451 gap: var(--space-2);
452 border: 1px solid transparent;
453 border-radius: var(--radius);
454 padding: 0 var(--space-4);
455 font-weight: 700;
456 }
457
458 .button:disabled {
459 cursor: not-allowed;
460 opacity: 0.62;
461 }
462
463 .button-primary {
464 background: var(--primary);
465 color: #ffffff;
466 }
467
468 .button-secondary {
469 border-color: var(--line);
470 background: var(--surface-raised);
471 color: var(--text);
472 }
473
474 .button-ghost {
475 background: transparent;
476 color: var(--text);
477 }
478
479 .button-danger {
480 background: var(--negative);
481 color: #ffffff;
482 }
483
484 .badge {
485 display: inline-flex;
486 align-items: center;
487 width: max-content;
488 min-height: 24px;
489 border: 1px solid var(--line);
490 border-radius: 999px;
491 padding: 2px 9px;
492 font-size: 12px;
493 font-weight: 800;
494 line-height: 1.2;
495 }
496
497 .badge-neutral {
498 color: var(--text-muted);
499 background: var(--bg-subtle);
500 }
501
502 .badge-positive {
503 color: var(--positive);
504 background: color-mix(in srgb, var(--positive) 10%, transparent);
505 }
506
507 .badge-negative {
508 color: var(--negative);
509 background: color-mix(in srgb, var(--negative) 10%, transparent);
510 }
511
512 .badge-warning {
513 color: var(--warning);
514 background: color-mix(in srgb, var(--warning) 12%, transparent);
515 }
516
517 .badge-info {
518 color: var(--info);
519 background: color-mix(in srgb, var(--info) 10%, transparent);
520 }
521
522 .card {
523 border: 1px solid var(--line);
524 border-radius: var(--radius);
525 background: var(--surface);
526 box-shadow: var(--shadow);
527 }
528
529 .metric-card {
530 min-height: 122px;
531 display: grid;
532 align-content: start;
533 gap: var(--space-2);
534 padding: var(--space-5);
535 }
536
537 .metric-label,
538 .metric-meta {
539 color: var(--text-muted);
540 }
541
542 .metric-label {
543 font-size: 13px;
544 font-weight: 700;
545 }
546
547 .metric-value {
548 font-size: 25px;
549 line-height: 1.15;
550 letter-spacing: 0;
551 }
552
553 .metric-positive,
554 .positive-text {
555 color: var(--positive);
556 }
557
558 .metric-negative,
559 .negative-text {
560 color: var(--negative);
561 }
562
563 .metric-warning {
564 color: var(--warning);
565 }
566
567 .dashboard-grid,
568 .portfolio-layout,
569 .broker-grid {
570 display: grid;
571 grid-template-columns: repeat(2, minmax(0, 1fr));
572 gap: var(--space-5);
573 }
574
575 .broker-inline-error {
576 margin-bottom: 1rem;
577 padding: .75rem 1rem;
578 border: 1px solid var(--color-warning, #b7791f);
579 border-radius: .75rem;
580 overflow-wrap: anywhere;
581 }
582
583 .broker-credential-card {
584 margin-bottom: 1rem;
585 max-width: 36rem;
586 }
587
588 .broker-credential-card label {
589 display: grid;
590 gap: .35rem;
591 margin: .75rem 0;
592 }
593
594 .broker-card-content,
595 .broker-message,
596 .broker-actions {
597 min-width: 0;
598 overflow-wrap: break-word;
599 word-break: normal;
600 }
601
602 .import-modal-backdrop {
603 position: fixed;
604 inset: 0;
605 z-index: 100;
606 display: grid;
607 place-items: center;
608 padding: var(--space-4);
609 background: rgba(8, 15, 25, .62);
610 backdrop-filter: blur(3px);
611 }
612
613 .import-modal {
614 width: min(920px, 100%);
615 max-height: min(820px, calc(100vh - 32px));
616 overflow: auto;
617 padding: var(--space-6);
618 border: 1px solid var(--line);
619 border-radius: calc(var(--radius) * 2);
620 background: var(--surface-raised);
621 box-shadow: var(--shadow);
622 }
623
624 .import-modal-header {
625 display: flex;
626 justify-content: space-between;
627 gap: var(--space-4);
628 margin-bottom: var(--space-5);
629 }
630
631 .import-modal-header span,
632 .import-section-label { color: var(--text-muted); font-size: 13px; font-weight: 700; }
633 .import-modal-header h2 { margin: 4px 0 0; font-size: 21px; }
634 .icon-button { border: 0; background: transparent; color: var(--text); cursor: pointer; }
635
636 .import-dropzone {
637 display: grid;
638 justify-items: center;
639 gap: var(--space-2);
640 padding: var(--space-8);
641 border: 1.5px dashed var(--line-strong);
642 border-radius: calc(var(--radius) * 1.5);
643 background: var(--bg-subtle);
644 color: var(--text-muted);
645 text-align: center;
646 cursor: pointer;
647 }
648 .import-dropzone strong { color: var(--text); }
649 .import-dropzone input { position: absolute; width: 1px; height: 1px; opacity: 0; }
650 .import-file { display: flex; align-items: center; gap: var(--space-2); color: var(--positive); overflow-wrap: anywhere; }
651 .import-error { padding: var(--space-3); border-left: 3px solid var(--negative); border-radius: var(--radius); background: color-mix(in srgb, var(--negative) 8%, transparent); color: var(--negative); }
652 .import-preview { display: grid; gap: var(--space-3); }
653 .import-table-frame { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--radius); }
654 .import-table { min-width: 780px; font-size: 13px; }
655 .import-table th, .import-table td { padding: 10px 12px; }
656 .success-toast { position: fixed; right: var(--space-5); bottom: var(--space-5); z-index: 110; display: flex; align-items: center; gap: var(--space-2); padding: 12px 16px; border-radius: var(--radius); background: var(--positive); color: white; box-shadow: var(--shadow); }
657 .research-refresh-notice { margin: 0 var(--space-5) var(--space-3); color: var(--text-muted); font-size: 0.875rem; }
658
659 @media (max-width: 640px) {
660 .import-modal-backdrop { padding: 0; align-items: end; }
661 .import-modal { max-height: 92vh; border-radius: calc(var(--radius) * 2) calc(var(--radius) * 2) 0 0; padding: var(--space-5); }
662 }
663
664 .metrics-grid {
665 grid-column: 1 / -1;
666 display: grid;
667 grid-template-columns: repeat(6, minmax(0, 1fr));
668 gap: var(--space-4);
669 }
670
671 .wide-panel,
672 .create-panel {
673 grid-column: 1 / -1;
674 padding: var(--space-5);
675 }
676
677 .create-panel {
678 display: grid;
679 gap: var(--space-5);
680 max-width: 720px;
681 }
682
683 .form-grid {
684 display: grid;
685 grid-template-columns: 1fr 160px;
686 gap: var(--space-4);
687 }
688
689 .panel-header {
690 display: flex;
691 align-items: flex-start;
692 justify-content: space-between;
693 gap: var(--space-4);
694 margin-bottom: var(--space-5);
695 }
696
697 .panel-header.compact {
698 align-items: center;
699 margin-bottom: var(--space-3);
700 }
701
702 .panel-header h2,
703 .allocation-group h3,
704 .empty-state h3,
705 .error-state h3,
706 .settings-grid h3 {
707 margin: 0;
708 letter-spacing: 0;
709 }
710
711 .panel-header h2 {
712 font-size: 18px;
713 }
714
715 .movement-list {
716 display: grid;
717 gap: var(--space-3);
718 }
719
720 .movement-list div {
721 display: flex;
722 justify-content: space-between;
723 gap: var(--space-3);
724 padding-top: var(--space-3);
725 border-top: 1px solid var(--line);
726 }
727
728 .allocation-grid {
729 display: grid;
730 grid-template-columns: repeat(5, minmax(180px, 1fr));
731 gap: var(--space-4);
732 overflow-x: auto;
733 padding-bottom: 2px;
734 }
735
736 .allocation-group {
737 display: grid;
738 gap: var(--space-3);
739 min-width: 0;
740 border: 1px solid var(--line);
741 border-radius: var(--radius);
742 padding: var(--space-4);
743 background: var(--bg-subtle);
744 }
745
746 .allocation-group h3 {
747 font-size: 14px;
748 }
749
750 .allocation-row {
751 display: grid;
752 gap: 6px;
753 }
754
755 .allocation-row div:first-child {
756 display: flex;
757 justify-content: space-between;
758 gap: var(--space-3);
759 color: var(--text-muted);
760 font-size: 13px;
761 }
762
763 .bar-track {
764 height: 8px;
765 overflow: hidden;
766 border-radius: 999px;
767 background: color-mix(in srgb, var(--line) 70%, transparent);
768 }
769
770 .bar-track span {
771 display: block;
772 height: 100%;
773 border-radius: inherit;
774 background: var(--primary);
775 }
776
777 .table-toolbar {
778 display: flex;
779 align-items: center;
780 justify-content: space-between;
781 gap: var(--space-4);
782 margin-bottom: var(--space-4);
783 }
784
785 .table-search,
786 .research-search,
787 .sort-control {
788 min-height: 42px;
789 display: flex;
790 align-items: center;
791 gap: var(--space-2);
792 border: 1px solid var(--line);
793 border-radius: var(--radius);
794 padding: 0 var(--space-3);
795 background: var(--surface-raised);
796 }
797
798 .table-search {
799 flex: 1;
800 max-width: 480px;
801 }
802
803 .sort-control {
804 color: var(--text-muted);
805 }
806
807 .table-frame {
808 overflow-x: auto;
809 border: 1px solid var(--line);
810 border-radius: var(--radius);
811 }
812
813 table {
814 width: 100%;
815 min-width: 1560px;
816 border-collapse: collapse;
817 }
818
819 th,
820 td {
821 padding: 13px 14px;
822 border-bottom: 1px solid var(--line);
823 text-align: left;
824 vertical-align: middle;
825 white-space: nowrap;
826 }
827
828 th {
829 background: var(--bg-subtle);
830 color: var(--text-muted);
831 font-size: 12px;
832 font-weight: 800;
833 text-transform: uppercase;
834 }
835
836 tbody tr:hover {
837 background: color-mix(in srgb, var(--primary) 5%, transparent);
838 }
839
840 tbody tr:last-child td {
841 border-bottom: 0;
842 }
843
844 tbody tr[class*="valuation-"] { cursor: pointer; }
845 tbody tr.valuation-cheap td:first-child { box-shadow: inset 4px 0 #3182f6; }
846 tbody tr.valuation-fair td:first-child { box-shadow: inset 4px 0 #2ea66f; }
847 tbody tr.valuation-expensive td:first-child { box-shadow: inset 4px 0 #d94a54; }
848 tbody tr.valuation-unknown td:first-child { box-shadow: inset 4px 0 #8993a4; }
849
850 tbody tr[class*="ownership-"] td {
851 border-top: 2px dotted var(--ownership-a);
852 border-bottom: 2px dotted var(--ownership-b, var(--ownership-a));
853 background-image: linear-gradient(90deg, transparent 0 45%, color-mix(in srgb, var(--ownership-c, var(--ownership-a)) 8%, transparent) 50%, transparent 55%);
854 background-size: 180% 100%;
855 animation: ownership-dots 8s linear infinite;
856 }
857 .ownership-promoter { --ownership-a: #2ea66f; }
858 .ownership-fii { --ownership-a: #3182f6; }
859 .ownership-dii { --ownership-a: #df68ae; }
860 .ownership-promoter-dii { --ownership-a: #2ea66f; --ownership-b: #df68ae; }
861 .ownership-promoter-fii { --ownership-a: #2ea66f; --ownership-b: #3182f6; }
862 .ownership-fii-dii { --ownership-a: #3182f6; --ownership-b: #df68ae; }
863 .ownership-promoter-fii-dii { --ownership-a: #2ea66f; --ownership-b: #3182f6; --ownership-c: #df68ae; }
864
865 @keyframes ownership-dots { to { background-position: -180% 0; } }
866
867 .research-drawer-backdrop {
868 position: fixed;
869 inset: 0;
870 z-index: 80;
871 display: flex;
872 justify-content: flex-end;
873 background: rgba(10, 18, 32, 0.55);
874 }
875
876 .research-drawer {
877 width: min(680px, 100%);
878 height: 100%;
879 overflow-y: auto;
880 padding: var(--space-6);
881 background: var(--surface);
882 box-shadow: -16px 0 48px rgba(0, 0, 0, 0.24);
883 }
884
885 .research-drawer section { padding: var(--space-4) 0; border-top: 1px solid var(--line); }
886 .research-drawer article { padding: var(--space-3) 0; }
887 .research-metric-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(145px, 1fr)); gap: var(--space-3); }
888 .research-metric { display: grid; gap: 0.2rem; padding: var(--space-3); border: 1px solid var(--line); border-radius: var(--radius); }
889 .research-metric span, .research-metric small { color: var(--text-muted); font-size: 0.75rem; }
890
891 .shareholding-table-frame { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--radius); }
892 .shareholding-table { width: 100%; min-width: 560px; border-collapse: collapse; font-variant-numeric: tabular-nums; }
893 .shareholding-table th, .shareholding-table td { padding: 0.55rem 0.65rem; border-bottom: 1px solid var(--line); white-space: nowrap; }
894 .shareholding-table thead th { background: var(--bg-subtle); color: var(--text-muted); font-size: 0.72rem; text-transform: none; text-align: right; }
895 .shareholding-table th:first-child { position: sticky; left: 0; z-index: 1; min-width: 130px; text-align: left; background: var(--surface); }
896 .shareholding-table thead th:first-child { z-index: 2; background: var(--bg-subtle); }
897 .shareholding-table td { text-align: right; }
898 .shareholding-table tbody tr:last-child th, .shareholding-table tbody tr:last-child td { border-bottom: 0; }
899 .shareholding-note, .shareholding-source { margin: var(--space-2) 0 0; color: var(--text-muted); font-size: 0.78rem; }
900
901 .security-button {
902 display: grid;
903 gap: 2px;
904 border: 0;
905 padding: 0;
906 background: transparent;
907 color: var(--text);
908 text-align: left;
909 }
910
911 .security-button span {
912 color: var(--text-muted);
913 font-size: 12px;
914 }
915
916 .market-performance-row {
917 display: grid;
918 grid-template-columns: minmax(0, 1fr) auto;
919 gap: 0.2rem var(--space-3);
920 width: 100%;
921 min-height: 88px;
922 padding: var(--space-3) var(--space-4);
923 border: 1px solid var(--line);
924 border-inline-start-width: 4px;
925 border-radius: var(--radius);
926 background: var(--surface);
927 color: var(--text);
928 text-align: left;
929 transition: background-color 120ms ease, border-color 120ms ease, box-shadow 120ms ease;
930 }
931
932 .market-performance-row-positive {
933 border-color: color-mix(in srgb, var(--positive) 55%, var(--line));
934 background: color-mix(in srgb, var(--positive) 10%, var(--surface));
935 }
936
937 .market-performance-row-negative {
938 border-color: color-mix(in srgb, var(--negative) 55%, var(--line));
939 background: color-mix(in srgb, var(--negative) 10%, var(--surface));
940 }
941
942 .market-performance-row-neutral {
943 border-color: var(--line-strong);
944 background: var(--surface);
945 }
946
947 .market-performance-row:hover {
948 border-color: var(--primary);
949 background: color-mix(in srgb, var(--primary) 9%, var(--surface));
950 box-shadow: 0 8px 22px color-mix(in srgb, var(--primary) 15%, transparent);
951 }
952
953 .market-performance-row[aria-current="true"] {
954 border-color: var(--primary);
955 box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 32%, transparent);
956 }
957
958 .market-performance-row:focus-visible {
959 outline: 3px solid color-mix(in srgb, var(--focus) 45%, transparent);
960 outline-offset: 3px;
961 }
962
963 .market-performance-identity {
964 color: var(--text-muted);
965 font-size: 12px;
966 }
967
968 .market-performance-return {
969 grid-column: 2;
970 grid-row: 1 / span 2;
971 align-self: center;
972 font-weight: 750;
973 font-variant-numeric: tabular-nums;
974 }
975
976 .market-performance-row-positive .market-performance-return { color: var(--positive); }
977 .market-performance-row-negative .market-performance-return { color: var(--negative); }
978 .market-performance-row-neutral .market-performance-return { color: var(--text-muted); }
979
980 .broker-card {
981 display: grid;
982 grid-template-columns: 52px minmax(0, 1fr);
983 gap: var(--space-4);
984 padding: var(--space-5);
985 }
986
987 .broker-icon {
988 width: 48px;
989 height: 48px;
990 display: grid;
991 place-items: center;
992 border: 1px solid var(--line);
993 border-radius: var(--radius);
994 background: var(--bg-subtle);
995 color: var(--primary-strong);
996 }
997
998 .broker-card-content {
999 min-width: 0;
1000 }
1001
1002 .broker-card .panel-header {
1003 flex-wrap: wrap;
1004 justify-content: flex-start;
1005 }
1006
1007 .broker-card .panel-header h2 {
1008 margin-right: auto;
1009 }
1010
1011 .broker-card .badge,
1012 .broker-actions .button {
1013 white-space: nowrap;
1014 overflow-wrap: normal;
1015 word-break: normal;
1016 }
1017
1018 .broker-message,
1019 .broker-linked-portfolio {
1020 color: var(--text-muted);
1021 line-height: 1.5;
1022 }
1023
1024 .broker-actions {
1025 display: flex;
1026 flex-wrap: wrap;
1027 gap: var(--space-3);
1028 margin-top: var(--space-4);
1029 }
1030
1031 .broker-facts {
1032 display: grid;
1033 gap: var(--space-3);
1034 margin: 0 0 var(--space-5);
1035 }
1036
1037 .broker-facts div {
1038 display: flex;
1039 justify-content: space-between;
1040 gap: var(--space-3);
1041 border-top: 1px solid var(--line);
1042 padding-top: var(--space-3);
1043 }
1044
1045 .broker-facts dt {
1046 color: var(--text-muted);
1047 }
1048
1049 .broker-facts dd {
1050 margin: 0;
1051 font-weight: 700;
1052 overflow-wrap: anywhere;
1053 text-align: right;
1054 }
1055
1056 .broker-note {
1057 color: var(--warning);
1058 font-size: 0.88rem;
1059 font-weight: 650;
1060 margin: 0 0 var(--space-4);
1061 }
1062
1063 .research-search {
1064 max-width: 680px;
1065 margin-bottom: var(--space-5);
1066 }
1067
1068 .research-layout {
1069 display: grid;
1070 gap: var(--space-4);
1071 }
1072
1073 .research-sticky-panel {
1074 position: sticky;
1075 top: 88px;
1076 z-index: 10;
1077 }
1078
1079 .research-actions,
1080 .research-controls {
1081 display: flex;
1082 align-items: center;
1083 gap: var(--space-3);
1084 flex-wrap: wrap;
1085 }
1086
1087 .research-controls {
1088 justify-content: space-between;
1089 }
1090
1091 .research-controls .sort-control {
1092 flex: 1;
1093 min-width: 220px;
1094 }
1095
1096 .research-controls .research-company-control {
1097 flex: 2;
1098 min-width: min(100%, 380px);
1099 min-height: 56px;
1100 display: grid;
1101 grid-template-columns: auto auto minmax(220px, 1fr);
1102 grid-template-rows: auto auto;
1103 column-gap: var(--space-2);
1104 align-content: center;
1105 }
1106
1107 .research-company-control > svg {
1108 grid-row: 1 / 3;
1109 }
1110
1111 .research-company-select {
1112 min-width: 0;
1113 max-width: 100%;
1114 overflow: hidden;
1115 text-overflow: ellipsis;
1116 white-space: nowrap;
1117 font-weight: 700;
1118 }
1119
1120 .research-company-select option {
1121 background: var(--research-option-bg);
1122 color: var(--research-option-text);
1123 font-weight: 600;
1124 }
1125
1126 .research-company-select option:hover,
1127 .research-company-select option:checked {
1128 background: var(--research-option-hover);
1129 color: var(--research-option-text);
1130 font-weight: 700;
1131 }
1132
1133 .research-company-select:focus-visible {
1134 outline: 3px solid color-mix(in srgb, var(--focus) 40%, transparent);
1135 outline-offset: 3px;
1136 }
1137
1138 .research-company-meta {
1139 grid-column: 3;
1140 color: var(--text-muted);
1141 overflow: hidden;
1142 text-overflow: ellipsis;
1143 white-space: nowrap;
1144 font-size: 12px;
1145 }
1146
1147 .research-layout .metrics-grid {
1148 gap: var(--space-3);
1149 }
1150
1151 .research-layout .metric-card {
1152 min-height: 88px;
1153 padding: var(--space-4);
1154 }
1155
1156 .research-layout .metric-value {
1157 font-size: 21px;
1158 }
1159
1160 .research-accordion {
1161 display: grid;
1162 gap: var(--space-2);
1163 }
1164
1165 .research-accordion-item,
1166 .research-event-row {
1167 overflow: hidden;
1168 border: 1px solid var(--line);
1169 border-radius: var(--radius);
1170 background: var(--surface-raised);
1171 }
1172
1173 .research-accordion-item h3,
1174 .research-event-row h4 {
1175 margin: 0;
1176 }
1177
1178 .research-accordion-button,
1179 .research-event-row-button {
1180 width: 100%;
1181 min-height: 48px;
1182 display: grid;
1183 grid-template-columns: minmax(0, 1fr) auto auto;
1184 align-items: center;
1185 gap: var(--space-3);
1186 border: 0;
1187 padding: 0 var(--space-4);
1188 background: transparent;
1189 color: var(--text);
1190 text-align: left;
1191 }
1192
1193 .research-accordion-button:hover,
1194 .research-event-row-button:hover {
1195 background: color-mix(in srgb, var(--primary) 5%, transparent);
1196 }
1197
1198 .research-section-meta,
1199 .research-event-row-button > span:last-of-type {
1200 color: var(--text-muted);
1201 font-size: 13px;
1202 font-weight: 800;
1203 white-space: nowrap;
1204 }
1205
1206 .accordion-chevron {
1207 color: var(--text-muted);
1208 transition: transform 160ms ease;
1209 }
1210
1211 .research-accordion-button[aria-expanded="true"] .accordion-chevron,
1212 .research-event-row-button[aria-expanded="true"] .accordion-chevron {
1213 transform: rotate(180deg);
1214 }
1215
1216 .research-accordion-panel {
1217 border-top: 1px solid var(--line);
1218 padding: var(--space-4);
1219 background: var(--surface);
1220 }
1221
1222 .research-overview-grid,
1223 .research-detail-list,
1224 .research-event-rows {
1225 display: grid;
1226 gap: var(--space-3);
1227 }
1228
1229 .research-overview-grid {
1230 grid-template-columns: repeat(5, minmax(140px, 1fr));
1231 }
1232
1233 .research-summary-note {
1234 grid-column: 1 / -1;
1235 display: flex;
1236 justify-content: space-between;
1237 gap: var(--space-3);
1238 border: 1px solid var(--line);
1239 border-radius: var(--radius);
1240 padding: var(--space-3) var(--space-4);
1241 background: var(--bg-subtle);
1242 color: var(--text-muted);
1243 }
1244
1245 .research-summary-note strong {
1246 color: var(--text);
1247 }
1248
1249 .research-event-row-button > span:first-child {
1250 min-width: 0;
1251 display: flex;
1252 align-items: center;
1253 gap: var(--space-3);
1254 }
1255
1256 .research-event-row-button strong {
1257 overflow: hidden;
1258 text-overflow: ellipsis;
1259 white-space: nowrap;
1260 }
1261
1262 .score-grid {
1263 display: grid;
1264 grid-template-columns: repeat(5, minmax(160px, 1fr));
1265 gap: var(--space-4);
1266 }
1267
1268 .score-row {
1269 display: grid;
1270 gap: var(--space-2);
1271 border: 1px solid var(--line);
1272 border-radius: var(--radius);
1273 padding: var(--space-4);
1274 background: var(--bg-subtle);
1275 }
1276
1277 .score-row span {
1278 color: var(--text-muted);
1279 font-size: 13px;
1280 }
1281
1282 .score-row strong {
1283 font-size: 24px;
1284 }
1285
1286 .score-row.compact {
1287 padding: var(--space-3);
1288 }
1289
1290 .score-row.compact strong {
1291 font-size: 20px;
1292 }
1293
1294 .research-event-detail {
1295 display: grid;
1296 gap: var(--space-3);
1297 padding: var(--space-4);
1298 }
1299
1300 .research-event-detail h4 {
1301 margin: var(--space-2) 0 0;
1302 font-size: 16px;
1303 }
1304
1305 .research-event-detail p,
1306 .research-event-detail blockquote {
1307 margin: 0;
1308 color: var(--text-muted);
1309 }
1310
1311 .research-event-detail blockquote {
1312 border-left: 3px solid var(--line-strong);
1313 padding-left: var(--space-3);
1314 font-size: 13px;
1315 }
1316
1317 .event-value-line {
1318 display: flex;
1319 align-items: baseline;
1320 justify-content: space-between;
1321 gap: var(--space-3);
1322 border-top: 1px solid var(--line);
1323 padding-top: var(--space-3);
1324 }
1325
1326 .event-value-line strong {
1327 font-size: 20px;
1328 }
1329
1330 .event-value-line span {
1331 color: var(--text-muted);
1332 }
1333
1334 .event-facts {
1335 display: grid;
1336 grid-template-columns: repeat(5, minmax(0, 1fr));
1337 gap: var(--space-3);
1338 margin: 0;
1339 }
1340
1341 .event-facts div {
1342 border: 1px solid var(--line);
1343 border-radius: var(--radius);
1344 padding: var(--space-3);
1345 background: var(--bg-subtle);
1346 }
1347
1348 .event-facts dt {
1349 color: var(--text-muted);
1350 font-size: 12px;
1351 font-weight: 800;
1352 text-transform: uppercase;
1353 }
1354
1355 .event-facts dd {
1356 margin: 4px 0 0;
1357 font-weight: 700;
1358 }
1359
1360 .source-link,
1361 .source-list a {
1362 color: var(--primary-strong);
1363 font-weight: 800;
1364 text-decoration: none;
1365 }
1366
1367 .supporting-sources {
1368 display: grid;
1369 gap: var(--space-2);
1370 }
1371
1372 .supporting-sources .source-link {
1373 display: grid;
1374 gap: 2px;
1375 border: 1px solid var(--line);
1376 border-radius: var(--radius);
1377 padding: var(--space-3);
1378 background: var(--bg-subtle);
1379 overflow-wrap: anywhere;
1380 }
1381
1382 .supporting-sources small {
1383 color: var(--text-soft);
1384 font-weight: 600;
1385 }
1386
1387 .source-list {
1388 display: grid;
1389 gap: var(--space-3);
1390 }
1391
1392 .source-list a {
1393 display: grid;
1394 gap: 3px;
1395 border: 1px solid var(--line);
1396 border-radius: var(--radius);
1397 padding: var(--space-4);
1398 background: var(--bg-subtle);
1399 }
1400
1401 .source-list span {
1402 color: var(--text-muted);
1403 font-weight: 500;
1404 }
1405
1406 .source-list small {
1407 color: var(--text-soft);
1408 font-weight: 600;
1409 overflow-wrap: anywhere;
1410 }
1411
1412 .range-control {
1413 display: flex;
1414 flex-wrap: wrap;
1415 gap: var(--space-1);
1416 }
1417
1418 .range-control button {
1419 min-width: 42px;
1420 border: 1px solid var(--line);
1421 border-radius: 6px;
1422 background: var(--bg-panel);
1423 color: var(--text-muted);
1424 font-weight: 800;
1425 padding: 7px 9px;
1426 cursor: pointer;
1427 }
1428
1429 .range-control button:hover,
1430 .range-control .range-active {
1431 border-color: var(--primary);
1432 color: var(--primary-strong);
1433 background: var(--bg-subtle);
1434 }
1435
1436 .history-metrics {
1437 display: grid;
1438 grid-template-columns: repeat(4, minmax(140px, 1fr));
1439 gap: var(--space-3);
1440 margin: var(--space-4) 0;
1441 }
1442
1443 .history-chart {
1444 width: 100%;
1445 overflow: hidden;
1446 border: 1px solid var(--line);
1447 border-radius: var(--radius);
1448 background: var(--bg-subtle);
1449 }
1450
1451 .history-chart svg {
1452 display: block;
1453 width: 100%;
1454 min-height: 260px;
1455 }
1456
1457 .history-chart line {
1458 stroke: var(--line-strong);
1459 }
1460
1461 .history-chart text {
1462 fill: var(--text-muted);
1463 font-size: 12px;
1464 font-weight: 700;
1465 }
1466
1467 .history-chart path {
1468 fill: none;
1469 stroke-width: 3;
1470 stroke-linecap: round;
1471 stroke-linejoin: round;
1472 }
1473
1474 .history-chart .market-line {
1475 stroke: var(--primary);
1476 }
1477
1478 .history-chart .invested-line {
1479 stroke: var(--warning);
1480 stroke-dasharray: 8 6;
1481 }
1482
1483 .history-chart .market-point {
1484 fill: var(--primary);
1485 stroke: var(--bg-panel);
1486 stroke-width: 2;
1487 }
1488
1489 .history-note {
1490 margin: var(--space-3) 0 0;
1491 color: var(--text-muted);
1492 font-size: 13px;
1493 font-weight: 700;
1494 }
1495
1496 .portfolio-research-table {
1497 display: grid;
1498 gap: var(--space-2);
1499 margin-top: var(--space-4);
1500 max-height: 70vh;
1501 overflow: auto;
1502 }
1503
1504 .portfolio-research-row {
1505 display: grid;
1506 grid-template-columns: minmax(190px, 1.5fr) repeat(6, minmax(105px, 1fr)) minmax(180px, 1.2fr);
1507 gap: var(--space-3);
1508 align-items: center;
1509 padding: var(--space-3);
1510 border: 1px solid var(--line);
1511 border-radius: var(--radius);
1512 background: var(--bg-panel);
1513 color: var(--text);
1514 text-align: left;
1515 }
1516
1517 .portfolio-research-head {
1518 position: sticky;
1519 top: 0;
1520 z-index: 2;
1521 background: var(--bg-subtle);
1522 color: var(--text-muted);
1523 font-size: 12px;
1524 font-weight: 800;
1525 text-transform: uppercase;
1526 }
1527
1528 .portfolio-research-company {
1529 width: 100%;
1530 cursor: pointer;
1531 }
1532
1533 .portfolio-research-company:hover {
1534 border-color: var(--primary);
1535 }
1536
1537 .market-intelligence-research-row-positive {
1538 border-color: color-mix(in srgb, var(--positive) 55%, var(--line));
1539 background: color-mix(in srgb, var(--positive) 10%, var(--bg-panel));
1540 }
1541
1542 .market-intelligence-research-row-negative {
1543 border-color: color-mix(in srgb, var(--negative) 55%, var(--line));
1544 background: color-mix(in srgb, var(--negative) 10%, var(--bg-panel));
1545 }
1546
1547 .market-intelligence-research-row-neutral {
1548 border-color: var(--line-strong);
1549 background: var(--bg-panel);
1550 }
1551
1552 .market-intelligence-research-row:hover {
1553 border-color: var(--primary);
1554 background: color-mix(in srgb, var(--primary) 9%, var(--bg-panel));
1555 }
1556
1557 .market-intelligence-research-row[aria-current="true"] {
1558 border-color: var(--primary);
1559 box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 32%, transparent);
1560 }
1561
1562 .market-intelligence-table-return {
1563 margin-top: var(--space-2);
1564 font-variant-numeric: tabular-nums;
1565 }
1566
1567 .market-intelligence-table-return.neutral-text {
1568 color: var(--text-muted);
1569 }
1570
1571 .research-status-dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; margin-left: 4px; }
1572 .research-status-positive { background: #2ea66f; }.research-status-warning { background: #d99527; }.research-status-info { background: #3182f6; }.research-status-negative { background: #d94a54; }.research-status-neutral { background: #8993a4; }
1573
1574 .readiness-popup-backdrop {
1575 position: fixed;
1576 inset: 0;
1577 z-index: 1000;
1578 display: grid;
1579 place-items: center;
1580 padding: var(--space-4);
1581 overflow: hidden;
1582 background: rgb(8 15 25 / 68%);
1583 backdrop-filter: blur(3px);
1584 }
1585
1586 .readiness-popup {
1587 width: min(960px, 100%);
1588 max-height: min(920px, calc(100vh - 2 * var(--space-4)));
1589 max-height: min(920px, calc(100dvh - 2 * var(--space-4)));
1590 display: grid;
1591 grid-template-rows: auto minmax(0, 1fr);
1592 overflow: hidden;
1593 border: 1px solid var(--line);
1594 border-radius: calc(var(--radius) + 4px);
1595 background: var(--surface-raised);
1596 color: var(--text);
1597 box-shadow: 0 24px 70px rgb(0 0 0 / 38%);
1598 isolation: isolate;
1599 }
1600
1601 .readiness-popup-header,
1602 .readiness-requirement-heading,
1603 .readiness-actions {
1604 display: flex;
1605 align-items: center;
1606 justify-content: space-between;
1607 gap: var(--space-3);
1608 }
1609
1610 .readiness-popup-header {
1611 min-width: 0;
1612 padding: var(--space-4) var(--space-5);
1613 border-bottom: 1px solid var(--line);
1614 background: var(--surface-raised);
1615 }
1616
1617 .readiness-popup-header > div {
1618 min-width: 0;
1619 }
1620
1621 .readiness-popup-header h2 {
1622 margin: 0;
1623 overflow-wrap: anywhere;
1624 }
1625
1626 .readiness-popup-header .icon-button {
1627 flex: 0 0 auto;
1628 }
1629
1630 .readiness-popup-body {
1631 min-height: 0;
1632 overflow-y: auto;
1633 overscroll-behavior: contain;
1634 padding: var(--space-5);
1635 scrollbar-gutter: stable;
1636 }
1637
1638 .readiness-summary {
1639 display: grid;
1640 grid-template-columns: repeat(4, minmax(130px, 1fr));
1641 gap: var(--space-3);
1642 margin: var(--space-4) 0;
1643 }
1644
1645 .readiness-summary > div {
1646 min-width: 0;
1647 display: grid;
1648 gap: .25rem;
1649 padding: var(--space-3);
1650 border: 1px solid var(--line);
1651 border-radius: var(--radius);
1652 background: var(--surface);
1653 }
1654
1655 .readiness-summary strong {
1656 overflow-wrap: anywhere;
1657 }
1658
1659 .readiness-summary span,
1660 .readiness-requirement small,
1661 .readiness-requirement p {
1662 color: var(--text-muted);
1663 }
1664
1665 .readiness-requirements {
1666 display: grid;
1667 gap: var(--space-3);
1668 margin-top: var(--space-4);
1669 }
1670
1671 .readiness-requirement {
1672 min-width: 0;
1673 padding: var(--space-4);
1674 border: 1px solid var(--line);
1675 border-left-width: 5px;
1676 border-radius: var(--radius);
1677 background: var(--surface);
1678 }
1679
1680 .readiness-requirement-ready { border-left-color: #2ea66f; }
1681 .readiness-requirement-warning { border-left-color: #d99527; }
1682 .readiness-requirement-danger { border-left-color: #d94a54; }
1683 .readiness-requirement-neutral { border-left-color: #8993a4; }
1684
1685 .readiness-requirement-heading > div {
1686 display: grid;
1687 gap: .2rem;
1688 }
1689
1690 .readiness-status {
1691 flex: 0 0 auto;
1692 padding: .25rem .55rem;
1693 border-radius: 999px;
1694 font-size: .72rem;
1695 font-weight: 700;
1696 line-height: 1.35;
1697 text-align: center;
1698 white-space: nowrap;
1699 }
1700
1701 .readiness-status-ready { color: #16764c; background: rgb(46 166 111 / 15%); }
1702 .readiness-status-warning { color: #9a5d08; background: rgb(217 149 39 / 16%); }
1703 .readiness-status-danger { color: #ad2632; background: rgb(217 74 84 / 14%); }
1704 .readiness-status-neutral { color: var(--text-muted); background: var(--bg-subtle); }
1705
1706 .readiness-primary-actions {
1707 display: flex;
1708 align-items: center;
1709 flex-wrap: wrap;
1710 gap: var(--space-3);
1711 margin: var(--space-4) 0;
1712 padding: var(--space-3) 0;
1713 border-block: 1px solid var(--line);
1714 }
1715
1716 .readiness-actions {
1717 justify-content: flex-start;
1718 flex-wrap: wrap;
1719 margin-top: var(--space-3);
1720 }
1721
1722 .readiness-reason,
1723 .readiness-popup-error { color: var(--negative); }
1724 .readiness-refresh-state { color: var(--text-muted); }
1725
1726 .readiness-analysis-actions {
1727 display: flex;
1728 align-items: center;
1729 gap: var(--space-3);
1730 margin: 0;
1731 }
1732
1733 .rule-engine-result {
1734 margin-top: var(--space-4);
1735 padding: var(--space-4);
1736 border: 1px solid var(--line);
1737 border-left: 5px solid #8993a4;
1738 border-radius: var(--radius);
1739 background: color-mix(in srgb, var(--surface-raised) 92%, var(--bg-subtle));
1740 }
1741
1742 .rule-engine-result-ready { border-left-color: #2ea66f; }
1743 .rule-engine-result-danger { border-left-color: #d94a54; }
1744
1745 .rule-engine-result > header {
1746 display: flex;
1747 align-items: center;
1748 justify-content: space-between;
1749 gap: var(--space-3);
1750 }
1751
1752 .rule-engine-score-grid {
1753 display: grid;
1754 grid-template-columns: repeat(4, minmax(120px, 1fr));
1755 gap: var(--space-3);
1756 margin: var(--space-3) 0;
1757 }
1758
1759 .rule-engine-score-grid > div {
1760 display: grid;
1761 gap: .2rem;
1762 padding: var(--space-3);
1763 border: 1px solid var(--line);
1764 border-radius: var(--radius);
1765 }
1766
1767 .rule-engine-score-grid span,
1768 .rule-engine-meta,
1769 .rule-engine-area-detail p {
1770 color: var(--text-muted);
1771 }
1772
1773 .rule-engine-overrides {
1774 margin: var(--space-3) 0;
1775 padding: var(--space-3);
1776 border: 1px solid rgb(217 74 84 / 45%);
1777 border-radius: var(--radius);
1778 color: var(--negative);
1779 background: rgb(217 74 84 / 8%);
1780 }
1781
1782 .rule-engine-area-table {
1783 display: grid;
1784 gap: .35rem;
1785 margin-top: var(--space-3);
1786 }
1787
1788 .rule-engine-area-row > summary,
1789 .rule-engine-area-header {
1790 display: grid;
1791 grid-template-columns: minmax(220px, 2fr) repeat(4, minmax(88px, 1fr));
1792 gap: var(--space-2);
1793 align-items: center;
1794 padding: var(--space-2) var(--space-3);
1795 }
1796
1797 .rule-engine-area-row > summary {
1798 cursor: pointer;
1799 border: 1px solid var(--line);
1800 border-radius: var(--radius);
1801 font-variant-numeric: tabular-nums;
1802 }
1803
1804 .rule-engine-area-header {
1805 color: var(--text-muted);
1806 font-size: .78rem;
1807 font-weight: 700;
1808 text-transform: uppercase;
1809 }
1810
1811 .rule-engine-area-detail {
1812 padding: var(--space-3);
1813 border: 1px solid var(--line);
1814 border-top: 0;
1815 border-radius: 0 0 var(--radius) var(--radius);
1816 }
1817
1818 .rule-engine-metrics {
1819 display: grid;
1820 gap: var(--space-2);
1821 }
1822
1823 .rule-engine-metrics article {
1824 padding: var(--space-2);
1825 border-left: 3px solid var(--line-strong);
1826 }
1827
1828 @media (max-width: 720px) {
1829 .readiness-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1830 .rule-engine-score-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1831 .rule-engine-area-header { display: none; }
1832 .rule-engine-area-row > summary { grid-template-columns: minmax(150px, 2fr) repeat(2, 1fr); }
1833 .rule-engine-area-row > summary span:nth-child(4),
1834 .rule-engine-area-row > summary span:nth-child(5) { display: none; }
1835 .readiness-popup-backdrop { padding: var(--space-2); }
1836 .readiness-popup {
1837 max-height: calc(100vh - 2 * var(--space-2));
1838 max-height: calc(100dvh - 2 * var(--space-2));
1839 }
1840 .readiness-popup-header,
1841 .readiness-popup-body { padding: var(--space-4); }
1842 .readiness-requirement-heading { align-items: flex-start; }
1843 }
1844
1845 .portfolio-research-row strong,
1846 .portfolio-research-row small {
1847 display: block;
1848 }
1849
1850 .portfolio-research-row small {
1851 color: var(--text-soft);
1852 margin-top: 3px;
1853 }
1854
1855 .settings-grid {
1856 display: grid;
1857 grid-template-columns: repeat(2, minmax(0, 1fr));
1858 gap: var(--space-4);
1859 }
1860
1861 .settings-grid div {
1862 border: 1px solid var(--line);
1863 border-radius: var(--radius);
1864 padding: var(--space-4);
1865 background: var(--bg-subtle);
1866 }
1867
1868 .empty-state,
1869 .error-state {
1870 display: grid;
1871 gap: var(--space-3);
1872 place-items: start;
1873 border: 1px dashed var(--line-strong);
1874 border-radius: var(--radius);
1875 padding: var(--space-6);
1876 background: var(--surface);
1877 }
1878
1879 .error-state {
1880 margin-bottom: var(--space-5);
1881 border-color: color-mix(in srgb, var(--negative) 45%, var(--line));
1882 }
1883
1884 .error-state small {
1885 color: var(--text-muted);
1886 }
1887
1888 .loading-grid {
1889 display: grid;
1890 gap: var(--space-4);
1891 }
1892
1893 .skeleton-stack {
1894 display: grid;
1895 gap: var(--space-3);
1896 border: 1px solid var(--line);
1897 border-radius: var(--radius);
1898 padding: var(--space-5);
1899 background: var(--surface);
1900 }
1901
1902 .skeleton-line {
1903 height: 18px;
1904 border-radius: 999px;
1905 background: linear-gradient(90deg, var(--bg-subtle), var(--line), var(--bg-subtle));
1906 background-size: 200% 100%;
1907 animation: skeleton-pulse 1.4s ease-in-out infinite;
1908 }
1909
1910 .skeleton-line:nth-child(2n) {
1911 width: 76%;
1912 }
1913
1914 .skeleton-line:nth-child(3n) {
1915 width: 54%;
1916 }
1917
1918 @keyframes skeleton-pulse {
1919 0% {
1920 background-position: 100% 0;
1921 }
1922 100% {
1923 background-position: -100% 0;
1924 }
1925 }
1926
1927 @media (prefers-reduced-motion: reduce) {
1928 .skeleton-line {
1929 animation: none;
1930 }
1931 tbody tr[class*="ownership-"] td { animation: none; }
1932 .portfolio-research-company[class*="ownership-"] { animation: none; }
1933 }
1934
1935 @media (max-width: 1180px) {
1936 .metrics-grid {
1937 grid-template-columns: repeat(3, minmax(0, 1fr));
1938 }
1939
1940 .dashboard-grid,
1941 .broker-grid {
1942 grid-template-columns: 1fr;
1943 }
1944
1945 .score-grid {
1946 grid-template-columns: repeat(2, minmax(0, 1fr));
1947 }
1948
1949 .research-overview-grid {
1950 grid-template-columns: repeat(3, minmax(0, 1fr));
1951 }
1952
1953 .event-facts {
1954 grid-template-columns: repeat(3, minmax(0, 1fr));
1955 }
1956 }
1957
1958 @media (max-width: 860px) {
1959 .app-shell {
1960 grid-template-columns: 1fr;
1961 }
1962
1963 .sidebar {
1964 position: fixed;
1965 z-index: 40;
1966 left: 0;
1967 transform: translateX(-100%);
1968 width: min(82vw, 300px);
1969 transition: transform 160ms ease;
1970 }
1971
1972 .sidebar-open {
1973 transform: translateX(0);
1974 }
1975
1976 .mobile-menu {
1977 display: inline-flex;
1978 width: 40px;
1979 height: 40px;
1980 align-items: center;
1981 justify-content: center;
1982 }
1983
1984 .sidebar-scrim {
1985 position: fixed;
1986 z-index: 35;
1987 inset: 0;
1988 display: flex;
1989 justify-content: flex-end;
1990 padding: var(--space-5);
1991 border: 0;
1992 background: rgba(15, 23, 42, 0.52);
1993 color: #ffffff;
1994 }
1995
1996 .topbar {
1997 padding: 0 var(--space-4);
1998 }
1999
2000 .topbar-actions .badge,
2001 .command-bar kbd {
2002 display: none;
2003 }
2004
2005 .content {
2006 width: min(100% - 32px, 1480px);
2007 padding-top: var(--space-6);
2008 }
2009
2010 .page-header,
2011 .table-toolbar {
2012 align-items: stretch;
2013 flex-direction: column;
2014 }
2015
2016 .portfolio-select,
2017 .table-search {
2018 max-width: none;
2019 }
2020
2021 .metrics-grid {
2022 grid-template-columns: repeat(2, minmax(0, 1fr));
2023 }
2024
2025 .form-grid,
2026 .settings-grid,
2027 .event-facts {
2028 grid-template-columns: 1fr;
2029 }
2030
2031 .research-sticky-panel {
2032 position: static;
2033 }
2034
2035 .research-overview-grid {
2036 grid-template-columns: repeat(2, minmax(0, 1fr));
2037 }
2038
2039 .portfolio-research-row {
2040 grid-template-columns: 1fr 1fr;
2041 }
2042
2043 .portfolio-research-head {
2044 display: none;
2045 }
2046
2047 .research-summary-note,
2048 .research-event-row-button > span:first-child {
2049 align-items: flex-start;
2050 flex-direction: column;
2051 }
2052 }
2053
2054 @media (max-width: 620px) {
2055 .topbar {
2056 flex-wrap: wrap;
2057 min-height: 112px;
2058 align-content: center;
2059 }
2060
2061 .command-bar {
2062 order: 3;
2063 flex-basis: 100%;
2064 max-width: none;
2065 }
2066
2067 .topbar-actions {
2068 margin-left: auto;
2069 }
2070
2071 .theme-switch {
2072 display: none;
2073 }
2074
2075 .page-header h1 {
2076 font-size: 26px;
2077 }
2078
2079 .metrics-grid {
2080 grid-template-columns: 1fr;
2081 }
2082
2083 .metric-card {
2084 min-height: 104px;
2085 }
2086
2087 .panel-header {
2088 flex-direction: column;
2089 }
2090
2091 .score-grid {
2092 grid-template-columns: 1fr;
2093 }
2094
2095 .research-overview-grid,
2096 .research-accordion-button,
2097 .research-event-row-button {
2098 grid-template-columns: 1fr auto;
2099 }
2100
2101 .research-accordion-button > span:first-child,
2102 .research-event-row-button > span:first-child {
2103 grid-column: 1;
2104 }
2105
2106 .research-accordion-button .accordion-chevron,
2107 .research-event-row-button .accordion-chevron {
2108 grid-column: 2;
2109 grid-row: 1;
2110 justify-self: end;
2111 }
2112
2113 .research-section-meta,
2114 .research-event-row-button > span:last-of-type {
2115 grid-column: 1 / -1;
2116 grid-row: 2;
2117 }
2118 }
2119 .portfolio-tabs {
2120 display: flex;
2121 gap: 0.5rem;
2122 overflow-x: auto;
2123 padding-bottom: 0.75rem;
2124 }
2125
2126 .portfolio-tabs button {
2127 border: 1px solid var(--line);
2128 background: var(--surface);
2129 color: var(--text-muted);
2130 border-radius: 999px;
2131 padding: 0.55rem 0.9rem;
2132 white-space: nowrap;
2133 cursor: pointer;
2134 }
2135
2136 .portfolio-tabs button.active {
2137 color: var(--text);
2138 border-color: var(--primary);
2139 background: var(--bg-subtle);
2140 }
2141
2142 .currency-total-grid,
2143 .portfolio-card-grid {
2144 display: grid;
2145 grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
2146 gap: 1rem;
2147 }
2148
2149 .portfolio-card-grid {
2150 grid-column: 1 / -1;
2151 }
2152
2153 .holding-name-editor {
2154 display: flex;
2155 flex-wrap: wrap;
2156 align-items: end;
2157 gap: 0.45rem;
2158 min-width: 280px;
2159 }
2160
2161 .holding-name-editor label {
2162 display: grid;
2163 gap: 0.25rem;
2164 color: var(--text-muted);
2165 font-size: 0.75rem;
2166 }
2167
2168 .holding-name-editor input {
2169 min-width: 220px;
2170 }
2171
2172 .holding-name-editor small {
2173 flex-basis: 100%;
2174 color: var(--negative);
2175 }
2176
2177 .text-action {
2178 border: 0;
2179 background: transparent;
2180 color: var(--primary);
2181 cursor: pointer;
2182 padding: 0.25rem 0;
2183 }
2184
2185 @media (max-width: 640px) {
2186 .currency-total-grid,
2187 .portfolio-card-grid {
2188 grid-template-columns: 1fr;
2189 }
2190 }
2191 .ownership-increase { border-left: 4px solid var(--border); padding-left: .75rem; }
2192 .ownership-promoter { border-left-color: #22c55e; }
2193 .ownership-fii_fpi { border-left-color: #3b82f6; }
2194 .ownership-dii { border-left-color: #ec4899; }
2195
2196 /* Research discovery is independent of the saved-list/company controls. */
2197 .research-discovery { display: grid; gap: 20px; }
2198 .research-search-control { position: relative; display: grid; width: 100%; gap: 12px; }
2199 .research-region-control { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
2200 .research-region-control button { padding: 10px 18px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-raised); color: inherit; cursor: pointer; }
2201 .research-region-control button.active { outline: 2px solid var(--primary); }
2202 .research-search-input { width: 100%; min-height: 52px; padding: 14px 16px; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-raised); color: inherit; font: inherit; }
2203 .research-search-listbox { top: 100%; left: 0; right: 0; margin: 4px 0 0; padding: 6px; list-style: none; }
2204 .research-search-listbox li { display: grid; gap: 4px; padding: 12px; border-radius: 6px; cursor: pointer; background: var(--research-option-bg); color: var(--research-option-text); }
2205 .research-search-listbox li strong { color: inherit; }
2206 .research-search-listbox li small { color: var(--research-option-muted); }
2207 .research-search-listbox li:hover { background: var(--research-option-hover); color: var(--research-option-text); }
2208 .research-search-listbox li.highlighted,
2209 .research-search-listbox li[aria-selected="true"],
2210 .research-search-listbox li:focus-visible { background: var(--research-option-hover); color: var(--research-option-text); outline: 2px solid var(--primary-strong); outline-offset: -2px; }
2211 .research-search-listbox li.selected { background: var(--research-option-bg); color: var(--research-option-text); outline: 2px solid var(--primary); }
2212
2213 .research-saved-lists { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; padding: 16px 20px; }
2214 .research-saved-lists h3 { margin: 0; }
2215 .research-saved-lists .research-context-select { margin-left: auto; }
2216 /* Persisted global recommendations */
2217 .opportunity-radar { padding: 24px; margin-bottom: 24px; border: 1px solid var(--border, #657080); border-radius: 16px; }
2218 .opportunity-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; }
2219 .opportunity-card { padding: 18px; border: 1px solid var(--border, #657080); border-radius: 12px; }
2220 .opportunity-card dl { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
2221 .opportunity-card dd { margin: 0; }
2222 .opportunity-card p, .opportunity-card li { overflow-wrap: anywhere; }
2223 .opportunity-radar table { width: 100%; text-align: left; border-spacing: 12px; }