orbcafe-ui 3.0.0 → 3.1.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.
package/dist/orbis.css CHANGED
@@ -8,6 +8,37 @@
8
8
  font-display: block;
9
9
  }
10
10
 
11
+ /* Montserrat is the ORBIS Latin face. Weights match the shipped cuts;
12
+ 400 is not a file, so UI text uses 500 instead of synthesizing it. */
13
+ @font-face {
14
+ font-family: "Montserrat";
15
+ src: url("./themes/orbis/fonts/montserrat-300.otf") format("opentype");
16
+ font-weight: 300;
17
+ font-style: normal;
18
+ font-display: swap;
19
+ }
20
+ @font-face {
21
+ font-family: "Montserrat";
22
+ src: url("./themes/orbis/fonts/montserrat-500.otf") format("opentype");
23
+ font-weight: 500;
24
+ font-style: normal;
25
+ font-display: swap;
26
+ }
27
+ @font-face {
28
+ font-family: "Montserrat";
29
+ src: url("./themes/orbis/fonts/montserrat-600.otf") format("opentype");
30
+ font-weight: 600;
31
+ font-style: normal;
32
+ font-display: swap;
33
+ }
34
+ @font-face {
35
+ font-family: "Montserrat";
36
+ src: url("./themes/orbis/fonts/montserrat-700.otf") format("opentype");
37
+ font-weight: 700;
38
+ font-style: normal;
39
+ font-display: swap;
40
+ }
41
+
11
42
  /* ==========================================================================
12
43
  ORBCAFE × ORBIS — orbis.css
13
44
  Adapted from the official ORBIS design handoff (orbis-reference.css).
@@ -28,6 +59,8 @@
28
59
  --orb-font: var(--orb-font-brand), system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
29
60
  --orb-r: 10px;
30
61
  --orb-r-container: var(--orb-r);
62
+ /* Panel shell matches the composer. InputArea draws the same radius. */
63
+ --orb-shell-radius: 24px;
31
64
  --orb-t-fast: 0.2s ease;
32
65
 
33
66
  /* ---------- light tokens (default) ---------- */
@@ -1695,6 +1728,136 @@ select.orb-inp {
1695
1728
  .orb-legend { display: flex; flex-wrap: wrap; gap: 14px; font: 500 12px/1 var(--orb-font); color: var(--orb-muted); }
1696
1729
  .orb-legend i { width: 10px; height: 10px; border-radius: 3px; display: inline-block; margin-right: 6px; }
1697
1730
 
1731
+ /* ---------- metric chart cards ---------- */
1732
+ .orb-metric-chart-shell { position: relative; min-width: 0; height: 100%; }
1733
+ .orb-metric-chart-card {
1734
+ display: flex;
1735
+ min-width: 0;
1736
+ min-height: 258px;
1737
+ flex-direction: column;
1738
+ padding: 16px;
1739
+ border: 1px solid var(--orb-border);
1740
+ border-radius: var(--orb-r-container);
1741
+ background: var(--orb-surface);
1742
+ color: var(--orb-fg);
1743
+ box-sizing: border-box;
1744
+ }
1745
+ .orb-metric-chart-header {
1746
+ display: flex;
1747
+ min-width: 0;
1748
+ align-items: flex-start;
1749
+ justify-content: space-between;
1750
+ gap: 12px;
1751
+ margin-bottom: 14px;
1752
+ }
1753
+ .orb-metric-chart-heading { min-width: 0; flex: 1 1 auto; }
1754
+ .orb-metric-chart-heading .orb-subtitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1755
+ .orb-metric-chart-select { flex: 0 0 auto; width: auto !important; min-width: 108px; }
1756
+ .orb-metric-chart-select .orb-select-trigger { min-height: 30px; padding: 0 9px; font-size: 11px; }
1757
+ .orb-metric-chart-body { min-width: 0; flex: 1 1 auto; display: flex; flex-direction: column; justify-content: center; }
1758
+ .orb-metric-chart-footer { border-top: 1px solid var(--orb-border); margin-top: 12px; padding-top: 10px; }
1759
+ .orb-metric-bars, .orb-metric-progress, .orb-metric-list { display: flex; flex-direction: column; gap: 10px; }
1760
+ .orb-metric-bar-row, .orb-metric-progress-row, .orb-metric-list-row {
1761
+ display: grid;
1762
+ width: 100%;
1763
+ min-width: 0;
1764
+ align-items: center;
1765
+ border: 0;
1766
+ background: transparent;
1767
+ color: var(--orb-fg);
1768
+ font: inherit;
1769
+ text-align: left;
1770
+ }
1771
+ .orb-metric-bar-row { grid-template-columns: minmax(76px, 0.8fr) minmax(60px, 1.6fr) auto; gap: 9px; padding: 2px 0; }
1772
+ .orb-metric-bar-row.is-active, .orb-metric-progress-row.is-active, .orb-metric-list-row.is-active { color: var(--orb-primary); }
1773
+ button.orb-metric-bar-row, button.orb-metric-progress-row, button.orb-metric-list-row { cursor: pointer; border-radius: 7px; padding: 5px 6px; margin: -3px -6px; }
1774
+ button.orb-metric-bar-row:hover, button.orb-metric-progress-row:hover, button.orb-metric-list-row:hover { background: var(--orb-hover); }
1775
+ .orb-metric-bar-label, .orb-metric-list-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 500 12px/1.3 var(--orb-font); }
1776
+ .orb-metric-bar-track { display: block; min-width: 0; height: 8px; overflow: hidden; border-radius: 999px; background: var(--orb-track); }
1777
+ .orb-metric-bar-fill { display: block; height: 100%; min-width: 2px; border-radius: inherit; transition: width 220ms ease, background-color 180ms ease; }
1778
+ .orb-metric-bar-fill.is-active { filter: brightness(0.8); }
1779
+ .orb-metric-bar-value, .orb-metric-list-value, .orb-metric-list-secondary { min-width: 46px; font: 500 12px/1.3 var(--orb-font); font-variant-numeric: tabular-nums; text-align: right; }
1780
+ .orb-metric-progress-row { gap: 5px; }
1781
+ .orb-metric-progress-heading { display: flex; min-width: 0; justify-content: space-between; gap: 12px; font: 500 12px/1.3 var(--orb-font); }
1782
+ .orb-metric-progress-heading > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1783
+ .orb-metric-progress-heading strong { flex: 0 0 auto; font-weight: 600; font-variant-numeric: tabular-nums; }
1784
+ .orb-metric-list-row { grid-template-columns: minmax(0, 1fr) auto auto; gap: 12px; padding: 7px 0; border-bottom: 1px solid var(--orb-border); }
1785
+ .orb-metric-list-row:last-child { border-bottom: 0; }
1786
+ .orb-metric-list-secondary { color: var(--orb-muted); }
1787
+ .orb-metric-kpi { display: flex; min-height: 150px; flex-direction: column; justify-content: center; gap: 5px; }
1788
+ .orb-metric-kpi-label { color: var(--orb-muted); font: 500 12px/1.3 var(--orb-font); }
1789
+ .orb-metric-kpi strong { color: var(--orb-fg-strong); font: 600 42px/1.05 var(--orb-font); font-variant-numeric: tabular-nums; letter-spacing: -0.03em; }
1790
+ .orb-metric-kpi-secondary { color: var(--orb-muted); font: 500 12px/1.3 var(--orb-font); }
1791
+ .orb-metric-svg-wrap { min-width: 0; overflow: hidden; }
1792
+ .orb-metric-svg { display: block; width: 100%; min-width: 300px; height: 192px; overflow: visible; }
1793
+ .orb-metric-axis, .orb-metric-grid { stroke: var(--orb-chart-grid); stroke-width: 1; }
1794
+ .orb-metric-line { stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }
1795
+ .orb-metric-point, .orb-metric-column, .orb-metric-slice { transition: opacity 160ms ease, filter 160ms ease, transform 160ms ease; }
1796
+ .orb-metric-point.is-active, .orb-metric-column.is-active, .orb-metric-slice.is-active { filter: brightness(0.78); }
1797
+ .orb-metric-svg-label, .orb-metric-axis-label { fill: var(--orb-chart-text); font: 500 10px/1 var(--orb-font); }
1798
+ .orb-metric-axis-label { font-variant-numeric: tabular-nums; }
1799
+ .orb-metric-circular { display: grid; min-width: 0; grid-template-columns: minmax(130px, 0.9fr) minmax(120px, 1.1fr); align-items: center; gap: 12px; }
1800
+ .orb-metric-donut { display: block; width: 156px; max-width: 100%; height: 156px; margin: 0 auto; overflow: visible; }
1801
+ .orb-metric-donut-total { fill: var(--orb-fg-strong); font: 600 16px/1 var(--orb-font); font-variant-numeric: tabular-nums; }
1802
+ .orb-metric-legend { display: flex; min-width: 0; max-height: 156px; flex-direction: column; gap: 7px; overflow: auto; }
1803
+ .orb-metric-legend-item { display: grid; min-width: 0; grid-template-columns: 9px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 2px 4px; border: 0; border-radius: 5px; background: transparent; color: var(--orb-fg); font: 500 11px/1.25 var(--orb-font); text-align: left; }
1804
+ .orb-metric-legend-item:not(:disabled) { cursor: pointer; }
1805
+ .orb-metric-legend-item:not(:disabled):hover, .orb-metric-legend-item.is-active { background: var(--orb-hover); color: var(--orb-primary); }
1806
+ .orb-metric-legend-dot { width: 8px; height: 8px; border-radius: 50%; }
1807
+ .orb-metric-legend-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1808
+ .orb-metric-legend-item strong { font-variant-numeric: tabular-nums; font-weight: 600; }
1809
+ .orb-metric-empty { display: flex; min-height: 150px; flex-direction: column; align-items: center; justify-content: center; gap: 6px; text-align: center; }
1810
+ .orb-metric-empty-mark { display: inline-flex; width: 28px; height: 28px; align-items: center; justify-content: center; border: 1px solid var(--orb-border); border-radius: 50%; color: var(--orb-muted); font-size: 17px; }
1811
+ .orb-metric-error { display: flex; min-height: 150px; align-items: center; justify-content: center; border-radius: var(--orb-r); background: var(--orb-err-bg); color: var(--orb-err); font: 500 12px/1.4 var(--orb-font); text-align: center; padding: 10px; }
1812
+ .orb-metric-loading { display: flex; min-height: 150px; flex-direction: column; justify-content: center; gap: 13px; }
1813
+ .orb-metric-skeleton { display: block; width: 72%; height: 10px; border-radius: 999px; background: var(--orb-track); animation: orb-metric-pulse 1.3s ease-in-out infinite; }
1814
+ .orb-metric-skeleton-wide { width: 94%; }
1815
+ .orb-metric-skeleton-short { width: 48%; }
1816
+ .orb-metric-more { align-self: flex-end; margin-top: 10px; padding: 0; border: 0; background: transparent; color: var(--orb-link); cursor: pointer; font: 500 12px/1.3 var(--orb-font); }
1817
+ .orb-metric-more:hover { text-decoration: underline; }
1818
+ .orb-metric-context-menu {
1819
+ position: absolute;
1820
+ z-index: 30;
1821
+ min-width: 148px;
1822
+ padding: 7px;
1823
+ border: 1px solid var(--orb-border);
1824
+ border-radius: 8px;
1825
+ background: var(--orb-canvas);
1826
+ box-shadow: var(--orb-shadow-2);
1827
+ }
1828
+ .orb-metric-context-label { max-width: 220px; overflow: hidden; padding: 3px 7px 6px; color: var(--orb-muted); font: 500 11px/1.25 var(--orb-font); text-overflow: ellipsis; white-space: nowrap; }
1829
+ .orb-metric-context-menu button { display: block; width: 100%; padding: 7px; border: 0; border-radius: 5px; background: transparent; color: var(--orb-fg); cursor: pointer; font: 500 12px/1.2 var(--orb-font); text-align: left; }
1830
+ .orb-metric-context-menu button:hover, .orb-metric-context-menu button:focus-visible { background: var(--orb-hover); color: var(--orb-primary); outline: none; }
1831
+ .orb-metric-data-details {
1832
+ position: absolute;
1833
+ right: 10px;
1834
+ bottom: 10px;
1835
+ z-index: 25;
1836
+ min-width: 190px;
1837
+ max-width: calc(100% - 20px);
1838
+ padding: 10px 11px;
1839
+ border: 1px solid var(--orb-border);
1840
+ border-radius: 9px;
1841
+ background: color-mix(in srgb, var(--orb-canvas) 96%, transparent);
1842
+ box-shadow: var(--orb-shadow-2);
1843
+ backdrop-filter: blur(10px);
1844
+ }
1845
+ .orb-metric-data-details-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 7px; color: var(--orb-fg-strong); font: 600 12px/1.25 var(--orb-font); }
1846
+ .orb-metric-data-details-header strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1847
+ .orb-metric-data-details-header button { width: 20px; height: 20px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--orb-muted); cursor: pointer; font: 500 16px/1 var(--orb-font); }
1848
+ .orb-metric-data-details-header button:hover, .orb-metric-data-details-header button:focus-visible { background: var(--orb-hover); color: var(--orb-fg); outline: none; }
1849
+ .orb-metric-data-details-row { display: flex; align-items: baseline; justify-content: space-between; gap: 18px; padding: 4px 0; color: var(--orb-muted); font: 500 11px/1.3 var(--orb-font); }
1850
+ .orb-metric-data-details-row strong { color: var(--orb-fg-strong); font-variant-numeric: tabular-nums; }
1851
+ .orb-metric-data-details-hint { display: block; margin-top: 6px; color: var(--orb-muted); font: 400 10px/1.3 var(--orb-font); }
1852
+ @keyframes orb-metric-pulse { 0%, 100% { opacity: .55; } 50% { opacity: 1; } }
1853
+ @media (max-width: 520px) {
1854
+ .orb-metric-chart-card { padding: 13px; }
1855
+ .orb-metric-chart-header { gap: 8px; }
1856
+ .orb-metric-circular { grid-template-columns: 1fr; }
1857
+ .orb-metric-legend { max-height: 96px; }
1858
+ .orb-metric-donut { width: 136px; height: 136px; }
1859
+ }
1860
+
1698
1861
  /* ---------- login / auth (per login reference) ---------- */
1699
1862
  .orb-auth-frame {
1700
1863
  display: grid;
@@ -2444,3 +2607,1135 @@ button.orb-app-header-locale:hover,
2444
2607
  white-space: nowrap;
2445
2608
  border: 0;
2446
2609
  }
2610
+
2611
+ /* ---------- OMPHPanel ---------- */
2612
+ /* ORBIS tokens only. Working state is motion: pulse, spinner, shimmer. */
2613
+ .orb-omph-panel {
2614
+ --orb-omph-column: 800px;
2615
+ --orb-omph-process-max: 240px;
2616
+ --orb-omph-text: 14px;
2617
+ --orb-omph-text-lh: 1.6;
2618
+ position: relative;
2619
+ isolation: isolate;
2620
+ display: flex;
2621
+ flex-direction: column;
2622
+ height: 100%;
2623
+ width: 100%;
2624
+ min-height: 0;
2625
+ overflow: hidden;
2626
+ border: 1px solid var(--orb-border);
2627
+ border-radius: var(--orb-shell-radius);
2628
+ background: var(--orb-canvas);
2629
+ box-shadow: var(--orb-shadow-1);
2630
+ color: var(--orb-fg);
2631
+ font-family: var(--orb-font);
2632
+ font-synthesis: none;
2633
+ }
2634
+
2635
+ .orb-agent-input {
2636
+ border-radius: var(--orb-shell-radius);
2637
+ }
2638
+
2639
+ .orb-omph-header {
2640
+ display: flex;
2641
+ align-items: center;
2642
+ gap: 10px;
2643
+ flex: none;
2644
+ padding: 12px 14px;
2645
+ border-bottom: 1px solid var(--orb-border);
2646
+ background: var(--orb-canvas);
2647
+ }
2648
+
2649
+ .orb-omph-avatar {
2650
+ display: inline-flex;
2651
+ align-items: center;
2652
+ justify-content: center;
2653
+ flex: none;
2654
+ width: 32px;
2655
+ height: 32px;
2656
+ border-radius: 50%;
2657
+ background: var(--orb-primary);
2658
+ color: var(--orb-on-primary);
2659
+ font: 600 12px/1 var(--orb-font);
2660
+ }
2661
+
2662
+ .orb-omph-title {
2663
+ font: 600 14px/1.2 var(--orb-font);
2664
+ color: var(--orb-fg);
2665
+ }
2666
+
2667
+ .orb-omph-subtitle {
2668
+ display: flex;
2669
+ align-items: center;
2670
+ gap: 6px;
2671
+ margin-top: 2px;
2672
+ min-width: 0;
2673
+ font: 500 11px/1.3 var(--orb-font);
2674
+ color: var(--orb-muted);
2675
+ }
2676
+
2677
+ .orb-omph-dot {
2678
+ flex: none;
2679
+ width: 7px;
2680
+ height: 7px;
2681
+ border-radius: 50%;
2682
+ background: var(--orb-primary);
2683
+ }
2684
+
2685
+ .orb-omph-dot[data-active="true"] {
2686
+ animation: orb-agent-pls 1.6s ease infinite;
2687
+ }
2688
+
2689
+ .orb-omph-stage {
2690
+ position: relative;
2691
+ flex: 1;
2692
+ min-height: 0;
2693
+ }
2694
+
2695
+ .orb-omph-scroll {
2696
+ height: 100%;
2697
+ overflow: auto;
2698
+ padding: 16px 28px 20px;
2699
+ scrollbar-width: thin;
2700
+ scrollbar-color: color-mix(in oklch, var(--orb-fg) 36%, var(--orb-canvas)) var(--orb-canvas);
2701
+ }
2702
+
2703
+ .orb-omph-scroll::-webkit-scrollbar {
2704
+ width: 10px;
2705
+ height: 10px;
2706
+ }
2707
+
2708
+ .orb-omph-scroll::-webkit-scrollbar-track {
2709
+ background: var(--orb-canvas);
2710
+ }
2711
+
2712
+ .orb-omph-scroll::-webkit-scrollbar-thumb {
2713
+ background: color-mix(in oklch, var(--orb-fg) 36%, var(--orb-canvas));
2714
+ border: 2px solid var(--orb-canvas);
2715
+ border-radius: var(--orb-shell-radius);
2716
+ }
2717
+
2718
+ .orb-omph-scroll::-webkit-scrollbar-corner {
2719
+ background: var(--orb-canvas);
2720
+ }
2721
+
2722
+ .orb-omph-stage[data-rail="true"] .orb-omph-scroll {
2723
+ padding-left: 36px;
2724
+ }
2725
+
2726
+ .orb-omph-column {
2727
+ width: min(100%, var(--orb-omph-column));
2728
+ margin-inline: auto;
2729
+ display: flex;
2730
+ flex-direction: column;
2731
+ gap: 16px;
2732
+ }
2733
+
2734
+ .orb-omph-turn {
2735
+ --orb-omph-turn-gap: 12px;
2736
+ --orb-omph-actions-gap: 6px;
2737
+ display: flex;
2738
+ flex-direction: column;
2739
+ gap: var(--orb-omph-turn-gap);
2740
+ }
2741
+
2742
+ .orb-omph-user {
2743
+ display: flex;
2744
+ flex-direction: column;
2745
+ align-items: flex-end;
2746
+ gap: 6px;
2747
+ }
2748
+
2749
+ .orb-omph-user-bubble {
2750
+ max-width: 80%;
2751
+ padding: 10px 14px;
2752
+ border: 1px solid var(--orb-p100);
2753
+ border-radius: var(--orb-r);
2754
+ background: var(--orb-p50);
2755
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
2756
+ white-space: pre-wrap;
2757
+ }
2758
+
2759
+ .orb-omph-clock {
2760
+ font: 500 11px/1.3 var(--orb-font);
2761
+ color: var(--orb-muted);
2762
+ }
2763
+
2764
+ .orb-omph-process-list {
2765
+ display: flex;
2766
+ flex-direction: column;
2767
+ gap: 6px;
2768
+ }
2769
+
2770
+ .orb-omph-process-toggle {
2771
+ display: flex;
2772
+ align-items: center;
2773
+ gap: 6px;
2774
+ width: 100%;
2775
+ min-width: 0;
2776
+ padding: 2px 0;
2777
+ border: 0;
2778
+ background: transparent;
2779
+ color: var(--orb-muted);
2780
+ font: 500 var(--orb-omph-text)/1.4 var(--orb-font);
2781
+ text-align: left;
2782
+ cursor: pointer;
2783
+ }
2784
+
2785
+ .orb-omph-process-toggle:hover {
2786
+ color: var(--orb-fg);
2787
+ }
2788
+
2789
+ .orb-omph-process[data-status="error"] .orb-omph-process-toggle {
2790
+ color: var(--orb-err);
2791
+ }
2792
+
2793
+ .orb-omph-process-chevron {
2794
+ transition: transform var(--orb-t-fast);
2795
+ }
2796
+
2797
+ .orb-omph-process[data-open="true"] .orb-omph-process-chevron {
2798
+ transform: rotate(180deg);
2799
+ }
2800
+
2801
+ .orb-omph-process-summary {
2802
+ min-width: 0;
2803
+ overflow: hidden;
2804
+ text-overflow: ellipsis;
2805
+ white-space: nowrap;
2806
+ font-weight: 500;
2807
+ }
2808
+
2809
+ .orb-omph-process-body {
2810
+ max-height: var(--orb-omph-process-max);
2811
+ margin: 8px 0 4px 22px;
2812
+ padding: 12px 16px;
2813
+ overflow: auto;
2814
+ border: 1px solid var(--orb-border);
2815
+ border-radius: var(--orb-r);
2816
+ background: var(--orb-surface);
2817
+ color: var(--orb-fg);
2818
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
2819
+ white-space: pre-wrap;
2820
+ }
2821
+
2822
+ .orb-omph-process-body[data-overflow="true"] {
2823
+ mask-image: linear-gradient(to bottom, transparent, #000 12px, #000 calc(100% - 12px), transparent);
2824
+ }
2825
+
2826
+ .orb-omph-assistant,
2827
+ .orb-omph-assistant .markdown-body {
2828
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
2829
+ }
2830
+
2831
+ .orb-omph-caret {
2832
+ display: inline-block;
2833
+ width: 2px;
2834
+ height: 13px;
2835
+ margin-left: 2px;
2836
+ vertical-align: -2px;
2837
+ background: var(--orb-primary);
2838
+ animation: orb-agent-blk 1s steps(1) infinite;
2839
+ }
2840
+
2841
+ .orb-omph-failure {
2842
+ padding: 8px 12px;
2843
+ border-left: 3px solid var(--orb-warn);
2844
+ background: var(--orb-warn-bg);
2845
+ color: var(--orb-fg);
2846
+ font: 500 var(--orb-omph-text)/1.45 var(--orb-font);
2847
+ }
2848
+
2849
+ .orb-omph-failure[data-severity="error"] {
2850
+ border-left-color: var(--orb-err);
2851
+ background: var(--orb-err-bg);
2852
+ }
2853
+
2854
+ /* Reply action bar: time on the left, Usage after a hairline, copy on the right,
2855
+ all on one quiet tinted surface. */
2856
+ .orb-omph-turn-actions {
2857
+ display: flex;
2858
+ flex-wrap: wrap;
2859
+ align-items: center;
2860
+ gap: 0 6px;
2861
+ padding: 4px 6px 4px 14px;
2862
+ border-radius: var(--orb-r);
2863
+ background: var(--orb-surface);
2864
+ /* Pull the bar up out of the turn's flex gap so it sits just under the reply. */
2865
+ margin-top: calc(var(--orb-omph-actions-gap) - var(--orb-omph-turn-gap));
2866
+ opacity: 0;
2867
+ transition: opacity 160ms ease;
2868
+ }
2869
+
2870
+ .orb-omph-actions-time {
2871
+ color: var(--orb-muted);
2872
+ font: 500 11px/1 var(--orb-font);
2873
+ font-variant-numeric: tabular-nums;
2874
+ letter-spacing: 0.02em;
2875
+ }
2876
+
2877
+ .orb-omph-actions-divider {
2878
+ width: 1px;
2879
+ height: 14px;
2880
+ margin: 0 6px;
2881
+ background: var(--orb-border);
2882
+ }
2883
+
2884
+ .orb-omph-actions-end {
2885
+ margin-left: auto;
2886
+ }
2887
+
2888
+ /* On the tinted bar a hovered control lifts to the canvas colour instead of darkening. */
2889
+ .orb-omph-turn-actions .orb-omph-icon-button:hover,
2890
+ .orb-omph-turn-actions .orb-omph-text-button:hover,
2891
+ .orb-omph-turn-actions .orb-omph-text-button[aria-expanded="true"] {
2892
+ background: var(--orb-canvas);
2893
+ }
2894
+
2895
+ .orb-omph-turn[data-actions-reveal="always"] .orb-omph-turn-actions,
2896
+ .orb-omph-turn:hover .orb-omph-turn-actions,
2897
+ .orb-omph-turn:focus-within .orb-omph-turn-actions {
2898
+ opacity: 1;
2899
+ }
2900
+
2901
+ @media (hover: none) {
2902
+ .orb-omph-turn-actions {
2903
+ opacity: 1;
2904
+ }
2905
+ }
2906
+
2907
+ .orb-omph-older,
2908
+ .orb-omph-to-bottom {
2909
+ border: 1px solid var(--orb-border);
2910
+ background: var(--orb-canvas);
2911
+ color: var(--orb-muted);
2912
+ cursor: pointer;
2913
+ }
2914
+
2915
+ /* Turn action buttons are borderless; hover is a quiet tint, not an outline. */
2916
+ .orb-omph-icon-button,
2917
+ .orb-omph-text-button {
2918
+ display: inline-flex;
2919
+ align-items: center;
2920
+ justify-content: center;
2921
+ min-height: 28px;
2922
+ border: 0;
2923
+ border-radius: var(--orb-r);
2924
+ background: transparent;
2925
+ color: var(--orb-muted);
2926
+ cursor: pointer;
2927
+ }
2928
+
2929
+ .orb-omph-icon-button:hover,
2930
+ .orb-omph-text-button:hover,
2931
+ .orb-omph-text-button[aria-expanded="true"] {
2932
+ background: var(--orb-hover);
2933
+ color: var(--orb-primary);
2934
+ }
2935
+
2936
+ .orb-omph-icon-button:focus-visible,
2937
+ .orb-omph-text-button:focus-visible {
2938
+ outline: 2px solid var(--orb-focus-solid);
2939
+ outline-offset: 1px;
2940
+ }
2941
+
2942
+ .orb-omph-icon-button {
2943
+ width: 28px;
2944
+ padding: 0;
2945
+ }
2946
+
2947
+ .orb-omph-text-button,
2948
+ .orb-omph-older {
2949
+ padding: 4px 10px;
2950
+ font: 500 12px/1.3 var(--orb-font);
2951
+ }
2952
+
2953
+ .orb-omph-older:hover,
2954
+ .orb-omph-to-bottom:hover {
2955
+ color: var(--orb-primary);
2956
+ border-color: var(--orb-primary);
2957
+ }
2958
+
2959
+ .orb-omph-usage {
2960
+ display: flex;
2961
+ flex: 1 0 100%;
2962
+ flex-wrap: wrap;
2963
+ gap: 4px 16px;
2964
+ margin-top: 2px;
2965
+ padding: 8px 0 6px;
2966
+ border-top: 1px solid var(--orb-border);
2967
+ color: var(--orb-muted);
2968
+ font: 500 12px/1.4 var(--orb-font);
2969
+ }
2970
+
2971
+ .orb-omph-running {
2972
+ display: flex;
2973
+ flex-direction: column;
2974
+ gap: 8px;
2975
+ padding-top: 4px;
2976
+ }
2977
+
2978
+ .orb-omph-running-rule {
2979
+ height: 1px;
2980
+ background: var(--orb-border);
2981
+ }
2982
+
2983
+ .orb-omph-running-body {
2984
+ display: flex;
2985
+ align-items: center;
2986
+ gap: 8px;
2987
+ color: var(--orb-primary);
2988
+ font: 500 13px/1.4 var(--orb-font);
2989
+ }
2990
+
2991
+ .orb-omph-spinner {
2992
+ width: 12px;
2993
+ height: 12px;
2994
+ flex: none;
2995
+ border-radius: 50%;
2996
+ border: 2px solid var(--orb-p100);
2997
+ border-top-color: var(--orb-primary);
2998
+ animation: orb-rot 1s linear infinite;
2999
+ display: inline-block;
3000
+ }
3001
+
3002
+ .orb-omph-shimmer {
3003
+ background-image: linear-gradient(90deg, var(--orb-muted) 0%, var(--orb-primary) 45%, var(--orb-muted) 90%);
3004
+ background-size: 200% 100%;
3005
+ background-clip: text;
3006
+ -webkit-background-clip: text;
3007
+ color: transparent;
3008
+ animation: orb-omph-shimmer 1.6s linear infinite;
3009
+ }
3010
+
3011
+ @keyframes orb-omph-shimmer {
3012
+ from { background-position: 100% 0; }
3013
+ to { background-position: -100% 0; }
3014
+ }
3015
+
3016
+ .orb-omph-rail {
3017
+ position: absolute;
3018
+ top: 12px;
3019
+ left: 10px;
3020
+ bottom: 12px;
3021
+ display: flex;
3022
+ flex-direction: column;
3023
+ align-items: center;
3024
+ gap: 10px;
3025
+ width: 16px;
3026
+ overflow: auto;
3027
+ }
3028
+
3029
+ .orb-omph-rail-mark {
3030
+ flex: none;
3031
+ width: 8px;
3032
+ height: 8px;
3033
+ padding: 0;
3034
+ border: 1px solid var(--orb-border);
3035
+ border-radius: 50%;
3036
+ background: var(--orb-canvas);
3037
+ cursor: pointer;
3038
+ }
3039
+
3040
+ .orb-omph-rail-mark[data-active="true"] {
3041
+ border-color: var(--orb-primary);
3042
+ background: var(--orb-primary);
3043
+ }
3044
+
3045
+ .orb-omph-to-bottom {
3046
+ position: absolute;
3047
+ left: 50%;
3048
+ bottom: 12px;
3049
+ display: inline-flex;
3050
+ align-items: center;
3051
+ justify-content: center;
3052
+ width: 32px;
3053
+ height: 32px;
3054
+ border-radius: 50%;
3055
+ transform: translateX(-50%);
3056
+ box-shadow: var(--orb-shadow-1);
3057
+ }
3058
+
3059
+ .orb-omph-older {
3060
+ align-self: center;
3061
+ border-radius: 999px;
3062
+ background: transparent;
3063
+ }
3064
+
3065
+ .orb-omph-older:disabled {
3066
+ cursor: default;
3067
+ opacity: 0.6;
3068
+ }
3069
+
3070
+ .orb-omph-composer {
3071
+ display: flex;
3072
+ align-items: flex-end;
3073
+ gap: 8px;
3074
+ flex: none;
3075
+ padding: 12px 16px 16px;
3076
+ border-top: 1px solid var(--orb-border);
3077
+ background: var(--orb-canvas);
3078
+ }
3079
+
3080
+ .orb-omph-input {
3081
+ flex: 1;
3082
+ min-height: 44px;
3083
+ max-height: 12em;
3084
+ padding: 10px 12px;
3085
+ resize: none;
3086
+ border: 1px solid var(--orb-border);
3087
+ border-radius: var(--orb-r);
3088
+ outline: none;
3089
+ background: var(--orb-canvas);
3090
+ color: var(--orb-fg);
3091
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
3092
+ }
3093
+
3094
+ .orb-omph-input:focus {
3095
+ border-color: var(--orb-primary);
3096
+ box-shadow: 0 0 0 1px var(--orb-focus-ring);
3097
+ }
3098
+
3099
+ .orb-omph-send,
3100
+ .orb-omph-stop {
3101
+ display: inline-flex;
3102
+ align-items: center;
3103
+ justify-content: center;
3104
+ flex: none;
3105
+ width: 36px;
3106
+ height: 36px;
3107
+ border: 0;
3108
+ border-radius: 50%;
3109
+ color: var(--orb-on-primary);
3110
+ cursor: pointer;
3111
+ }
3112
+
3113
+ .orb-omph-send {
3114
+ background: var(--orb-primary);
3115
+ }
3116
+
3117
+ .orb-omph-send:disabled {
3118
+ cursor: not-allowed;
3119
+ opacity: 0.4;
3120
+ background: var(--orb-disabled-bg);
3121
+ color: var(--orb-disabled-fg);
3122
+ }
3123
+
3124
+ .orb-omph-stop {
3125
+ background: var(--orb-err);
3126
+ }
3127
+
3128
+ @media (prefers-reduced-motion: reduce) {
3129
+ .orb-omph-dot[data-active="true"],
3130
+ .orb-omph-caret,
3131
+ .orb-omph-shimmer,
3132
+ .orb-omph-spinner {
3133
+ animation: none;
3134
+ }
3135
+
3136
+ .orb-omph-shimmer {
3137
+ color: var(--orb-primary);
3138
+ background: none;
3139
+ }
3140
+ }
3141
+
3142
+ /* ---------- OMPHPanel · file preview ---------- */
3143
+ /* Large container: the pane is a grid column that reveals from the right edge.
3144
+ Small container: the pane covers the whole body and fades in. Tokens only. */
3145
+ .orb-omph-panel {
3146
+ --orb-omph-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
3147
+ --orb-omph-ease: cubic-bezier(0.2, 0.8, 0.2, 1);
3148
+ --orb-omph-pv-w: 0px;
3149
+ --orb-omph-pv-pref: 420px;
3150
+ }
3151
+
3152
+ .orb-omph-main {
3153
+ position: relative;
3154
+ flex: 1;
3155
+ min-height: 0;
3156
+ display: grid;
3157
+ grid-template-columns: minmax(0, 1fr) var(--orb-omph-pv-w);
3158
+ transition: grid-template-columns 320ms var(--orb-omph-ease);
3159
+ }
3160
+
3161
+ .orb-omph-main[data-dragging] {
3162
+ transition: none;
3163
+ user-select: none;
3164
+ }
3165
+
3166
+ .orb-omph-center {
3167
+ display: flex;
3168
+ flex-direction: column;
3169
+ min-width: 0;
3170
+ min-height: 0;
3171
+ }
3172
+
3173
+ .orb-omph-preview {
3174
+ position: relative;
3175
+ min-width: 0;
3176
+ min-height: 0;
3177
+ overflow: hidden;
3178
+ border-left: 1px solid var(--orb-border);
3179
+ background: var(--orb-canvas);
3180
+ outline: none;
3181
+ visibility: hidden;
3182
+ transition: visibility 0s linear 320ms;
3183
+ }
3184
+
3185
+ .orb-omph-preview[data-open] {
3186
+ visibility: visible;
3187
+ transition-delay: 0s;
3188
+ }
3189
+
3190
+ /* The inner box keeps its width while the column animates, so content is revealed, not reflowed. */
3191
+ .orb-omph-pv {
3192
+ position: absolute;
3193
+ top: 0;
3194
+ right: 0;
3195
+ bottom: 0;
3196
+ width: var(--orb-omph-pv-pref);
3197
+ display: flex;
3198
+ flex-direction: column;
3199
+ background: var(--orb-canvas);
3200
+ }
3201
+
3202
+ .orb-omph-preview[data-placement="overlay"] {
3203
+ position: absolute;
3204
+ inset: 0;
3205
+ z-index: 6;
3206
+ border-left: 0;
3207
+ opacity: 0;
3208
+ transform: translateX(24px);
3209
+ transition: opacity 220ms ease, transform 320ms var(--orb-omph-ease), visibility 0s linear 320ms;
3210
+ }
3211
+
3212
+ .orb-omph-preview[data-placement="overlay"][data-open] {
3213
+ opacity: 1;
3214
+ transform: none;
3215
+ transition-delay: 0s;
3216
+ }
3217
+
3218
+ .orb-omph-preview[data-placement="overlay"] .orb-omph-pv {
3219
+ inset: 0;
3220
+ width: 100%;
3221
+ }
3222
+
3223
+ .orb-omph-pv-grip {
3224
+ position: absolute;
3225
+ z-index: 2;
3226
+ top: 0;
3227
+ bottom: 0;
3228
+ left: 0;
3229
+ width: 8px;
3230
+ cursor: col-resize;
3231
+ touch-action: none;
3232
+ outline: none;
3233
+ }
3234
+
3235
+ .orb-omph-pv-grip::after {
3236
+ content: "";
3237
+ position: absolute;
3238
+ top: 0;
3239
+ bottom: 0;
3240
+ left: 0;
3241
+ width: 2px;
3242
+ background: transparent;
3243
+ transition: background var(--orb-t-fast);
3244
+ }
3245
+
3246
+ .orb-omph-pv-grip:hover::after,
3247
+ .orb-omph-pv-grip:focus-visible::after,
3248
+ .orb-omph-main[data-dragging] .orb-omph-pv-grip::after {
3249
+ background: var(--orb-primary);
3250
+ }
3251
+
3252
+ .orb-omph-pv-head {
3253
+ display: flex;
3254
+ align-items: center;
3255
+ gap: 12px;
3256
+ flex: none;
3257
+ min-height: 64px;
3258
+ padding: 12px 12px 12px 20px;
3259
+ }
3260
+
3261
+ .orb-omph-preview[data-placement="overlay"] .orb-omph-pv-head {
3262
+ gap: 8px;
3263
+ padding-left: 8px;
3264
+ }
3265
+
3266
+ .orb-omph-pv-glyph {
3267
+ display: inline-flex;
3268
+ align-items: center;
3269
+ justify-content: center;
3270
+ flex: none;
3271
+ width: 36px;
3272
+ height: 36px;
3273
+ border-radius: var(--orb-r);
3274
+ background: var(--orb-p50);
3275
+ color: var(--orb-primary);
3276
+ }
3277
+
3278
+ .orb-omph-pv-titles {
3279
+ flex: 1;
3280
+ min-width: 0;
3281
+ }
3282
+
3283
+ .orb-omph-pv-name {
3284
+ overflow: hidden;
3285
+ text-overflow: ellipsis;
3286
+ white-space: nowrap;
3287
+ color: var(--orb-fg-strong);
3288
+ font: 600 14px/1.3 var(--orb-font);
3289
+ }
3290
+
3291
+ /* rtl + bdi keeps the tail of a long directory path and cuts its head. */
3292
+ .orb-omph-pv-path {
3293
+ min-height: 15px;
3294
+ margin-top: 2px;
3295
+ overflow: hidden;
3296
+ direction: rtl;
3297
+ text-align: left;
3298
+ text-overflow: ellipsis;
3299
+ white-space: nowrap;
3300
+ color: var(--orb-muted);
3301
+ font: 500 11px/1.4 var(--orb-font);
3302
+ }
3303
+
3304
+ .orb-omph-pv-actions {
3305
+ display: flex;
3306
+ align-items: center;
3307
+ flex: none;
3308
+ gap: 2px;
3309
+ }
3310
+
3311
+ .orb-omph-pv .orb-omph-icon-button {
3312
+ width: 32px;
3313
+ min-height: 32px;
3314
+ }
3315
+
3316
+ .orb-omph-pv .orb-omph-text-button {
3317
+ min-height: 32px;
3318
+ padding: 0 10px;
3319
+ }
3320
+
3321
+ .orb-omph-pv [aria-pressed="true"] {
3322
+ background: var(--orb-selected);
3323
+ color: var(--orb-primary);
3324
+ }
3325
+
3326
+ .orb-omph-pv-meta {
3327
+ display: flex;
3328
+ align-items: center;
3329
+ flex: none;
3330
+ min-height: 32px;
3331
+ padding: 0 20px;
3332
+ border-bottom: 1px solid var(--orb-border);
3333
+ color: var(--orb-muted);
3334
+ font: 500 11px/1 var(--orb-font);
3335
+ letter-spacing: 0.02em;
3336
+ }
3337
+
3338
+ .orb-omph-preview[data-placement="overlay"] .orb-omph-pv-meta {
3339
+ padding-left: 16px;
3340
+ }
3341
+
3342
+ .orb-omph-pv-body {
3343
+ position: relative;
3344
+ flex: 1;
3345
+ min-height: 0;
3346
+ overflow: auto;
3347
+ overscroll-behavior: contain;
3348
+ }
3349
+
3350
+ .orb-omph-pv-body[data-kind="image"] {
3351
+ overflow: hidden;
3352
+ }
3353
+
3354
+ .orb-omph-pv-note {
3355
+ padding: 12px 20px;
3356
+ color: var(--orb-muted);
3357
+ font: 500 12px/1.5 var(--orb-font);
3358
+ }
3359
+
3360
+ .orb-omph-pv-doc {
3361
+ max-width: 760px;
3362
+ margin: 0 auto;
3363
+ padding: 28px 28px 48px;
3364
+ }
3365
+
3366
+ /* ----- code ----- */
3367
+ .orb-omph-code {
3368
+ --orb-omph-gutter: calc(var(--orb-omph-digits, 3) * 1ch + 36px);
3369
+ display: table;
3370
+ min-width: 100%;
3371
+ padding: 14px 0 28px;
3372
+ color: var(--orb-fg);
3373
+ font: 400 12.5px/1.7 var(--orb-omph-mono);
3374
+ font-variant-ligatures: none;
3375
+ tab-size: 2;
3376
+ }
3377
+
3378
+ .orb-omph-code .orb-omph-code-line {
3379
+ display: block;
3380
+ padding: 0 24px 0 var(--orb-omph-gutter);
3381
+ text-indent: calc(var(--orb-omph-gutter) * -1);
3382
+ white-space: pre;
3383
+ }
3384
+
3385
+ .orb-omph-code[data-wrap] .orb-omph-code-line {
3386
+ white-space: pre-wrap;
3387
+ overflow-wrap: anywhere;
3388
+ }
3389
+
3390
+ .orb-omph-code .react-syntax-highlighter-line-number {
3391
+ position: sticky;
3392
+ left: 0;
3393
+ display: inline-block;
3394
+ box-sizing: border-box;
3395
+ width: var(--orb-omph-gutter);
3396
+ padding-right: 18px;
3397
+ background: var(--orb-canvas);
3398
+ color: color-mix(in oklch, var(--orb-muted) 80%, transparent);
3399
+ font-variant-numeric: tabular-nums;
3400
+ text-align: right;
3401
+ text-indent: 0;
3402
+ user-select: none;
3403
+ }
3404
+
3405
+ .orb-omph-code .orb-omph-code-line[data-hit] {
3406
+ background: color-mix(in oklch, var(--orb-primary) 8%, transparent);
3407
+ animation: orb-omph-hit 1.2s ease-out 1;
3408
+ }
3409
+
3410
+ .orb-omph-code .orb-omph-code-line[data-hit] .react-syntax-highlighter-line-number {
3411
+ background: color-mix(in oklch, var(--orb-primary) 8%, var(--orb-canvas));
3412
+ box-shadow: inset 2px 0 0 var(--orb-primary);
3413
+ color: var(--orb-primary);
3414
+ }
3415
+
3416
+ @keyframes orb-omph-hit {
3417
+ from { background: color-mix(in oklch, var(--orb-primary) 22%, transparent); }
3418
+ }
3419
+
3420
+ .orb-omph-code .token.comment,
3421
+ .orb-omph-code .token.prolog,
3422
+ .orb-omph-code .token.doctype,
3423
+ .orb-omph-code .token.cdata {
3424
+ color: var(--orb-muted);
3425
+ font-style: italic;
3426
+ }
3427
+
3428
+ .orb-omph-code .token.keyword,
3429
+ .orb-omph-code .token.builtin,
3430
+ .orb-omph-code .token.tag,
3431
+ .orb-omph-code .token.atrule,
3432
+ .orb-omph-code .token.selector,
3433
+ .orb-omph-code .token.important {
3434
+ color: var(--orb-primary);
3435
+ font-weight: 500;
3436
+ }
3437
+
3438
+ .orb-omph-code .token.string,
3439
+ .orb-omph-code .token.attr-value,
3440
+ .orb-omph-code .token.char,
3441
+ .orb-omph-code .token.regex,
3442
+ .orb-omph-code .token.template-string {
3443
+ color: color-mix(in oklch, var(--orb-primary) 55%, var(--orb-fg-strong));
3444
+ }
3445
+
3446
+ .orb-omph-code .token.function,
3447
+ .orb-omph-code .token.class-name,
3448
+ .orb-omph-code .token.maybe-class-name {
3449
+ color: var(--orb-fg-strong);
3450
+ font-weight: 600;
3451
+ }
3452
+
3453
+ .orb-omph-code .token.number,
3454
+ .orb-omph-code .token.boolean,
3455
+ .orb-omph-code .token.constant,
3456
+ .orb-omph-code .token.symbol {
3457
+ color: var(--orb-p600);
3458
+ }
3459
+
3460
+ .orb-omph-code .token.property,
3461
+ .orb-omph-code .token.attr-name {
3462
+ color: var(--orb-fg-strong);
3463
+ }
3464
+
3465
+ .orb-omph-code .token.punctuation,
3466
+ .orb-omph-code .token.operator {
3467
+ color: var(--orb-muted);
3468
+ }
3469
+
3470
+ /* Dark surfaces keep --orb-primary as the deep brand blue, which disappears on
3471
+ the night canvas. Code tokens use the already-lightened dark mixes instead. */
3472
+ .orb-dark .orb-omph-code .token.keyword,
3473
+ .orb-dark .orb-omph-code .token.tag,
3474
+ .orb-dark .orb-omph-code .token.atrule,
3475
+ .orb-dark .orb-omph-code .token.selector,
3476
+ .orb-dark .orb-omph-code .token.important,
3477
+ [data-orb-mode="dark"] .orb-omph-code .token.keyword,
3478
+ [data-orb-mode="dark"] .orb-omph-code .token.tag,
3479
+ [data-orb-mode="dark"] .orb-omph-code .token.atrule,
3480
+ [data-orb-mode="dark"] .orb-omph-code .token.selector,
3481
+ [data-orb-mode="dark"] .orb-omph-code .token.important {
3482
+ color: var(--orb-link);
3483
+ }
3484
+
3485
+ .orb-dark .orb-omph-code .token.builtin,
3486
+ .orb-dark .orb-omph-code .token.class-name,
3487
+ .orb-dark .orb-omph-code .token.maybe-class-name,
3488
+ [data-orb-mode="dark"] .orb-omph-code .token.builtin,
3489
+ [data-orb-mode="dark"] .orb-omph-code .token.class-name,
3490
+ [data-orb-mode="dark"] .orb-omph-code .token.maybe-class-name {
3491
+ color: var(--orb-p200);
3492
+ }
3493
+
3494
+ .orb-dark .orb-omph-code .token.function,
3495
+ [data-orb-mode="dark"] .orb-omph-code .token.function {
3496
+ color: var(--orb-fg);
3497
+ font-weight: 600;
3498
+ }
3499
+
3500
+ .orb-dark .orb-omph-code .token.string,
3501
+ .orb-dark .orb-omph-code .token.attr-value,
3502
+ .orb-dark .orb-omph-code .token.char,
3503
+ .orb-dark .orb-omph-code .token.regex,
3504
+ .orb-dark .orb-omph-code .token.template-string,
3505
+ [data-orb-mode="dark"] .orb-omph-code .token.string,
3506
+ [data-orb-mode="dark"] .orb-omph-code .token.attr-value,
3507
+ [data-orb-mode="dark"] .orb-omph-code .token.char,
3508
+ [data-orb-mode="dark"] .orb-omph-code .token.regex,
3509
+ [data-orb-mode="dark"] .orb-omph-code .token.template-string {
3510
+ color: color-mix(in oklch, var(--orb-accent) 72%, #ffffff);
3511
+ }
3512
+
3513
+ .orb-dark .orb-omph-code .token.number,
3514
+ .orb-dark .orb-omph-code .token.boolean,
3515
+ .orb-dark .orb-omph-code .token.constant,
3516
+ .orb-dark .orb-omph-code .token.symbol,
3517
+ [data-orb-mode="dark"] .orb-omph-code .token.number,
3518
+ [data-orb-mode="dark"] .orb-omph-code .token.boolean,
3519
+ [data-orb-mode="dark"] .orb-omph-code .token.constant,
3520
+ [data-orb-mode="dark"] .orb-omph-code .token.symbol {
3521
+ color: color-mix(in oklch, var(--orb-accent) 42%, var(--orb-fg));
3522
+ }
3523
+
3524
+ .orb-dark .orb-omph-code .token.property,
3525
+ .orb-dark .orb-omph-code .token.attr-name,
3526
+ [data-orb-mode="dark"] .orb-omph-code .token.property,
3527
+ [data-orb-mode="dark"] .orb-omph-code .token.attr-name {
3528
+ color: color-mix(in oklch, var(--orb-fg) 88%, var(--orb-link));
3529
+ }
3530
+
3531
+ .orb-dark .orb-omph-code .token.punctuation,
3532
+ .orb-dark .orb-omph-code .token.operator,
3533
+ [data-orb-mode="dark"] .orb-omph-code .token.punctuation,
3534
+ [data-orb-mode="dark"] .orb-omph-code .token.operator {
3535
+ color: var(--orb-muted);
3536
+ }
3537
+
3538
+ .orb-omph-code [class*='language-'],
3539
+ .orb-omph-code .token {
3540
+ text-shadow: none;
3541
+ }
3542
+
3543
+ .orb-dark .orb-omph-code .orb-omph-code-line[data-hit],
3544
+ [data-orb-mode="dark"] .orb-omph-code .orb-omph-code-line[data-hit] {
3545
+ background: color-mix(in oklch, var(--orb-link) 16%, transparent);
3546
+ }
3547
+
3548
+ .orb-dark .orb-omph-code .orb-omph-code-line[data-hit] .react-syntax-highlighter-line-number,
3549
+ [data-orb-mode="dark"] .orb-omph-code .orb-omph-code-line[data-hit] .react-syntax-highlighter-line-number {
3550
+ background: color-mix(in oklch, var(--orb-link) 16%, var(--orb-canvas));
3551
+ box-shadow: inset 2px 0 0 var(--orb-link);
3552
+ color: var(--orb-link);
3553
+ }
3554
+
3555
+ /* ----- image ----- */
3556
+ .orb-omph-img {
3557
+ position: relative;
3558
+ height: 100%;
3559
+ background: var(--orb-surface);
3560
+ }
3561
+
3562
+ .orb-omph-img-stage {
3563
+ display: flex;
3564
+ box-sizing: border-box;
3565
+ height: 100%;
3566
+ padding: 16px;
3567
+ overflow: auto;
3568
+ }
3569
+
3570
+ .orb-omph-img-stage img {
3571
+ flex: none;
3572
+ margin: auto;
3573
+ border-radius: var(--orb-r);
3574
+ background: var(--orb-canvas);
3575
+ box-shadow: var(--orb-shadow-1);
3576
+ }
3577
+
3578
+ .orb-omph-img-zoom {
3579
+ position: absolute;
3580
+ left: 50%;
3581
+ bottom: 16px;
3582
+ display: inline-flex;
3583
+ gap: 2px;
3584
+ padding: 4px;
3585
+ border-radius: 999px;
3586
+ background: color-mix(in oklch, var(--orb-canvas) 86%, transparent);
3587
+ box-shadow: var(--orb-shadow-2);
3588
+ transform: translateX(-50%);
3589
+ backdrop-filter: blur(10px);
3590
+ }
3591
+
3592
+ .orb-omph-img-zoom button {
3593
+ min-width: 28px;
3594
+ height: 28px;
3595
+ padding: 0 10px;
3596
+ border: 0;
3597
+ border-radius: 999px;
3598
+ background: transparent;
3599
+ color: var(--orb-fg);
3600
+ font: 500 12px/1 var(--orb-font);
3601
+ cursor: pointer;
3602
+ }
3603
+
3604
+ .orb-omph-img-zoom button:hover:not(:disabled),
3605
+ .orb-omph-img-zoom button[data-active] {
3606
+ background: var(--orb-hover);
3607
+ color: var(--orb-primary);
3608
+ }
3609
+
3610
+ .orb-omph-img-zoom button:disabled {
3611
+ cursor: default;
3612
+ opacity: 0.4;
3613
+ }
3614
+
3615
+ /* ----- states ----- */
3616
+ .orb-omph-pv-skel {
3617
+ display: flex;
3618
+ flex-direction: column;
3619
+ gap: 12px;
3620
+ padding: 24px 20px;
3621
+ }
3622
+
3623
+ .orb-omph-pv-skel span {
3624
+ display: block;
3625
+ height: 10px;
3626
+ border-radius: 999px;
3627
+ background: linear-gradient(
3628
+ 90deg,
3629
+ var(--orb-surface) 0%,
3630
+ color-mix(in oklch, var(--orb-primary) 12%, var(--orb-surface)) 50%,
3631
+ var(--orb-surface) 100%
3632
+ );
3633
+ background-size: 200% 100%;
3634
+ animation: orb-omph-skel 1.4s linear infinite;
3635
+ }
3636
+
3637
+ .orb-omph-pv-skel span:nth-child(1) { width: 92%; }
3638
+ .orb-omph-pv-skel span:nth-child(2) { width: 78%; }
3639
+ .orb-omph-pv-skel span:nth-child(3) { width: 86%; }
3640
+ .orb-omph-pv-skel span:nth-child(4) { width: 64%; }
3641
+ .orb-omph-pv-skel span:nth-child(5) { width: 90%; }
3642
+ .orb-omph-pv-skel span:nth-child(6) { width: 72%; }
3643
+ .orb-omph-pv-skel span:nth-child(7) { width: 84%; }
3644
+ .orb-omph-pv-skel span:nth-child(8) { width: 58%; }
3645
+ .orb-omph-pv-skel span:nth-child(9) { width: 76%; }
3646
+
3647
+ @keyframes orb-omph-skel {
3648
+ from { background-position: 100% 0; }
3649
+ to { background-position: -100% 0; }
3650
+ }
3651
+
3652
+ .orb-omph-pv-notice {
3653
+ display: flex;
3654
+ flex-direction: column;
3655
+ align-items: center;
3656
+ gap: 8px;
3657
+ padding: 64px 32px;
3658
+ text-align: center;
3659
+ }
3660
+
3661
+ .orb-omph-pv-notice-icon {
3662
+ display: inline-flex;
3663
+ align-items: center;
3664
+ justify-content: center;
3665
+ width: 44px;
3666
+ height: 44px;
3667
+ border-radius: 50%;
3668
+ background: var(--orb-p50);
3669
+ color: var(--orb-primary);
3670
+ }
3671
+
3672
+ .orb-omph-pv-notice[data-tone="error"] .orb-omph-pv-notice-icon {
3673
+ background: var(--orb-err-bg);
3674
+ color: var(--orb-err);
3675
+ }
3676
+
3677
+ .orb-omph-pv-notice-title {
3678
+ color: var(--orb-fg-strong);
3679
+ font: 600 14px/1.4 var(--orb-font);
3680
+ }
3681
+
3682
+ .orb-omph-pv-notice-text {
3683
+ max-width: 36ch;
3684
+ margin: 0;
3685
+ color: var(--orb-muted);
3686
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
3687
+ overflow-wrap: anywhere;
3688
+ }
3689
+
3690
+ .orb-omph-pv-action {
3691
+ margin-top: 8px;
3692
+ padding: 8px 14px;
3693
+ border: 0;
3694
+ border-radius: var(--orb-r);
3695
+ background: var(--orb-p50);
3696
+ color: var(--orb-primary);
3697
+ font: 500 13px/1 var(--orb-font);
3698
+ cursor: pointer;
3699
+ }
3700
+
3701
+ .orb-omph-pv-action:hover {
3702
+ background: var(--orb-p100);
3703
+ }
3704
+
3705
+ /* ----- links to files inside assistant replies ----- */
3706
+ .orb-omph-assistant[data-file-links] .markdown-body a:not([href*="://"]):not([href^="#"]):not([href^="mailto:"]):not([href^="//"]) {
3707
+ border-radius: 3px;
3708
+ color: var(--orb-primary);
3709
+ cursor: pointer;
3710
+ text-decoration: underline dotted;
3711
+ text-decoration-thickness: 1px;
3712
+ text-underline-offset: 3px;
3713
+ transition: background var(--orb-t-fast);
3714
+ }
3715
+
3716
+ .orb-omph-assistant[data-file-links] .markdown-body a:not([href*="://"]):not([href^="#"]):not([href^="mailto:"]):not([href^="//"]):hover {
3717
+ background: var(--orb-hover);
3718
+ text-decoration-style: solid;
3719
+ }
3720
+
3721
+ /* ----- small container ----- */
3722
+ .orb-omph-panel[data-compact] .orb-omph-header { padding: 10px 12px; }
3723
+ .orb-omph-panel[data-compact] .orb-omph-scroll { padding: 12px 16px 16px; }
3724
+ .orb-omph-panel[data-compact] .orb-omph-user-bubble { max-width: 92%; }
3725
+ .orb-omph-panel[data-compact] .orb-omph-composer { padding: 8px 12px 12px; }
3726
+ .orb-omph-panel[data-compact] .orb-omph-pv-doc { padding: 20px 16px 36px; }
3727
+ .orb-omph-panel[data-compact] .orb-omph-pv-meta { padding-left: 16px; padding-right: 16px; }
3728
+
3729
+ @media (prefers-reduced-motion: reduce) {
3730
+ .orb-omph-main,
3731
+ .orb-omph-preview,
3732
+ .orb-omph-preview[data-placement="overlay"] {
3733
+ transition-duration: 0s;
3734
+ transition-delay: 0s;
3735
+ }
3736
+
3737
+ .orb-omph-pv-skel span,
3738
+ .orb-omph-code .orb-omph-code-line[data-hit] {
3739
+ animation: none;
3740
+ }
3741
+ }