@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okjavis/nodebb-theme-javis",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Modern, premium NodeBB theme for JAVIS Community - Extends Harmony with custom styling",
5
5
  "main": "theme.js",
6
6
  "scripts": {
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: $jv-space-3;
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
- // Always visible post actions (override Harmony's hover behavior)
448
- .topic .posts [component="post"] [component="post/actions"] {
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
- // Consistent ghost button styling for all sidebar action buttons
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
- i {
612
- width: 16px;
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: $jv-surface !important;
744
- border: 1px solid $jv-border-subtle !important;
745
- border-left: 3px solid $jv-primary !important;
746
- border-radius: $jv-radius-sm !important;
747
- padding: $jv-space-3 !important;
748
- margin-bottom: $jv-space-3 !important;
749
- transition: background-color $jv-transition-fast, border-color $jv-transition-fast;
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
- background: $jv-hover-bg !important;
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
- // Small avatar
763
- .avatar,
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
- // Username and time
772
- .text-nowrap,
773
- .fw-bold {
774
- font-size: $jv-font-size-xs !important;
775
- font-weight: 600;
776
- color: $jv-text-main;
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
- .text-muted {
780
- font-size: $jv-font-size-xs !important;
781
- color: $jv-text-soft !important;
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-sm !important;
788
- color: $jv-text-muted !important;
789
- line-height: $jv-line-height-base;
790
- display: -webkit-box;
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
- // REPLY COUNT BUTTON (Accordion trigger)
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 !important;
860
+ display: inline-flex;
806
861
  align-items: center;
807
862
  gap: $jv-space-2;
808
- background: $jv-surface !important;
809
- border: 1px solid $jv-border-subtle !important;
810
- border-radius: $jv-radius-pill !important;
811
- padding: $jv-space-1 $jv-space-3 !important;
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
- &:hover {
818
- background: $jv-hover-bg !important;
819
- border-color: $jv-border-strong !important;
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
- // Avatar stack
824
- [component="post/reply-count/avatars"] {
825
- display: flex;
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
- &:first-child {
832
- margin-left: 0;
833
- }
882
+ [component="post/reply-count/text"],
883
+ .replies-count {
884
+ color: $jv-primary !important;
834
885
  }
886
+ }
835
887
 
836
- .avatar,
837
- img {
838
- width: 18px !important;
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
- color: $jv-text-main;
897
+ font-size: $jv-font-size-xs;
898
+ color: $jv-text-muted;
899
+ transition: color $jv-transition-fast;
850
900
  }
851
901
 
852
- // Last reply time
902
+ // Hide last reply time - too verbose
853
903
  .replies-last {
854
- color: $jv-text-soft;
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 (Threaded style)
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-6;
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
- // Thread line
943
+ // Simple thread line
887
944
  &::before {
888
945
  content: "";
889
946
  position: absolute;
890
- left: -$jv-space-4;
947
+ left: -$jv-space-2;
891
948
  top: 0;
892
- bottom: $jv-space-4;
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-3;
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
- // Thread connector dot
978
+ // No connector dots
916
979
  &::before {
917
- content: "";
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 card
983
+ // Reply container - compact padding
930
984
  .post-container-parent {
931
- background: $jv-surface !important;
932
- border: 1px solid $jv-border-subtle !important;
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: border-color $jv-transition-fast, box-shadow $jv-transition-fast;
992
+ transition: background $jv-transition-fast;
937
993
 
938
994
  &:hover {
939
- border-color: $jv-border-strong !important;
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: 28px !important;
949
- height: 28px !important;
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: $jv-space-1 !important;
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/actions
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-2 !important;
993
- padding-top: $jv-space-2 !important;
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: 14px !important;
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-4;
1118
+ margin-left: $jv-space-3;
1065
1119
 
1066
1120
  &::before {
1067
- left: -$jv-space-3;
1121
+ left: -$jv-space-2;
1068
1122
  }
1069
1123
 
1070
- [component="post"] {
1071
- &::before {
1072
- left: -$jv-space-3 - 3px;
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
  }
@@ -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>