@viberaven/cli 1.5.3 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -852,3 +852,157 @@ select.sel:focus, input.sel:focus { outline: none; box-shadow: inset 0 0 0 1px #
852
852
  .fc-score { gap: 14px; }
853
853
  .fc-score-num { width: 68px; height: 68px; font-size: 22px; }
854
854
  }
855
+
856
+ /* ---------- the project canvas, as on the viberaven.dev hero: tabs in the bar, the stack as cards on a dotted
857
+ canvas that fills the window, each later step as a panel over the canvas, and the loop as a dock ---------- */
858
+ .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
859
+
860
+ /* Views in the bar. */
861
+ .top-tabs { display: flex; align-self: stretch; gap: 20px; margin-right: 10px; }
862
+ .top-tab { position: relative; display: inline-flex; align-items: center; gap: 7px; height: 100%; padding: 0 1px; border-radius: 0; font-size: 13.5px; font-weight: 500; color: var(--ink-3); transition: color 0.15s; }
863
+ .top-tab:hover:not(:disabled) { color: var(--ink); }
864
+ .top-tab[aria-current="page"] { color: var(--ink); }
865
+ .top-tab[aria-current="page"]::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 1.5px; background: var(--ink); }
866
+ .top-tab:disabled { opacity: 0.4; cursor: default; }
867
+ .top-tab-count { display: inline-grid; place-items: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px; background: rgba(255, 255, 255, 0.1); font-family: var(--mono); font-size: 11px; color: var(--ink); }
868
+
869
+ /* The dock: Scan, Fix, Re-check, Launch. */
870
+ .rail { top: auto; bottom: 18px; left: 50%; right: auto; transform: translateX(-50%); z-index: 31; padding: 4px; border-radius: 14px; border: 1px solid var(--line-2); background: rgba(18, 18, 22, 0.96); -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); box-shadow: 0 20px 40px -16px rgba(0, 0, 0, 0.9); transition: left 0.45s var(--ease); }
871
+ .rail ol { display: flex; gap: 2px; }
872
+ .rail-button { position: relative; overflow: hidden; height: 40px; padding: 0 16px; border-radius: 10px; gap: 8px; }
873
+ .rail-button:hover:not(:disabled) { background: rgba(255, 255, 255, 0.05); }
874
+ .rail-mark, .is-current .rail-mark, .is-passed .rail-mark { display: inline-grid; place-items: center; width: auto; height: auto; margin: 0; border-radius: 0; background: none; box-shadow: none; color: var(--ink-3); }
875
+ .rail-mark svg { width: 15px; height: 15px; }
876
+ .is-current .rail-mark::after { display: none; }
877
+ .rail-label { font-size: 14px; font-weight: 500; color: var(--ink-2); }
878
+ .is-current .rail-button { background: rgba(255, 255, 255, 0.1); }
879
+ .is-current .rail-label, .is-current .rail-mark { color: var(--ink); }
880
+ .is-passed .rail-mark { color: var(--green); }
881
+ .is-locked .rail-button { opacity: 0.4; }
882
+ .rail-time { position: absolute; left: 10px; right: 10px; bottom: 3px; height: 2px; border-radius: 2px; background: #f7d27f; transform-origin: left; animation: rail-time 1.6s ease-in-out infinite; }
883
+ @keyframes rail-time { 0% { transform: scaleX(0); } 60% { transform: scaleX(1); opacity: 1; } 100% { transform: scaleX(1); opacity: 0; } }
884
+ .app:has(.stage.has-panel) .rail { left: calc((100% - min(560px, 46%)) / 2); }
885
+
886
+ /* The canvas fills the window under the bar. */
887
+ .app .stage { position: relative; height: calc(100vh - var(--top)); height: calc(100dvh - var(--top)); min-height: 360px; padding: 0; overflow: hidden; }
888
+ .canvas { position: absolute; inset: 0; overflow: auto; display: grid; place-items: center; padding: 48px 32px 128px; background: radial-gradient(rgba(255, 255, 255, 0.1) 1px, transparent 1.2px) 0 0 / 18px 18px, #060607; transition: right 0.45s var(--ease); }
889
+ .stage.has-panel .canvas { right: min(560px, 46%); }
890
+ .stage-alert { position: absolute; top: 14px; left: 50%; z-index: 6; transform: translateX(-50%); margin: 0; }
891
+ .app .board { width: min(1080px, 100%); margin: 0; padding: 0; border: 0; border-radius: 0; background: none; min-height: 0; }
892
+ .app .board-col { width: min(260px, 100%); }
893
+
894
+ /* Cards: mark and name, what it is in mono, a hairline, then the state with its verdict at the edge. */
895
+ .app .node, .app .board-app { display: block; width: 100%; padding: 12px 14px; border-radius: 10px; border: 1px solid var(--line-2); background: #111114; box-shadow: 0 16px 30px -18px rgba(0, 0, 0, 0.9); text-align: left; transition: border-color 0.45s var(--ease); }
896
+ .node-head { display: flex; align-items: center; gap: 9px; min-width: 0; }
897
+ .app .node-head img, .app .node-head .node-fallback { flex: none; width: 18px; height: 18px; }
898
+ .node-head .ico { display: inline-grid; color: var(--ink); }
899
+ .app .node-name { font-size: 14px; font-weight: 500; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
900
+ .node-detail, .app .board-app-name { display: block; margin: 4px 0 0 27px; font-family: var(--mono); font-size: 11px; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
901
+ .app .node-state { display: flex; align-items: center; gap: 8px; margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--line); font-size: 12.5px; color: var(--ink-2); }
902
+ .node-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
903
+ .node-verdict { flex: none; font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); }
904
+ .node.is-pass .node-verdict { color: var(--green); }
905
+ .node.is-warn .node-verdict { color: var(--warn); }
906
+ .node.is-fail .node-verdict { color: var(--red); }
907
+ .app .node.is-pass .node-state, .app .node.is-warn .node-state, .app .node.is-fail .node-state { color: var(--ink-2); }
908
+ .app .board-app { padding: 14px 16px; }
909
+ .app .board-status { margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--line); }
910
+ .app .board-status strong { font-size: 18px; font-weight: 500; letter-spacing: -0.02em; }
911
+ .app .board-checks { margin-top: 10px; padding: 0; border-top: 0; gap: 5px; }
912
+ .app .board-checks li { font-size: 12px; color: var(--ink-2); }
913
+ .canvas-note { font-size: 12.5px; color: var(--ink-3); text-align: center; }
914
+ .stage-body.step-app { position: absolute; left: 0; right: 0; bottom: 78px; z-index: 2; max-width: none; margin: 0; pointer-events: none; }
915
+
916
+ /* Every later step: a panel over the canvas. */
917
+ .stage-body.panel { position: absolute; top: 14px; right: 14px; bottom: 14px; z-index: 5; width: calc(min(560px, 46%) - 28px); max-width: none; margin: 0; overflow: auto; padding: 20px 24px 32px; border-radius: 16px; border: 1px solid var(--line-2); background: rgba(10, 10, 12, 0.97); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); box-shadow: 0 30px 60px -20px rgba(0, 0, 0, 0.9); animation: panel-in 0.45s var(--ease) both; }
918
+ @keyframes panel-in { from { transform: translateX(28px); opacity: 0; } }
919
+ .panel-close { display: inline-flex; align-items: center; gap: 6px; height: 30px; margin-bottom: 18px; padding: 0 12px; font-size: 13px; }
920
+ .panel h1 { font-size: 26px; max-width: none; letter-spacing: -0.03em; }
921
+ .panel .stage-sub { font-size: 15px; }
922
+ .panel .primary-row { margin-top: 24px; }
923
+ .panel .findings { margin-top: 22px; }
924
+ .panel .finding, .panel .finding.is-static { grid-template-columns: minmax(0, 1fr) 16px; gap: 6px 12px; padding: 13px 16px; }
925
+ .panel .finding .sev { grid-column: 1; grid-row: 1; }
926
+ .panel .finding .finding-title { grid-column: 1; grid-row: 2; white-space: normal; }
927
+ .panel .finding .where, .panel .finding .finding-tag { grid-column: 1; grid-row: 3; }
928
+ .panel .finding > .ico { grid-column: 2; grid-row: 1 / span 3; align-self: center; }
929
+ .panel .ready-grid { grid-template-columns: minmax(0, 1fr); }
930
+ .panel .strip { margin-top: 18px; }
931
+
932
+ @media (max-width: 1100px) {
933
+ .top-tab-count { display: none; }
934
+ }
935
+ @media (max-width: 900px) {
936
+ .stage.has-panel .canvas { right: 0; }
937
+ .stage-body.panel { left: 10px; right: 10px; top: 10px; bottom: 76px; width: auto; }
938
+ .app:has(.stage.has-panel) .rail { left: 50%; }
939
+ #tab-terminal, #tab-releases { display: none; }
940
+ }
941
+ @media (max-width: 640px) {
942
+ .top { gap: 10px; padding: 0 14px; }
943
+ .top-project strong { max-width: 30vw; }
944
+ .top-tabs { gap: 14px; margin-right: 0; }
945
+ .rail { left: 10px; right: 10px; transform: none; }
946
+ .app:has(.stage.has-panel) .rail { left: 10px; }
947
+ .rail ol { justify-content: space-between; }
948
+ .rail-button { padding: 0 10px; gap: 6px; }
949
+ .rail-label { font-size: 13px; }
950
+ .canvas { place-items: start center; padding: 20px 14px 140px; }
951
+ .stage-body.step-app { bottom: 72px; }
952
+ .stage-body.panel { padding: 16px 16px 24px; }
953
+ }
954
+ @media (prefers-reduced-motion: reduce) {
955
+ .stage-body.panel, .rail-time { animation: none; }
956
+ .canvas, .rail { transition: none; }
957
+ }
958
+ .app .node.is-focus { border-color: #f5f5f7; box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.12), 0 16px 30px -18px rgba(0, 0, 0, 0.9); }
959
+
960
+ /* The board sizes to the canvas, not the window: with a panel open, the space left of it decides the layout. */
961
+ .canvas { container-type: inline-size; }
962
+ @container (max-width: 820px) {
963
+ .app .board { width: min(600px, 100%); }
964
+ .app .board-col { width: 100%; }
965
+ }
966
+ @container (min-width: 560px) and (max-width: 820px) {
967
+ .board.is-side { grid-template-columns: minmax(200px, 250px) minmax(200px, 250px); grid-template-areas: "app right"; column-gap: clamp(40px, 8cqi, 72px); align-items: center; }
968
+ .board.is-side .board-lines { display: block; }
969
+ .app .board.is-side { width: auto; }
970
+ }
971
+
972
+ /* A movable canvas: drag the ground to pan, drag a card to move it, zoom from the tools. */
973
+ .canvas { overflow: hidden; cursor: grab; touch-action: none; -webkit-user-select: none; user-select: none; }
974
+ .canvas.is-dragging { cursor: grabbing; }
975
+ .app .board { transform-origin: 50% 50%; will-change: transform; }
976
+ .app .node, .app .board-app { position: relative; cursor: grab; }
977
+ .canvas.is-dragging .node, .canvas.is-dragging .board-app { cursor: grabbing; }
978
+ .app .node.is-lifted, .app .board-app.is-lifted { z-index: 3; border-color: rgba(255, 255, 255, 0.5); box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.08), 0 30px 50px -20px rgba(0, 0, 0, 0.95); }
979
+ .canvas.is-dragging .board-lines .pulse { animation: none; opacity: 0; }
980
+ .canvas-tools { position: absolute; left: 14px; top: 14px; z-index: 4; display: grid; gap: 2px; padding: 4px; border-radius: 10px; border: 1px solid var(--line); background: rgba(17, 17, 20, 0.92); cursor: default; }
981
+ .canvas-tool { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 7px; color: var(--ink-3); transition: background 0.15s, color 0.15s; }
982
+ .canvas-tool:hover { background: rgba(255, 255, 255, 0.08); color: var(--ink); }
983
+ .canvas-tool.is-reset { display: none; }
984
+ .canvas.is-moved .canvas-tool.is-reset { display: grid; }
985
+ @media (max-width: 640px) {
986
+ .canvas-tools { top: 10px; left: 10px; }
987
+ }
988
+
989
+ /* Checks on every pull request: a button in the canvas corner and a card that says what it writes. */
990
+ .pr-checks { position: absolute; right: 14px; top: 14px; z-index: 4; display: grid; justify-items: end; gap: 8px; cursor: default; }
991
+ .pr-checks-button { display: inline-flex; align-items: center; gap: 8px; height: 34px; padding: 0 14px; border-radius: 999px; border: 1px solid var(--line-2); background: rgba(17, 17, 20, 0.94); font-size: 13px; font-weight: 500; color: var(--ink); transition: background 0.15s, border-color 0.15s; }
992
+ .pr-checks-button:hover { background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.4); }
993
+ .pr-checks-button[aria-expanded="true"] { background: #f5f5f7; border-color: #f5f5f7; color: #0a0a0b; }
994
+ .pr-checks-button.is-on { color: var(--ink-2); }
995
+ .pr-checks-button.is-on .ico { color: var(--green); }
996
+ .pr-card { width: min(340px, calc(100vw - 48px)); display: grid; gap: 10px; padding: 16px; border-radius: 14px; border: 1px solid var(--line-2); background: rgba(12, 12, 14, 0.98); box-shadow: 0 30px 60px -20px rgba(0, 0, 0, 0.9); animation: settle 0.3s var(--ease) both; }
997
+ .pr-card h3 { font-size: 15px; font-weight: 500; letter-spacing: -0.01em; }
998
+ .pr-card p { font-size: 13px; line-height: 1.5; color: var(--ink-2); }
999
+ .pr-card code { font-family: var(--mono); font-size: 12px; color: var(--ink); }
1000
+ .pr-points { display: grid; gap: 6px; padding-left: 16px; font-size: 12.5px; line-height: 1.45; color: var(--ink-3); }
1001
+ .pr-command { margin: 0; padding: 10px 12px; border-radius: 9px; background: #060607; box-shadow: inset 0 0 0 1px var(--line); font-family: var(--mono); font-size: 11.5px; line-height: 1.5; color: var(--ink); white-space: pre-wrap; word-break: break-all; }
1002
+ .pr-muted { color: var(--ink-3) !important; }
1003
+ .pr-error { color: var(--red-ink) !important; }
1004
+ .pr-actions { display: flex; gap: 8px; flex-wrap: wrap; }
1005
+ @media (max-width: 640px) {
1006
+ .pr-checks { top: 10px; right: 10px; }
1007
+ .pr-checks-button { height: 32px; padding: 0 12px; font-size: 12.5px; }
1008
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viberaven/cli",
3
- "version": "1.5.3",
3
+ "version": "1.6.0",
4
4
  "description": "Local Studio cockpit for AI-built apps: agentic chat, provider context, release review, diffs, and approval-controlled repo work.",
5
5
  "license": "MIT",
6
6
  "author": "VibeRaven",