@okjavis/nodebb-theme-javis 2.2.0 → 2.3.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.
- package/package.json +1 -1
- package/scss/_topic.scss +196 -152
- package/static/lib/theme.js +104 -0
- package/templates/partials/topic/post-parent.tpl +9 -0
package/package.json
CHANGED
package/scss/_topic.scss
CHANGED
|
@@ -166,11 +166,9 @@ body.template-topic {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
// Align the post header row with avatar
|
|
169
|
+
// Align the post header row with avatar (extends base .post-header)
|
|
170
170
|
.post-header {
|
|
171
|
-
min-height: 36px; // Match avatar height
|
|
172
|
-
align-items: center !important;
|
|
173
|
-
margin-bottom: 0 !important;
|
|
171
|
+
min-height: 36px; // Match avatar height for alignment
|
|
174
172
|
}
|
|
175
173
|
|
|
176
174
|
.post-container {
|
|
@@ -191,9 +189,9 @@ body.template-topic {
|
|
|
191
189
|
// ===========================================================
|
|
192
190
|
.post-header {
|
|
193
191
|
display: flex;
|
|
194
|
-
align-items: center;
|
|
192
|
+
align-items: center !important;
|
|
195
193
|
gap: $jv-space-2;
|
|
196
|
-
margin-bottom:
|
|
194
|
+
margin-bottom: 0 !important;
|
|
197
195
|
font-size: $jv-font-size-xs;
|
|
198
196
|
|
|
199
197
|
.avatar {
|
|
@@ -444,10 +442,32 @@ body.template-topic {
|
|
|
444
442
|
}
|
|
445
443
|
}
|
|
446
444
|
|
|
447
|
-
//
|
|
448
|
-
|
|
445
|
+
// Post actions - show on hover (Reddit/HN style)
|
|
446
|
+
// Uses JS-managed .post-hovered class to prevent bubble to parent posts
|
|
447
|
+
.topic .posts [component="post"] {
|
|
448
|
+
[component="post/actions"] {
|
|
449
|
+
opacity: 0;
|
|
450
|
+
transition: opacity $jv-transition-fast;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// Show actions only on the directly hovered post (JS adds .post-hovered class)
|
|
454
|
+
> .post-container-parent.post-hovered [component="post/actions"] {
|
|
455
|
+
opacity: 1;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Always show if user has interacted (voted, bookmarked)
|
|
459
|
+
[component="post/actions"] {
|
|
460
|
+
.upvoted,
|
|
461
|
+
.downvoted,
|
|
462
|
+
.bookmarked {
|
|
463
|
+
opacity: 1;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// Keep vote count always visible when there are votes
|
|
469
|
+
.topic .posts [component="post/vote-count"]:not(:empty) {
|
|
449
470
|
opacity: 1 !important;
|
|
450
|
-
visibility: visible !important;
|
|
451
471
|
}
|
|
452
472
|
|
|
453
473
|
// ===========================================================
|
|
@@ -592,9 +612,21 @@ body.template-topic {
|
|
|
592
612
|
.dropdown-toggle { display: none; }
|
|
593
613
|
}
|
|
594
614
|
|
|
595
|
-
//
|
|
615
|
+
// Sidebar action buttons - full-width, left-aligned (extends base .btn-ghost)
|
|
596
616
|
.btn-ghost,
|
|
597
617
|
.bottom-sheet > .btn,
|
|
618
|
+
.thread-tools > .dropdown-toggle {
|
|
619
|
+
text-align: left;
|
|
620
|
+
width: 100%;
|
|
621
|
+
justify-content: flex-start;
|
|
622
|
+
|
|
623
|
+
i {
|
|
624
|
+
width: 16px; // Fixed width for icon alignment
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Non-ghost buttons need base ghost styling too
|
|
629
|
+
.bottom-sheet > .btn,
|
|
598
630
|
.thread-tools > .dropdown-toggle {
|
|
599
631
|
background: transparent !important;
|
|
600
632
|
border: 1px solid transparent !important;
|
|
@@ -603,15 +635,10 @@ body.template-topic {
|
|
|
603
635
|
border-radius: $jv-radius-sm;
|
|
604
636
|
font-size: $jv-font-size-sm;
|
|
605
637
|
font-weight: 500;
|
|
606
|
-
text-align: left;
|
|
607
|
-
width: 100%;
|
|
608
|
-
justify-content: flex-start;
|
|
609
638
|
transition: background-color $jv-transition-fast, color $jv-transition-fast;
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
color: $jv-primary;
|
|
614
|
-
}
|
|
639
|
+
display: inline-flex;
|
|
640
|
+
align-items: center;
|
|
641
|
+
gap: $jv-space-2;
|
|
615
642
|
|
|
616
643
|
&:hover {
|
|
617
644
|
background: $jv-hover-bg !important;
|
|
@@ -738,121 +765,143 @@ body.template-topic {
|
|
|
738
765
|
|
|
739
766
|
// ===========================================================
|
|
740
767
|
// PARENT POST CONTEXT (shown when viewing a reply)
|
|
768
|
+
// Compact inline style - visually distinct from main posts
|
|
741
769
|
// ===========================================================
|
|
742
770
|
[component="post/parent"] {
|
|
743
|
-
background:
|
|
744
|
-
border:
|
|
745
|
-
border-left:
|
|
746
|
-
border-radius:
|
|
747
|
-
padding: $jv-space-3 !important;
|
|
748
|
-
margin-bottom: $jv-space-
|
|
749
|
-
|
|
771
|
+
background: transparent !important;
|
|
772
|
+
border: none !important;
|
|
773
|
+
border-left: 2px solid $jv-border-strong !important;
|
|
774
|
+
border-radius: 0 !important;
|
|
775
|
+
padding: $jv-space-1 0 $jv-space-1 $jv-space-3 !important;
|
|
776
|
+
margin-bottom: $jv-space-2 !important;
|
|
777
|
+
margin-left: $jv-space-1 !important;
|
|
778
|
+
transition: border-color $jv-transition-fast;
|
|
779
|
+
cursor: pointer;
|
|
780
|
+
display: flex !important;
|
|
781
|
+
align-items: center !important;
|
|
782
|
+
gap: $jv-space-2 !important;
|
|
783
|
+
flex-direction: row !important;
|
|
750
784
|
|
|
751
785
|
&:hover {
|
|
752
|
-
|
|
753
|
-
border-color: $jv-border-strong !important;
|
|
754
|
-
border-left-color: $jv-primary-hover !important;
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
// Header row with avatar and metadata
|
|
758
|
-
> .d-flex:first-child {
|
|
759
|
-
gap: $jv-space-2 !important;
|
|
760
|
-
margin-bottom: $jv-space-2;
|
|
786
|
+
border-left-color: $jv-primary !important;
|
|
761
787
|
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
[component="user/picture"] {
|
|
765
|
-
width: 20px !important;
|
|
766
|
-
height: 20px !important;
|
|
767
|
-
border-radius: 50%;
|
|
768
|
-
flex-shrink: 0;
|
|
788
|
+
.fw-semibold {
|
|
789
|
+
color: $jv-primary !important;
|
|
769
790
|
}
|
|
791
|
+
}
|
|
770
792
|
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
793
|
+
// Avatar
|
|
794
|
+
.avatar,
|
|
795
|
+
[component="user/picture"] {
|
|
796
|
+
width: 16px !important;
|
|
797
|
+
height: 16px !important;
|
|
798
|
+
border-radius: 50%;
|
|
799
|
+
flex-shrink: 0;
|
|
800
|
+
}
|
|
778
801
|
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
802
|
+
// Username
|
|
803
|
+
.fw-semibold {
|
|
804
|
+
font-size: $jv-font-size-xs !important;
|
|
805
|
+
font-weight: 600;
|
|
806
|
+
color: $jv-text-muted;
|
|
807
|
+
transition: color $jv-transition-fast;
|
|
783
808
|
}
|
|
784
809
|
|
|
785
|
-
// Parent content preview
|
|
810
|
+
// Parent content preview - inline, truncated
|
|
786
811
|
[component="post/parent/content"] {
|
|
787
|
-
font-size: $jv-font-size-
|
|
788
|
-
color: $jv-text-
|
|
789
|
-
line-height:
|
|
790
|
-
|
|
791
|
-
-webkit-line-clamp: 2;
|
|
792
|
-
-webkit-box-orient: vertical;
|
|
812
|
+
font-size: $jv-font-size-xs !important;
|
|
813
|
+
color: $jv-text-soft !important;
|
|
814
|
+
line-height: 1.4;
|
|
815
|
+
white-space: nowrap;
|
|
793
816
|
overflow: hidden;
|
|
817
|
+
text-overflow: ellipsis;
|
|
818
|
+
flex: 1;
|
|
819
|
+
min-width: 0;
|
|
794
820
|
|
|
795
821
|
p {
|
|
796
822
|
margin: 0;
|
|
823
|
+
display: inline;
|
|
797
824
|
}
|
|
825
|
+
|
|
826
|
+
// Hide images in preview
|
|
827
|
+
img {
|
|
828
|
+
display: none;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// Hide the nested flex container structure, flatten it
|
|
833
|
+
> .d-flex {
|
|
834
|
+
display: contents !important;
|
|
798
835
|
}
|
|
799
836
|
}
|
|
800
837
|
|
|
801
838
|
// ===========================================================
|
|
802
|
-
//
|
|
839
|
+
// POST HIGHLIGHT ANIMATION (when navigating to a post)
|
|
840
|
+
// ===========================================================
|
|
841
|
+
.post-highlight-flash {
|
|
842
|
+
animation: postHighlightFlash 1.5s ease-out;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
@keyframes postHighlightFlash {
|
|
846
|
+
0% {
|
|
847
|
+
background-color: rgba($jv-primary, 0.15);
|
|
848
|
+
box-shadow: 0 0 0 4px rgba($jv-primary, 0.1);
|
|
849
|
+
}
|
|
850
|
+
100% {
|
|
851
|
+
background-color: $jv-surface;
|
|
852
|
+
box-shadow: none;
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// ===========================================================
|
|
857
|
+
// REPLY COUNT BUTTON (Reddit/Discord style - no border, text link)
|
|
803
858
|
// ===========================================================
|
|
804
859
|
[component="post/reply-count"] {
|
|
805
|
-
display: inline-flex
|
|
860
|
+
display: inline-flex;
|
|
806
861
|
align-items: center;
|
|
807
862
|
gap: $jv-space-2;
|
|
808
|
-
background:
|
|
809
|
-
border:
|
|
810
|
-
border-radius: $jv-radius-
|
|
811
|
-
padding: $jv-space-1 $jv-space-
|
|
863
|
+
background: transparent !important;
|
|
864
|
+
border: none !important;
|
|
865
|
+
border-radius: $jv-radius-sm !important;
|
|
866
|
+
padding: $jv-space-1 $jv-space-2 !important;
|
|
812
867
|
font-size: $jv-font-size-xs !important;
|
|
813
868
|
color: $jv-text-muted !important;
|
|
814
869
|
cursor: pointer;
|
|
815
870
|
transition: all $jv-transition-fast;
|
|
871
|
+
text-decoration: none !important;
|
|
816
872
|
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
color: $jv-text-main !important;
|
|
873
|
+
// Respect the hidden class when there are no replies
|
|
874
|
+
&.hidden {
|
|
875
|
+
display: none !important;
|
|
821
876
|
}
|
|
822
877
|
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
align-items: center;
|
|
827
|
-
|
|
828
|
-
span {
|
|
829
|
-
margin-left: -4px;
|
|
878
|
+
&:hover {
|
|
879
|
+
background: $jv-hover-bg !important;
|
|
880
|
+
color: $jv-primary !important;
|
|
830
881
|
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
882
|
+
[component="post/reply-count/text"],
|
|
883
|
+
.replies-count {
|
|
884
|
+
color: $jv-primary !important;
|
|
834
885
|
}
|
|
886
|
+
}
|
|
835
887
|
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
height: 18px !important;
|
|
840
|
-
border-radius: 50%;
|
|
841
|
-
border: 2px solid $jv-surface;
|
|
842
|
-
}
|
|
888
|
+
// Hide avatars - cleaner look like Reddit
|
|
889
|
+
[component="post/reply-count/avatars"] {
|
|
890
|
+
display: none !important;
|
|
843
891
|
}
|
|
844
892
|
|
|
845
|
-
// Reply count text
|
|
893
|
+
// Reply count text - simple and clean
|
|
846
894
|
.replies-count,
|
|
847
895
|
[component="post/reply-count/text"] {
|
|
848
896
|
font-weight: 600;
|
|
849
|
-
|
|
897
|
+
font-size: $jv-font-size-xs;
|
|
898
|
+
color: $jv-text-muted;
|
|
899
|
+
transition: color $jv-transition-fast;
|
|
850
900
|
}
|
|
851
901
|
|
|
852
|
-
//
|
|
902
|
+
// Hide last reply time - too verbose
|
|
853
903
|
.replies-last {
|
|
854
|
-
|
|
855
|
-
font-size: $jv-font-size-xs;
|
|
904
|
+
display: none !important;
|
|
856
905
|
}
|
|
857
906
|
|
|
858
907
|
// Chevron icon
|
|
@@ -864,80 +913,86 @@ body.template-topic {
|
|
|
864
913
|
|
|
865
914
|
// Expanded state
|
|
866
915
|
&[aria-expanded="true"] {
|
|
916
|
+
color: $jv-primary !important;
|
|
917
|
+
|
|
867
918
|
.fa-chevron-down {
|
|
868
919
|
transform: rotate(180deg);
|
|
869
920
|
}
|
|
921
|
+
|
|
922
|
+
[component="post/reply-count/text"],
|
|
923
|
+
.replies-count {
|
|
924
|
+
color: $jv-primary !important;
|
|
925
|
+
}
|
|
870
926
|
}
|
|
871
927
|
}
|
|
872
928
|
|
|
873
929
|
// ===========================================================
|
|
874
|
-
// NESTED REPLIES CONTAINER (
|
|
930
|
+
// NESTED REPLIES CONTAINER (Clean threaded style)
|
|
931
|
+
// Inspired by Reddit/GitHub - compact, minimal
|
|
875
932
|
// ===========================================================
|
|
876
933
|
[component="post/replies/container"] {
|
|
877
934
|
margin-top: $jv-space-3 !important;
|
|
878
935
|
margin-bottom: 0 !important;
|
|
879
|
-
margin-left: $jv-space-
|
|
936
|
+
margin-left: $jv-space-4;
|
|
880
937
|
padding: 0 !important;
|
|
881
938
|
background: transparent !important;
|
|
882
939
|
border: none !important;
|
|
883
940
|
border-radius: 0 !important;
|
|
884
941
|
position: relative;
|
|
885
942
|
|
|
886
|
-
//
|
|
943
|
+
// Simple thread line
|
|
887
944
|
&::before {
|
|
888
945
|
content: "";
|
|
889
946
|
position: absolute;
|
|
890
|
-
left: -$jv-space-
|
|
947
|
+
left: -$jv-space-2;
|
|
891
948
|
top: 0;
|
|
892
|
-
bottom:
|
|
949
|
+
bottom: 0;
|
|
893
950
|
width: 2px;
|
|
894
951
|
background: $jv-border-subtle;
|
|
895
952
|
border-radius: 1px;
|
|
953
|
+
transition: background $jv-transition-fast;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
// Hover effect on thread line
|
|
957
|
+
&:hover::before {
|
|
958
|
+
background: $jv-border-strong;
|
|
896
959
|
}
|
|
897
960
|
|
|
898
|
-
// Replies list
|
|
961
|
+
// Replies list - compact spacing
|
|
899
962
|
[component="post/replies"],
|
|
900
963
|
ul.list-unstyled {
|
|
901
964
|
margin: 0;
|
|
902
965
|
padding: 0;
|
|
903
966
|
display: flex;
|
|
904
967
|
flex-direction: column;
|
|
905
|
-
gap: $jv-space-
|
|
968
|
+
gap: $jv-space-2;
|
|
906
969
|
}
|
|
907
970
|
|
|
908
|
-
// Individual reply posts
|
|
971
|
+
// Individual reply posts - clean, compact
|
|
909
972
|
[component="post"] {
|
|
910
973
|
margin: 0 !important;
|
|
911
974
|
padding: 0 !important;
|
|
912
975
|
background: transparent !important;
|
|
913
976
|
position: relative;
|
|
914
977
|
|
|
915
|
-
//
|
|
978
|
+
// No connector dots
|
|
916
979
|
&::before {
|
|
917
|
-
|
|
918
|
-
position: absolute;
|
|
919
|
-
left: -$jv-space-4 - 3px;
|
|
920
|
-
top: $jv-space-4;
|
|
921
|
-
width: 8px;
|
|
922
|
-
height: 8px;
|
|
923
|
-
background: $jv-surface;
|
|
924
|
-
border: 2px solid $jv-border-strong;
|
|
925
|
-
border-radius: 50%;
|
|
926
|
-
z-index: 1;
|
|
980
|
+
display: none !important;
|
|
927
981
|
}
|
|
928
982
|
|
|
929
|
-
// Reply
|
|
983
|
+
// Reply container - compact padding
|
|
930
984
|
.post-container-parent {
|
|
931
|
-
background:
|
|
932
|
-
border:
|
|
985
|
+
background: transparent !important;
|
|
986
|
+
border: none !important;
|
|
933
987
|
border-radius: $jv-radius-sm !important;
|
|
934
|
-
padding: $jv-space-3 !important;
|
|
988
|
+
padding: $jv-space-2 $jv-space-3 !important;
|
|
989
|
+
margin-left: 0;
|
|
990
|
+
margin-right: 0;
|
|
935
991
|
gap: $jv-space-2 !important;
|
|
936
|
-
transition:
|
|
992
|
+
transition: background $jv-transition-fast;
|
|
937
993
|
|
|
938
994
|
&:hover {
|
|
939
|
-
|
|
940
|
-
box-shadow: $jv-shadow-sm;
|
|
995
|
+
background: $jv-hover-bg !important;
|
|
941
996
|
}
|
|
942
997
|
|
|
943
998
|
// Smaller avatar for replies
|
|
@@ -945,8 +1000,8 @@ body.template-topic {
|
|
|
945
1000
|
> div:first-child {
|
|
946
1001
|
.avatar,
|
|
947
1002
|
[component="user/picture"] {
|
|
948
|
-
width:
|
|
949
|
-
height:
|
|
1003
|
+
width: 20px !important;
|
|
1004
|
+
height: 20px !important;
|
|
950
1005
|
}
|
|
951
1006
|
}
|
|
952
1007
|
}
|
|
@@ -958,16 +1013,20 @@ body.template-topic {
|
|
|
958
1013
|
border: none !important;
|
|
959
1014
|
}
|
|
960
1015
|
|
|
961
|
-
// Reply header
|
|
1016
|
+
// Reply header - inline, compact
|
|
962
1017
|
.post-header {
|
|
963
1018
|
font-size: $jv-font-size-xs !important;
|
|
964
1019
|
min-height: auto !important;
|
|
965
|
-
margin-bottom:
|
|
1020
|
+
margin-bottom: 0 !important;
|
|
1021
|
+
display: flex;
|
|
1022
|
+
align-items: center;
|
|
1023
|
+
gap: $jv-space-2;
|
|
966
1024
|
|
|
967
1025
|
.fw-bold,
|
|
968
1026
|
a[data-username] {
|
|
969
1027
|
font-size: $jv-font-size-xs !important;
|
|
970
1028
|
font-weight: 600;
|
|
1029
|
+
color: $jv-text-main;
|
|
971
1030
|
}
|
|
972
1031
|
|
|
973
1032
|
.text-muted {
|
|
@@ -980,22 +1039,22 @@ body.template-topic {
|
|
|
980
1039
|
}
|
|
981
1040
|
}
|
|
982
1041
|
|
|
983
|
-
// Reply content
|
|
1042
|
+
// Reply content - tighter
|
|
984
1043
|
[component="post/content"] {
|
|
985
1044
|
font-size: $jv-font-size-sm !important;
|
|
986
1045
|
line-height: $jv-line-height-base;
|
|
1046
|
+
color: $jv-text-main;
|
|
1047
|
+
margin-top: $jv-space-1;
|
|
987
1048
|
}
|
|
988
1049
|
|
|
989
|
-
// Reply footer
|
|
1050
|
+
// Reply footer - override main post styles (no border, tighter spacing)
|
|
990
1051
|
[component="post/footer"],
|
|
991
1052
|
.post-footer {
|
|
992
|
-
margin-top: $jv-space-
|
|
993
|
-
|
|
994
|
-
padding-bottom: 0 !important;
|
|
995
|
-
border-top: 1px solid $jv-border-subtle !important;
|
|
996
|
-
border-bottom: none !important;
|
|
1053
|
+
margin-top: $jv-space-1 !important;
|
|
1054
|
+
border-top: none !important;
|
|
997
1055
|
}
|
|
998
1056
|
|
|
1057
|
+
// Smaller action buttons for compact reply layout (inherits opacity/hover behavior from main rule)
|
|
999
1058
|
[component="post/actions"] {
|
|
1000
1059
|
gap: $jv-space-1 !important;
|
|
1001
1060
|
|
|
@@ -1005,15 +1064,10 @@ body.template-topic {
|
|
|
1005
1064
|
font-size: $jv-font-size-xs !important;
|
|
1006
1065
|
|
|
1007
1066
|
i {
|
|
1008
|
-
font-size:
|
|
1067
|
+
font-size: 12px !important;
|
|
1009
1068
|
}
|
|
1010
1069
|
}
|
|
1011
1070
|
}
|
|
1012
|
-
|
|
1013
|
-
// Last reply - no bottom spacing on thread line
|
|
1014
|
-
&:last-child::before {
|
|
1015
|
-
display: block !important;
|
|
1016
|
-
}
|
|
1017
1071
|
}
|
|
1018
1072
|
}
|
|
1019
1073
|
}
|
|
@@ -1061,33 +1115,23 @@ body.template-topic {
|
|
|
1061
1115
|
|
|
1062
1116
|
// Mobile adjustments for threaded replies
|
|
1063
1117
|
[component="post/replies/container"] {
|
|
1064
|
-
margin-left: $jv-space-
|
|
1118
|
+
margin-left: $jv-space-3;
|
|
1065
1119
|
|
|
1066
1120
|
&::before {
|
|
1067
|
-
left: -$jv-space-
|
|
1121
|
+
left: -$jv-space-2;
|
|
1068
1122
|
}
|
|
1069
1123
|
|
|
1070
|
-
[component="post"] {
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1124
|
+
[component="post"] .post-container-parent {
|
|
1125
|
+
padding: $jv-space-2 $jv-space-3 !important;
|
|
1126
|
+
margin-left: 0;
|
|
1127
|
+
margin-right: 0;
|
|
1074
1128
|
}
|
|
1075
1129
|
}
|
|
1076
1130
|
|
|
1077
1131
|
// Mobile adjustments for parent context
|
|
1078
1132
|
[component="post/parent"] {
|
|
1079
|
-
padding: $jv-space-2 !important;
|
|
1080
|
-
|
|
1081
|
-
[component="post/parent/content"] {
|
|
1082
|
-
-webkit-line-clamp: 1;
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
|
|
1086
|
-
// Mobile reply count button
|
|
1087
|
-
[component="post/reply-count"] {
|
|
1088
|
-
.replies-last {
|
|
1089
|
-
display: none !important;
|
|
1090
|
-
}
|
|
1133
|
+
padding: $jv-space-1 0 $jv-space-1 $jv-space-2 !important;
|
|
1134
|
+
margin-left: 0 !important;
|
|
1091
1135
|
}
|
|
1092
1136
|
}
|
|
1093
1137
|
}
|
package/static/lib/theme.js
CHANGED
|
@@ -21,10 +21,18 @@
|
|
|
21
21
|
// Fix bookmark alert - only show when bookmark is meaningfully ahead
|
|
22
22
|
fixBookmarkAlert();
|
|
23
23
|
|
|
24
|
+
// Initialize parent post click navigation with smooth scroll
|
|
25
|
+
initParentPostNavigation();
|
|
26
|
+
|
|
27
|
+
// Initialize post hover actions (show actions only on directly hovered post)
|
|
28
|
+
initPostHoverActions();
|
|
29
|
+
|
|
24
30
|
// Re-initialize carousels when new posts are loaded (infinite scroll, etc.)
|
|
25
31
|
// Also handle post edits by clearing the processed flag
|
|
26
32
|
$(window).on('action:posts.loaded action:topic.loaded action:ajaxify.end', function() {
|
|
27
33
|
initPostImageCarousels();
|
|
34
|
+
initParentPostNavigation();
|
|
35
|
+
initPostHoverActions();
|
|
28
36
|
});
|
|
29
37
|
|
|
30
38
|
// Handle post edits - need to re-process the edited post
|
|
@@ -266,4 +274,100 @@
|
|
|
266
274
|
});
|
|
267
275
|
}
|
|
268
276
|
|
|
277
|
+
/**
|
|
278
|
+
* Initialize parent post click navigation with smooth scroll
|
|
279
|
+
* Clicking the "Replying to" component scrolls to the parent post
|
|
280
|
+
*/
|
|
281
|
+
function initParentPostNavigation() {
|
|
282
|
+
// Use event delegation on the topic container
|
|
283
|
+
$('[component="topic"]').off('click.javis-parent').on('click.javis-parent', '[component="post/parent"]', function(e) {
|
|
284
|
+
// Don't navigate if clicking on a link (username, etc.)
|
|
285
|
+
if ($(e.target).closest('a').length) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
e.preventDefault();
|
|
290
|
+
e.stopPropagation();
|
|
291
|
+
|
|
292
|
+
var parentPid = $(this).attr('data-parent-pid');
|
|
293
|
+
if (!parentPid) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Find the parent post element
|
|
298
|
+
var $parentPost = $('[component="topic"] > [component="post"][data-pid="' + parentPid + '"]');
|
|
299
|
+
|
|
300
|
+
if ($parentPost.length) {
|
|
301
|
+
// Post is on the current page - smooth scroll to it
|
|
302
|
+
smoothScrollToPost($parentPost);
|
|
303
|
+
} else {
|
|
304
|
+
// Post is on a different page - navigate via URL
|
|
305
|
+
window.location.href = config.relative_path + '/post/' + parentPid;
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Smooth scroll to a post element with highlight effect
|
|
312
|
+
*/
|
|
313
|
+
function smoothScrollToPost($postElement) {
|
|
314
|
+
if (!$postElement.length) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Calculate scroll position (with offset for header)
|
|
319
|
+
var headerHeight = $('header').outerHeight() || 60;
|
|
320
|
+
var scrollTop = $postElement.offset().top - headerHeight - 20;
|
|
321
|
+
|
|
322
|
+
// Smooth scroll
|
|
323
|
+
$('html, body').animate({
|
|
324
|
+
scrollTop: scrollTop
|
|
325
|
+
}, 400, 'swing', function() {
|
|
326
|
+
// Add highlight effect after scroll completes
|
|
327
|
+
highlightPost($postElement);
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Briefly highlight a post to draw attention
|
|
333
|
+
*/
|
|
334
|
+
function highlightPost($postElement) {
|
|
335
|
+
var $container = $postElement.find('.post-container-parent');
|
|
336
|
+
if (!$container.length) {
|
|
337
|
+
$container = $postElement;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Add highlight class
|
|
341
|
+
$container.addClass('post-highlight-flash');
|
|
342
|
+
|
|
343
|
+
// Remove after animation
|
|
344
|
+
setTimeout(function() {
|
|
345
|
+
$container.removeClass('post-highlight-flash');
|
|
346
|
+
}, 1500);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Initialize post hover actions
|
|
351
|
+
* Adds 'post-hovered' class only to the directly hovered post container
|
|
352
|
+
* This prevents CSS hover from bubbling up to parent posts
|
|
353
|
+
*/
|
|
354
|
+
function initPostHoverActions() {
|
|
355
|
+
// Use event delegation for all post containers
|
|
356
|
+
$(document).off('mouseenter.javis-hover mouseleave.javis-hover', '.post-container-parent');
|
|
357
|
+
|
|
358
|
+
$(document).on('mouseenter.javis-hover', '.post-container-parent', function(e) {
|
|
359
|
+
// Stop propagation to prevent parent containers from getting the event
|
|
360
|
+
e.stopPropagation();
|
|
361
|
+
// Remove class from all other containers first
|
|
362
|
+
$('.post-container-parent.post-hovered').removeClass('post-hovered');
|
|
363
|
+
// Add class only to this specific container
|
|
364
|
+
$(this).addClass('post-hovered');
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
$(document).on('mouseleave.javis-hover', '.post-container-parent', function(e) {
|
|
368
|
+
e.stopPropagation();
|
|
369
|
+
$(this).removeClass('post-hovered');
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
|
|
269
373
|
})();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<div component="post/parent" data-parent-pid="{./parent.pid}" data-uid="{./parent.uid}" class="btn btn-ghost btn-sm d-flex gap-2 text-start flex-row mb-2 post-parent-clickable" style="font-size: 13px;">
|
|
2
|
+
<div class="d-flex gap-2 text-nowrap">
|
|
3
|
+
<div class="d-flex flex-nowrap gap-1 align-items-center">
|
|
4
|
+
<a href="{config.relative_path}/user/{./parent.user.userslug}" class="text-decoration-none lh-1" onclick="event.stopPropagation();">{buildAvatar(./parent.user, "16px", true, "not-responsive align-middle")}</a>
|
|
5
|
+
<a class="fw-semibold text-truncate" style="max-width: 150px;" href="{config.relative_path}/user/{./parent.user.userslug}" onclick="event.stopPropagation();">{./parent.user.displayname}</a>
|
|
6
|
+
</div>
|
|
7
|
+
</div>
|
|
8
|
+
<div component="post/parent/content" class="text-muted line-clamp-1 text-break w-100">{./parent.content}</div>
|
|
9
|
+
</div>
|