@keenmate/pure-admin-core 2.3.6 → 2.5.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.
Files changed (47) hide show
  1. package/README.md +23 -29
  2. package/dist/css/main.css +68 -148
  3. package/package.json +1 -5
  4. package/snippets/AUDIT.md +94 -0
  5. package/snippets/alerts.html +264 -89
  6. package/snippets/badges.html +193 -61
  7. package/snippets/buttons.html +178 -0
  8. package/snippets/callouts.html +210 -129
  9. package/snippets/cards.html +383 -200
  10. package/snippets/checkbox-lists.html +199 -65
  11. package/snippets/code.html +55 -11
  12. package/snippets/command-palette.html +401 -111
  13. package/snippets/comparison.html +144 -93
  14. package/snippets/customization.html +311 -104
  15. package/snippets/data-display.html +584 -0
  16. package/snippets/detail-panel.html +470 -138
  17. package/snippets/filter-card.html +246 -0
  18. package/snippets/forms.html +408 -308
  19. package/snippets/grid.html +253 -141
  20. package/snippets/layout.html +379 -480
  21. package/snippets/lists.html +144 -47
  22. package/snippets/loaders.html +64 -39
  23. package/snippets/manifest.json +330 -280
  24. package/snippets/modal-dialogs.html +137 -64
  25. package/snippets/modals.html +221 -151
  26. package/snippets/notifications.html +285 -0
  27. package/snippets/popconfirm.html +213 -19
  28. package/snippets/profile.html +290 -330
  29. package/snippets/statistics.html +247 -0
  30. package/snippets/tables.html +359 -150
  31. package/snippets/tabs.html +129 -45
  32. package/snippets/timeline.html +123 -56
  33. package/snippets/toasts.html +179 -31
  34. package/snippets/tooltips.html +199 -81
  35. package/snippets/typography.html +183 -58
  36. package/snippets/utilities.html +511 -415
  37. package/snippets/virtual-scroll.html +201 -75
  38. package/snippets/web-daterangepicker.html +369 -189
  39. package/snippets/web-multiselect.html +360 -124
  40. package/src/scss/core-components/_alerts.scss +51 -12
  41. package/src/scss/core-components/_pagers.scss +1 -1
  42. package/src/scss/core-components/_popconfirm.scss +35 -13
  43. package/src/scss/core-components/_profile.scss +18 -8
  44. package/src/scss/core-components/_statistics.scss +12 -12
  45. package/src/scss/core-components/_tables.scss +2 -134
  46. package/src/scss/variables/_components.scss +17 -2
  47. package/scripts/download-themes.js +0 -351
@@ -200,7 +200,7 @@
200
200
  <span>Notifications</span>
201
201
  </button>
202
202
  </div>
203
- <div class="pa-tabs__content" class="flex-grow-1">
203
+ <div class="pa-tabs__content flex-grow-1">
204
204
  <div class="pa-tabs__panel pa-tabs__panel--active" id="vert-1">
205
205
  Account settings
206
206
  </div>
@@ -226,7 +226,7 @@
226
226
  <i class="fa-solid fa-gear"></i>
227
227
  </button>
228
228
  </div>
229
- <div class="pa-tabs__content" class="flex-grow-1">
229
+ <div class="pa-tabs__content flex-grow-1">
230
230
  <div class="pa-tabs__panel pa-tabs__panel--active" id="vert-c-1">
231
231
  Dashboard content
232
232
  </div>
@@ -582,7 +582,7 @@
582
582
  <i class="fa-solid fa-envelope"></i>
583
583
  </button>
584
584
  </div>
585
- <div class="pa-tabs__content" class="flex-grow-1">
585
+ <div class="pa-tabs__content flex-grow-1">
586
586
  <div class="pa-tabs__panel pa-tabs__panel--active" id="vicon1">
587
587
  Home content
588
588
  </div>
@@ -680,20 +680,20 @@
680
680
  <!-- Vertical Standalone Tabs - Sidebar Style Navigation (use vertical layout wrapper) -->
681
681
  <div class="pa-tabs__vertical-layout">
682
682
  <div class="pa-tabs pa-tabs--vertical">
683
- <button class="pa-tabs__item pa-tabs__item--h-3x pa-tabs__item--active">
683
+ <button class="pa-tabs__item minhr-3 pa-tabs__item--active">
684
684
  <i class="fa-solid fa-house"></i>
685
685
  <span>Dashboard</span>
686
686
  </button>
687
- <button class="pa-tabs__item pa-tabs__item--h-3x">
687
+ <button class="pa-tabs__item minhr-3">
688
688
  <i class="fa-solid fa-chart-bar"></i>
689
689
  <span>Analytics</span>
690
690
  </button>
691
- <button class="pa-tabs__item pa-tabs__item--h-3x">
691
+ <button class="pa-tabs__item minhr-3">
692
692
  <i class="fa-solid fa-users"></i>
693
693
  <span>Users</span>
694
694
  </button>
695
695
  </div>
696
- <div class="pa-tabs__content" class="flex-grow-1">
696
+ <div class="pa-tabs__content flex-grow-1">
697
697
  <div class="pa-tabs__panel pa-tabs__panel--active" id="sav1">
698
698
  <div class="pa-card">
699
699
  <div class="pa-card__header">
@@ -743,20 +743,20 @@
743
743
  <!-- Bordered Vertical Tabs - Card-Like Wrapper -->
744
744
  <div class="pa-tabs__vertical-layout pa-tabs__vertical-layout--bordered">
745
745
  <div class="pa-tabs pa-tabs--vertical">
746
- <button class="pa-tabs__item pa-tabs__item--h-3x pa-tabs__item--active">
746
+ <button class="pa-tabs__item minhr-3 pa-tabs__item--active">
747
747
  <i class="fa-solid fa-gauge"></i>
748
748
  <span>Overview</span>
749
749
  </button>
750
- <button class="pa-tabs__item pa-tabs__item--h-3x">
750
+ <button class="pa-tabs__item minhr-3">
751
751
  <i class="fa-solid fa-chart-pie"></i>
752
752
  <span>Reports</span>
753
753
  </button>
754
- <button class="pa-tabs__item pa-tabs__item--h-3x">
754
+ <button class="pa-tabs__item minhr-3">
755
755
  <i class="fa-solid fa-gear"></i>
756
756
  <span>Settings</span>
757
757
  </button>
758
758
  </div>
759
- <div class="pa-tabs__content" class="flex-grow-1">
759
+ <div class="pa-tabs__content flex-grow-1">
760
760
  <div class="pa-tabs__panel pa-tabs__panel--active" id="bv1">
761
761
  Overview - bordered vertical tabs with divider
762
762
  </div>
@@ -770,9 +770,72 @@
770
770
  </div>
771
771
 
772
772
 
773
+ <!-- ================================
774
+ CARD-HEADER TABS (pa-tabs__container--card)
775
+ Makes the tab row look and sit like a pa-card__header — same
776
+ height, same padding, same background. Useful when the tabs ARE
777
+ the header of a card-shaped section, not just navigation above it.
778
+
779
+ Built-in overflow behaviour: when the tab row can't fit all tabs,
780
+ a .pa-tabs__overflow menu on the inline-end side holds the
781
+ overflowing ones. The toggle carries --has-active when the hidden
782
+ tab is the active one (adds an accent underline to the toggle).
783
+ ================================ -->
784
+
785
+ <div class="pa-tabs__container pa-tabs__container--card">
786
+ <div class="pa-tabs">
787
+ <button class="pa-tabs__item pa-tabs__item--active">Overview</button>
788
+ <button class="pa-tabs__item">Analytics</button>
789
+ <button class="pa-tabs__item">Logs</button>
790
+
791
+ <!-- Overflow affordance — toggle + dropdown menu.
792
+ Flipped open/closed by adding pa-tabs__overflow-menu--open on
793
+ the menu. Add pa-tabs__overflow-toggle--has-active on the
794
+ toggle when the hidden tab currently has --active. -->
795
+ <div class="pa-tabs__overflow">
796
+ <button class="pa-tabs__overflow-toggle" onclick="toggleTabOverflow(this)" aria-label="More tabs">
797
+ <i class="fa-solid fa-ellipsis"></i>
798
+ </button>
799
+ <div class="pa-tabs__overflow-menu">
800
+ <button class="pa-tabs__item">Archived</button>
801
+ <button class="pa-tabs__item">Deleted</button>
802
+ <button class="pa-tabs__item">Audit Trail</button>
803
+ </div>
804
+ </div>
805
+ </div>
806
+
807
+ <div class="pa-tabs__content">
808
+ <div class="pa-tabs__panel pa-tabs__panel--active" id="cardtabs-1">
809
+ Overview content — tab row renders at $card-header-min-height with
810
+ $card-header-padding, matching adjacent pa-card headers cleanly.
811
+ </div>
812
+ <div class="pa-tabs__panel" id="cardtabs-2">Analytics content</div>
813
+ <div class="pa-tabs__panel" id="cardtabs-3">Logs content</div>
814
+ </div>
815
+ </div>
816
+
817
+
773
818
  <!-- JAVASCRIPT FOR TAB SWITCHING -->
774
819
 
775
820
  <script>
821
+ // Toggle the overflow menu on card-header tabs.
822
+ function toggleTabOverflow(btn) {
823
+ const menu = btn.nextElementSibling;
824
+ if (menu && menu.classList.contains('pa-tabs__overflow-menu')) {
825
+ menu.classList.toggle('pa-tabs__overflow-menu--open');
826
+ }
827
+ }
828
+
829
+ // Close the overflow menu when clicking outside
830
+ document.addEventListener('click', (e) => {
831
+ document.querySelectorAll('.pa-tabs__overflow-menu--open').forEach(menu => {
832
+ const overflow = menu.closest('.pa-tabs__overflow');
833
+ if (overflow && !overflow.contains(e.target)) {
834
+ menu.classList.remove('pa-tabs__overflow-menu--open');
835
+ }
836
+ });
837
+ });
838
+
776
839
  // Scrollable tabs functionality
777
840
  function scrollTabs(button, direction) {
778
841
  const tabsContainer = button.closest('.pa-tabs--scrollable');
@@ -907,46 +970,67 @@ STANDALONE TABS:
907
970
  - pa-tabs__panel--active (active panel)
908
971
 
909
972
  STYLES:
910
- - pa-tabs--pills (pill-style tabs with rounded backgrounds)
911
- - pa-tabs--boxed (boxed tabs with container border)
912
- - pa-tabs--vertical (vertical tab orientation)
973
+ - pa-tabs--pills (pill-style tabs with rounded backgrounds)
974
+ - pa-tabs--boxed (boxed tabs with container border)
975
+ - pa-tabs--vertical (vertical tab orientation; use inside
976
+ .pa-tabs__vertical-layout for proper spacing)
977
+ - pa-tabs--border-top (active indicator on TOP border instead of bottom;
978
+ border-bottom is removed on the container)
913
979
 
914
980
  ALIGNMENT:
915
- - pa-tabs--centered (center-align tabs)
916
- - pa-tabs--full (full-width tabs, equal distribution)
981
+ - pa-tabs--centered (center-align tabs)
982
+ - pa-tabs--full (full-width tabs, equal distribution)
917
983
 
918
984
  OVERFLOW HANDLING:
919
- - (default) (tabs wrap to multiple lines when constrained)
920
- - pa-tabs--nowrap (prevent wrapping, tabs overflow in single line)
921
- - pa-tabs--scrollable (horizontal scroll with arrow navigation)
922
- - pa-tabs--collapse (show only icons, active tab shows full title - requires icons on all tabs)
923
- - Use for long tab titles in narrow containers
985
+ - (default) (tabs wrap to multiple lines when constrained)
986
+ - pa-tabs--nowrap (prevent wrapping, tabs overflow in single line)
987
+ - pa-tabs--scrollable (horizontal scroll with arrow navigation;
988
+ requires .pa-tabs__scroll-container wrap and
989
+ .pa-tabs__scroll-btn--start / --end arrows)
990
+ - pa-tabs--collapse (show only icons, active tab shows full title —
991
+ all tabs must have an <i> AND a <span>, since
992
+ the SCSS only hides the span)
924
993
 
925
994
  SIZES:
926
- - pa-tabs--sm (small tabs with compact padding)
927
- - (no class) (default size)
928
- - pa-tabs--lg (large tabs with generous padding)
929
-
930
- FIXED WIDTH/HEIGHT (use utility classes):
931
- - minwr-1 through minwr-25 (min-width in rem)
932
- - minhr-1 through minhr-25 (min-height in rem)
933
- - Examples: minwr-6 (6rem), minwr-8 (8rem), minhr-3 (3rem)
934
- - Use for consistent tab sizing across navigation
935
-
936
- LAYOUT WRAPPERS:
937
- - pa-tabs__container (wrapper for horizontal tabs + content)
938
- - pa-tabs__container--bordered (card-like border around entire tabs system)
939
- - pa-tabs__vertical-layout (flexbox wrapper for vertical tabs + content)
940
- - pa-tabs__vertical-layout--bordered (card-like border around entire tabs system)
941
- - Use wrappers for all vertical tab layouts instead of grid
942
- - Provides proper spacing and alignment
943
-
944
- BORDERED VARIANTS:
945
- - Add --bordered modifier to wrapper for card-like appearance
946
- - Wraps entire tab system (navigation + content) in single border
947
- - Horizontal: pa-tabs__container--bordered
948
- - Vertical: pa-tabs__vertical-layout--bordered
949
- - Perfect for standalone tabs that need visual separation
995
+ - pa-tabs--sm (small tabs with compact padding)
996
+ - (no class) (default size)
997
+ - pa-tabs--lg (large tabs with generous padding)
998
+
999
+ FIXED WIDTH/HEIGHT (utility classes from utilities.scss):
1000
+ - minwr-{n} / wr-{n} / maxwr-{n} (rem width; n = 1..10, 15, 20, 25, 30, 35, 40, 45, 50)
1001
+ - minhr-{n} / hr-{n} / maxhr-{n} (rem height; same set)
1002
+ - Examples: .minwr-6 (6rem), .minwr-8 (8rem), .minhr-3 (3rem)
1003
+ - For icon-only vertical tabs, .minwr-3 .minhr-3 produces a 30×30 px square.
1004
+
1005
+ LAYOUT WRAPPERS (for pairing tabs + content):
1006
+ - pa-tabs__container Horizontal wrapper.
1007
+ - pa-tabs__container--bordered Card-like border around the
1008
+ whole tabs system; adds a
1009
+ divider between nav and content.
1010
+ - pa-tabs__container--card Tab row renders as a
1011
+ pa-card__header (same height,
1012
+ padding, bg); supports an
1013
+ overflow menu on the inline-end.
1014
+ Content below uses card body
1015
+ padding. Good when tabs ARE the
1016
+ section header.
1017
+ - pa-tabs__vertical-layout Vertical wrapper (flex row:
1018
+ tabs on start, content on end).
1019
+ Content panels get padding-top: 0
1020
+ so they align horizontally with
1021
+ the tab row.
1022
+ - pa-tabs__vertical-layout--bordered Card-like border with a divider
1023
+ between vertical tabs and content.
1024
+
1025
+ OVERFLOW MENU (used inside pa-tabs__container--card):
1026
+ - pa-tabs__overflow Wrapper; sits at the inline-end
1027
+ of the tab row.
1028
+ - pa-tabs__overflow-toggle Ellipsis / chevron button.
1029
+ - pa-tabs__overflow-toggle--has-active Adds an accent underline so the
1030
+ user knows the active tab is
1031
+ currently hidden inside the menu.
1032
+ - pa-tabs__overflow-menu Dropdown <div> hosting tab items.
1033
+ - pa-tabs__overflow-menu--open JS-flipped visibility.
950
1034
 
951
1035
  USAGE NOTES:
952
1036
  - Use pa-card__tabs for tabs integrated into cards
@@ -1,5 +1,18 @@
1
- <!-- Timeline Component Snippets -->
2
- <!-- Clean HTML examples for all timeline variants -->
1
+ <!-- ================================
2
+ TIMELINE SNIPPETS
3
+ Pure Admin Visual Framework
4
+
5
+ Three visual variants, pick one per timeline container:
6
+ --simple vertical line + dots on one side (start)
7
+ --alternating centered line, items zigzag left/right
8
+ --feed activity-feed layout (avatar + text + time)
9
+
10
+ The base .pa-timeline class has zero visual styling on its own;
11
+ each variant adds its own rules. Items can be <li> inside a <ul>
12
+ (semantic) or <div> inside a <div> (non-semantic) — the SCSS uses
13
+ :nth-child so either tag works. Use <ul>/<li> when the timeline
14
+ is a genuine list of events; otherwise <div> is fine.
15
+ ================================ -->
3
16
 
4
17
  <!-- ========================================
5
18
  Simple Timeline (Start-aligned with dots)
@@ -306,59 +319,113 @@
306
319
  </div>
307
320
  </div>
308
321
 
309
- <!-- ========================================
310
- Complete Component Reference
311
- ======================================== -->
322
+ <!-- ================================
323
+ COMPONENT REFERENCE
324
+ ================================ -->
325
+
312
326
  <!--
313
- TIMELINE VARIANTS:
314
- - pa-timeline--simple: Start-aligned with dots
315
- - pa-timeline--alternating: Centered zigzag layout
316
- - pa-timeline--feed: Activity feed with avatars
317
-
318
- ALTERNATING LAYOUT MODIFIERS (can be combined):
319
- - pa-timeline--start: All items on start side (independent of responsive behavior)
320
- - pa-timeline--end: All items on end side (independent of responsive behavior)
321
- - pa-timeline--keep-layout: Prevent mobile collapse, maintain desktop layout at all widths
322
- - pa-timeline--single-column: Force single-column layout (alias for --start)
323
-
324
- RESPONSIVE BEHAVIOR:
325
- - Default: Zigzag on desktop (>767px), auto-collapse to single-column on mobile (≤767px)
326
- - With --keep-layout: Layout maintained at all screen widths
327
- - With --start or --end: Aligned layout on desktop, collapses on mobile (unless --keep-layout added)
328
-
329
- COMBINATION EXAMPLES:
330
- - pa-timeline--alternating: Zigzag desktop, single-column mobile (auto-responsive)
331
- - pa-timeline--alternating pa-timeline--start: All start desktop, single-column mobile
332
- - pa-timeline--alternating pa-timeline--end: All end desktop, single-column mobile
333
- - pa-timeline--alternating pa-timeline--keep-layout: Zigzag stays zigzag on mobile
334
- - pa-timeline--alternating pa-timeline--start pa-timeline--keep-layout: Start stays start on mobile
335
- - pa-timeline--alternating pa-timeline--end pa-timeline--keep-layout: End stays end on mobile
336
-
337
- ITEM MODIFIERS (simple variant):
338
- - pa-timeline__item--primary: Primary color marker
339
- - pa-timeline__item--success: Success color marker
340
- - pa-timeline__item--warning: Warning color marker
341
- - pa-timeline__item--danger: Danger color marker
342
- - pa-timeline__item--info: Info color marker
343
- - pa-timeline__item--secondary: Secondary color marker
344
- - pa-timeline__item--filled: Solid filled marker
345
-
346
- FEED MODIFIERS:
347
- - pa-timeline__item--date-header: Date section header
348
-
349
- COMPONENTS:
350
- - pa-timeline__time: Time label
351
- - pa-timeline__content: Main content area
352
- - pa-timeline__date: Date label (block variant)
353
- - pa-timeline__icon: Icon container (block variant)
354
- - pa-timeline__avatar: Avatar image (feed variant)
355
- - pa-timeline__comment: Comment bubble (feed variant)
356
- - pa-timeline__date-icon: Calendar icon (feed date headers)
357
- - pa-timeline__date-label: Date text (feed date headers)
358
-
359
- UTILITIES:
360
- - pa-timeline__scroll-container: Scrollable container
361
- - pa-timeline__loader: Loading indicator
362
- - pa-timeline__loader-text: Loading text
363
- - pa-timeline__load-more-wrapper: Load more button wrapper
327
+ BASE:
328
+ - .pa-timeline Base container; no visual styling on its
329
+ own. Pick ONE variant below.
330
+
331
+ VARIANTS (mutually exclusive):
332
+ - .pa-timeline--simple Start-aligned: vertical line on the
333
+ inline-start edge with dot markers.
334
+ Uses logical properties mirrors in RTL.
335
+ - .pa-timeline--alternating Centered line; items zigzag to the left
336
+ and right side via :nth-child(odd/even).
337
+ Max-width capped.
338
+ (NOTE: uses physical left/right — does
339
+ NOT mirror in RTL.)
340
+ - .pa-timeline--feed Flex-row per item: time / avatar / body.
341
+ Optimised for activity feeds & comments.
342
+
343
+ SIMPLE ITEM MODIFIERS (dot colour):
344
+ - .pa-timeline__item--primary / --success / --warning / --danger
345
+ / --info / --secondary
346
+ - .pa-timeline__item--filled Solid fill instead of ring. Composes
347
+ with a colour modifier to match.
348
+
349
+ ALTERNATING LAYOUT MODIFIERS:
350
+ - .pa-timeline--start All items on start side; line on start.
351
+ - .pa-timeline--end All items on end side; line on end.
352
+ - .pa-timeline--keep-layout Don't auto-collapse to single column on
353
+ mobile (<= 767px). Desktop zigzag stays.
354
+ - .pa-timeline--single-column Force single-column layout regardless of
355
+ screen width. Visually similar to --start
356
+ but uses a different specificity path
357
+ (does NOT override left with !important,
358
+ so odd/even classes on items still apply).
359
+
360
+ Responsive behaviour (--alternating only):
361
+ default zigzag desktop single column mobile (≤ 767px)
362
+ + --keep-layout zigzag stays at all widths
363
+ + --start start-aligned desktop → single column mobile
364
+ + --end end-aligned desktop → single column mobile
365
+ (combine --start/--end with --keep-layout to skip the mobile collapse.)
366
+
367
+ SIMPLE / FEED SUB-ELEMENTS:
368
+ - .pa-timeline__time Time label (block in --simple; fixed-
369
+ width column in --feed).
370
+ - .pa-timeline__content Main body text.
371
+
372
+ ALTERNATING SUB-ELEMENTS:
373
+ - .pa-timeline__date Accent-coloured date label (uppercase).
374
+ - .pa-timeline__icon Circular icon badge beside the dot.
375
+ - .pa-timeline__content Content box (auto-styled h3 + p).
376
+
377
+ FEED SUB-ELEMENTS:
378
+ - .pa-timeline__avatar Circular avatar wrapper (inline-block,
379
+ margin-inline-end). Put an <img>
380
+ inside.
381
+ - .pa-timeline__comment Bordered comment bubble below the
382
+ meta line.
383
+ - .pa-timeline__item--date-header Section divider (flex row + date
384
+ icon/label, no dot on the line).
385
+ - .pa-timeline__date-icon Emoji / FA calendar icon.
386
+ - .pa-timeline__date-label Uppercase date text.
387
+
388
+ UTILITIES (typically with --simple for interactive log views):
389
+ - .pa-timeline__scroll-container max-height + overflow-y: auto
390
+ - .pa-timeline__loader Centred loader wrapper
391
+ - .pa-timeline__loader-text Muted caption under the spinner
392
+ - .pa-timeline__load-more-wrapper Centred button wrapper
393
+
394
+ MARKUP NOTE:
395
+ The SCSS uses :nth-child selectors, so item order comes from DOM order
396
+ regardless of tag. Use <ul>/<li> for semantic lists (preferred for
397
+ event logs / history); <div>/<div> works the same if you don't want
398
+ list semantics.
399
+
400
+ STRUCTURE PATTERNS:
401
+
402
+ Simple log (start-aligned, coloured dots):
403
+ <ul class="pa-timeline pa-timeline--simple">
404
+ <li class="pa-timeline__item pa-timeline__item--success">
405
+ <div class="pa-timeline__time">14:32</div>
406
+ <div class="pa-timeline__content">Deploy succeeded</div>
407
+ </li>
408
+ </ul>
409
+
410
+ Alternating milestone layout (auto-collapse on mobile):
411
+ <ul class="pa-timeline pa-timeline--alternating">
412
+ <li class="pa-timeline__item">
413
+ <div class="pa-timeline__date">Jan 2024</div>
414
+ <div class="pa-timeline__icon">🚀</div>
415
+ <div class="pa-timeline__content"><h3>Launch</h3><p>…</p></div>
416
+ </li>
417
+ </ul>
418
+
419
+ Activity feed with avatar, comment, and time column:
420
+ <ul class="pa-timeline pa-timeline--feed">
421
+ <li class="pa-timeline__item">
422
+ <div class="pa-timeline__time">14:32</div>
423
+ <div class="pa-timeline__content">
424
+ <div class="pa-timeline__avatar"><img src="…"></div>
425
+ <span><a href="#">User</a> commented on <a href="#">Issue #42</a></span>
426
+ <div class="pa-timeline__comment"><p>Looks good to me.</p></div>
427
+ </div>
428
+ </li>
429
+ </ul>
364
430
  -->
431
+