Skip to content

Commit 74b4cd3

Browse files
Smooth merge/cut result popups: gentle slide + breathing glow
- Entry: gentle slide-up with slight overshoot (0.45s) - Exit: soft fade-down (0.35s) - Success: subtle breathing green glow instead of glitch/scanline - Error: satisfying micro-shake then settle (no chromatic aberration) - Rounded corners (12px), cleaner glass backdrop - Removed all holographic beam/scanline/glitch effects Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 44493fc commit 74b4cd3

File tree

1 file changed

+58
-216
lines changed

1 file changed

+58
-216
lines changed

src/components/SplitMergeOverlay.vue

Lines changed: 58 additions & 216 deletions
Original file line numberDiff line numberDiff line change
@@ -661,114 +661,54 @@ function cancelTool() {
661661
display: flex;
662662
align-items: center;
663663
gap: 12px;
664-
padding: 12px 28px;
665-
border-radius: 2px;
664+
padding: 14px 32px;
665+
border-radius: 12px;
666666
font-family: 'Inter', 'Roboto', sans-serif;
667667
font-size: 14px;
668668
font-weight: 600;
669-
letter-spacing: 0.6px;
669+
letter-spacing: 0.4px;
670670
pointer-events: none;
671671
user-select: none;
672672
white-space: nowrap;
673673
overflow: hidden;
674-
675-
/* Holographic glass base */
676-
backdrop-filter: blur(14px) saturate(1.4);
677-
-webkit-backdrop-filter: blur(14px) saturate(1.4);
678-
679-
/* Persistent scanline texture */
680-
background-image: repeating-linear-gradient(
681-
0deg,
682-
transparent 0px,
683-
transparent 2px,
684-
rgba(0, 0, 0, 0.06) 2px,
685-
rgba(0, 0, 0, 0.06) 4px
686-
);
687-
background-size: 100% 4px;
688-
animation: holo-scanline-drift 4s linear infinite;
674+
backdrop-filter: blur(16px) saturate(1.3);
675+
-webkit-backdrop-filter: blur(16px) saturate(1.3);
689676
}
690677
691-
/* ── Scan beam — bright line that sweeps top→bottom on entry ── */
678+
/* ── Subtle glow shimmer on entry ── */
692679
.nge-smo-result-flash::before {
693-
content: '';
694-
position: absolute;
695-
left: 0;
696-
right: 0;
697-
height: 2px;
698-
top: 0;
699-
background: linear-gradient(
700-
90deg,
701-
transparent 0%,
702-
rgba(255, 255, 255, 0.1) 10%,
703-
currentColor 35%,
704-
rgba(255, 255, 255, 0.95) 50%,
705-
currentColor 65%,
706-
rgba(255, 255, 255, 0.1) 90%,
707-
transparent 100%
708-
);
709-
filter: blur(0.5px);
710-
box-shadow: 0 0 8px currentColor, 0 0 16px currentColor;
711-
animation: holo-scanbeam 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
712-
animation-delay: 0.15s;
713-
opacity: 0;
714-
}
715-
716-
/* ── Holographic edge frame — breathing border glow ── */
717-
.nge-smo-result-flash::after {
718680
content: '';
719681
position: absolute;
720682
inset: 0;
721-
border-radius: 2px;
722-
border: 1px solid transparent;
723-
background: linear-gradient(
724-
135deg,
725-
rgba(255, 255, 255, 0.25) 0%,
726-
transparent 30%,
727-
transparent 70%,
728-
rgba(255, 255, 255, 0.12) 100%
729-
) border-box;
730-
-webkit-mask: linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0);
731-
-webkit-mask-composite: xor;
732-
mask-composite: exclude;
733-
animation: holo-edge-breathe 2.5s ease-in-out infinite;
734-
animation-delay: 0.8s;
735-
opacity: 0;
683+
border-radius: 12px;
684+
background: linear-gradient(135deg, rgba(255,255,255,0.08) 0%, transparent 50%);
685+
pointer-events: none;
736686
}
687+
.nge-smo-result-flash::after { display: none; }
737688
738689
/* ── SUCCESS ── */
739690
.nge-smo-result-flash.success {
740-
background-color: rgba(6, 32, 20, 0.88);
741-
border: 1px solid rgba(0, 255, 140, 0.35);
691+
background-color: rgba(8, 30, 22, 0.92);
692+
border: 1px solid rgba(0, 220, 120, 0.25);
742693
color: #a0ffd4;
743-
box-shadow:
744-
0 0 30px rgba(0, 220, 120, 0.25),
745-
0 0 60px rgba(0, 220, 120, 0.08),
746-
inset 0 1px 0 rgba(0, 255, 140, 0.15),
747-
inset 0 0 30px rgba(0, 220, 120, 0.04);
748-
text-shadow:
749-
0 0 8px rgba(0, 220, 120, 0.7),
750-
0 0 20px rgba(0, 220, 120, 0.25);
694+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), 0 0 20px rgba(0, 220, 120, 0.15);
695+
text-shadow: 0 0 6px rgba(0, 220, 120, 0.4);
696+
animation: smo-result-glow-green 2s ease-in-out infinite;
751697
}
752698
753699
/* ── ERROR ── */
754700
.nge-smo-result-flash.error {
755-
background-color: rgba(40, 6, 6, 0.88);
756-
border: 1px solid rgba(255, 80, 80, 0.35);
757-
color: #ffb0b0;
758-
box-shadow:
759-
0 0 30px rgba(255, 60, 60, 0.25),
760-
0 0 60px rgba(255, 60, 60, 0.08),
761-
inset 0 1px 0 rgba(255, 80, 80, 0.15),
762-
inset 0 0 30px rgba(255, 60, 60, 0.04);
763-
text-shadow:
764-
0 0 8px rgba(255, 60, 60, 0.7),
765-
0 0 20px rgba(255, 60, 60, 0.25);
701+
background-color: rgba(35, 10, 10, 0.92);
702+
border: 1px solid rgba(255, 100, 100, 0.2);
703+
color: #ffb8b8;
704+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), 0 0 20px rgba(255, 80, 80, 0.1);
705+
text-shadow: 0 0 6px rgba(255, 80, 80, 0.3);
706+
animation: smo-result-shake 0.4s ease-out;
766707
}
767708
768709
.nge-smo-result-icon {
769710
font-size: 20px;
770-
filter: drop-shadow(0 0 6px currentColor);
771-
animation: holo-icon-stabilize 0.7s ease-out forwards;
711+
filter: drop-shadow(0 0 4px currentColor);
772712
}
773713
774714
.nge-smo-result-text {
@@ -783,166 +723,68 @@ function cancelTool() {
783723
font-style: italic;
784724
margin-left: 6px;
785725
opacity: 0;
786-
animation: holo-retry-fade-in 0.4s ease-out 1.2s forwards;
726+
animation: smo-retry-fade-in 0.4s ease-out 0.8s forwards;
787727
}
788728
789-
/* ═══ HOLOGRAPHIC KEYFRAMES ═══════════════════════════════════ */
729+
/* ═══ SMOOTH RESULT KEYFRAMES ═══════════════════════════════ */
790730
791-
/* Entry: beam line expands outward, content resolves through glitch */
792-
@keyframes holo-materialize {
731+
/* Entry: gentle slide up + fade in */
732+
@keyframes smo-result-enter {
793733
0% {
794-
clip-path: inset(48% 35% 48% 35%);
795734
opacity: 0;
796-
filter: brightness(4) saturate(0) blur(2px);
797-
transform: translateX(-50%);
798-
}
799-
8% {
800-
opacity: 1;
801-
filter: brightness(3) saturate(0) blur(1px);
802-
}
803-
/* Beam line visible — thin horizontal slit */
804-
16% {
805-
clip-path: inset(46% 8% 46% 8%);
806-
filter: brightness(2.5) saturate(0) blur(0.5px);
735+
transform: translateX(-50%) translateY(16px) scale(0.96);
807736
}
808-
/* Expanding — scanlines visible through the opening */
809-
30% {
810-
clip-path: inset(30% 2% 30% 2%);
811-
filter: brightness(1.6) saturate(0.4) blur(0px);
812-
transform: translateX(-50%);
813-
}
814-
48% {
815-
clip-path: inset(12% 0% 12% 0%);
816-
filter: brightness(1.2) saturate(0.7);
817-
}
818-
/* Content nearly full — first glitch hit */
819737
60% {
820-
clip-path: inset(2% 0% 2% 0%);
821-
filter: brightness(1) saturate(1);
822-
transform: translateX(-50%);
823-
}
824-
/* Chromatic glitch sequence */
825-
66% {
826-
clip-path: inset(0);
827-
transform: translateX(calc(-50% + 3px));
828-
filter: brightness(1.4) hue-rotate(-10deg);
829-
text-shadow: -3px 0 rgba(255, 0, 80, 0.7), 3px 0 rgba(0, 200, 255, 0.7);
830-
}
831-
72% {
832-
transform: translateX(calc(-50% - 4px));
833-
filter: brightness(0.8) hue-rotate(8deg);
834-
text-shadow: 2px 0 rgba(255, 0, 80, 0.5), -2px 0 rgba(0, 200, 255, 0.5);
835-
}
836-
78% {
837-
transform: translateX(calc(-50% + 1px));
838-
filter: brightness(1.3) hue-rotate(-3deg);
839-
text-shadow: -1px 0 rgba(255, 0, 80, 0.3), 1px 0 rgba(0, 200, 255, 0.3);
840-
}
841-
/* Stabilize */
842-
88% {
843-
filter: brightness(1.05) hue-rotate(0deg);
844-
text-shadow: none;
738+
opacity: 1;
739+
transform: translateX(-50%) translateY(-2px) scale(1.01);
845740
}
846741
100% {
847-
clip-path: inset(0);
848742
opacity: 1;
849-
filter: brightness(1) saturate(1) blur(0px);
850-
transform: translateX(-50%);
743+
transform: translateX(-50%) translateY(0) scale(1);
851744
}
852745
}
853746
854-
/* Scan beam sweeps top → bottom during materialization */
855-
@keyframes holo-scanbeam {
856-
0% { top: 0%; opacity: 0.9; height: 2px; }
857-
40% { opacity: 1; height: 3px; }
858-
100% { top: 100%; opacity: 0; height: 1px; }
859-
}
860-
861-
/* Scanline texture drifts upward slowly (CRT / hologram feel) */
862-
@keyframes holo-scanline-drift {
863-
0% { background-position: 0 0; }
864-
100% { background-position: 0 -40px; }
865-
}
866-
867-
/* Edge glow pulses after materialization */
868-
@keyframes holo-edge-breathe {
869-
0%, 100% { opacity: 0.2; }
870-
50% { opacity: 0.6; }
871-
}
872-
873-
/* Icon resolves from static */
874-
@keyframes holo-icon-stabilize {
875-
0% { opacity: 0; transform: scale(1.8); filter: blur(4px) drop-shadow(0 0 12px currentColor); }
876-
40% { opacity: 1; transform: scale(0.9); filter: blur(0px) drop-shadow(0 0 8px currentColor); }
877-
60% { transform: scale(1.1); }
878-
80% { transform: scale(0.97); }
879-
100% { transform: scale(1); filter: drop-shadow(0 0 6px currentColor); }
880-
}
881-
882-
/* Retry text materializes late */
883-
@keyframes holo-retry-fade-in {
884-
0% { opacity: 0; transform: translateX(-4px); filter: blur(2px); }
885-
60% { opacity: 0.8; filter: blur(0); }
886-
100% { opacity: 0.65; transform: translateX(0); }
887-
}
888-
889-
/* Exit: destabilize → chromatic split → collapse to beam → vanish */
890-
@keyframes holo-destabilize {
747+
/* Exit: gentle fade down */
748+
@keyframes smo-result-exit {
891749
0% {
892-
clip-path: inset(0);
893750
opacity: 1;
894-
filter: brightness(1) saturate(1);
895-
transform: translateX(-50%);
896-
}
897-
/* Flicker unstable */
898-
15% {
899-
opacity: 0.7;
900-
filter: brightness(1.5) saturate(0.6);
901-
transform: translateX(calc(-50% - 2px));
902-
text-shadow: -2px 0 rgba(255, 0, 80, 0.6), 2px 0 rgba(0, 200, 255, 0.6);
903-
}
904-
25% {
905-
opacity: 1;
906-
filter: brightness(0.8);
907-
transform: translateX(calc(-50% + 3px));
908-
}
909-
35% {
910-
filter: brightness(1.8) saturate(0.3);
911-
transform: translateX(calc(-50% - 1px));
912-
text-shadow: -3px 0 rgba(255, 0, 80, 0.4), 3px 0 rgba(0, 200, 255, 0.4);
913-
}
914-
/* Begin collapse */
915-
50% {
916-
clip-path: inset(15% 3% 15% 3%);
917-
filter: brightness(2) saturate(0.1);
918-
text-shadow: none;
919-
transform: translateX(-50%);
920-
}
921-
70% {
922-
clip-path: inset(35% 10% 35% 10%);
923-
filter: brightness(2.5) saturate(0) blur(0.5px);
924-
opacity: 0.7;
925-
}
926-
85% {
927-
clip-path: inset(46% 25% 46% 25%);
928-
filter: brightness(3) saturate(0) blur(1px);
929-
opacity: 0.4;
751+
transform: translateX(-50%) translateY(0) scale(1);
930752
}
931753
100% {
932-
clip-path: inset(50% 45% 50% 45%);
933-
filter: brightness(4) saturate(0) blur(2px);
934754
opacity: 0;
935-
transform: translateX(-50%);
755+
transform: translateX(-50%) translateY(10px) scale(0.97);
936756
}
937757
}
938758
759+
/* Success: subtle breathing glow */
760+
@keyframes smo-result-glow-green {
761+
0%, 100% { box-shadow: 0 8px 32px rgba(0,0,0,0.3), 0 0 20px rgba(0,220,120,0.12); }
762+
50% { box-shadow: 0 8px 32px rgba(0,0,0,0.3), 0 0 28px rgba(0,220,120,0.2); }
763+
}
764+
765+
/* Error: satisfying micro-shake then settle */
766+
@keyframes smo-result-shake {
767+
0% { transform: translateX(-50%); }
768+
20% { transform: translateX(calc(-50% + 6px)); }
769+
40% { transform: translateX(calc(-50% - 4px)); }
770+
60% { transform: translateX(calc(-50% + 2px)); }
771+
80% { transform: translateX(calc(-50% - 1px)); }
772+
100% { transform: translateX(-50%); }
773+
}
774+
775+
/* Retry text fades in gently */
776+
@keyframes smo-retry-fade-in {
777+
0% { opacity: 0; }
778+
100% { opacity: 0.6; }
779+
}
780+
939781
/* ═══ VUE TRANSITION HOOKS ═══════════════════════════════════ */
940782
941783
.flash-pop-enter-active {
942-
animation: holo-materialize 0.75s cubic-bezier(0.16, 1, 0.3, 1) forwards;
784+
animation: smo-result-enter 0.45s cubic-bezier(0.16, 1, 0.3, 1) forwards;
943785
}
944786
.flash-pop-leave-active {
945-
animation: holo-destabilize 0.55s ease-in forwards;
787+
animation: smo-result-exit 0.35s ease-in forwards;
946788
}
947789
948790
/* ═══ MAIN BAR TRANSITION — horizontal wipe materialization ══ */

0 commit comments

Comments
 (0)