@qodalis/cli 2.0.0-beta.8 → 2.0.0-rc.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.
@@ -171,6 +171,8 @@
171
171
  overflow-x: auto;
172
172
  overflow-y: hidden;
173
173
  flex-shrink: 0;
174
+ scrollbar-width: thin;
175
+ scrollbar-color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.3)) transparent;
174
176
  }
175
177
 
176
178
  .cli-panel-tabs::-webkit-scrollbar {
@@ -656,6 +658,18 @@
656
658
  letter-spacing: 0.03em;
657
659
  }
658
660
 
661
+ /* Phones: icon only, so the tab covers as little of the page as possible */
662
+ @media (max-width: 600px) {
663
+ .cli-panel-hide-tab {
664
+ padding: 6px 8px;
665
+ }
666
+
667
+ .cli-panel-hide-tab .cli-panel-hide-tab-label,
668
+ .cli-panel-hide-tab .cli-panel-hide-tab-arrow {
669
+ display: none;
670
+ }
671
+ }
672
+
659
673
  /* Arrow pulse on hover */
660
674
  @keyframes cli-hide-tab-pulse {
661
675
  0%, 100% { transform: translateX(0); }
@@ -809,6 +823,398 @@
809
823
  left: auto;
810
824
  }
811
825
 
826
+ /* ─── Status indicators ──────────────────────────────────── */
827
+
828
+ .cli-panel-status-indicators {
829
+ display: flex;
830
+ align-items: center;
831
+ gap: 14px;
832
+ margin-left: 24px;
833
+ font-size: 12px;
834
+ overflow: hidden;
835
+ white-space: nowrap;
836
+ }
837
+
838
+ .cli-panel-status-item {
839
+ display: flex;
840
+ align-items: center;
841
+ gap: 5px;
842
+ color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.6));
843
+ }
844
+
845
+ .cli-panel-status-dot {
846
+ width: 6px;
847
+ height: 6px;
848
+ border-radius: 50%;
849
+ flex-shrink: 0;
850
+ background: var(--cli-status-neutral, #6b7280);
851
+ }
852
+
853
+ .cli-panel-status-dot.dot-idle {
854
+ background: var(--cli-status-idle, #3fb950);
855
+ }
856
+
857
+ .cli-panel-status-dot.dot-running {
858
+ background: var(--cli-status-running, #f0883e);
859
+ animation: cliStatusPulse 1.5s ease-in-out infinite;
860
+ }
861
+
862
+ .cli-panel-status-dot.dot-error {
863
+ background: var(--cli-status-error, #f85149);
864
+ }
865
+
866
+ .cli-panel-status-icon {
867
+ flex-shrink: 0;
868
+ }
869
+
870
+ .cli-panel-status-icon.status-success {
871
+ color: var(--cli-status-idle, #3fb950);
872
+ }
873
+
874
+ .cli-panel-status-icon.status-error {
875
+ color: var(--cli-status-error, #f85149);
876
+ }
877
+
878
+ .cli-panel-status-label {
879
+ overflow: hidden;
880
+ text-overflow: ellipsis;
881
+ }
882
+
883
+ .cli-panel-status-item.status-muted {
884
+ color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.4));
885
+ }
886
+
887
+ .cli-panel-status-item.status-text {
888
+ max-width: 200px;
889
+ }
890
+
891
+ .cli-panel-status-item.status-text.level-info {
892
+ color: var(--cli-panel-accent, #818cf8);
893
+ }
894
+
895
+ .cli-panel-status-item.status-text.level-success {
896
+ color: var(--cli-status-idle, #3fb950);
897
+ }
898
+
899
+ .cli-panel-status-item.status-text.level-warn {
900
+ color: var(--cli-status-running, #f0883e);
901
+ }
902
+
903
+ .cli-panel-status-item.status-text.level-error {
904
+ color: var(--cli-status-error, #f85149);
905
+ }
906
+
907
+ .cli-panel-status-item.status-running {
908
+ color: var(--cli-status-running, #f0883e);
909
+ }
910
+
911
+ .cli-panel-status-item.status-clickable {
912
+ cursor: pointer;
913
+ border-radius: 4px;
914
+ padding: 2px 6px;
915
+ margin: -2px -6px;
916
+ transition: background-color 0.15s ease;
917
+ }
918
+
919
+ .cli-panel-status-item.status-clickable:hover {
920
+ background-color: var(--cli-btn-hover-bg, rgba(129, 140, 248, 0.12));
921
+ }
922
+
923
+ /* ─── Compact status indicators (vertical positions) ───── */
924
+
925
+ .cli-panel-status-indicators-compact {
926
+ display: none;
927
+ }
928
+
929
+ .cli-panel-wrapper[data-position="left"] .cli-panel-status-indicators-compact,
930
+ .cli-panel-wrapper[data-position="right"] .cli-panel-status-indicators-compact {
931
+ display: flex;
932
+ flex-direction: column;
933
+ align-items: center;
934
+ gap: 10px;
935
+ padding: 12px 0;
936
+ }
937
+
938
+ .cli-panel-status-compact-item {
939
+ display: flex;
940
+ align-items: center;
941
+ justify-content: center;
942
+ width: 20px;
943
+ height: 20px;
944
+ cursor: default;
945
+ color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.6));
946
+ font-size: 12px;
947
+ }
948
+
949
+ .cli-panel-status-compact-item.status-clickable {
950
+ cursor: pointer;
951
+ border-radius: 4px;
952
+ }
953
+
954
+ .cli-panel-status-compact-item.status-clickable:hover {
955
+ background-color: var(--cli-btn-hover-bg, rgba(129, 140, 248, 0.12));
956
+ }
957
+
958
+ .cli-panel-status-compact-item.status-muted {
959
+ color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.4));
960
+ }
961
+
962
+ .cli-panel-status-compact-dot {
963
+ width: 6px;
964
+ height: 6px;
965
+ border-radius: 50%;
966
+ flex-shrink: 0;
967
+ }
968
+
969
+ .cli-panel-status-compact-dot.level-info {
970
+ background: var(--cli-panel-accent, #818cf8);
971
+ }
972
+
973
+ .cli-panel-status-compact-dot.level-success {
974
+ background: var(--cli-status-idle, #3fb950);
975
+ }
976
+
977
+ .cli-panel-status-compact-dot.level-warn {
978
+ background: var(--cli-status-running, #f0883e);
979
+ }
980
+
981
+ .cli-panel-status-compact-dot.level-error {
982
+ background: var(--cli-status-error, #f85149);
983
+ }
984
+
985
+ /* ─── Tab dot ────────────────────────────────────────────── */
986
+
987
+ .cli-panel-tab-dot {
988
+ width: 6px;
989
+ height: 6px;
990
+ border-radius: 50%;
991
+ flex-shrink: 0;
992
+ background: var(--cli-status-idle, #3fb950);
993
+ }
994
+
995
+ .cli-panel-tab-dot.dot-running {
996
+ background: var(--cli-status-running, #f0883e);
997
+ animation: cliStatusPulse 1.5s ease-in-out infinite;
998
+ }
999
+
1000
+ .cli-panel-tab-dot.dot-error {
1001
+ background: var(--cli-status-error, #f85149);
1002
+ }
1003
+
1004
+ /* ─── Services / Servers dropdown ────────────────────────── */
1005
+
1006
+ .cli-panel-services-dropdown {
1007
+ position: fixed;
1008
+ background-color: var(--cli-panel-header-bg, #1f2937);
1009
+ border: 1px solid var(--cli-panel-border, #374151);
1010
+ border-radius: 8px;
1011
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
1012
+ z-index: 1100;
1013
+ min-width: 260px;
1014
+ max-width: 380px;
1015
+ overflow: hidden;
1016
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
1017
+ }
1018
+
1019
+ .cli-panel-services-dropdown-header {
1020
+ padding: 10px 14px 8px;
1021
+ font-size: 11px;
1022
+ font-weight: 600;
1023
+ text-transform: uppercase;
1024
+ letter-spacing: 0.05em;
1025
+ color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.5));
1026
+ border-bottom: 1px solid var(--cli-panel-border, #374151);
1027
+ }
1028
+
1029
+ .cli-panel-services-dropdown-list {
1030
+ max-height: 240px;
1031
+ overflow-y: auto;
1032
+ scrollbar-width: thin;
1033
+ scrollbar-color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.2)) transparent;
1034
+ }
1035
+
1036
+ .cli-panel-services-dropdown-list::-webkit-scrollbar {
1037
+ width: 6px;
1038
+ }
1039
+
1040
+ .cli-panel-services-dropdown-list::-webkit-scrollbar-track {
1041
+ background: transparent;
1042
+ }
1043
+
1044
+ .cli-panel-services-dropdown-list::-webkit-scrollbar-thumb {
1045
+ background: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.2));
1046
+ border-radius: 3px;
1047
+ }
1048
+
1049
+ .cli-panel-services-dropdown-list::-webkit-scrollbar-thumb:hover {
1050
+ background: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.35));
1051
+ }
1052
+
1053
+ .cli-panel-services-dropdown-item {
1054
+ display: flex;
1055
+ align-items: flex-start;
1056
+ gap: 10px;
1057
+ padding: 10px 14px;
1058
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
1059
+ transition: background-color 0.15s ease;
1060
+ }
1061
+
1062
+ .cli-panel-services-dropdown-item:last-child {
1063
+ border-bottom: none;
1064
+ }
1065
+
1066
+ .cli-panel-services-dropdown-item:hover {
1067
+ background-color: var(--cli-btn-hover-bg, rgba(129, 140, 248, 0.08));
1068
+ }
1069
+
1070
+ .cli-panel-svc-dot {
1071
+ width: 7px;
1072
+ height: 7px;
1073
+ border-radius: 50%;
1074
+ flex-shrink: 0;
1075
+ margin-top: 5px;
1076
+ }
1077
+
1078
+ .cli-panel-svc-dot.svc-running {
1079
+ background: var(--cli-status-idle, #3fb950);
1080
+ }
1081
+
1082
+ .cli-panel-svc-dot.svc-stopped {
1083
+ background: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.3));
1084
+ }
1085
+
1086
+ .cli-panel-svc-info {
1087
+ flex: 1;
1088
+ min-width: 0;
1089
+ display: flex;
1090
+ flex-direction: column;
1091
+ gap: 2px;
1092
+ }
1093
+
1094
+ .cli-panel-svc-name {
1095
+ font-size: 13px;
1096
+ font-weight: 500;
1097
+ color: var(--cli-panel-text, rgba(255, 255, 255, 0.87));
1098
+ overflow: hidden;
1099
+ text-overflow: ellipsis;
1100
+ white-space: nowrap;
1101
+ }
1102
+
1103
+ .cli-panel-svc-desc {
1104
+ font-size: 11px;
1105
+ color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.5));
1106
+ overflow: hidden;
1107
+ text-overflow: ellipsis;
1108
+ white-space: nowrap;
1109
+ }
1110
+
1111
+ .cli-panel-svc-status {
1112
+ font-size: 11px;
1113
+ flex-shrink: 0;
1114
+ color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.5));
1115
+ margin-top: 1px;
1116
+ }
1117
+
1118
+ .cli-panel-srv-meta {
1119
+ display: flex;
1120
+ flex-direction: column;
1121
+ align-items: flex-end;
1122
+ gap: 2px;
1123
+ flex-shrink: 0;
1124
+ }
1125
+
1126
+ .cli-panel-services-dropdown-empty {
1127
+ padding: 16px 14px;
1128
+ font-size: 12px;
1129
+ color: var(--cli-panel-text-secondary, rgba(255, 255, 255, 0.4));
1130
+ text-align: center;
1131
+ }
1132
+
1133
+ /* ─── Glow line ──────────────────────────────────────────── */
1134
+
1135
+ .cli-panel-glow-line {
1136
+ position: absolute;
1137
+ bottom: 0;
1138
+ left: 0;
1139
+ right: 0;
1140
+ height: 2px;
1141
+ background: linear-gradient(90deg, transparent, var(--cli-status-glow, var(--cli-panel-accent, #818cf8)), #a78bfa, var(--cli-status-glow, var(--cli-panel-accent, #818cf8)), transparent);
1142
+ background-size: 200% 100%;
1143
+ opacity: 0.4;
1144
+ animation: cliGlowShift 8s ease-in-out infinite;
1145
+ transition: opacity 0.6s ease;
1146
+ pointer-events: none;
1147
+ }
1148
+
1149
+ .cli-panel-glow-line.glow-active {
1150
+ opacity: 0.8;
1151
+ animation-duration: 3s;
1152
+ }
1153
+
1154
+ /* Glow line for vertical positions */
1155
+ .cli-panel-wrapper[data-position="left"] .cli-panel-glow-line {
1156
+ bottom: auto;
1157
+ top: 0;
1158
+ left: auto;
1159
+ right: 0;
1160
+ width: 2px;
1161
+ height: 100%;
1162
+ background: linear-gradient(180deg, transparent, var(--cli-status-glow, var(--cli-panel-accent, #818cf8)), #a78bfa, var(--cli-status-glow, var(--cli-panel-accent, #818cf8)), transparent);
1163
+ background-size: 100% 200%;
1164
+ }
1165
+
1166
+ .cli-panel-wrapper[data-position="right"] .cli-panel-glow-line {
1167
+ bottom: auto;
1168
+ top: 0;
1169
+ left: 0;
1170
+ right: auto;
1171
+ width: 2px;
1172
+ height: 100%;
1173
+ background: linear-gradient(180deg, transparent, var(--cli-status-glow, var(--cli-panel-accent, #818cf8)), #a78bfa, var(--cli-status-glow, var(--cli-panel-accent, #818cf8)), transparent);
1174
+ background-size: 100% 200%;
1175
+ }
1176
+
1177
+ /* ─── Animations ─────────────────────────────────────────── */
1178
+
1179
+ @keyframes cliStatusPulse {
1180
+ 0%, 100% { opacity: 1; }
1181
+ 50% { opacity: 0.3; }
1182
+ }
1183
+
1184
+ @keyframes cliGlowShift {
1185
+ 0% { background-position: 200% center; }
1186
+ 100% { background-position: -200% center; }
1187
+ }
1188
+
1189
+ /* ─── Accessibility ──────────────────────────────────────── */
1190
+
1191
+ @media (prefers-reduced-motion: reduce) {
1192
+ .cli-panel-glow-line,
1193
+ .cli-panel-status-dot,
1194
+ .cli-panel-tab-dot {
1195
+ animation: none !important;
1196
+ }
1197
+ }
1198
+
1199
+ /* ─── Scrollbar styling — scoped to CLI containers ────────── */
1200
+
1201
+ .cli-panel-wrapper .xterm .xterm-viewport {
1202
+ overscroll-behavior: contain;
1203
+ }
1204
+
1205
+ .cli-panel-wrapper .xterm .xterm-viewport::-webkit-scrollbar {
1206
+ width: 8px;
1207
+ }
1208
+
1209
+ .cli-panel-wrapper .xterm .xterm-viewport::-webkit-scrollbar-thumb {
1210
+ background: #444;
1211
+ border-radius: 4px;
1212
+ }
1213
+
1214
+ .cli-panel-wrapper .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover {
1215
+ background: #666;
1216
+ }
1217
+
812
1218
  /* ─── Global helper ──────────────────────────────────────── */
813
1219
 
814
1220
  body.cli-pane-resizing {
@@ -0,0 +1,8 @@
1
+ /* @qodalis/cli — all-in-one stylesheet for vanilla JS usage
2
+ *
3
+ * Import this single file to get all required styles:
4
+ * import '@qodalis/cli/assets/styles.css';
5
+ */
6
+
7
+ @import '@xterm/xterm/css/xterm.css';
8
+ @import './cli-panel.css';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/cli",
3
- "version": "2.0.0-beta.8",
3
+ "version": "2.0.0-rc.1",
4
4
  "description": "Framework-agnostic CLI engine for @qodalis terminal applications.",
5
5
  "author": "Nicolae Lupei, Qodalis Solutions",
6
6
  "license": "MIT",
@@ -30,11 +30,11 @@
30
30
  "./assets/*": "./assets/*"
31
31
  },
32
32
  "dependencies": {
33
- "@qodalis/cli-core": "2.0.0-beta.8",
34
- "@xterm/xterm": "^5.5.0",
35
- "@xterm/addon-fit": "^0.10.0",
36
- "@xterm/addon-web-links": "^0.11.0",
37
- "@xterm/addon-unicode11": "^0.8.0",
33
+ "@qodalis/cli-core": "2.0.0-rc.1",
34
+ "@xterm/xterm": "^6.0.0",
35
+ "@xterm/addon-fit": "^0.11.0",
36
+ "@xterm/addon-web-links": "^0.12.0",
37
+ "@xterm/addon-unicode11": "^0.9.0",
38
38
  "@xterm/addon-serialize": "^0.14.0",
39
39
  "rxjs": "^7.0.0"
40
40
  },