@keenmate/pure-admin-core 2.9.0-rc03 → 2.9.0-rc05

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 (35) hide show
  1. package/README.md +55 -13
  2. package/dist/css/main.css +554 -7
  3. package/package.json +3 -1
  4. package/snippets/buttons.html +51 -0
  5. package/snippets/cards.html +132 -47
  6. package/snippets/comparison.html +26 -22
  7. package/snippets/manifest.json +180 -115
  8. package/snippets/range-group.html +125 -0
  9. package/snippets/splitter.html +44 -38
  10. package/snippets/statistics.html +31 -0
  11. package/src/js/btn-split-auto-absorb.js +327 -0
  12. package/src/js/command-palette.js +472 -0
  13. package/src/js/file-selector.js +1275 -0
  14. package/src/js/internal/logging.js +121 -0
  15. package/src/js/logic-tree-renderer.js +303 -0
  16. package/src/js/modal-dialogs.js +460 -0
  17. package/src/js/overflow.js +371 -0
  18. package/src/js/pa-stat-fit.js +184 -0
  19. package/src/js/range-group.js +663 -0
  20. package/src/js/search-autocomplete-v2.js +907 -0
  21. package/src/js/search-autocomplete.js +434 -0
  22. package/src/js/settings-panel.js +245 -0
  23. package/src/js/split-button.js +141 -0
  24. package/src/js/splitter.js +1323 -0
  25. package/src/js/toast-service.js +302 -0
  26. package/src/js/tooltips-popovers.js +275 -0
  27. package/src/js/virtual-scroll.js +143 -0
  28. package/src/js/virtual-textbox.js +803 -0
  29. package/src/scss/_core.scss +7 -0
  30. package/src/scss/core-components/_buttons.scss +44 -0
  31. package/src/scss/core-components/_cards.scss +95 -6
  32. package/src/scss/core-components/_overflow.scss +50 -0
  33. package/src/scss/core-components/_range-group.scss +474 -0
  34. package/src/scss/core-components/_statistics.scss +163 -0
  35. package/src/scss/variables/_components.scss +41 -2
@@ -283,6 +283,57 @@
283
283
  </div>
284
284
 
285
285
 
286
+ <!-- Auto-Absorb Split Button (sibling buttons collapse into menu on resize) -->
287
+ <!-- The .pa-btn-toolbar wrapper provides the constrained-width flex row;
288
+ btn-split-auto-absorb.js moves overflowing siblings into the menu.
289
+ Standalone form (any flex context): -->
290
+ <div class="pa-btn-toolbar">
291
+ <button class="pa-btn pa-btn--primary">Save</button>
292
+ <button class="pa-btn pa-btn--primary">Format</button>
293
+ <button class="pa-btn pa-btn--primary">Refresh</button>
294
+ <button class="pa-btn pa-btn--primary" data-pa-absorb-priority="10">Publish</button>
295
+ <div class="pa-btn-split pa-btn-split--auto-absorb">
296
+ <button class="pa-btn pa-btn--primary">Run</button>
297
+ <button class="pa-btn pa-btn--primary pa-btn-split__toggle" onclick="toggleSplitMenu(event)">
298
+ <i class="fas fa-chevron-down text-2xs pa-btn-split__chevron"></i>
299
+ </button>
300
+ <div class="pa-btn-split__menu">
301
+ <div class="pa-btn-split__menu-inner">
302
+ <button class="pa-btn-split__item">Run with options&hellip;</button>
303
+ </div>
304
+ </div>
305
+ </div>
306
+ </div>
307
+
308
+ <!-- In a card header, nest the toolbar inside .pa-card__actions (the canonical
309
+ header actions slot) — same as a plain button row or a .pa-btn-group. The
310
+ framework makes that actions wrapper shrinkable so overflow detection still
311
+ works, and the header title yields before the toolbar collapses. -->
312
+ <div class="pa-card">
313
+ <div class="pa-card__header">
314
+ <h3>Team Members</h3>
315
+ <div class="pa-card__actions">
316
+ <div class="pa-btn-toolbar">
317
+ <button class="pa-btn pa-btn--secondary">Search</button>
318
+ <button class="pa-btn pa-btn--secondary">Filter</button>
319
+ <div class="pa-btn-split pa-btn-split--auto-absorb">
320
+ <button class="pa-btn pa-btn--primary">Add user</button>
321
+ <button class="pa-btn pa-btn--primary pa-btn-split__toggle" onclick="toggleSplitMenu(event)">
322
+ <i class="fas fa-chevron-down text-2xs pa-btn-split__chevron"></i>
323
+ </button>
324
+ <div class="pa-btn-split__menu">
325
+ <div class="pa-btn-split__menu-inner">
326
+ <button class="pa-btn-split__item">Add user with role&hellip;</button>
327
+ </div>
328
+ </div>
329
+ </div>
330
+ </div>
331
+ </div>
332
+ </div>
333
+ <div class="pa-card__body">Card content.</div>
334
+ </div>
335
+
336
+
286
337
  <!-- BUTTONS WITH ICONS -->
287
338
 
288
339
  <!-- Button with Icon (Text Icon) -->
@@ -11,10 +11,16 @@
11
11
  </div>
12
12
 
13
13
 
14
- <!-- CARD WITH HEADER -->
14
+ <!-- CARD WITH HEADER
15
+ The title ALWAYS uses .pa-card__title > .pa-card__title-text (the icon
16
+ span is optional). This is the one canonical header title structure —
17
+ a bare <h3> in the header still renders, but is legacy tolerance, not
18
+ the documented shape. -->
15
19
  <div class="pa-card">
16
20
  <div class="pa-card__header">
17
- <h3>Card Title</h3>
21
+ <div class="pa-card__title">
22
+ <h3 class="pa-card__title-text">Card Title</h3>
23
+ </div>
18
24
  </div>
19
25
  <div class="pa-card__body">
20
26
  Card content goes here.
@@ -28,7 +34,9 @@
28
34
  Card content goes here.
29
35
  </div>
30
36
  <div class="pa-card__footer">
31
- <button class="pa-btn pa-btn--primary">Action</button>
37
+ <div class="pa-card__actions">
38
+ <button class="pa-btn pa-btn--primary">Action</button>
39
+ </div>
32
40
  </div>
33
41
  </div>
34
42
 
@@ -36,31 +44,37 @@
36
44
  <!-- COMPLETE CARD (header + body + footer) -->
37
45
  <div class="pa-card">
38
46
  <div class="pa-card__header">
39
- <h3>Complete Card</h3>
47
+ <div class="pa-card__title">
48
+ <h3 class="pa-card__title-text">Complete Card</h3>
49
+ </div>
40
50
  </div>
41
51
  <div class="pa-card__body">
42
52
  <p>This card has all three sections: header, body, and footer.</p>
43
53
  </div>
44
54
  <div class="pa-card__footer">
45
- <button class="pa-btn pa-btn--secondary">Cancel</button>
46
- <button class="pa-btn pa-btn--primary">Save</button>
55
+ <div class="pa-card__actions">
56
+ <button class="pa-btn pa-btn--secondary">Cancel</button>
57
+ <button class="pa-btn pa-btn--primary">Save</button>
58
+ </div>
47
59
  </div>
48
60
  </div>
49
61
 
50
62
 
51
63
  <!-- ================================
52
64
  THREE-PART HEADER LAYOUT
53
- .pa-card__header is a flex row with automatic behaviour:
54
- [title (truncates)] — [description <p> (flexes and truncates)] — [actions (fixed)]
55
- Any h1..h6 / <p> children get ellipsis on overflow so narrow cards
65
+ .pa-card__header is a flex row with three canonical slots:
66
+ [.pa-card__title (truncates)] — [.pa-card__description (flexes, truncates)] — [.pa-card__actions (fixed)]
67
+ The title-text and description get ellipsis on overflow so narrow cards
56
68
  never push content out of the header. Use .pa-card__header--wrap
57
69
  if you'd rather have the text wrap to multiple lines instead.
58
70
  ================================ -->
59
71
 
60
72
  <div class="pa-card">
61
73
  <div class="pa-card__header">
62
- <h3>Dashboard</h3>
63
- <p>Live metrics across every connected service — updated every 30 seconds.</p>
74
+ <div class="pa-card__title">
75
+ <h3 class="pa-card__title-text">Dashboard</h3>
76
+ </div>
77
+ <p class="pa-card__description">Live metrics across every connected service — updated every 30 seconds.</p>
64
78
  <div class="pa-card__actions">
65
79
  <button class="pa-btn pa-btn--sm pa-btn--secondary">Refresh</button>
66
80
  </div>
@@ -71,8 +85,10 @@
71
85
  <!-- Wrap instead of truncate -->
72
86
  <div class="pa-card">
73
87
  <div class="pa-card__header pa-card__header--wrap">
74
- <h3>Wrapping Header</h3>
75
- <p>This description wraps to multiple lines when the header gets narrow, instead of being clipped with an ellipsis.</p>
88
+ <div class="pa-card__title">
89
+ <h3 class="pa-card__title-text">Wrapping Header</h3>
90
+ </div>
91
+ <p class="pa-card__description">This description wraps to multiple lines when the header gets narrow, instead of being clipped with an ellipsis.</p>
76
92
  <div class="pa-card__actions">
77
93
  <button class="pa-btn pa-btn--sm pa-btn--secondary">Action</button>
78
94
  </div>
@@ -90,7 +106,9 @@
90
106
  <!-- Default (accent-coloured underline) -->
91
107
  <div class="pa-card">
92
108
  <div class="pa-card__header pa-card__header--underlined">
93
- <h3>Section</h3>
109
+ <div class="pa-card__title">
110
+ <h3 class="pa-card__title-text">Section</h3>
111
+ </div>
94
112
  </div>
95
113
  <div class="pa-card__body">Body content.</div>
96
114
  </div>
@@ -98,14 +116,18 @@
98
116
  <!-- Semantic colour variants -->
99
117
  <div class="pa-card">
100
118
  <div class="pa-card__header pa-card__header--underlined pa-card__header--underline-success">
101
- <h3>Success underline</h3>
119
+ <div class="pa-card__title">
120
+ <h3 class="pa-card__title-text">Success underline</h3>
121
+ </div>
102
122
  </div>
103
123
  <div class="pa-card__body">Body.</div>
104
124
  </div>
105
125
 
106
126
  <div class="pa-card">
107
127
  <div class="pa-card__header pa-card__header--underlined pa-card__header--underline-danger">
108
- <h3>Danger underline</h3>
128
+ <div class="pa-card__title">
129
+ <h3 class="pa-card__title-text">Danger underline</h3>
130
+ </div>
109
131
  </div>
110
132
  <div class="pa-card__body">Body.</div>
111
133
  </div>
@@ -113,7 +135,9 @@
113
135
  <!-- Theme colour slot (1..9) -->
114
136
  <div class="pa-card">
115
137
  <div class="pa-card__header pa-card__header--underlined pa-card__header--underline-color-3">
116
- <h3>Theme colour 3 underline</h3>
138
+ <div class="pa-card__title">
139
+ <h3 class="pa-card__title-text">Theme colour 3 underline</h3>
140
+ </div>
117
141
  </div>
118
142
  <div class="pa-card__body">Body.</div>
119
143
  </div>
@@ -124,7 +148,7 @@
124
148
  -->
125
149
 
126
150
 
127
- <!-- CARD WITH TITLE COMPONENTS (icon + truncating text) -->
151
+ <!-- CARD WITH TITLE ICON (the icon span is the only optional part) -->
128
152
  <div class="pa-card">
129
153
  <div class="pa-card__header">
130
154
  <div class="pa-card__title">
@@ -136,8 +160,9 @@
136
160
  </div>
137
161
  </div>
138
162
  <div class="pa-card__body">
139
- Use .pa-card__title when you need the title-icon combo + __actions
140
- alignment; h3 alone works too when no icon is needed.
163
+ The title always uses .pa-card__title > .pa-card__title-text; add the
164
+ .pa-card__title-icon span when you want a leading icon. Same structure
165
+ with or without the icon — never a bare <h3>.
141
166
  </div>
142
167
  </div>
143
168
 
@@ -145,18 +170,26 @@
145
170
  <!-- CARD WITH METADATA -->
146
171
  <div class="pa-card">
147
172
  <div class="pa-card__header">
148
- <h3>Article Title</h3>
173
+ <div class="pa-card__title">
174
+ <h3 class="pa-card__title-text">Article Title</h3>
175
+ </div>
149
176
  <span class="pa-card__meta">Published 2 hours ago</span>
150
177
  </div>
151
178
  <div class="pa-card__body">Article content.</div>
152
179
  </div>
153
180
 
154
181
 
155
- <!-- CARD WITH ACTIONS IN HEADER -->
182
+ <!-- CARD WITH ACTIONS IN HEADER
183
+ .pa-card__actions is THE canonical wrapper for header controls: it is a
184
+ documented card sub-element, carries its own gap + vertical centering, and
185
+ the header flex rules pin it to flex-shrink: 0 so it never gets squeezed.
186
+ Reach for this by default. -->
156
187
  <div class="pa-card">
157
188
  <div class="pa-card__header">
158
- <h3>Card with Actions</h3>
159
- <div class="pa-btn-group">
189
+ <div class="pa-card__title">
190
+ <h3 class="pa-card__title-text">Card with Actions</h3>
191
+ </div>
192
+ <div class="pa-card__actions">
160
193
  <button class="pa-btn pa-btn--sm pa-btn--secondary">Cancel</button>
161
194
  <button class="pa-btn pa-btn--sm pa-btn--success">Save</button>
162
195
  </div>
@@ -164,15 +197,38 @@
164
197
  <div class="pa-card__body">Card content.</div>
165
198
  </div>
166
199
 
200
+ <!-- …want the SEGMENTED (joined-corner) button look? Nest .pa-btn-group
201
+ INSIDE .pa-card__actions. Don't use .pa-btn-group as the direct header
202
+ child — it's a general-purpose button-cluster component, not the card's
203
+ actions slot; putting it straight in the header only "works" because the
204
+ header happens to also pin .pa-btn-group to flex-shrink: 0, and it drags
205
+ the attached-button styling in whether you want it or not. -->
206
+ <div class="pa-card">
207
+ <div class="pa-card__header">
208
+ <div class="pa-card__title">
209
+ <h3 class="pa-card__title-text">Card with Segmented Actions</h3>
210
+ </div>
211
+ <div class="pa-card__actions">
212
+ <div class="pa-btn-group">
213
+ <button class="pa-btn pa-btn--sm pa-btn--secondary">Day</button>
214
+ <button class="pa-btn pa-btn--sm pa-btn--secondary">Week</button>
215
+ <button class="pa-btn pa-btn--sm pa-btn--secondary">Month</button>
216
+ </div>
217
+ </div>
218
+ </div>
219
+ <div class="pa-card__body">Card content.</div>
220
+ </div>
221
+
167
222
 
168
223
  <!-- CARD WITH FOOTER ACTIONS -->
169
224
  <div class="pa-card">
170
225
  <div class="pa-card__header">
171
- <h3>Form Card</h3>
226
+ <div class="pa-card__title">
227
+ <h3 class="pa-card__title-text">Form Card</h3>
228
+ </div>
172
229
  </div>
173
230
  <div class="pa-card__body">Form content here.</div>
174
231
  <div class="pa-card__footer">
175
- <div></div>
176
232
  <div class="pa-card__actions">
177
233
  <button class="pa-btn pa-btn--secondary">Cancel</button>
178
234
  <button class="pa-btn pa-btn--success">Save</button>
@@ -184,7 +240,9 @@
184
240
  <!-- CARD WITH NO-PADDING BODY (for flush tables / lists) -->
185
241
  <div class="pa-card">
186
242
  <div class="pa-card__header">
187
- <h3>User List</h3>
243
+ <div class="pa-card__title">
244
+ <h3 class="pa-card__title-text">User List</h3>
245
+ </div>
188
246
  </div>
189
247
  <div class="pa-card__body pa-card__body--no-padding">
190
248
  <table class="pa-table">
@@ -354,7 +412,9 @@
354
412
  <!-- Inline tabs — pills that live in the header row -->
355
413
  <div class="pa-card">
356
414
  <div class="pa-card__header">
357
- <h3>Sales</h3>
415
+ <div class="pa-card__title">
416
+ <h3 class="pa-card__title-text">Sales</h3>
417
+ </div>
358
418
  <div class="pa-card__tabs pa-card__tabs--inline">
359
419
  <button class="pa-card__tab pa-card__tab--active">Day</button>
360
420
  <button class="pa-card__tab">Week</button>
@@ -372,7 +432,9 @@
372
432
  identical, but the entire area becomes clickable. -->
373
433
  <a href="/products/42" class="pa-card">
374
434
  <div class="pa-card__header">
375
- <h3>Widget Pro</h3>
435
+ <div class="pa-card__title">
436
+ <h3 class="pa-card__title-text">Widget Pro</h3>
437
+ </div>
376
438
  </div>
377
439
  <div class="pa-card__body">
378
440
  <p>Click anywhere on this card to navigate.</p>
@@ -474,21 +536,41 @@ CLICKABLE CARD:
474
536
  looks identical to a regular card.
475
537
 
476
538
  SUB-ELEMENTS:
477
- - .pa-card__header Flex row: [title] [description] — [actions].
478
- Direct h1..h6 and <p> children auto-truncate.
479
- Native tags inside get margin/padding/border
480
- reset so they inherit the header layout cleanly.
539
+ - .pa-card__header Flex row of three canonical slots:
540
+ [.pa-card__title] [.pa-card__description]
541
+ [.pa-card__actions]. (Bare h1..h6 / <p> children
542
+ still render + auto-truncate as legacy tolerance,
543
+ but the documented shape is the slots above —
544
+ one structure, so a <Card> wrapper emits one tree.)
545
+ - .pa-card__description Muted, flexing, truncating description line —
546
+ the header's middle slot. Bare <p> tolerated.
481
547
  - .pa-card__body flex: 1; standard padding.
482
548
  - .pa-card__footer Border-top + footer background; flex row.
483
- - .pa-card__actions Button/control container (gap + align-center).
484
- flex-shrink: 0 inside header.
549
+ Canonical content: optional leading text /
550
+ .pa-card__meta on the left + .pa-card__actions
551
+ on the right. The actions slot auto-pins to the
552
+ trailing edge (no empty spacer <div> needed),
553
+ with or without leading content. Always put
554
+ footer buttons inside .pa-card__actions so they
555
+ don't scatter to opposite corners.
556
+ - .pa-card__actions THE canonical header actions slot. Button/
557
+ control container (gap + align-center);
558
+ flex-shrink: 0 inside header. Use this for any
559
+ set of header controls. For the segmented
560
+ (joined-corner) look, nest a .pa-btn-group
561
+ INSIDE it — don't put .pa-btn-group straight in
562
+ the header (it's a generic button cluster, not
563
+ the actions slot).
485
564
  - .pa-card__meta Muted secondary text (dates, byline, etc.).
486
565
 
487
- TITLE SUB-COMPONENT:
488
- - .pa-card__title Flex row wrapping icon + text; flex: 1 so
489
- the actions sibling stays on the right.
490
- - .pa-card__title-icon Fixed-size icon.
491
- - .pa-card__title-text Truncates with ellipsis on overflow.
566
+ TITLE SUB-COMPONENT (the canonical header title — use it for EVERY card):
567
+ - .pa-card__title Flex row wrapping the optional icon + text;
568
+ flex: 0 1 auto (natural width) so a sibling
569
+ .pa-card__description gets the free space and
570
+ .pa-card__actions stays right. Always present,
571
+ with or without an icon — never a bare <h3>.
572
+ - .pa-card__title-icon Fixed-size leading icon (optional).
573
+ - .pa-card__title-text The heading (h1..h6); truncates with ellipsis.
492
574
 
493
575
  BODY MODIFIER:
494
576
  - .pa-card__body--no-padding Strips body padding (for tables / lists
@@ -526,10 +608,9 @@ SECTION WRAPPERS (lighter than a card, for heading-only groupings):
526
608
  underline, no container behaviour.
527
609
 
528
610
  IMPLICIT BEHAVIOURS:
529
- - The header is flex with auto-truncation: direct h1..h6 and <p>
530
- children get white-space: nowrap + text-overflow: ellipsis. This
531
- is why long card titles look "cut off" in narrow columns — use
532
- --wrap to opt out.
611
+ - The header truncates: .pa-card__title-text and .pa-card__description
612
+ get white-space: nowrap + text-overflow: ellipsis. This is why long
613
+ card titles look "cut off" in narrow columns — use --wrap to opt out.
533
614
  - Buttons inside the header get -0.25rem vertical margin so they
534
615
  don't grow the header height past $card-header-min-height.
535
616
  - Card body :first-child gets margin-top: 0 to avoid double-spacing
@@ -540,8 +621,10 @@ STRUCTURE PATTERNS:
540
621
  Card with three-part header:
541
622
  <div class="pa-card">
542
623
  <div class="pa-card__header">
543
- <h3>Title</h3>
544
- <p>Description (truncates)</p>
624
+ <div class="pa-card__title">
625
+ <h3 class="pa-card__title-text">Title</h3>
626
+ </div>
627
+ <p class="pa-card__description">Description (truncates)</p>
545
628
  <div class="pa-card__actions">
546
629
  <button class="pa-btn pa-btn--sm">Action</button>
547
630
  </div>
@@ -552,7 +635,9 @@ Card with three-part header:
552
635
  Card with underlined header (semantic variant):
553
636
  <div class="pa-card">
554
637
  <div class="pa-card__header pa-card__header--underlined pa-card__header--underline-danger">
555
- <h3>Critical Settings</h3>
638
+ <div class="pa-card__title">
639
+ <h3 class="pa-card__title-text">Critical Settings</h3>
640
+ </div>
556
641
  </div>
557
642
  <div class="pa-card__body">…</div>
558
643
  </div>
@@ -22,18 +22,20 @@
22
22
  ================================ -->
23
23
 
24
24
  <div class="pa-card">
25
- <div class="pa-card__header d-flex justify-content-between align-items-center">
25
+ <div class="pa-card__header">
26
26
  <h3>Version Detail</h3>
27
- <div class="pa-btn-group">
28
- <button class="pa-btn pa-btn--sm pa-btn--primary">
29
- <i class="fa-solid fa-table-list"></i> View in form
30
- </button>
31
- <button class="pa-btn pa-btn--sm pa-btn--secondary">
32
- <i class="fa-solid fa-table"></i> View in table
33
- </button>
34
- <button class="pa-btn pa-btn--sm pa-btn--secondary pa-btn--icon-only">
35
- <i class="fa-solid fa-location-dot"></i>
36
- </button>
27
+ <div class="pa-card__actions">
28
+ <div class="pa-btn-group">
29
+ <button class="pa-btn pa-btn--sm pa-btn--primary">
30
+ <i class="fa-solid fa-table-list"></i> View in form
31
+ </button>
32
+ <button class="pa-btn pa-btn--sm pa-btn--secondary">
33
+ <i class="fa-solid fa-table"></i> View in table
34
+ </button>
35
+ <button class="pa-btn pa-btn--sm pa-btn--secondary pa-btn--icon-only">
36
+ <i class="fa-solid fa-location-dot"></i>
37
+ </button>
38
+ </div>
37
39
  </div>
38
40
  </div>
39
41
  <div class="pa-card__body pa-card__body--no-padding">
@@ -136,18 +138,20 @@
136
138
  ================================ -->
137
139
 
138
140
  <div class="pa-card">
139
- <div class="pa-card__header d-flex justify-content-between align-items-center">
141
+ <div class="pa-card__header">
140
142
  <h3>Merge Comparison</h3>
141
- <div class="pa-btn-group">
142
- <button class="pa-btn pa-btn--sm pa-btn--success">
143
- <i class="fa-solid fa-code-merge"></i> Accept A
144
- </button>
145
- <button class="pa-btn pa-btn--sm pa-btn--info">
146
- <i class="fa-solid fa-code-merge"></i> Accept B
147
- </button>
148
- <button class="pa-btn pa-btn--sm pa-btn--secondary">
149
- <i class="fa-solid fa-xmark"></i> Reject Both
150
- </button>
143
+ <div class="pa-card__actions">
144
+ <div class="pa-btn-group">
145
+ <button class="pa-btn pa-btn--sm pa-btn--success">
146
+ <i class="fa-solid fa-code-merge"></i> Accept A
147
+ </button>
148
+ <button class="pa-btn pa-btn--sm pa-btn--info">
149
+ <i class="fa-solid fa-code-merge"></i> Accept B
150
+ </button>
151
+ <button class="pa-btn pa-btn--sm pa-btn--secondary">
152
+ <i class="fa-solid fa-xmark"></i> Reject Both
153
+ </button>
154
+ </div>
151
155
  </div>
152
156
  </div>
153
157
  <div class="pa-card__body pa-card__body--no-padding">