openclacky 0.9.2 → 0.9.4

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.
@@ -148,11 +148,49 @@ body {
148
148
  .sidebar-toggle-btn:active {
149
149
  transform: scale(0.95);
150
150
  }
151
+ /* Header brand area: logo image + brand name */
152
+ #header-brand {
153
+ display: flex;
154
+ align-items: center;
155
+ gap: 8px;
156
+ min-width: 0;
157
+ }
151
158
  .header-logo {
152
159
  font-weight: 700;
153
- font-size: 18px;
154
- color: var(--color-accent-primary);
155
- letter-spacing: -0.5px;
160
+ font-size: 17px;
161
+ color: var(--color-text-primary);
162
+ letter-spacing: -0.3px;
163
+ white-space: nowrap;
164
+ overflow: hidden;
165
+ text-overflow: ellipsis;
166
+ max-width: 180px;
167
+ line-height: 1;
168
+ }
169
+ /* When a logo image is present, slightly dim the text to act as a subtitle */
170
+ #header-brand.has-logo .header-logo {
171
+ font-size: 14px;
172
+ font-weight: 600;
173
+ color: var(--color-text-secondary);
174
+ letter-spacing: 0;
175
+ }
176
+ .header-logo-img {
177
+ height: 28px;
178
+ max-width: 120px;
179
+ object-fit: contain;
180
+ display: block;
181
+ flex-shrink: 0;
182
+ border-radius: 4px;
183
+ }
184
+ /* Subtle divider between logo image and brand name text */
185
+ #header-brand.has-logo .header-logo-divider {
186
+ display: block;
187
+ width: 1px;
188
+ height: 16px;
189
+ background: var(--color-border-primary);
190
+ flex-shrink: 0;
191
+ }
192
+ #header-brand .header-logo-divider {
193
+ display: none;
156
194
  }
157
195
  #header-right {
158
196
  display: flex;
@@ -971,7 +1009,10 @@ body {
971
1009
  opacity: 0.7;
972
1010
  padding: 2px 4px;
973
1011
  margin-top: -8px;
1012
+ cursor: default;
1013
+ transition: opacity 0.15s ease;
974
1014
  }
1015
+ .token-usage-line:hover { opacity: 1; }
975
1016
  .token-usage-line b { font-weight: 600; color: var(--color-text-secondary); }
976
1017
  .tu-label { color: var(--color-text-tertiary); font-weight: 600; }
977
1018
  .tu-sep { color: var(--color-text-muted); opacity: 0.45; padding: 0 1px; }
@@ -984,6 +1025,14 @@ body {
984
1025
  .tu-delta-high { color: #f87171; } /* red — large */
985
1026
  .tu-delta-neg { color: var(--color-accent-primary); } /* cyan — compression */
986
1027
 
1028
+ /* Detail fields: hidden by default, revealed on hover */
1029
+ .tu-detail {
1030
+ display: none;
1031
+ align-items: center;
1032
+ gap: 4px;
1033
+ }
1034
+ .token-usage-line:hover .tu-detail { display: contents; }
1035
+
987
1036
  /* ── Tool group (collapsible tool call list) ─────────────────────────────── */
988
1037
  .tool-group {
989
1038
  align-self: flex-start;
@@ -1116,6 +1165,23 @@ body {
1116
1165
  white-space: nowrap;
1117
1166
  overflow: hidden;
1118
1167
  flex-shrink: 0;
1168
+ opacity: 0.7;
1169
+ transition: opacity 0.15s ease;
1170
+ cursor: default;
1171
+ }
1172
+
1173
+ #session-info-bar:hover {
1174
+ opacity: 1;
1175
+ }
1176
+
1177
+ /* Detail fields: hidden by default, revealed on hover */
1178
+ .sib-detail {
1179
+ display: none;
1180
+ align-items: center;
1181
+ }
1182
+
1183
+ #session-info-bar:hover .sib-detail {
1184
+ display: contents;
1119
1185
  }
1120
1186
 
1121
1187
  #sib-id {
@@ -1670,6 +1736,7 @@ body {
1670
1736
  font-size: 13px;
1671
1737
  font-family: inherit;
1672
1738
  width: 100%;
1739
+ box-sizing: border-box;
1673
1740
  cursor: pointer;
1674
1741
  display: flex;
1675
1742
  align-items: center;
@@ -2443,6 +2510,292 @@ body {
2443
2510
  /* ── Skills sidebar section ──────────────────────────────────────────────── */
2444
2511
  #skill-list-items { padding: 0 8px 8px; display: flex; flex-direction: column; gap: 2px; }
2445
2512
 
2513
+ /* ── Setup panel (full-screen, covers sidebar — mandatory first-run) ─────── */
2514
+ /* Setup panel background — decorative gradient so transparency has something to show */
2515
+ body.setup-mode {
2516
+ background: linear-gradient(135deg,
2517
+ #dbeafe 0%,
2518
+ #ede9fe 35%,
2519
+ #fce7f3 65%,
2520
+ #d1fae5 100%);
2521
+ }
2522
+ [data-theme="dark"] body.setup-mode,
2523
+ body.setup-mode[data-theme="dark"] {
2524
+ background: linear-gradient(135deg,
2525
+ #0f1f3d 0%,
2526
+ #1a1040 35%,
2527
+ #2d0a28 65%,
2528
+ #042f1e 100%);
2529
+ }
2530
+
2531
+ /* ── Setup panel overlay ─────────────────────────────────────────────────── */
2532
+ #setup-panel {
2533
+ position: fixed;
2534
+ inset: 0;
2535
+ z-index: 500;
2536
+ display: flex;
2537
+ align-items: center;
2538
+ justify-content: center;
2539
+ overflow-y: auto;
2540
+ /* Reserve scrollbar space always so card doesn't shift when scrollbar appears */
2541
+ scrollbar-gutter: stable;
2542
+ padding: 40px 20px;
2543
+ background: rgba(255, 255, 255, 0.45);
2544
+ backdrop-filter: blur(24px);
2545
+ -webkit-backdrop-filter: blur(24px);
2546
+ }
2547
+ [data-theme="dark"] #setup-panel {
2548
+ background: rgba(11, 16, 32, 0.55);
2549
+ }
2550
+
2551
+ /* Glass card */
2552
+ #setup-card {
2553
+ width: 420px;
2554
+ max-width: calc(100vw - 40px);
2555
+ background: var(--color-bg-primary);
2556
+ border: 1px solid var(--color-border-primary);
2557
+ border-radius: 16px;
2558
+ padding: 36px 40px 32px;
2559
+ display: flex;
2560
+ flex-direction: column;
2561
+ gap: 20px;
2562
+ box-shadow: 0 4px 32px rgba(0,0,0,0.12), 0 1px 4px rgba(0,0,0,0.08);
2563
+ /* Prevent height/width jitter when content changes */
2564
+ min-height: 340px;
2565
+ /* Dropdown must overflow the card boundary */
2566
+ overflow: visible;
2567
+ }
2568
+ [data-theme="dark"] #setup-card {
2569
+ box-shadow: 0 4px 40px rgba(0,0,0,0.5), 0 1px 4px rgba(0,0,0,0.3);
2570
+ }
2571
+
2572
+ /* Header */
2573
+ #setup-header {
2574
+ display: flex;
2575
+ flex-direction: column;
2576
+ align-items: center;
2577
+ gap: 6px;
2578
+ text-align: center;
2579
+ }
2580
+
2581
+ #setup-logo {
2582
+ font-size: 32px;
2583
+ line-height: 1;
2584
+ margin-bottom: 2px;
2585
+ background: linear-gradient(135deg, #6366f1, #3b82f6);
2586
+ -webkit-background-clip: text;
2587
+ -webkit-text-fill-color: transparent;
2588
+ background-clip: text;
2589
+ }
2590
+
2591
+ #setup-title {
2592
+ font-size: 20px;
2593
+ font-weight: 700;
2594
+ color: var(--color-text-primary);
2595
+ margin: 0;
2596
+ /* Reserve space so height doesn't change when text switches language */
2597
+ min-height: 1.4em;
2598
+ }
2599
+
2600
+ #setup-subtitle {
2601
+ font-size: 13px;
2602
+ color: var(--color-text-tertiary);
2603
+ margin: 0;
2604
+ min-height: 1.5em;
2605
+ }
2606
+
2607
+ /* Step indicators */
2608
+ #setup-steps {
2609
+ display: flex;
2610
+ align-items: center;
2611
+ justify-content: center;
2612
+ gap: 0;
2613
+ }
2614
+
2615
+ .setup-step {
2616
+ width: 24px;
2617
+ height: 24px;
2618
+ border-radius: 50%;
2619
+ background: var(--color-bg-secondary);
2620
+ border: 1.5px solid var(--color-border-primary);
2621
+ color: var(--color-text-tertiary);
2622
+ font-size: 11px;
2623
+ font-weight: 700;
2624
+ display: flex;
2625
+ align-items: center;
2626
+ justify-content: center;
2627
+ transition: background .2s, border-color .2s, color .2s;
2628
+ }
2629
+ .setup-step.active {
2630
+ background: #3b82f6;
2631
+ border-color: #3b82f6;
2632
+ color: #fff;
2633
+ }
2634
+ .setup-step.done {
2635
+ background: #22c55e;
2636
+ border-color: #22c55e;
2637
+ color: #fff;
2638
+ }
2639
+ .setup-step-line {
2640
+ width: 48px;
2641
+ height: 1.5px;
2642
+ background: var(--color-border-primary);
2643
+ }
2644
+
2645
+ /* Phase containers */
2646
+ #setup-phase-lang,
2647
+ #setup-phase-key {
2648
+ width: 100%;
2649
+ display: flex;
2650
+ flex-direction: column;
2651
+ gap: 14px;
2652
+ }
2653
+
2654
+ /* Phase label */
2655
+ .setup-phase-label {
2656
+ font-size: 13px;
2657
+ font-weight: 600;
2658
+ color: var(--color-text-secondary);
2659
+ text-align: center;
2660
+ margin: 0;
2661
+ }
2662
+
2663
+ /* Language row: [En] [中文] on first line, [Continue →] on second */
2664
+ #setup-lang-row {
2665
+ display: flex;
2666
+ flex-direction: column;
2667
+ gap: 10px;
2668
+ margin-top: 12px;
2669
+ }
2670
+
2671
+ #setup-lang-btns {
2672
+ display: flex;
2673
+ gap: 8px;
2674
+ margin-bottom: 6px;
2675
+ }
2676
+
2677
+ .setup-lang-btn {
2678
+ flex: 1;
2679
+ background: var(--color-bg-secondary);
2680
+ border: 1.5px solid var(--color-border-primary);
2681
+ border-radius: 8px;
2682
+ color: var(--color-text-primary);
2683
+ font-size: 13px;
2684
+ font-weight: 600;
2685
+ padding: 8px 0;
2686
+ cursor: pointer;
2687
+ transition: border-color .15s, background .15s, color .15s;
2688
+ }
2689
+ .setup-lang-btn:hover {
2690
+ border-color: #3b82f6;
2691
+ }
2692
+ .setup-lang-btn.active {
2693
+ background: #3b82f6;
2694
+ border-color: #3b82f6;
2695
+ color: #fff;
2696
+ }
2697
+
2698
+ .setup-next-btn {
2699
+ width: 100%;
2700
+ background: #18181b;
2701
+ color: #fff;
2702
+ border: none;
2703
+ border-radius: 8px;
2704
+ padding: 9px 0;
2705
+ font-size: 13px;
2706
+ font-weight: 600;
2707
+ cursor: pointer;
2708
+ transition: background .15s, opacity .15s;
2709
+ }
2710
+ .setup-next-btn:hover { background: #3f3f46; }
2711
+ [data-theme="dark"] .setup-next-btn { background: #e4e4e7; color: #18181b; }
2712
+ [data-theme="dark"] .setup-next-btn:hover { background: #fff; }
2713
+
2714
+ /* Fields */
2715
+ .setup-field {
2716
+ display: flex;
2717
+ flex-direction: column;
2718
+ gap: 5px;
2719
+ }
2720
+ .setup-label {
2721
+ font-size: 11px;
2722
+ font-weight: 600;
2723
+ color: var(--color-text-tertiary);
2724
+ text-transform: uppercase;
2725
+ letter-spacing: .06em;
2726
+ }
2727
+ .setup-input {
2728
+ width: 100%;
2729
+ background: var(--color-bg-secondary);
2730
+ border: 1px solid var(--color-border-primary);
2731
+ border-radius: 7px;
2732
+ color: var(--color-text-primary);
2733
+ font-size: 13px;
2734
+ padding: 8px 10px;
2735
+ outline: none;
2736
+ transition: border-color .15s;
2737
+ box-sizing: border-box;
2738
+ }
2739
+ .setup-input:focus {
2740
+ border-color: #3b82f6;
2741
+ box-shadow: 0 0 0 3px rgba(59,130,246,.15);
2742
+ }
2743
+ .setup-input-row {
2744
+ display: flex;
2745
+ gap: 6px;
2746
+ }
2747
+ .setup-input-row .setup-input { flex: 1; }
2748
+
2749
+ /* Test result */
2750
+ .setup-test-result {
2751
+ font-size: 12px;
2752
+ min-height: 16px;
2753
+ text-align: center;
2754
+ }
2755
+ .setup-test-result.result-ok { color: var(--color-success); }
2756
+ .setup-test-result.result-fail { color: var(--color-error); }
2757
+
2758
+ /* Bottom action row: [← Back] [Test & Continue →] */
2759
+ .setup-key-actions {
2760
+ display: flex;
2761
+ gap: 8px;
2762
+ margin-top: 4px;
2763
+ }
2764
+
2765
+ .setup-back-btn {
2766
+ flex-shrink: 0;
2767
+ background: transparent;
2768
+ color: var(--color-text-secondary);
2769
+ border: 1.5px solid var(--color-border-primary);
2770
+ border-radius: 8px;
2771
+ padding: 9px 14px;
2772
+ font-size: 13px;
2773
+ font-weight: 600;
2774
+ cursor: pointer;
2775
+ white-space: nowrap;
2776
+ transition: border-color .15s, color .15s;
2777
+ }
2778
+ .setup-back-btn:hover {
2779
+ border-color: var(--color-text-secondary);
2780
+ color: var(--color-text-primary);
2781
+ }
2782
+
2783
+ /* Submit button */
2784
+ .setup-submit-btn {
2785
+ flex: 1;
2786
+ background: #3b82f6;
2787
+ color: #fff;
2788
+ border: none;
2789
+ border-radius: 8px;
2790
+ padding: 10px 0;
2791
+ font-size: 14px;
2792
+ font-weight: 600;
2793
+ cursor: pointer;
2794
+ transition: background .15s, opacity .15s;
2795
+ }
2796
+ .setup-submit-btn:hover { background: #2563eb; }
2797
+ .setup-submit-btn:disabled { opacity: .5; cursor: default; }
2798
+
2446
2799
  /* ── Onboard panel ───────────────────────────────────────────────────────── */
2447
2800
  #onboard-panel {
2448
2801
  flex: 1;
@@ -2737,6 +3090,18 @@ body {
2737
3090
  flex-direction: column;
2738
3091
  gap: 10px;
2739
3092
  }
3093
+ /* Inner layout: status fields on the left, QR code on the right */
3094
+ .brand-status-main {
3095
+ display: flex;
3096
+ align-items: flex-start;
3097
+ gap: 20px;
3098
+ }
3099
+ .brand-status-fields {
3100
+ flex: 1;
3101
+ display: flex;
3102
+ flex-direction: column;
3103
+ gap: 10px;
3104
+ }
2740
3105
  .brand-status-row {
2741
3106
  display: flex;
2742
3107
  align-items: center;
@@ -2757,9 +3122,164 @@ body {
2757
3122
  padding-top: 12px;
2758
3123
  border-top: 1px solid var(--color-border-primary);
2759
3124
  }
2760
- .badge-active { color: var(--color-success); }
2761
- .badge-expired { color: var(--color-error); }
2762
- .badge-inactive { color: var(--color-text-secondary); }
3125
+ .badge-active { color: var(--color-success); }
3126
+ .badge-expired { color: var(--color-error); }
3127
+ .badge-expiring { color: var(--color-warning); }
3128
+ .badge-inactive { color: var(--color-text-secondary); }
3129
+
3130
+ /* Support QR code */
3131
+ .brand-support-qr {
3132
+ display: flex;
3133
+ flex-direction: column;
3134
+ align-items: center;
3135
+ gap: 8px;
3136
+ flex-shrink: 0;
3137
+ }
3138
+
3139
+ /* Clickable QR button wrapper */
3140
+ .brand-support-qr-btn {
3141
+ position: relative;
3142
+ display: flex;
3143
+ align-items: center;
3144
+ justify-content: center;
3145
+ background: none;
3146
+ border: none;
3147
+ padding: 0;
3148
+ cursor: pointer;
3149
+ border-radius: 10px;
3150
+ overflow: hidden;
3151
+ outline: none;
3152
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
3153
+ }
3154
+ .brand-support-qr-btn:hover {
3155
+ transform: scale(1.03);
3156
+ box-shadow: 0 4px 16px rgba(0,0,0,0.25);
3157
+ }
3158
+ .brand-support-qr-btn:hover .brand-support-qr-zoom-hint {
3159
+ opacity: 1;
3160
+ }
3161
+ .brand-support-qr-btn:focus-visible {
3162
+ box-shadow: 0 0 0 2px var(--color-accent-primary);
3163
+ }
3164
+
3165
+ .brand-support-qr-img {
3166
+ width: 110px;
3167
+ height: 110px;
3168
+ border-radius: 10px;
3169
+ border: 1px solid var(--color-border-primary);
3170
+ object-fit: cover;
3171
+ background: #fff;
3172
+ display: block;
3173
+ }
3174
+
3175
+ /* Hover overlay hint — "Click to enlarge" */
3176
+ .brand-support-qr-zoom-hint {
3177
+ position: absolute;
3178
+ bottom: 0;
3179
+ left: 0;
3180
+ right: 0;
3181
+ background: rgba(0, 0, 0, 0.55);
3182
+ color: #fff;
3183
+ font-size: 10px;
3184
+ font-weight: 500;
3185
+ display: flex;
3186
+ align-items: center;
3187
+ justify-content: center;
3188
+ gap: 4px;
3189
+ padding: 5px 4px;
3190
+ opacity: 0;
3191
+ transition: opacity 0.2s ease;
3192
+ backdrop-filter: blur(2px);
3193
+ -webkit-backdrop-filter: blur(2px);
3194
+ border-radius: 0 0 10px 10px;
3195
+ pointer-events: none;
3196
+ white-space: nowrap;
3197
+ }
3198
+
3199
+ .brand-support-qr-label {
3200
+ font-size: 12px;
3201
+ font-weight: 500;
3202
+ color: var(--color-text-secondary);
3203
+ text-align: center;
3204
+ }
3205
+
3206
+ /* ── QR Lightbox Modal ──────────────────────────────────────── */
3207
+ .qr-lightbox {
3208
+ position: fixed;
3209
+ inset: 0;
3210
+ z-index: 9999;
3211
+ display: flex;
3212
+ align-items: center;
3213
+ justify-content: center;
3214
+ }
3215
+ .qr-lightbox-backdrop {
3216
+ position: absolute;
3217
+ inset: 0;
3218
+ background: rgba(0, 0, 0, 0.65);
3219
+ backdrop-filter: blur(4px);
3220
+ -webkit-backdrop-filter: blur(4px);
3221
+ }
3222
+ .qr-lightbox-content {
3223
+ position: relative;
3224
+ z-index: 1;
3225
+ background: var(--color-bg-primary);
3226
+ border: 1px solid var(--color-border-primary);
3227
+ border-radius: 16px;
3228
+ padding: 28px 32px 24px;
3229
+ display: flex;
3230
+ flex-direction: column;
3231
+ align-items: center;
3232
+ gap: 12px;
3233
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.4);
3234
+ animation: qr-lightbox-in 0.2s ease;
3235
+ }
3236
+ @keyframes qr-lightbox-in {
3237
+ from { opacity: 0; transform: scale(0.88); }
3238
+ to { opacity: 1; transform: scale(1); }
3239
+ }
3240
+ .qr-lightbox-img {
3241
+ width: 240px;
3242
+ height: 240px;
3243
+ border-radius: 10px;
3244
+ object-fit: contain;
3245
+ background: #fff;
3246
+ border: 1px solid var(--color-border-primary);
3247
+ display: block;
3248
+ padding: 8px;
3249
+ }
3250
+ .qr-lightbox-label {
3251
+ font-size: 15px;
3252
+ font-weight: 600;
3253
+ color: var(--color-text-primary);
3254
+ margin: 0;
3255
+ text-align: center;
3256
+ }
3257
+ .qr-lightbox-hint {
3258
+ font-size: 12px;
3259
+ color: var(--color-text-secondary);
3260
+ margin: 0;
3261
+ text-align: center;
3262
+ }
3263
+ .qr-lightbox-close {
3264
+ position: absolute;
3265
+ top: 12px;
3266
+ right: 12px;
3267
+ width: 30px;
3268
+ height: 30px;
3269
+ border: none;
3270
+ background: var(--color-bg-tertiary);
3271
+ color: var(--color-text-secondary);
3272
+ border-radius: 50%;
3273
+ display: flex;
3274
+ align-items: center;
3275
+ justify-content: center;
3276
+ cursor: pointer;
3277
+ transition: background 0.15s ease, color 0.15s ease;
3278
+ }
3279
+ .qr-lightbox-close:hover {
3280
+ background: var(--color-bg-hover);
3281
+ color: var(--color-text-primary);
3282
+ }
2763
3283
 
2764
3284
  .brand-activate-form {
2765
3285
  background: var(--color-bg-secondary);
@@ -2813,6 +3333,68 @@ body {
2813
3333
 
2814
3334
  .brand-warning-bar button:hover { opacity: 1; }
2815
3335
 
3336
+ /* ── Brand activation banner (top info bar, replaces full-screen panel) ──── */
3337
+ .brand-activation-banner {
3338
+ display: flex;
3339
+ align-items: center;
3340
+ gap: 10px;
3341
+ padding: 9px 16px;
3342
+ /* Dark theme default */
3343
+ background: #0d2045;
3344
+ border-bottom: 1px solid #1e3a6e;
3345
+ color: #93c5fd;
3346
+ font-size: 13px;
3347
+ flex-shrink: 0;
3348
+ }
3349
+
3350
+ .brand-activation-banner > span {
3351
+ flex: 1;
3352
+ color: #93c5fd;
3353
+ }
3354
+
3355
+ .brand-activation-banner-link {
3356
+ background: #2563eb;
3357
+ border: none;
3358
+ border-radius: 5px;
3359
+ color: #fff;
3360
+ cursor: pointer;
3361
+ font-size: 12px;
3362
+ font-weight: 600;
3363
+ padding: 4px 12px;
3364
+ white-space: nowrap;
3365
+ transition: opacity 0.15s;
3366
+ }
3367
+
3368
+ .brand-activation-banner-link:hover { opacity: 0.85; }
3369
+
3370
+ .brand-activation-banner-close {
3371
+ background: transparent;
3372
+ border: none;
3373
+ color: #93c5fd;
3374
+ cursor: pointer;
3375
+ font-size: 14px;
3376
+ padding: 0 4px;
3377
+ opacity: 0.6;
3378
+ flex-shrink: 0;
3379
+ }
3380
+
3381
+ .brand-activation-banner-close:hover { opacity: 1; }
3382
+
3383
+ /* Light theme overrides */
3384
+ [data-theme="light"] .brand-activation-banner {
3385
+ background: #eff6ff;
3386
+ border-bottom-color: #bfdbfe;
3387
+ color: #1d4ed8;
3388
+ }
3389
+
3390
+ [data-theme="light"] .brand-activation-banner > span {
3391
+ color: #1d4ed8;
3392
+ }
3393
+
3394
+ [data-theme="light"] .brand-activation-banner-close {
3395
+ color: #1d4ed8;
3396
+ }
3397
+
2816
3398
  /* ── Scrollbar ───────────────────────────────────────────────────────────── */
2817
3399
  ::-webkit-scrollbar { width: 6px; }
2818
3400
  ::-webkit-scrollbar-track { background: transparent; }