orbcafe-ui 3.0.1 → 3.1.1

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) ---------- */
@@ -1696,6 +1729,7 @@ select.orb-inp {
1696
1729
  .orb-legend i { width: 10px; height: 10px; border-radius: 3px; display: inline-block; margin-right: 6px; }
1697
1730
 
1698
1731
  /* ---------- metric chart cards ---------- */
1732
+ .orb-metric-chart-shell { position: relative; min-width: 0; height: 100%; }
1699
1733
  .orb-metric-chart-card {
1700
1734
  display: flex;
1701
1735
  min-width: 0;
@@ -1781,6 +1815,40 @@ button.orb-metric-bar-row:hover, button.orb-metric-progress-row:hover, button.or
1781
1815
  .orb-metric-skeleton-short { width: 48%; }
1782
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); }
1783
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); }
1784
1852
  @keyframes orb-metric-pulse { 0%, 100% { opacity: .55; } 50% { opacity: 1; } }
1785
1853
  @media (max-width: 520px) {
1786
1854
  .orb-metric-chart-card { padding: 13px; }
@@ -2509,6 +2577,30 @@ button.orb-app-header-locale:hover,
2509
2577
  font-size: 12px;
2510
2578
  }
2511
2579
 
2580
+ .markdown-body .orb-html-demo-frame {
2581
+ margin: 12px 0 4px;
2582
+ overflow: hidden;
2583
+ border: 1px solid var(--orb-border);
2584
+ border-radius: var(--orb-r);
2585
+ background: var(--orb-canvas);
2586
+ }
2587
+
2588
+ .markdown-body .orb-html-demo-caption {
2589
+ padding: 8px 12px;
2590
+ border-bottom: 1px solid var(--orb-border);
2591
+ background: var(--orb-surface);
2592
+ color: var(--orb-fg-strong);
2593
+ font: 600 14px/1.3 var(--orb-font);
2594
+ }
2595
+
2596
+ .markdown-body .orb-html-demo {
2597
+ display: block;
2598
+ width: 100%;
2599
+ margin: 0;
2600
+ border: 0;
2601
+ background: var(--orb-canvas);
2602
+ }
2603
+
2512
2604
  .markdown-body blockquote {
2513
2605
  margin: 8px 0;
2514
2606
  padding: 2px 12px;
@@ -2539,3 +2631,1271 @@ button.orb-app-header-locale:hover,
2539
2631
  white-space: nowrap;
2540
2632
  border: 0;
2541
2633
  }
2634
+
2635
+ /* ---------- OMPHPanel ---------- */
2636
+ /* ORBIS tokens only. Working state is motion: pulse, spinner, shimmer. */
2637
+ .orb-omph-panel {
2638
+ --orb-omph-column: 800px;
2639
+ --orb-omph-process-max: 240px;
2640
+ --orb-omph-text: 14px;
2641
+ --orb-omph-text-lh: 1.6;
2642
+ position: relative;
2643
+ isolation: isolate;
2644
+ display: flex;
2645
+ flex-direction: column;
2646
+ height: 100%;
2647
+ width: 100%;
2648
+ min-height: 0;
2649
+ overflow: hidden;
2650
+ border: 1px solid var(--orb-border);
2651
+ border-radius: var(--orb-shell-radius);
2652
+ background: var(--orb-canvas);
2653
+ box-shadow: var(--orb-shadow-1);
2654
+ color: var(--orb-fg);
2655
+ font-family: var(--orb-font);
2656
+ font-synthesis: none;
2657
+ }
2658
+
2659
+ .orb-agent-input {
2660
+ border-radius: var(--orb-shell-radius);
2661
+ }
2662
+
2663
+ /* Composer takeover while a tool waits for a one-shot decision. */
2664
+ .orb-omph-approval {
2665
+ --orb-omph-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
2666
+ width: 100%;
2667
+ }
2668
+
2669
+ .orb-omph-approval-card {
2670
+ overflow: hidden;
2671
+ border: 1px solid var(--orb-warn);
2672
+ border-radius: var(--orb-shell-radius);
2673
+ background: var(--orb-canvas);
2674
+ box-shadow: var(--orb-shadow-2);
2675
+ }
2676
+
2677
+ .orb-omph-approval-strip {
2678
+ display: flex;
2679
+ align-items: center;
2680
+ gap: 8px;
2681
+ padding: 10px 16px;
2682
+ background: var(--orb-warn-bg);
2683
+ color: var(--orb-warn);
2684
+ font: 500 14px/1.3 var(--orb-font);
2685
+ }
2686
+
2687
+ .orb-omph-approval-dot {
2688
+ flex: none;
2689
+ width: 8px;
2690
+ height: 8px;
2691
+ border-radius: 50%;
2692
+ background: var(--orb-warn);
2693
+ }
2694
+
2695
+ .orb-omph-approval-body {
2696
+ display: flex;
2697
+ flex-direction: column;
2698
+ gap: 8px;
2699
+ max-height: 280px;
2700
+ padding: 12px 16px 0;
2701
+ overflow: auto;
2702
+ outline: none;
2703
+ }
2704
+
2705
+ .orb-omph-approval-body:focus-visible {
2706
+ box-shadow: inset 0 0 0 2px var(--orb-focus-ring);
2707
+ }
2708
+
2709
+ .orb-omph-approval-headline {
2710
+ color: var(--orb-fg-strong);
2711
+ font: 500 14px/1.5 var(--orb-font);
2712
+ }
2713
+
2714
+ .orb-omph-approval-detail {
2715
+ color: var(--orb-muted);
2716
+ font: 400 13px/1.5 var(--orb-omph-mono);
2717
+ overflow-wrap: anywhere;
2718
+ }
2719
+
2720
+ .orb-omph-approval-choices {
2721
+ display: flex;
2722
+ flex-direction: column;
2723
+ gap: 8px;
2724
+ margin: 0;
2725
+ padding: 0;
2726
+ border: 0;
2727
+ }
2728
+
2729
+ .orb-omph-approval-choice {
2730
+ display: grid;
2731
+ grid-template-columns: 16px minmax(0, 1fr);
2732
+ column-gap: 10px;
2733
+ row-gap: 2px;
2734
+ align-items: start;
2735
+ margin: 0;
2736
+ padding: 8px 10px;
2737
+ border: 1px solid var(--orb-border);
2738
+ border-radius: var(--orb-r);
2739
+ background: transparent;
2740
+ color: var(--orb-fg);
2741
+ font: 500 14px/1.4 var(--orb-font);
2742
+ cursor: pointer;
2743
+ }
2744
+
2745
+ .orb-omph-approval-choice[data-selected='true'] {
2746
+ border-color: var(--orb-primary);
2747
+ background: var(--orb-p50);
2748
+ }
2749
+
2750
+ .orb-omph-approval-choice input {
2751
+ margin-top: 3px;
2752
+ accent-color: var(--orb-primary);
2753
+ }
2754
+
2755
+ .orb-omph-approval-choice-copy {
2756
+ display: flex;
2757
+ flex-direction: column;
2758
+ gap: 2px;
2759
+ min-width: 0;
2760
+ }
2761
+
2762
+ .orb-omph-approval-choice-description {
2763
+ color: var(--orb-muted);
2764
+ font: 400 13px/1.45 var(--orb-font);
2765
+ }
2766
+
2767
+ .orb-omph-approval-other {
2768
+ width: 100%;
2769
+ min-height: 72px;
2770
+ margin: 0;
2771
+ padding: 8px 10px;
2772
+ resize: vertical;
2773
+ border: 1px solid var(--orb-border);
2774
+ border-radius: var(--orb-r);
2775
+ background: var(--orb-canvas);
2776
+ color: var(--orb-fg);
2777
+ font: 400 14px/1.5 var(--orb-font);
2778
+ }
2779
+
2780
+ .orb-omph-approval-other:focus {
2781
+ border-color: var(--orb-primary);
2782
+ outline: none;
2783
+ box-shadow: 0 0 0 1px var(--orb-focus-ring);
2784
+ }
2785
+
2786
+ .orb-omph-approval-actions {
2787
+ display: flex;
2788
+ justify-content: flex-end;
2789
+ gap: 8px;
2790
+ padding: 14px 16px;
2791
+ }
2792
+
2793
+ .orb-omph-approval-reject:hover:not(:disabled) {
2794
+ background: var(--orb-err-bg);
2795
+ color: var(--orb-err);
2796
+ border-color: var(--orb-err);
2797
+ }
2798
+
2799
+ .orb-omph-header {
2800
+ display: flex;
2801
+ align-items: center;
2802
+ gap: 10px;
2803
+ flex: none;
2804
+ padding: 12px 14px;
2805
+ border-bottom: 1px solid var(--orb-border);
2806
+ background: var(--orb-canvas);
2807
+ }
2808
+
2809
+ .orb-omph-avatar {
2810
+ display: inline-flex;
2811
+ align-items: center;
2812
+ justify-content: center;
2813
+ flex: none;
2814
+ width: 32px;
2815
+ height: 32px;
2816
+ border-radius: 50%;
2817
+ background: var(--orb-primary);
2818
+ color: var(--orb-on-primary);
2819
+ font: 600 12px/1 var(--orb-font);
2820
+ }
2821
+
2822
+ .orb-omph-title {
2823
+ font: 600 14px/1.2 var(--orb-font);
2824
+ color: var(--orb-fg);
2825
+ }
2826
+
2827
+ .orb-omph-subtitle {
2828
+ display: flex;
2829
+ align-items: center;
2830
+ gap: 6px;
2831
+ margin-top: 2px;
2832
+ min-width: 0;
2833
+ font: 500 11px/1.3 var(--orb-font);
2834
+ color: var(--orb-muted);
2835
+ }
2836
+
2837
+ .orb-omph-dot {
2838
+ flex: none;
2839
+ width: 7px;
2840
+ height: 7px;
2841
+ border-radius: 50%;
2842
+ background: var(--orb-primary);
2843
+ }
2844
+
2845
+ .orb-omph-dot[data-active="true"] {
2846
+ animation: orb-agent-pls 1.6s ease infinite;
2847
+ }
2848
+
2849
+ .orb-omph-stage {
2850
+ position: relative;
2851
+ flex: 1;
2852
+ min-height: 0;
2853
+ }
2854
+
2855
+ .orb-omph-scroll {
2856
+ height: 100%;
2857
+ overflow: auto;
2858
+ padding: 16px 28px 20px;
2859
+ scrollbar-width: thin;
2860
+ scrollbar-color: color-mix(in oklch, var(--orb-fg) 36%, var(--orb-canvas)) var(--orb-canvas);
2861
+ }
2862
+
2863
+ .orb-omph-scroll::-webkit-scrollbar {
2864
+ width: 10px;
2865
+ height: 10px;
2866
+ }
2867
+
2868
+ .orb-omph-scroll::-webkit-scrollbar-track {
2869
+ background: var(--orb-canvas);
2870
+ }
2871
+
2872
+ .orb-omph-scroll::-webkit-scrollbar-thumb {
2873
+ background: color-mix(in oklch, var(--orb-fg) 36%, var(--orb-canvas));
2874
+ border: 2px solid var(--orb-canvas);
2875
+ border-radius: var(--orb-shell-radius);
2876
+ }
2877
+
2878
+ .orb-omph-scroll::-webkit-scrollbar-corner {
2879
+ background: var(--orb-canvas);
2880
+ }
2881
+
2882
+ .orb-omph-stage[data-rail="true"] .orb-omph-scroll {
2883
+ padding-left: 36px;
2884
+ }
2885
+
2886
+ .orb-omph-column {
2887
+ width: min(100%, var(--orb-omph-column));
2888
+ margin-inline: auto;
2889
+ display: flex;
2890
+ flex-direction: column;
2891
+ gap: 16px;
2892
+ }
2893
+
2894
+ .orb-omph-turn {
2895
+ --orb-omph-turn-gap: 12px;
2896
+ --orb-omph-actions-gap: 6px;
2897
+ display: flex;
2898
+ flex-direction: column;
2899
+ gap: var(--orb-omph-turn-gap);
2900
+ }
2901
+
2902
+ .orb-omph-user {
2903
+ display: flex;
2904
+ flex-direction: column;
2905
+ align-items: flex-end;
2906
+ gap: 6px;
2907
+ }
2908
+
2909
+ .orb-omph-user-bubble {
2910
+ max-width: 80%;
2911
+ padding: 10px 14px;
2912
+ border: 1px solid var(--orb-p100);
2913
+ border-radius: var(--orb-r);
2914
+ background: var(--orb-p50);
2915
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
2916
+ white-space: pre-wrap;
2917
+ }
2918
+
2919
+ .orb-omph-clock {
2920
+ font: 500 11px/1.3 var(--orb-font);
2921
+ color: var(--orb-muted);
2922
+ }
2923
+
2924
+ .orb-omph-process-list {
2925
+ display: flex;
2926
+ flex-direction: column;
2927
+ gap: 6px;
2928
+ }
2929
+
2930
+ .orb-omph-process-toggle {
2931
+ display: flex;
2932
+ align-items: center;
2933
+ gap: 6px;
2934
+ width: 100%;
2935
+ min-width: 0;
2936
+ padding: 2px 0;
2937
+ border: 0;
2938
+ background: transparent;
2939
+ color: var(--orb-muted);
2940
+ font: 500 var(--orb-omph-text)/1.4 var(--orb-font);
2941
+ text-align: left;
2942
+ cursor: pointer;
2943
+ }
2944
+
2945
+ .orb-omph-process-toggle:hover {
2946
+ color: var(--orb-fg);
2947
+ }
2948
+
2949
+ .orb-omph-process[data-status="error"] .orb-omph-process-toggle {
2950
+ color: var(--orb-err);
2951
+ }
2952
+
2953
+ .orb-omph-process-chevron {
2954
+ transition: transform var(--orb-t-fast);
2955
+ }
2956
+
2957
+ .orb-omph-process[data-open="true"] .orb-omph-process-chevron {
2958
+ transform: rotate(180deg);
2959
+ }
2960
+
2961
+ .orb-omph-process-summary {
2962
+ min-width: 0;
2963
+ overflow: hidden;
2964
+ text-overflow: ellipsis;
2965
+ white-space: nowrap;
2966
+ font-weight: 500;
2967
+ }
2968
+
2969
+ .orb-omph-process-body {
2970
+ max-height: var(--orb-omph-process-max);
2971
+ margin: 8px 0 4px 22px;
2972
+ padding: 12px 16px;
2973
+ overflow: auto;
2974
+ border: 1px solid var(--orb-border);
2975
+ border-radius: var(--orb-r);
2976
+ background: var(--orb-surface);
2977
+ color: var(--orb-fg);
2978
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
2979
+ white-space: pre-wrap;
2980
+ }
2981
+
2982
+ .orb-omph-process-body[data-overflow="true"] {
2983
+ mask-image: linear-gradient(to bottom, transparent, #000 12px, #000 calc(100% - 12px), transparent);
2984
+ }
2985
+
2986
+ .orb-omph-assistant,
2987
+ .orb-omph-assistant .markdown-body {
2988
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
2989
+ }
2990
+
2991
+ .orb-omph-caret {
2992
+ display: inline-block;
2993
+ width: 2px;
2994
+ height: 13px;
2995
+ margin-left: 2px;
2996
+ vertical-align: -2px;
2997
+ background: var(--orb-primary);
2998
+ animation: orb-agent-blk 1s steps(1) infinite;
2999
+ }
3000
+
3001
+ .orb-omph-failure {
3002
+ padding: 8px 12px;
3003
+ border-left: 3px solid var(--orb-warn);
3004
+ background: var(--orb-warn-bg);
3005
+ color: var(--orb-fg);
3006
+ font: 500 var(--orb-omph-text)/1.45 var(--orb-font);
3007
+ }
3008
+
3009
+ .orb-omph-failure[data-severity="error"] {
3010
+ border-left-color: var(--orb-err);
3011
+ background: var(--orb-err-bg);
3012
+ }
3013
+
3014
+ /* Reply action bar: time on the left, Usage after a hairline, copy on the right,
3015
+ all on one quiet tinted surface. */
3016
+ .orb-omph-turn-actions {
3017
+ display: flex;
3018
+ flex-wrap: wrap;
3019
+ align-items: center;
3020
+ gap: 0 6px;
3021
+ padding: 4px 6px 4px 14px;
3022
+ border-radius: var(--orb-r);
3023
+ background: var(--orb-surface);
3024
+ /* Pull the bar up out of the turn's flex gap so it sits just under the reply. */
3025
+ margin-top: calc(var(--orb-omph-actions-gap) - var(--orb-omph-turn-gap));
3026
+ opacity: 0;
3027
+ transition: opacity 160ms ease;
3028
+ }
3029
+
3030
+ .orb-omph-actions-time {
3031
+ color: var(--orb-muted);
3032
+ font: 500 11px/1 var(--orb-font);
3033
+ font-variant-numeric: tabular-nums;
3034
+ letter-spacing: 0.02em;
3035
+ }
3036
+
3037
+ .orb-omph-actions-divider {
3038
+ width: 1px;
3039
+ height: 14px;
3040
+ margin: 0 6px;
3041
+ background: var(--orb-border);
3042
+ }
3043
+
3044
+ .orb-omph-actions-end {
3045
+ margin-left: auto;
3046
+ }
3047
+
3048
+ /* On the tinted bar a hovered control lifts to the canvas colour instead of darkening. */
3049
+ .orb-omph-turn-actions .orb-omph-icon-button:hover,
3050
+ .orb-omph-turn-actions .orb-omph-text-button:hover,
3051
+ .orb-omph-turn-actions .orb-omph-text-button[aria-expanded="true"] {
3052
+ background: var(--orb-canvas);
3053
+ }
3054
+
3055
+ .orb-omph-turn[data-actions-reveal="always"] .orb-omph-turn-actions,
3056
+ .orb-omph-turn:hover .orb-omph-turn-actions,
3057
+ .orb-omph-turn:focus-within .orb-omph-turn-actions {
3058
+ opacity: 1;
3059
+ }
3060
+
3061
+ @media (hover: none) {
3062
+ .orb-omph-turn-actions {
3063
+ opacity: 1;
3064
+ }
3065
+ }
3066
+
3067
+ .orb-omph-older,
3068
+ .orb-omph-to-bottom {
3069
+ border: 1px solid var(--orb-border);
3070
+ background: var(--orb-canvas);
3071
+ color: var(--orb-muted);
3072
+ cursor: pointer;
3073
+ }
3074
+
3075
+ /* Turn action buttons are borderless; hover is a quiet tint, not an outline. */
3076
+ .orb-omph-icon-button,
3077
+ .orb-omph-text-button {
3078
+ display: inline-flex;
3079
+ align-items: center;
3080
+ justify-content: center;
3081
+ min-height: 28px;
3082
+ border: 0;
3083
+ border-radius: var(--orb-r);
3084
+ background: transparent;
3085
+ color: var(--orb-muted);
3086
+ cursor: pointer;
3087
+ }
3088
+
3089
+ .orb-omph-icon-button:hover,
3090
+ .orb-omph-text-button:hover,
3091
+ .orb-omph-text-button[aria-expanded="true"] {
3092
+ background: var(--orb-hover);
3093
+ color: var(--orb-primary);
3094
+ }
3095
+
3096
+ .orb-omph-icon-button:focus-visible,
3097
+ .orb-omph-text-button:focus-visible {
3098
+ outline: 2px solid var(--orb-focus-solid);
3099
+ outline-offset: 1px;
3100
+ }
3101
+
3102
+ .orb-omph-icon-button {
3103
+ width: 28px;
3104
+ padding: 0;
3105
+ }
3106
+
3107
+ .orb-omph-text-button,
3108
+ .orb-omph-older {
3109
+ padding: 4px 10px;
3110
+ font: 500 12px/1.3 var(--orb-font);
3111
+ }
3112
+
3113
+ .orb-omph-older:hover,
3114
+ .orb-omph-to-bottom:hover {
3115
+ color: var(--orb-primary);
3116
+ border-color: var(--orb-primary);
3117
+ }
3118
+
3119
+ .orb-omph-usage {
3120
+ display: flex;
3121
+ flex: 1 0 100%;
3122
+ flex-wrap: wrap;
3123
+ gap: 4px 16px;
3124
+ margin-top: 2px;
3125
+ padding: 8px 0 6px;
3126
+ border-top: 1px solid var(--orb-border);
3127
+ color: var(--orb-muted);
3128
+ font: 500 12px/1.4 var(--orb-font);
3129
+ }
3130
+
3131
+ .orb-omph-running {
3132
+ display: flex;
3133
+ flex-direction: column;
3134
+ gap: 8px;
3135
+ padding-top: 4px;
3136
+ }
3137
+
3138
+ .orb-omph-running-rule {
3139
+ height: 1px;
3140
+ background: var(--orb-border);
3141
+ }
3142
+
3143
+ .orb-omph-running-body {
3144
+ display: flex;
3145
+ align-items: center;
3146
+ gap: 8px;
3147
+ color: var(--orb-primary);
3148
+ font: 500 13px/1.4 var(--orb-font);
3149
+ }
3150
+
3151
+ .orb-omph-spinner {
3152
+ width: 12px;
3153
+ height: 12px;
3154
+ flex: none;
3155
+ border-radius: 50%;
3156
+ border: 2px solid var(--orb-p100);
3157
+ border-top-color: var(--orb-primary);
3158
+ animation: orb-rot 1s linear infinite;
3159
+ display: inline-block;
3160
+ }
3161
+
3162
+ .orb-omph-shimmer {
3163
+ background-image: linear-gradient(90deg, var(--orb-muted) 0%, var(--orb-primary) 45%, var(--orb-muted) 90%);
3164
+ background-size: 200% 100%;
3165
+ background-clip: text;
3166
+ -webkit-background-clip: text;
3167
+ color: transparent;
3168
+ animation: orb-omph-shimmer 1.6s linear infinite;
3169
+ }
3170
+
3171
+ @keyframes orb-omph-shimmer {
3172
+ from { background-position: 100% 0; }
3173
+ to { background-position: -100% 0; }
3174
+ }
3175
+
3176
+ .orb-omph-rail {
3177
+ position: absolute;
3178
+ top: 12px;
3179
+ left: 10px;
3180
+ bottom: 12px;
3181
+ display: flex;
3182
+ flex-direction: column;
3183
+ align-items: center;
3184
+ gap: 10px;
3185
+ width: 16px;
3186
+ overflow: auto;
3187
+ }
3188
+
3189
+ .orb-omph-rail-mark {
3190
+ flex: none;
3191
+ width: 8px;
3192
+ height: 8px;
3193
+ padding: 0;
3194
+ border: 1px solid var(--orb-border);
3195
+ border-radius: 50%;
3196
+ background: var(--orb-canvas);
3197
+ cursor: pointer;
3198
+ }
3199
+
3200
+ .orb-omph-rail-mark[data-active="true"] {
3201
+ border-color: var(--orb-primary);
3202
+ background: var(--orb-primary);
3203
+ }
3204
+
3205
+ .orb-omph-to-bottom {
3206
+ position: absolute;
3207
+ left: 50%;
3208
+ bottom: 12px;
3209
+ display: inline-flex;
3210
+ align-items: center;
3211
+ justify-content: center;
3212
+ width: 32px;
3213
+ height: 32px;
3214
+ border-radius: 50%;
3215
+ transform: translateX(-50%);
3216
+ box-shadow: var(--orb-shadow-1);
3217
+ }
3218
+
3219
+ .orb-omph-older {
3220
+ align-self: center;
3221
+ border-radius: 999px;
3222
+ background: transparent;
3223
+ }
3224
+
3225
+ .orb-omph-older:disabled {
3226
+ cursor: default;
3227
+ opacity: 0.6;
3228
+ }
3229
+
3230
+ .orb-omph-composer {
3231
+ display: flex;
3232
+ align-items: flex-end;
3233
+ gap: 8px;
3234
+ flex: none;
3235
+ padding: 12px 16px 16px;
3236
+ border-top: 1px solid var(--orb-border);
3237
+ background: var(--orb-canvas);
3238
+ }
3239
+
3240
+ .orb-omph-input {
3241
+ flex: 1;
3242
+ min-height: 44px;
3243
+ max-height: 12em;
3244
+ padding: 10px 12px;
3245
+ resize: none;
3246
+ border: 1px solid var(--orb-border);
3247
+ border-radius: var(--orb-r);
3248
+ outline: none;
3249
+ background: var(--orb-canvas);
3250
+ color: var(--orb-fg);
3251
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
3252
+ }
3253
+
3254
+ .orb-omph-input:focus {
3255
+ border-color: var(--orb-primary);
3256
+ box-shadow: 0 0 0 1px var(--orb-focus-ring);
3257
+ }
3258
+
3259
+ .orb-omph-send,
3260
+ .orb-omph-stop {
3261
+ display: inline-flex;
3262
+ align-items: center;
3263
+ justify-content: center;
3264
+ flex: none;
3265
+ width: 36px;
3266
+ height: 36px;
3267
+ border: 0;
3268
+ border-radius: 50%;
3269
+ color: var(--orb-on-primary);
3270
+ cursor: pointer;
3271
+ }
3272
+
3273
+ .orb-omph-send {
3274
+ background: var(--orb-primary);
3275
+ }
3276
+
3277
+ .orb-omph-send:disabled {
3278
+ cursor: not-allowed;
3279
+ opacity: 0.4;
3280
+ background: var(--orb-disabled-bg);
3281
+ color: var(--orb-disabled-fg);
3282
+ }
3283
+
3284
+ .orb-omph-stop {
3285
+ background: var(--orb-err);
3286
+ }
3287
+
3288
+ @media (prefers-reduced-motion: reduce) {
3289
+ .orb-omph-dot[data-active="true"],
3290
+ .orb-omph-caret,
3291
+ .orb-omph-shimmer,
3292
+ .orb-omph-spinner {
3293
+ animation: none;
3294
+ }
3295
+
3296
+ .orb-omph-shimmer {
3297
+ color: var(--orb-primary);
3298
+ background: none;
3299
+ }
3300
+ }
3301
+
3302
+ /* ---------- OMPHPanel · file preview ---------- */
3303
+ /* Large container: the pane is a grid column that reveals from the right edge.
3304
+ Small container: the pane covers the whole body and fades in. Tokens only. */
3305
+ .orb-omph-panel {
3306
+ --orb-omph-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
3307
+ --orb-omph-ease: cubic-bezier(0.2, 0.8, 0.2, 1);
3308
+ --orb-omph-pv-w: 0px;
3309
+ --orb-omph-pv-pref: 420px;
3310
+ }
3311
+
3312
+ .orb-omph-main {
3313
+ position: relative;
3314
+ flex: 1;
3315
+ min-height: 0;
3316
+ display: grid;
3317
+ grid-template-columns: minmax(0, 1fr) var(--orb-omph-pv-w);
3318
+ transition: grid-template-columns 320ms var(--orb-omph-ease);
3319
+ }
3320
+
3321
+ .orb-omph-main[data-dragging] {
3322
+ transition: none;
3323
+ user-select: none;
3324
+ }
3325
+
3326
+ .orb-omph-center {
3327
+ display: flex;
3328
+ flex-direction: column;
3329
+ min-width: 0;
3330
+ min-height: 0;
3331
+ }
3332
+
3333
+ .orb-omph-preview {
3334
+ position: relative;
3335
+ min-width: 0;
3336
+ min-height: 0;
3337
+ overflow: hidden;
3338
+ border-left: 1px solid var(--orb-border);
3339
+ background: var(--orb-canvas);
3340
+ outline: none;
3341
+ visibility: hidden;
3342
+ transition: visibility 0s linear 320ms;
3343
+ }
3344
+
3345
+ .orb-omph-preview[data-open] {
3346
+ visibility: visible;
3347
+ transition-delay: 0s;
3348
+ }
3349
+
3350
+ /* The inner box keeps its width while the column animates, so content is revealed, not reflowed. */
3351
+ .orb-omph-pv {
3352
+ position: absolute;
3353
+ top: 0;
3354
+ right: 0;
3355
+ bottom: 0;
3356
+ width: var(--orb-omph-pv-pref);
3357
+ display: flex;
3358
+ flex-direction: column;
3359
+ background: var(--orb-canvas);
3360
+ }
3361
+
3362
+ .orb-omph-preview[data-placement="overlay"] {
3363
+ position: absolute;
3364
+ inset: 0;
3365
+ z-index: 6;
3366
+ border-left: 0;
3367
+ opacity: 0;
3368
+ transform: translateX(24px);
3369
+ transition: opacity 220ms ease, transform 320ms var(--orb-omph-ease), visibility 0s linear 320ms;
3370
+ }
3371
+
3372
+ .orb-omph-preview[data-placement="overlay"][data-open] {
3373
+ opacity: 1;
3374
+ transform: none;
3375
+ transition-delay: 0s;
3376
+ }
3377
+
3378
+ .orb-omph-preview[data-placement="overlay"] .orb-omph-pv {
3379
+ inset: 0;
3380
+ width: 100%;
3381
+ }
3382
+
3383
+ .orb-omph-pv-grip {
3384
+ position: absolute;
3385
+ z-index: 2;
3386
+ top: 0;
3387
+ bottom: 0;
3388
+ left: 0;
3389
+ width: 8px;
3390
+ cursor: col-resize;
3391
+ touch-action: none;
3392
+ outline: none;
3393
+ }
3394
+
3395
+ .orb-omph-pv-grip::after {
3396
+ content: "";
3397
+ position: absolute;
3398
+ top: 0;
3399
+ bottom: 0;
3400
+ left: 0;
3401
+ width: 2px;
3402
+ background: transparent;
3403
+ transition: background var(--orb-t-fast);
3404
+ }
3405
+
3406
+ .orb-omph-pv-grip:hover::after,
3407
+ .orb-omph-pv-grip:focus-visible::after,
3408
+ .orb-omph-main[data-dragging] .orb-omph-pv-grip::after {
3409
+ background: var(--orb-primary);
3410
+ }
3411
+
3412
+ .orb-omph-pv-head {
3413
+ display: flex;
3414
+ align-items: center;
3415
+ gap: 12px;
3416
+ flex: none;
3417
+ min-height: 64px;
3418
+ padding: 12px 12px 12px 20px;
3419
+ }
3420
+
3421
+ .orb-omph-preview[data-placement="overlay"] .orb-omph-pv-head {
3422
+ gap: 8px;
3423
+ padding-left: 8px;
3424
+ }
3425
+
3426
+ .orb-omph-pv-glyph {
3427
+ display: inline-flex;
3428
+ align-items: center;
3429
+ justify-content: center;
3430
+ flex: none;
3431
+ width: 36px;
3432
+ height: 36px;
3433
+ border-radius: var(--orb-r);
3434
+ background: var(--orb-p50);
3435
+ color: var(--orb-primary);
3436
+ }
3437
+
3438
+ .orb-omph-pv-titles {
3439
+ flex: 1;
3440
+ min-width: 0;
3441
+ }
3442
+
3443
+ .orb-omph-pv-name {
3444
+ overflow: hidden;
3445
+ text-overflow: ellipsis;
3446
+ white-space: nowrap;
3447
+ color: var(--orb-fg-strong);
3448
+ font: 600 14px/1.3 var(--orb-font);
3449
+ }
3450
+
3451
+ /* rtl + bdi keeps the tail of a long directory path and cuts its head. */
3452
+ .orb-omph-pv-path {
3453
+ min-height: 15px;
3454
+ margin-top: 2px;
3455
+ overflow: hidden;
3456
+ direction: rtl;
3457
+ text-align: left;
3458
+ text-overflow: ellipsis;
3459
+ white-space: nowrap;
3460
+ color: var(--orb-muted);
3461
+ font: 500 11px/1.4 var(--orb-font);
3462
+ }
3463
+
3464
+ .orb-omph-pv-actions {
3465
+ display: flex;
3466
+ align-items: center;
3467
+ flex: none;
3468
+ gap: 2px;
3469
+ }
3470
+
3471
+ .orb-omph-pv .orb-omph-icon-button {
3472
+ width: 32px;
3473
+ min-height: 32px;
3474
+ }
3475
+
3476
+ .orb-omph-pv .orb-omph-text-button {
3477
+ min-height: 32px;
3478
+ padding: 0 10px;
3479
+ }
3480
+
3481
+ .orb-omph-pv [aria-pressed="true"] {
3482
+ background: var(--orb-selected);
3483
+ color: var(--orb-primary);
3484
+ }
3485
+
3486
+ .orb-omph-pv-meta {
3487
+ display: flex;
3488
+ align-items: center;
3489
+ flex: none;
3490
+ min-height: 32px;
3491
+ padding: 0 20px;
3492
+ border-bottom: 1px solid var(--orb-border);
3493
+ color: var(--orb-muted);
3494
+ font: 500 11px/1 var(--orb-font);
3495
+ letter-spacing: 0.02em;
3496
+ }
3497
+
3498
+ .orb-omph-preview[data-placement="overlay"] .orb-omph-pv-meta {
3499
+ padding-left: 16px;
3500
+ }
3501
+
3502
+ .orb-omph-pv-body {
3503
+ position: relative;
3504
+ flex: 1;
3505
+ min-height: 0;
3506
+ overflow: auto;
3507
+ overscroll-behavior: contain;
3508
+ }
3509
+
3510
+ .orb-omph-pv-body[data-kind="image"] {
3511
+ overflow: hidden;
3512
+ }
3513
+
3514
+ .orb-omph-pv-note {
3515
+ padding: 12px 20px;
3516
+ color: var(--orb-muted);
3517
+ font: 500 12px/1.5 var(--orb-font);
3518
+ }
3519
+
3520
+ .orb-omph-pv-doc {
3521
+ max-width: 760px;
3522
+ margin: 0 auto;
3523
+ padding: 28px 28px 48px;
3524
+ }
3525
+
3526
+ /* ----- code ----- */
3527
+ .orb-omph-code {
3528
+ --orb-omph-gutter: calc(var(--orb-omph-digits, 3) * 1ch + 36px);
3529
+ display: table;
3530
+ min-width: 100%;
3531
+ padding: 14px 0 28px;
3532
+ color: var(--orb-fg);
3533
+ font: 400 12.5px/1.7 var(--orb-omph-mono);
3534
+ font-variant-ligatures: none;
3535
+ tab-size: 2;
3536
+ }
3537
+
3538
+ .orb-omph-code .orb-omph-code-line {
3539
+ display: block;
3540
+ padding: 0 24px 0 var(--orb-omph-gutter);
3541
+ text-indent: calc(var(--orb-omph-gutter) * -1);
3542
+ white-space: pre;
3543
+ }
3544
+
3545
+ .orb-omph-code[data-wrap] .orb-omph-code-line {
3546
+ white-space: pre-wrap;
3547
+ overflow-wrap: anywhere;
3548
+ }
3549
+
3550
+ .orb-omph-code .react-syntax-highlighter-line-number {
3551
+ position: sticky;
3552
+ left: 0;
3553
+ display: inline-block;
3554
+ box-sizing: border-box;
3555
+ width: var(--orb-omph-gutter);
3556
+ padding-right: 18px;
3557
+ background: var(--orb-canvas);
3558
+ color: color-mix(in oklch, var(--orb-muted) 80%, transparent);
3559
+ font-variant-numeric: tabular-nums;
3560
+ text-align: right;
3561
+ text-indent: 0;
3562
+ user-select: none;
3563
+ }
3564
+
3565
+ .orb-omph-code .orb-omph-code-line[data-hit] {
3566
+ background: color-mix(in oklch, var(--orb-primary) 8%, transparent);
3567
+ animation: orb-omph-hit 1.2s ease-out 1;
3568
+ }
3569
+
3570
+ .orb-omph-code .orb-omph-code-line[data-hit] .react-syntax-highlighter-line-number {
3571
+ background: color-mix(in oklch, var(--orb-primary) 8%, var(--orb-canvas));
3572
+ box-shadow: inset 2px 0 0 var(--orb-primary);
3573
+ color: var(--orb-primary);
3574
+ }
3575
+
3576
+ @keyframes orb-omph-hit {
3577
+ from { background: color-mix(in oklch, var(--orb-primary) 22%, transparent); }
3578
+ }
3579
+
3580
+ .orb-omph-code .token.comment,
3581
+ .orb-omph-code .token.prolog,
3582
+ .orb-omph-code .token.doctype,
3583
+ .orb-omph-code .token.cdata {
3584
+ color: var(--orb-muted);
3585
+ font-style: italic;
3586
+ }
3587
+
3588
+ .orb-omph-code .token.keyword,
3589
+ .orb-omph-code .token.builtin,
3590
+ .orb-omph-code .token.tag,
3591
+ .orb-omph-code .token.atrule,
3592
+ .orb-omph-code .token.selector,
3593
+ .orb-omph-code .token.important {
3594
+ color: var(--orb-primary);
3595
+ font-weight: 500;
3596
+ }
3597
+
3598
+ .orb-omph-code .token.string,
3599
+ .orb-omph-code .token.attr-value,
3600
+ .orb-omph-code .token.char,
3601
+ .orb-omph-code .token.regex,
3602
+ .orb-omph-code .token.template-string {
3603
+ color: color-mix(in oklch, var(--orb-primary) 55%, var(--orb-fg-strong));
3604
+ }
3605
+
3606
+ .orb-omph-code .token.function,
3607
+ .orb-omph-code .token.class-name,
3608
+ .orb-omph-code .token.maybe-class-name {
3609
+ color: var(--orb-fg-strong);
3610
+ font-weight: 600;
3611
+ }
3612
+
3613
+ .orb-omph-code .token.number,
3614
+ .orb-omph-code .token.boolean,
3615
+ .orb-omph-code .token.constant,
3616
+ .orb-omph-code .token.symbol {
3617
+ color: var(--orb-p600);
3618
+ }
3619
+
3620
+ .orb-omph-code .token.property,
3621
+ .orb-omph-code .token.attr-name {
3622
+ color: var(--orb-fg-strong);
3623
+ }
3624
+
3625
+ .orb-omph-code .token.punctuation,
3626
+ .orb-omph-code .token.operator {
3627
+ color: var(--orb-muted);
3628
+ }
3629
+
3630
+ /* Dark surfaces keep --orb-primary as the deep brand blue, which disappears on
3631
+ the night canvas. Code tokens use the already-lightened dark mixes instead. */
3632
+ .orb-dark .orb-omph-code .token.keyword,
3633
+ .orb-dark .orb-omph-code .token.tag,
3634
+ .orb-dark .orb-omph-code .token.atrule,
3635
+ .orb-dark .orb-omph-code .token.selector,
3636
+ .orb-dark .orb-omph-code .token.important,
3637
+ [data-orb-mode="dark"] .orb-omph-code .token.keyword,
3638
+ [data-orb-mode="dark"] .orb-omph-code .token.tag,
3639
+ [data-orb-mode="dark"] .orb-omph-code .token.atrule,
3640
+ [data-orb-mode="dark"] .orb-omph-code .token.selector,
3641
+ [data-orb-mode="dark"] .orb-omph-code .token.important {
3642
+ color: var(--orb-link);
3643
+ }
3644
+
3645
+ .orb-dark .orb-omph-code .token.builtin,
3646
+ .orb-dark .orb-omph-code .token.class-name,
3647
+ .orb-dark .orb-omph-code .token.maybe-class-name,
3648
+ [data-orb-mode="dark"] .orb-omph-code .token.builtin,
3649
+ [data-orb-mode="dark"] .orb-omph-code .token.class-name,
3650
+ [data-orb-mode="dark"] .orb-omph-code .token.maybe-class-name {
3651
+ color: var(--orb-p200);
3652
+ }
3653
+
3654
+ .orb-dark .orb-omph-code .token.function,
3655
+ [data-orb-mode="dark"] .orb-omph-code .token.function {
3656
+ color: var(--orb-fg);
3657
+ font-weight: 600;
3658
+ }
3659
+
3660
+ .orb-dark .orb-omph-code .token.string,
3661
+ .orb-dark .orb-omph-code .token.attr-value,
3662
+ .orb-dark .orb-omph-code .token.char,
3663
+ .orb-dark .orb-omph-code .token.regex,
3664
+ .orb-dark .orb-omph-code .token.template-string,
3665
+ [data-orb-mode="dark"] .orb-omph-code .token.string,
3666
+ [data-orb-mode="dark"] .orb-omph-code .token.attr-value,
3667
+ [data-orb-mode="dark"] .orb-omph-code .token.char,
3668
+ [data-orb-mode="dark"] .orb-omph-code .token.regex,
3669
+ [data-orb-mode="dark"] .orb-omph-code .token.template-string {
3670
+ color: color-mix(in oklch, var(--orb-accent) 72%, #ffffff);
3671
+ }
3672
+
3673
+ .orb-dark .orb-omph-code .token.number,
3674
+ .orb-dark .orb-omph-code .token.boolean,
3675
+ .orb-dark .orb-omph-code .token.constant,
3676
+ .orb-dark .orb-omph-code .token.symbol,
3677
+ [data-orb-mode="dark"] .orb-omph-code .token.number,
3678
+ [data-orb-mode="dark"] .orb-omph-code .token.boolean,
3679
+ [data-orb-mode="dark"] .orb-omph-code .token.constant,
3680
+ [data-orb-mode="dark"] .orb-omph-code .token.symbol {
3681
+ color: color-mix(in oklch, var(--orb-accent) 42%, var(--orb-fg));
3682
+ }
3683
+
3684
+ .orb-dark .orb-omph-code .token.property,
3685
+ .orb-dark .orb-omph-code .token.attr-name,
3686
+ [data-orb-mode="dark"] .orb-omph-code .token.property,
3687
+ [data-orb-mode="dark"] .orb-omph-code .token.attr-name {
3688
+ color: color-mix(in oklch, var(--orb-fg) 88%, var(--orb-link));
3689
+ }
3690
+
3691
+ .orb-dark .orb-omph-code .token.punctuation,
3692
+ .orb-dark .orb-omph-code .token.operator,
3693
+ [data-orb-mode="dark"] .orb-omph-code .token.punctuation,
3694
+ [data-orb-mode="dark"] .orb-omph-code .token.operator {
3695
+ color: var(--orb-muted);
3696
+ }
3697
+
3698
+ .orb-omph-code [class*='language-'],
3699
+ .orb-omph-code .token {
3700
+ text-shadow: none;
3701
+ }
3702
+
3703
+ .orb-dark .orb-omph-code .orb-omph-code-line[data-hit],
3704
+ [data-orb-mode="dark"] .orb-omph-code .orb-omph-code-line[data-hit] {
3705
+ background: color-mix(in oklch, var(--orb-link) 16%, transparent);
3706
+ }
3707
+
3708
+ .orb-dark .orb-omph-code .orb-omph-code-line[data-hit] .react-syntax-highlighter-line-number,
3709
+ [data-orb-mode="dark"] .orb-omph-code .orb-omph-code-line[data-hit] .react-syntax-highlighter-line-number {
3710
+ background: color-mix(in oklch, var(--orb-link) 16%, var(--orb-canvas));
3711
+ box-shadow: inset 2px 0 0 var(--orb-link);
3712
+ color: var(--orb-link);
3713
+ }
3714
+
3715
+ /* ----- image ----- */
3716
+ .orb-omph-img {
3717
+ position: relative;
3718
+ height: 100%;
3719
+ background: var(--orb-surface);
3720
+ }
3721
+
3722
+ .orb-omph-img-stage {
3723
+ display: flex;
3724
+ box-sizing: border-box;
3725
+ height: 100%;
3726
+ padding: 16px;
3727
+ overflow: auto;
3728
+ }
3729
+
3730
+ .orb-omph-img-stage img {
3731
+ flex: none;
3732
+ margin: auto;
3733
+ border-radius: var(--orb-r);
3734
+ background: var(--orb-canvas);
3735
+ box-shadow: var(--orb-shadow-1);
3736
+ }
3737
+
3738
+ .orb-omph-img-zoom {
3739
+ position: absolute;
3740
+ left: 50%;
3741
+ bottom: 16px;
3742
+ display: inline-flex;
3743
+ gap: 2px;
3744
+ padding: 4px;
3745
+ border-radius: 999px;
3746
+ background: color-mix(in oklch, var(--orb-canvas) 86%, transparent);
3747
+ box-shadow: var(--orb-shadow-2);
3748
+ transform: translateX(-50%);
3749
+ backdrop-filter: blur(10px);
3750
+ }
3751
+
3752
+ .orb-omph-img-zoom button {
3753
+ min-width: 28px;
3754
+ height: 28px;
3755
+ padding: 0 10px;
3756
+ border: 0;
3757
+ border-radius: 999px;
3758
+ background: transparent;
3759
+ color: var(--orb-fg);
3760
+ font: 500 12px/1 var(--orb-font);
3761
+ cursor: pointer;
3762
+ }
3763
+
3764
+ .orb-omph-img-zoom button:hover:not(:disabled),
3765
+ .orb-omph-img-zoom button[data-active] {
3766
+ background: var(--orb-hover);
3767
+ color: var(--orb-primary);
3768
+ }
3769
+
3770
+ .orb-omph-img-zoom button:disabled {
3771
+ cursor: default;
3772
+ opacity: 0.4;
3773
+ }
3774
+
3775
+ /* ----- states ----- */
3776
+ .orb-omph-pv-skel {
3777
+ display: flex;
3778
+ flex-direction: column;
3779
+ gap: 12px;
3780
+ padding: 24px 20px;
3781
+ }
3782
+
3783
+ .orb-omph-pv-skel span {
3784
+ display: block;
3785
+ height: 10px;
3786
+ border-radius: 999px;
3787
+ background: linear-gradient(
3788
+ 90deg,
3789
+ var(--orb-surface) 0%,
3790
+ color-mix(in oklch, var(--orb-primary) 12%, var(--orb-surface)) 50%,
3791
+ var(--orb-surface) 100%
3792
+ );
3793
+ background-size: 200% 100%;
3794
+ animation: orb-omph-skel 1.4s linear infinite;
3795
+ }
3796
+
3797
+ .orb-omph-pv-skel span:nth-child(1) { width: 92%; }
3798
+ .orb-omph-pv-skel span:nth-child(2) { width: 78%; }
3799
+ .orb-omph-pv-skel span:nth-child(3) { width: 86%; }
3800
+ .orb-omph-pv-skel span:nth-child(4) { width: 64%; }
3801
+ .orb-omph-pv-skel span:nth-child(5) { width: 90%; }
3802
+ .orb-omph-pv-skel span:nth-child(6) { width: 72%; }
3803
+ .orb-omph-pv-skel span:nth-child(7) { width: 84%; }
3804
+ .orb-omph-pv-skel span:nth-child(8) { width: 58%; }
3805
+ .orb-omph-pv-skel span:nth-child(9) { width: 76%; }
3806
+
3807
+ @keyframes orb-omph-skel {
3808
+ from { background-position: 100% 0; }
3809
+ to { background-position: -100% 0; }
3810
+ }
3811
+
3812
+ .orb-omph-pv-notice {
3813
+ display: flex;
3814
+ flex-direction: column;
3815
+ align-items: center;
3816
+ gap: 8px;
3817
+ padding: 64px 32px;
3818
+ text-align: center;
3819
+ }
3820
+
3821
+ .orb-omph-pv-notice-icon {
3822
+ display: inline-flex;
3823
+ align-items: center;
3824
+ justify-content: center;
3825
+ width: 44px;
3826
+ height: 44px;
3827
+ border-radius: 50%;
3828
+ background: var(--orb-p50);
3829
+ color: var(--orb-primary);
3830
+ }
3831
+
3832
+ .orb-omph-pv-notice[data-tone="error"] .orb-omph-pv-notice-icon {
3833
+ background: var(--orb-err-bg);
3834
+ color: var(--orb-err);
3835
+ }
3836
+
3837
+ .orb-omph-pv-notice-title {
3838
+ color: var(--orb-fg-strong);
3839
+ font: 600 14px/1.4 var(--orb-font);
3840
+ }
3841
+
3842
+ .orb-omph-pv-notice-text {
3843
+ max-width: 36ch;
3844
+ margin: 0;
3845
+ color: var(--orb-muted);
3846
+ font: 500 var(--orb-omph-text)/var(--orb-omph-text-lh) var(--orb-font);
3847
+ overflow-wrap: anywhere;
3848
+ }
3849
+
3850
+ .orb-omph-pv-action {
3851
+ margin-top: 8px;
3852
+ padding: 8px 14px;
3853
+ border: 0;
3854
+ border-radius: var(--orb-r);
3855
+ background: var(--orb-p50);
3856
+ color: var(--orb-primary);
3857
+ font: 500 13px/1 var(--orb-font);
3858
+ cursor: pointer;
3859
+ }
3860
+
3861
+ .orb-omph-pv-action:hover {
3862
+ background: var(--orb-p100);
3863
+ }
3864
+
3865
+ /* ----- links to files inside assistant replies ----- */
3866
+ .orb-omph-assistant[data-file-links] .markdown-body a:not([href*="://"]):not([href^="#"]):not([href^="mailto:"]):not([href^="//"]) {
3867
+ border-radius: 3px;
3868
+ color: var(--orb-primary);
3869
+ cursor: pointer;
3870
+ text-decoration: underline dotted;
3871
+ text-decoration-thickness: 1px;
3872
+ text-underline-offset: 3px;
3873
+ transition: background var(--orb-t-fast);
3874
+ }
3875
+
3876
+ .orb-omph-assistant[data-file-links] .markdown-body a:not([href*="://"]):not([href^="#"]):not([href^="mailto:"]):not([href^="//"]):hover {
3877
+ background: var(--orb-hover);
3878
+ text-decoration-style: solid;
3879
+ }
3880
+
3881
+ /* ----- small container ----- */
3882
+ .orb-omph-panel[data-compact] .orb-omph-header { padding: 10px 12px; }
3883
+ .orb-omph-panel[data-compact] .orb-omph-scroll { padding: 12px 16px 16px; }
3884
+ .orb-omph-panel[data-compact] .orb-omph-user-bubble { max-width: 92%; }
3885
+ .orb-omph-panel[data-compact] .orb-omph-composer { padding: 8px 12px 12px; }
3886
+ .orb-omph-panel[data-compact] .orb-omph-pv-doc { padding: 20px 16px 36px; }
3887
+ .orb-omph-panel[data-compact] .orb-omph-pv-meta { padding-left: 16px; padding-right: 16px; }
3888
+
3889
+ @media (prefers-reduced-motion: reduce) {
3890
+ .orb-omph-main,
3891
+ .orb-omph-preview,
3892
+ .orb-omph-preview[data-placement="overlay"] {
3893
+ transition-duration: 0s;
3894
+ transition-delay: 0s;
3895
+ }
3896
+
3897
+ .orb-omph-pv-skel span,
3898
+ .orb-omph-code .orb-omph-code-line[data-hit] {
3899
+ animation: none;
3900
+ }
3901
+ }