@imenam/mcp-messenger 1.0.31 → 1.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/.env.example +12 -22
  2. package/README.md +825 -764
  3. package/dist/src/cli/reset-password.d.ts +12 -0
  4. package/dist/src/cli/reset-password.js +29 -0
  5. package/dist/src/cli/setup-mcp.d.ts +5 -1
  6. package/dist/src/cli/setup-mcp.js +15 -37
  7. package/dist/src/cli/watch-handoff.d.ts +3 -3
  8. package/dist/src/cli/watch-handoff.js +2 -2
  9. package/dist/src/cli/watch.d.ts +1 -1
  10. package/dist/src/cli/watch.js +3 -3
  11. package/dist/src/client/messenger-client.d.ts +3 -3
  12. package/dist/src/client/messenger-client.js +5 -6
  13. package/dist/src/config.d.ts +13 -8
  14. package/dist/src/config.js +32 -43
  15. package/dist/src/core/access-store.d.ts +124 -0
  16. package/dist/src/core/access-store.js +307 -0
  17. package/dist/src/core/credentials.d.ts +28 -0
  18. package/dist/src/core/credentials.js +75 -0
  19. package/dist/src/core/errors.d.ts +5 -0
  20. package/dist/src/core/errors.js +9 -0
  21. package/dist/src/core/store.d.ts +10 -5
  22. package/dist/src/core/store.js +18 -9
  23. package/dist/src/core/types.d.ts +1 -1
  24. package/dist/src/index.js +32 -17
  25. package/dist/src/mcp/start.js +26 -26
  26. package/dist/src/mcp/tools.js +2 -2
  27. package/dist/src/server/app.d.ts +10 -1
  28. package/dist/src/server/app.js +259 -69
  29. package/dist/src/server/console-session.d.ts +31 -21
  30. package/dist/src/server/console-session.js +46 -63
  31. package/dist/src/server/start.d.ts +3 -0
  32. package/dist/src/server/start.js +10 -13
  33. package/dist/src/server/ui/app.js +3997 -2464
  34. package/dist/src/server/ui/index.html +467 -284
  35. package/dist/src/server/ui/styles.css +1263 -18
  36. package/package.json +2 -3
@@ -17,6 +17,8 @@
17
17
  --neutral-soft: #eef0f3;
18
18
  --radius: 8px;
19
19
  --topbar-h: 56px;
20
+ /* Largeur maximale de l'application : au-delà, elle est centrée entre deux marges. */
21
+ --app-max: 1600px;
20
22
  }
21
23
 
22
24
  @media (prefers-color-scheme: dark) {
@@ -77,7 +79,7 @@ body {
77
79
  align-items: center;
78
80
  gap: 16px;
79
81
  height: var(--topbar-h);
80
- padding: 0 20px;
82
+ padding: 0 max(20px, calc((100% - var(--app-max)) / 2 + 20px));
81
83
  background: var(--panel);
82
84
  border-bottom: 1px solid var(--border);
83
85
  }
@@ -560,6 +562,20 @@ body {
560
562
  height: calc(100vh - var(--topbar-h));
561
563
  }
562
564
 
565
+ .console,
566
+ .links {
567
+ max-width: var(--app-max);
568
+ margin: 0 auto;
569
+ }
570
+
571
+ @media (min-width: 1601px) {
572
+ .console,
573
+ .links {
574
+ border-left: 1px solid var(--border);
575
+ border-right: 1px solid var(--border);
576
+ }
577
+ }
578
+
563
579
  .console.is-collapsed {
564
580
  grid-template-columns: 57px var(--w-gutter) var(--w-threads) var(--w-gutter) minmax(0, 1fr);
565
581
  }
@@ -1965,23 +1981,12 @@ body {
1965
1981
  color: var(--ok);
1966
1982
  }
1967
1983
 
1968
- .links-zoom {
1969
- z-index: 1;
1970
- pointer-events: none;
1971
- background: var(--accent);
1972
- opacity: 0.05;
1973
- }
1974
-
1975
1984
  .links-tick {
1976
1985
  z-index: 1;
1977
1986
  pointer-events: none;
1978
1987
  border-top: 1px solid var(--border-soft);
1979
1988
  }
1980
1989
 
1981
- .links-tick--zoom {
1982
- border-top-color: var(--accent-softer);
1983
- }
1984
-
1985
1990
  .links-tick--now {
1986
1991
  border-top: 2px solid var(--ok);
1987
1992
  }
@@ -2012,9 +2017,6 @@ body {
2012
2017
  color: var(--ok);
2013
2018
  }
2014
2019
 
2015
- .links-axis-label--zoom strong {
2016
- color: var(--accent);
2017
- }
2018
2020
 
2019
2021
  .links-axis-old {
2020
2022
  color: var(--text);
@@ -2164,7 +2166,14 @@ body {
2164
2166
  color: var(--muted);
2165
2167
  }
2166
2168
 
2167
- .links-card:has(.links-card-count) .links-card-name {
2169
+ .links-card-line {
2170
+ display: flex;
2171
+ align-items: center;
2172
+ gap: 4px;
2173
+ min-width: 0;
2174
+ }
2175
+
2176
+ .links-card:has(.links-card-count) .links-card-line {
2168
2177
  padding-right: 24px;
2169
2178
  }
2170
2179
 
@@ -2238,6 +2247,98 @@ body {
2238
2247
  flex: none;
2239
2248
  }
2240
2249
 
2250
+ /* Poignée d'une boîte ancienne : discrète tant que la ligne n'est pas survolée ou choisie. */
2251
+ .links-old-row .links-handle {
2252
+ opacity: 0;
2253
+ }
2254
+
2255
+ .links-old-row:hover .links-handle,
2256
+ .links-old-row.is-selected .links-handle {
2257
+ opacity: 1;
2258
+ background: var(--accent);
2259
+ }
2260
+
2261
+ .links-card.is-renaming .links-handle,
2262
+ .links-old-row.is-renaming .links-handle {
2263
+ display: none;
2264
+ }
2265
+
2266
+ /* Crayon de renommage, montré au survol de la boîte. */
2267
+ .links-rename {
2268
+ display: none;
2269
+ place-items: center;
2270
+ flex: none;
2271
+ width: 16px;
2272
+ height: 16px;
2273
+ border-radius: 4px;
2274
+ cursor: pointer;
2275
+ }
2276
+
2277
+ .links-rename:hover {
2278
+ background: var(--accent-soft);
2279
+ }
2280
+
2281
+ .links-rename .icon {
2282
+ width: 12px;
2283
+ height: 12px;
2284
+ color: var(--accent);
2285
+ }
2286
+
2287
+ .links-card:hover .links-rename,
2288
+ .links-old-row:hover .links-rename {
2289
+ display: inline-grid;
2290
+ }
2291
+
2292
+ .links.is-linking .links-rename {
2293
+ display: none;
2294
+ }
2295
+
2296
+ .links-rename-input {
2297
+ z-index: 4;
2298
+ box-sizing: border-box;
2299
+ padding: 0 6px;
2300
+ border: 1.5px solid var(--accent);
2301
+ border-radius: 4px;
2302
+ background: var(--panel);
2303
+ font: inherit;
2304
+ font-size: 12px;
2305
+ font-weight: 600;
2306
+ color: var(--text);
2307
+ outline: none;
2308
+ }
2309
+
2310
+ .links-rename-input.is-invalid {
2311
+ border-color: var(--danger);
2312
+ }
2313
+
2314
+ .links-rename-hint {
2315
+ z-index: 4;
2316
+ padding: 3px 8px;
2317
+ border-radius: 6px;
2318
+ background: var(--text);
2319
+ color: var(--panel);
2320
+ font-size: 11px;
2321
+ white-space: nowrap;
2322
+ pointer-events: none;
2323
+ }
2324
+
2325
+ .links-rename-hint.is-error {
2326
+ background: var(--danger);
2327
+ }
2328
+
2329
+ /* Pendant un glissé : la boîte survolée est la cible, les autres s'estompent. */
2330
+ .links.is-linking .links-card:not(.is-drag-source, .is-drop-target),
2331
+ .links.is-linking .links-old-row:not(.is-drag-source, .is-drop-target) {
2332
+ opacity: 0.6;
2333
+ }
2334
+
2335
+ .links-card.is-drop-target,
2336
+ .links-old-row.is-drop-target {
2337
+ background: var(--accent-soft);
2338
+ border-color: var(--accent);
2339
+ box-shadow: 0 0 0 3px var(--accent-softer);
2340
+ }
2341
+
2241
2342
  .links-old-none {
2242
2343
  z-index: 3;
2243
2344
  font-size: 11px;
@@ -2520,9 +2621,1153 @@ body {
2520
2621
  font-size: 13px;
2521
2622
  }
2522
2623
 
2523
- /* --- Écrans étroits ------------------------------------------------------- */
2624
+ /* --- Menu du compte ------------------------------------------------------- */
2625
+
2626
+ .pill--warn {
2627
+ background: var(--warn-soft);
2628
+ color: var(--warn);
2629
+ }
2630
+
2631
+ .account {
2632
+ position: relative;
2633
+ flex: none;
2634
+ margin-left: auto;
2635
+ }
2636
+
2637
+ /* Les contrôles des boîtes, quand ils sont là, poussent déjà le menu au bord droit. */
2638
+ .topbar-controls:not([hidden]) + .account {
2639
+ margin-left: 0;
2640
+ }
2641
+
2642
+ .account-button {
2643
+ display: inline-flex;
2644
+ align-items: center;
2645
+ gap: 8px;
2646
+ height: 32px;
2647
+ padding: 0 10px 0 4px;
2648
+ border-radius: 999px;
2649
+ border: 1px solid var(--border);
2650
+ background: var(--panel);
2651
+ color: var(--text);
2652
+ font: inherit;
2653
+ font-size: 13px;
2654
+ cursor: pointer;
2655
+ }
2656
+
2657
+ .account-button:hover,
2658
+ .account-button[aria-expanded="true"] {
2659
+ border-color: var(--accent);
2660
+ }
2661
+
2662
+ .account-button[aria-expanded="true"] {
2663
+ background: var(--accent-soft);
2664
+ }
2665
+
2666
+ .account-button:focus-visible {
2667
+ outline: 2px solid var(--accent);
2668
+ outline-offset: 2px;
2669
+ }
2670
+
2671
+ .account-button .icon {
2672
+ width: 14px;
2673
+ height: 14px;
2674
+ color: var(--muted);
2675
+ }
2676
+
2677
+ .account-avatar {
2678
+ width: 24px;
2679
+ height: 24px;
2680
+ border-radius: 50%;
2681
+ display: grid;
2682
+ place-items: center;
2683
+ flex: none;
2684
+ background: var(--text);
2685
+ color: var(--panel);
2686
+ font-size: 11px;
2687
+ font-weight: 700;
2688
+ }
2689
+
2690
+ .account-avatar--lg {
2691
+ width: 36px;
2692
+ height: 36px;
2693
+ font-size: 14px;
2694
+ }
2695
+
2696
+ .account-menu {
2697
+ position: absolute;
2698
+ right: 0;
2699
+ top: calc(100% + 6px);
2700
+ z-index: 20;
2701
+ width: 200px;
2702
+ padding: 6px;
2703
+ border-radius: 10px;
2704
+ border: 1px solid var(--border);
2705
+ background: var(--panel);
2706
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);
2707
+ }
2708
+
2709
+ .account-item {
2710
+ display: flex;
2711
+ align-items: center;
2712
+ gap: 10px;
2713
+ width: 100%;
2714
+ padding: 8px 10px;
2715
+ border: 0;
2716
+ border-radius: 6px;
2717
+ background: none;
2718
+ color: var(--text);
2719
+ font: inherit;
2720
+ font-size: 13px;
2721
+ text-align: left;
2722
+ cursor: pointer;
2723
+ }
2724
+
2725
+ .account-item .icon {
2726
+ color: var(--muted);
2727
+ }
2728
+
2729
+ .account-item:hover,
2730
+ .account-item:focus-visible {
2731
+ background: var(--bg);
2732
+ outline: none;
2733
+ }
2734
+
2735
+ .account-item.is-active {
2736
+ background: var(--accent-soft);
2737
+ color: var(--accent);
2738
+ font-weight: 600;
2739
+ }
2740
+
2741
+ .account-item.is-active .icon {
2742
+ color: var(--accent);
2743
+ }
2744
+
2745
+ .account-sep {
2746
+ height: 1px;
2747
+ margin: 6px -6px;
2748
+ background: var(--border-soft);
2749
+ }
2750
+
2751
+ /* --- Formulaires d'identifiants ------------------------------------------- */
2752
+
2753
+ .field--tight {
2754
+ margin: 16px 0 0;
2755
+ }
2756
+
2757
+ .field-hint {
2758
+ display: block;
2759
+ margin-top: 6px;
2760
+ font-size: 12px;
2761
+ font-weight: 400;
2762
+ line-height: 1.4;
2763
+ color: var(--muted);
2764
+ }
2765
+
2766
+ .field-hint.is-weak {
2767
+ color: var(--danger);
2768
+ }
2769
+
2770
+ .field-hint.is-strong {
2771
+ color: var(--ok);
2772
+ }
2773
+
2774
+ .field-input input.mono {
2775
+ font-size: 14px;
2776
+ letter-spacing: 0.04em;
2777
+ }
2778
+
2779
+ .field-input--spaced {
2780
+ gap: 10px;
2781
+ }
2782
+
2783
+ .field-tag {
2784
+ font-size: 12px;
2785
+ color: var(--accent);
2786
+ flex: none;
2787
+ }
2788
+
2789
+ .card-rule {
2790
+ height: 1px;
2791
+ margin: 20px 0 4px;
2792
+ background: var(--border-soft);
2793
+ }
2794
+
2795
+ .card-note--rule {
2796
+ padding-top: 12px;
2797
+ border-top: 1px solid var(--border-soft);
2798
+ }
2799
+
2800
+ .card-note code {
2801
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
2802
+ font-size: 11px;
2803
+ }
2804
+
2805
+ .check {
2806
+ display: flex;
2807
+ align-items: center;
2808
+ gap: 10px;
2809
+ margin: 16px 0;
2810
+ font-size: 13px;
2811
+ text-align: left;
2812
+ cursor: pointer;
2813
+ }
2814
+
2815
+ .check input {
2816
+ width: 16px;
2817
+ height: 16px;
2818
+ margin: 0;
2819
+ accent-color: var(--accent);
2820
+ }
2821
+
2822
+ /* Robustesse d'un mot de passe : quatre segments, colorés selon le niveau atteint. */
2823
+ .meter {
2824
+ display: grid;
2825
+ grid-template-columns: repeat(4, 1fr);
2826
+ gap: 6px;
2827
+ margin-top: 10px;
2828
+ }
2829
+
2830
+ .meter span {
2831
+ height: 4px;
2832
+ border-radius: 2px;
2833
+ background: var(--neutral-soft);
2834
+ }
2835
+
2836
+ .meter[data-level="1"] span:nth-child(-n + 1) {
2837
+ background: var(--danger);
2838
+ }
2839
+
2840
+ .meter[data-level="2"] span:nth-child(-n + 2) {
2841
+ background: var(--warn);
2842
+ }
2843
+
2844
+ .meter[data-level="3"] span:nth-child(-n + 3),
2845
+ .meter[data-level="4"] span {
2846
+ background: var(--ok);
2847
+ }
2848
+
2849
+ .form-banner {
2850
+ display: flex;
2851
+ align-items: flex-start;
2852
+ gap: 10px;
2853
+ margin: 16px 0 0;
2854
+ padding: 10px 12px;
2855
+ border-radius: var(--radius);
2856
+ font-size: 13px;
2857
+ line-height: 1.4;
2858
+ text-align: left;
2859
+ background: var(--danger-soft);
2860
+ color: var(--danger);
2861
+ }
2862
+
2863
+ .form-banner .icon {
2864
+ margin-top: 1px;
2865
+ }
2866
+
2867
+ .form-banner--warn {
2868
+ background: var(--warn-soft);
2869
+ color: var(--warn);
2870
+ }
2871
+
2872
+ .form-banner--ok {
2873
+ background: var(--ok-soft);
2874
+ color: var(--ok);
2875
+ }
2876
+
2877
+ .login .btn--block {
2878
+ margin-top: 20px;
2879
+ }
2880
+
2881
+ /* --- Pages (clés, compte) -------------------------------------------------- */
2882
+
2883
+ .page {
2884
+ max-width: var(--app-max);
2885
+ margin: 0 auto;
2886
+ padding: 32px 40px 48px;
2887
+ }
2888
+
2889
+ .page--narrow {
2890
+ max-width: 800px;
2891
+ }
2892
+
2893
+ .page-head {
2894
+ display: flex;
2895
+ align-items: flex-start;
2896
+ justify-content: space-between;
2897
+ gap: 24px;
2898
+ }
2899
+
2900
+ .page-head h2 {
2901
+ margin: 0;
2902
+ font-size: 22px;
2903
+ }
2904
+
2905
+ .page-head p {
2906
+ margin: 4px 0 0;
2907
+ font-size: 13px;
2908
+ }
2909
+
2910
+ .page-tools {
2911
+ display: flex;
2912
+ align-items: center;
2913
+ justify-content: space-between;
2914
+ gap: 16px;
2915
+ margin: 20px 0 16px;
2916
+ }
2917
+
2918
+ .page-tools .chips {
2919
+ margin: 0;
2920
+ }
2921
+
2922
+ .chip-count {
2923
+ margin-left: 4px;
2924
+ font-weight: 400;
2925
+ opacity: 0.7;
2926
+ }
2927
+
2928
+ .page-search {
2929
+ display: flex;
2930
+ align-items: center;
2931
+ gap: 8px;
2932
+ width: 300px;
2933
+ height: 36px;
2934
+ padding: 0 12px;
2935
+ border-radius: var(--radius);
2936
+ border: 1px solid var(--border);
2937
+ background: var(--panel);
2938
+ color: var(--muted);
2939
+ }
2940
+
2941
+ .page-search:focus-within {
2942
+ border-color: var(--accent);
2943
+ }
2944
+
2945
+ .page-search input {
2946
+ flex: 1;
2947
+ min-width: 0;
2948
+ border: 0;
2949
+ background: none;
2950
+ font: inherit;
2951
+ font-size: 13px;
2952
+ color: var(--text);
2953
+ outline: none;
2954
+ }
2955
+
2956
+ .page-note {
2957
+ display: flex;
2958
+ align-items: center;
2959
+ gap: 12px;
2960
+ margin: 24px 0 0;
2961
+ padding: 14px 16px;
2962
+ border-radius: var(--radius);
2963
+ background: var(--neutral-soft);
2964
+ color: var(--muted);
2965
+ font-size: 13px;
2966
+ }
2967
+
2968
+ /* Liste des clés : une grille de colonnes fixes, une ligne par clé. */
2969
+ .key-table {
2970
+ border: 1px solid var(--border);
2971
+ border-radius: 10px;
2972
+ background: var(--panel);
2973
+ overflow: hidden;
2974
+ }
2975
+
2976
+ .key-row {
2977
+ display: grid;
2978
+ grid-template-columns: minmax(200px, 2.4fr) minmax(130px, 1.3fr) minmax(150px, 1.6fr) minmax(140px, 1.5fr) minmax(120px, 1.3fr) 130px;
2979
+ align-items: center;
2980
+ gap: 16px;
2981
+ min-height: 64px;
2982
+ padding: 10px 20px 10px 24px;
2983
+ border-top: 1px solid var(--border-soft);
2984
+ font-size: 13px;
2985
+ cursor: pointer;
2986
+ }
2987
+
2988
+ .key-row:hover,
2989
+ .key-row:focus-visible {
2990
+ background: var(--bg);
2991
+ outline: none;
2992
+ }
2993
+
2994
+ .key-row.is-selected {
2995
+ background: var(--accent-soft);
2996
+ }
2997
+
2998
+ .key-row--head {
2999
+ min-height: 40px;
3000
+ border-top: 0;
3001
+ border-bottom: 1px solid var(--border);
3002
+ font-size: 11px;
3003
+ font-weight: 700;
3004
+ letter-spacing: 0.04em;
3005
+ text-transform: uppercase;
3006
+ color: var(--muted);
3007
+ cursor: default;
3008
+ }
3009
+
3010
+ .key-row--head:hover {
3011
+ background: none;
3012
+ }
3013
+
3014
+ .key-row--head + .key-row {
3015
+ border-top: 0;
3016
+ }
3017
+
3018
+ .key-name {
3019
+ display: grid;
3020
+ gap: 2px;
3021
+ min-width: 0;
3022
+ }
3023
+
3024
+ .key-name strong {
3025
+ font-size: 14px;
3026
+ font-weight: 600;
3027
+ overflow: hidden;
3028
+ text-overflow: ellipsis;
3029
+ white-space: nowrap;
3030
+ }
3031
+
3032
+ .key-sub,
3033
+ .key-muted {
3034
+ font-size: 12px;
3035
+ color: var(--muted);
3036
+ }
3037
+
3038
+ .key-recent {
3039
+ color: var(--ok);
3040
+ }
3041
+
3042
+ .key-agent {
3043
+ display: inline-flex;
3044
+ align-items: center;
3045
+ gap: 8px;
3046
+ min-width: 0;
3047
+ }
3048
+
3049
+ .key-agent.is-muted {
3050
+ color: var(--muted);
3051
+ }
3052
+
3053
+ .key-dot {
3054
+ width: 14px;
3055
+ height: 14px;
3056
+ border-radius: 50%;
3057
+ flex: none;
3058
+ }
3059
+
3060
+ .key-actions {
3061
+ display: flex;
3062
+ align-items: center;
3063
+ justify-content: flex-end;
3064
+ gap: 12px;
3065
+ color: var(--muted);
3066
+ }
3067
+
3068
+ /* « Révoquer » n'apparaît qu'au survol : la liste se lit d'abord, elle s'édite ensuite. */
3069
+ .key-revoke {
3070
+ visibility: hidden;
3071
+ padding: 5px 12px;
3072
+ color: var(--danger);
3073
+ font-weight: 600;
3074
+ }
3075
+
3076
+ .key-row:hover .key-revoke,
3077
+ .key-row:focus-within .key-revoke {
3078
+ visibility: visible;
3079
+ }
3080
+
3081
+ .key-revoke:hover {
3082
+ border-color: var(--danger);
3083
+ }
3084
+
3085
+ .key-empty {
3086
+ margin: 0;
3087
+ padding: 28px 24px;
3088
+ color: var(--muted);
3089
+ font-size: 13px;
3090
+ }
3091
+
3092
+ .tag--muted {
3093
+ background: var(--neutral-soft);
3094
+ color: var(--muted);
3095
+ }
3096
+
3097
+ /* --- Volet des clés -------------------------------------------------------- */
3098
+
3099
+ .drawer {
3100
+ position: fixed;
3101
+ inset: var(--topbar-h) 0 0 auto;
3102
+ width: min(480px, 100vw);
3103
+ height: auto;
3104
+ max-width: none;
3105
+ max-height: none;
3106
+ margin: 0;
3107
+ padding: 0;
3108
+ border: 0;
3109
+ border-left: 1px solid var(--border);
3110
+ background: var(--panel);
3111
+ color: var(--text);
3112
+ }
3113
+
3114
+ .drawer::backdrop {
3115
+ background: rgba(28, 32, 36, 0.28);
3116
+ }
3117
+
3118
+ .drawer-body {
3119
+ display: flex;
3120
+ flex-direction: column;
3121
+ height: 100%;
3122
+ }
3123
+
3124
+ .drawer-head {
3125
+ display: flex;
3126
+ align-items: flex-start;
3127
+ justify-content: space-between;
3128
+ gap: 12px;
3129
+ padding: 28px 32px 20px;
3130
+ border-bottom: 1px solid var(--border-soft);
3131
+ }
3132
+
3133
+ .drawer-title h2 {
3134
+ margin: 0;
3135
+ font-size: 18px;
3136
+ }
3137
+
3138
+ .drawer-title p {
3139
+ margin: 6px 0 0;
3140
+ font-size: 13px;
3141
+ }
3142
+
3143
+ .drawer-name {
3144
+ display: flex;
3145
+ align-items: center;
3146
+ gap: 6px;
3147
+ }
3148
+
3149
+ .drawer-name .btn--icon {
3150
+ padding: 4px;
3151
+ }
3152
+
3153
+ .inline-input {
3154
+ width: 100%;
3155
+ height: 34px;
3156
+ padding: 0 10px;
3157
+ border-radius: var(--radius);
3158
+ border: 1px solid var(--accent);
3159
+ background: var(--panel);
3160
+ color: var(--text);
3161
+ font: inherit;
3162
+ font-size: 15px;
3163
+ font-weight: 600;
3164
+ outline: none;
3165
+ }
3166
+
3167
+ .drawer-content {
3168
+ flex: 1;
3169
+ overflow-y: auto;
3170
+ padding: 4px 32px 24px;
3171
+ }
3172
+
3173
+ .drawer-foot {
3174
+ display: flex;
3175
+ justify-content: flex-end;
3176
+ align-items: center;
3177
+ gap: 12px;
3178
+ padding: 16px 32px;
3179
+ border-top: 1px solid var(--border-soft);
3180
+ }
3181
+
3182
+ .drawer-tags {
3183
+ display: flex;
3184
+ gap: 8px;
3185
+ margin: 20px 0 4px;
3186
+ }
3187
+
3188
+ .drawer-tags .tag {
3189
+ font-size: 12px;
3190
+ padding: 2px 10px;
3191
+ }
3192
+
3193
+ .drawer-section {
3194
+ margin-top: 20px;
3195
+ padding-top: 20px;
3196
+ border-top: 1px solid var(--border-soft);
3197
+ }
3198
+
3199
+ .drawer-section h3 {
3200
+ margin: 0;
3201
+ font-size: 14px;
3202
+ }
3203
+
3204
+ .drawer-section-head {
3205
+ display: flex;
3206
+ justify-content: space-between;
3207
+ align-items: baseline;
3208
+ margin-bottom: 12px;
3209
+ }
3210
+
3211
+ .drawer-row {
3212
+ display: flex;
3213
+ align-items: flex-start;
3214
+ justify-content: space-between;
3215
+ gap: 16px;
3216
+ }
3217
+
3218
+ .drawer-row p {
3219
+ margin: 6px 0 0;
3220
+ }
3221
+
3222
+ .drawer-row .btn {
3223
+ flex: none;
3224
+ }
3225
+
3226
+ .segmented {
3227
+ display: grid;
3228
+ grid-template-columns: 1fr 1fr;
3229
+ gap: 2px;
3230
+ padding: 3px;
3231
+ margin-bottom: 12px;
3232
+ border-radius: var(--radius);
3233
+ background: var(--neutral-soft);
3234
+ }
3235
+
3236
+ .segmented-item {
3237
+ height: 30px;
3238
+ border: 1px solid transparent;
3239
+ border-radius: 6px;
3240
+ background: none;
3241
+ color: var(--muted);
3242
+ font: inherit;
3243
+ font-size: 13px;
3244
+ cursor: pointer;
3245
+ }
3246
+
3247
+ .segmented-item.is-active {
3248
+ border-color: var(--border);
3249
+ background: var(--panel);
3250
+ color: var(--text);
3251
+ font-weight: 600;
3252
+ }
3253
+
3254
+ .choice {
3255
+ display: grid;
3256
+ grid-template-columns: repeat(4, 1fr);
3257
+ gap: 10px;
3258
+ }
3259
+
3260
+ .choice-item {
3261
+ height: 34px;
3262
+ border-radius: var(--radius);
3263
+ border: 1px solid var(--border);
3264
+ background: var(--panel);
3265
+ color: var(--text);
3266
+ font: inherit;
3267
+ font-size: 13px;
3268
+ cursor: pointer;
3269
+ }
3270
+
3271
+ .choice-item:hover {
3272
+ border-color: var(--accent);
3273
+ }
3274
+
3275
+ .choice-item.is-active {
3276
+ border-color: var(--accent);
3277
+ background: var(--accent-soft);
3278
+ color: var(--accent);
3279
+ font-weight: 600;
3280
+ }
3281
+
3282
+ .segmented-item:focus-visible,
3283
+ .choice-item:focus-visible,
3284
+ .subtab:focus-visible {
3285
+ outline: 2px solid var(--accent);
3286
+ outline-offset: 2px;
3287
+ }
3288
+
3289
+ .notice {
3290
+ display: flex;
3291
+ gap: 12px;
3292
+ margin-top: 20px;
3293
+ padding: 12px 14px;
3294
+ border-radius: var(--radius);
3295
+ font-size: 12px;
3296
+ }
3297
+
3298
+ .notice .icon {
3299
+ width: 18px;
3300
+ height: 18px;
3301
+ margin-top: 1px;
3302
+ }
3303
+
3304
+ .notice div {
3305
+ display: grid;
3306
+ gap: 2px;
3307
+ }
3308
+
3309
+ .notice strong {
3310
+ font-size: 13px;
3311
+ }
3312
+
3313
+ .notice--ok {
3314
+ background: var(--ok-soft);
3315
+ color: var(--ok);
3316
+ }
3317
+
3318
+ .secret {
3319
+ display: flex;
3320
+ align-items: center;
3321
+ gap: 12px;
3322
+ padding: 8px 8px 8px 14px;
3323
+ border-radius: var(--radius);
3324
+ border: 1px solid var(--border);
3325
+ background: var(--bg);
3326
+ }
3327
+
3328
+ .secret-value {
3329
+ flex: 1;
3330
+ min-width: 0;
3331
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
3332
+ font-size: 13px;
3333
+ overflow-wrap: anywhere;
3334
+ user-select: all;
3335
+ }
3336
+
3337
+ .secret-warning {
3338
+ display: flex;
3339
+ gap: 8px;
3340
+ margin: 10px 0 0;
3341
+ font-size: 12px;
3342
+ line-height: 1.4;
3343
+ color: var(--warn);
3344
+ }
3345
+
3346
+ .secret-warning .icon {
3347
+ width: 14px;
3348
+ height: 14px;
3349
+ margin-top: 1px;
3350
+ }
3351
+
3352
+ .btn--small {
3353
+ padding: 5px 10px;
3354
+ font-size: 12px;
3355
+ }
3356
+
3357
+ .btn--primary.btn--small {
3358
+ padding: 7px 12px;
3359
+ font-size: 13px;
3360
+ }
3361
+
3362
+ .btn--danger-text {
3363
+ color: var(--danger);
3364
+ font-weight: 600;
3365
+ }
3366
+
3367
+ .btn--danger-text:hover {
3368
+ border-color: var(--danger);
3369
+ }
3370
+
3371
+ .btn--link.btn--danger-text {
3372
+ padding-left: 0;
3373
+ font-weight: 400;
3374
+ }
3375
+
3376
+ .subtabs {
3377
+ display: flex;
3378
+ gap: 20px;
3379
+ margin-bottom: 12px;
3380
+ border-bottom: 1px solid var(--border-soft);
3381
+ }
3382
+
3383
+ .subtab {
3384
+ padding: 6px 0;
3385
+ border: 0;
3386
+ border-bottom: 2px solid transparent;
3387
+ background: none;
3388
+ color: var(--muted);
3389
+ font: inherit;
3390
+ font-size: 13px;
3391
+ cursor: pointer;
3392
+ }
3393
+
3394
+ .subtab.is-active {
3395
+ border-bottom-color: var(--accent);
3396
+ color: var(--accent);
3397
+ font-weight: 600;
3398
+ }
3399
+
3400
+ /* Bloc de code sombre dans les deux thèmes : c'est ce qui se colle dans un fichier. */
3401
+ .code-block {
3402
+ position: relative;
3403
+ border-radius: var(--radius);
3404
+ background: #1c2024;
3405
+ }
3406
+
3407
+ .code-block pre {
3408
+ margin: 0;
3409
+ padding: 14px 44px 14px 16px;
3410
+ overflow-x: auto;
3411
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
3412
+ font-size: 12px;
3413
+ line-height: 1.5;
3414
+ color: #e6e9ee;
3415
+ white-space: pre;
3416
+ }
3417
+
3418
+ .code-block .copy {
3419
+ position: absolute;
3420
+ top: 10px;
3421
+ right: 10px;
3422
+ color: #98a1b0;
3423
+ }
3424
+
3425
+ .props {
3426
+ display: grid;
3427
+ grid-template-columns: 150px minmax(0, 1fr);
3428
+ margin: 16px 0 0;
3429
+ padding-top: 12px;
3430
+ border-top: 1px solid var(--border-soft);
3431
+ font-size: 13px;
3432
+ }
3433
+
3434
+ .props dt {
3435
+ padding: 7px 0;
3436
+ color: var(--muted);
3437
+ }
3438
+
3439
+ .props dd {
3440
+ display: flex;
3441
+ align-items: center;
3442
+ justify-content: space-between;
3443
+ gap: 12px;
3444
+ margin: 0;
3445
+ padding: 7px 0;
3446
+ min-width: 0;
3447
+ }
3448
+
3449
+ /* Prolonger : l'action courante en un clic, les autres durées derrière la flèche. */
3450
+ .split {
3451
+ position: relative;
3452
+ display: inline-flex;
3453
+ }
3454
+
3455
+ .split-main {
3456
+ border-top-right-radius: 0;
3457
+ border-bottom-right-radius: 0;
3458
+ font-weight: 600;
3459
+ }
3460
+
3461
+ .split-more {
3462
+ margin-left: -1px;
3463
+ padding: 5px 6px;
3464
+ border-top-left-radius: 0;
3465
+ border-bottom-left-radius: 0;
3466
+ }
3467
+
3468
+ .split-more .icon {
3469
+ width: 12px;
3470
+ height: 12px;
3471
+ }
3472
+
3473
+ .split-menu {
3474
+ position: absolute;
3475
+ right: 0;
3476
+ top: calc(100% + 4px);
3477
+ z-index: 5;
3478
+ min-width: 190px;
3479
+ padding: 4px;
3480
+ border-radius: var(--radius);
3481
+ border: 1px solid var(--border);
3482
+ background: var(--panel);
3483
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
3484
+ }
3485
+
3486
+ .split-item {
3487
+ display: block;
3488
+ width: 100%;
3489
+ padding: 7px 10px;
3490
+ border: 0;
3491
+ border-radius: 6px;
3492
+ background: none;
3493
+ color: var(--text);
3494
+ font: inherit;
3495
+ font-size: 13px;
3496
+ text-align: left;
3497
+ cursor: pointer;
3498
+ }
3499
+
3500
+ .split-item:hover {
3501
+ background: var(--bg);
3502
+ }
3503
+
3504
+ .key-boxes {
3505
+ list-style: none;
3506
+ margin: 0;
3507
+ padding: 0;
3508
+ display: grid;
3509
+ gap: 4px;
3510
+ }
3511
+
3512
+ .key-box {
3513
+ display: flex;
3514
+ align-items: center;
3515
+ gap: 12px;
3516
+ width: 100%;
3517
+ padding: 6px 8px;
3518
+ margin: 0 -8px;
3519
+ border: 0;
3520
+ border-radius: var(--radius);
3521
+ background: none;
3522
+ color: var(--text);
3523
+ font: inherit;
3524
+ text-align: left;
3525
+ cursor: pointer;
3526
+ }
3527
+
3528
+ .key-box:hover {
3529
+ background: var(--bg);
3530
+ }
3531
+
3532
+ .key-box .key-name {
3533
+ flex: 1;
3534
+ }
3535
+
3536
+ .key-box strong {
3537
+ font-size: 13px;
3538
+ }
3539
+
3540
+ .key-box > .icon {
3541
+ color: var(--muted);
3542
+ }
3543
+
3544
+ .danger-zone {
3545
+ display: flex;
3546
+ align-items: center;
3547
+ justify-content: space-between;
3548
+ gap: 16px;
3549
+ margin-top: 24px;
3550
+ padding: 16px;
3551
+ border-radius: var(--radius);
3552
+ background: var(--danger-soft);
3553
+ color: var(--danger);
3554
+ }
3555
+
3556
+ .danger-zone h3 {
3557
+ margin: 0;
3558
+ font-size: 14px;
3559
+ }
3560
+
3561
+ .danger-zone p {
3562
+ margin: 4px 0 0;
3563
+ font-size: 12px;
3564
+ }
3565
+
3566
+ /* --- Confirmation de révocation ------------------------------------------- */
3567
+
3568
+ .modal--confirm {
3569
+ width: min(440px, calc(100vw - 32px));
3570
+ }
3571
+
3572
+ .modal--confirm .modal-card {
3573
+ padding: 24px 24px 16px;
3574
+ }
3575
+
3576
+ .confirm-head {
3577
+ display: flex;
3578
+ gap: 16px;
3579
+ }
3580
+
3581
+ .confirm-head h2 {
3582
+ margin: 0;
3583
+ font-size: 17px;
3584
+ }
3585
+
3586
+ .confirm-head p {
3587
+ margin: 4px 0 0;
3588
+ }
3589
+
3590
+ .confirm-badge {
3591
+ width: 40px;
3592
+ height: 40px;
3593
+ border-radius: 50%;
3594
+ display: grid;
3595
+ place-items: center;
3596
+ flex: none;
3597
+ background: var(--danger-soft);
3598
+ color: var(--danger);
3599
+ }
3600
+
3601
+ .confirm-list {
3602
+ list-style: none;
3603
+ margin: 20px 0 0 56px;
3604
+ padding: 0;
3605
+ display: grid;
3606
+ gap: 12px;
3607
+ font-size: 13px;
3608
+ }
3609
+
3610
+ .confirm-list li {
3611
+ display: flex;
3612
+ gap: 8px;
3613
+ }
3614
+
3615
+ .confirm-list .icon {
3616
+ width: 14px;
3617
+ height: 14px;
3618
+ margin-top: 2px;
3619
+ stroke-width: 2.5;
3620
+ }
3621
+
3622
+ .confirm-list .is-lost .icon {
3623
+ color: var(--danger);
3624
+ }
3625
+
3626
+ .confirm-list .is-kept .icon {
3627
+ color: var(--ok);
3628
+ }
3629
+
3630
+ .confirm-note {
3631
+ margin: 12px 0 0 56px;
3632
+ font-size: 12px;
3633
+ color: var(--muted);
3634
+ }
3635
+
3636
+ .modal--confirm .modal-foot {
3637
+ margin: 20px -24px 0;
3638
+ padding: 16px 24px 0;
3639
+ border-top: 1px solid var(--border-soft);
3640
+ }
3641
+
3642
+ /* --- Mon compte ------------------------------------------------------------ */
3643
+
3644
+ .panel-card {
3645
+ margin-top: 24px;
3646
+ padding: 20px 24px;
3647
+ border-radius: 10px;
3648
+ border: 1px solid var(--border);
3649
+ background: var(--panel);
3650
+ }
3651
+
3652
+ .panel-card h3 {
3653
+ margin: 0;
3654
+ font-size: 15px;
3655
+ }
3656
+
3657
+ .panel-card h3 + .key-muted {
3658
+ margin: 4px 0 0;
3659
+ }
3660
+
3661
+ .panel-card--row {
3662
+ display: flex;
3663
+ align-items: center;
3664
+ gap: 16px;
3665
+ }
3666
+
3667
+ .panel-card-main {
3668
+ flex: 1;
3669
+ display: grid;
3670
+ gap: 2px;
3671
+ min-width: 0;
3672
+ }
3673
+
3674
+ .panel-card-title {
3675
+ font-size: 15px;
3676
+ }
3677
+
3678
+ .panel-card--flush {
3679
+ padding: 0;
3680
+ }
3681
+
3682
+ .panel-card-head {
3683
+ padding: 20px 24px 16px;
3684
+ border-bottom: 1px solid var(--border-soft);
3685
+ }
3686
+
3687
+ .panel-card-foot {
3688
+ display: flex;
3689
+ justify-content: flex-end;
3690
+ align-items: center;
3691
+ gap: 12px;
3692
+ margin-top: 16px;
3693
+ }
3694
+
3695
+ .panel-card-foot--start {
3696
+ justify-content: flex-start;
3697
+ flex-wrap: wrap;
3698
+ margin: 0;
3699
+ padding: 8px 24px 16px;
3700
+ }
3701
+
3702
+ .panel-card-foot--start .form-banner {
3703
+ margin: 0;
3704
+ }
3705
+
3706
+ .form-grid {
3707
+ display: grid;
3708
+ grid-template-columns: 1fr 1fr;
3709
+ column-gap: 24px;
3710
+ max-width: 680px;
3711
+ }
3712
+
3713
+ .form-grid-full {
3714
+ grid-column: 1 / -1;
3715
+ max-width: calc(50% - 12px);
3716
+ }
3717
+
3718
+ .session-list {
3719
+ list-style: none;
3720
+ margin: 0;
3721
+ padding: 0 24px;
3722
+ }
3723
+
3724
+ .session {
3725
+ display: flex;
3726
+ align-items: center;
3727
+ gap: 16px;
3728
+ padding: 14px 0;
3729
+ font-size: 13px;
3730
+ }
3731
+
3732
+ .session + .session {
3733
+ border-top: 1px solid var(--border-soft);
3734
+ }
3735
+
3736
+ .session > .icon {
3737
+ width: 20px;
3738
+ height: 20px;
3739
+ color: var(--muted);
3740
+ }
3741
+
3742
+ .session .key-name {
3743
+ flex: 1;
3744
+ }
3745
+
3746
+ .session .key-name strong {
3747
+ font-size: 13px;
3748
+ }
3749
+
3750
+ .session .tag {
3751
+ font-size: 12px;
3752
+ padding: 2px 10px;
3753
+ }
3754
+
3755
+ /* --- Écrans étroits ------------------------------------------------------- */
3756
+
3757
+ @media (max-width: 1000px) {
3758
+ .page {
3759
+ padding: 24px 20px 40px;
3760
+ }
3761
+
3762
+ .key-row {
3763
+ grid-template-columns: minmax(160px, 2fr) minmax(120px, 1.2fr) minmax(0, 1.4fr) 100px;
3764
+ }
3765
+
3766
+ .key-row > :nth-child(4),
3767
+ .key-row > :nth-child(5) {
3768
+ display: none;
3769
+ }
2524
3770
 
2525
- @media (max-width: 1000px) {
2526
3771
  .topbar-search {
2527
3772
  max-width: 240px;
2528
3773
  }