@keenmate/pure-admin-core 2.4.0 → 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 (44) hide show
  1. package/README.md +11 -6
  2. package/dist/css/main.css +47 -130
  3. package/package.json +1 -1
  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/_tables.scss +2 -134
  44. package/src/scss/variables/_components.scss +17 -2
@@ -0,0 +1,584 @@
1
+ <!-- ================================
2
+ DATA DISPLAY
3
+ Read-only label/value patterns. Seven distinct components share
4
+ one SCSS file (_data-display.scss) — pick the one whose visual
5
+ density matches the surface you're filling.
6
+
7
+ 1. .pa-field single label/value pair (stacked)
8
+ 2. .pa-fields container of .pa-field items;
9
+ many layout modifiers
10
+ 3. .pa-field-group titled block grouping .pa-fields
11
+ 4. .pa-desc-table Ant-style flat grid; tinted label cells
12
+ 5. .pa-prop-card bordered card with header + rows
13
+ 6. .pa-banded full-width rows with tinted label column
14
+ 7. .pa-accent-grid grid of items with coloured start border
15
+ 8. .pa-dot-leaders restaurant menu / invoice — dotted line
16
+
17
+ A consistent copy-to-clipboard pattern is shared across most:
18
+ four state modifiers (--copy-btn / --copy-hover / --copy-click /
19
+ --copied). See "COPY PATTERN" near the bottom.
20
+ ================================ -->
21
+
22
+
23
+ <!-- ================================
24
+ 1. .pa-field — SINGLE LABEL/VALUE
25
+ Stacked by default: uppercase label on top, value below.
26
+ Layout changes when wrapped in .pa-fields with a layout
27
+ modifier (see next section).
28
+ ================================ -->
29
+
30
+ <div class="pa-field">
31
+ <span class="pa-field__label">Email</span>
32
+ <span class="pa-field__value">jane@example.com</span>
33
+ </div>
34
+
35
+ <!-- --full spans the entire row in a grid layout (see .pa-fields--cols-N) -->
36
+ <div class="pa-field pa-field--full">
37
+ <span class="pa-field__label">Notes</span>
38
+ <span class="pa-field__value">Long-form text that should span all columns.</span>
39
+ </div>
40
+
41
+
42
+ <!-- ================================
43
+ 2. .pa-fields — CONTAINER + LAYOUT MODIFIERS
44
+ Use .pa-fields-container as a parent if you want container
45
+ queries (collapses --cols-N to a single column under the mobile
46
+ breakpoint). The fields container has a subtle inline-start
47
+ border by default — drop with --no-border.
48
+ ================================ -->
49
+
50
+ <!-- Default: vertical stack with start border -->
51
+ <div class="pa-fields">
52
+ <div class="pa-field"><span class="pa-field__label">Name</span><span class="pa-field__value">Jane Doe</span></div>
53
+ <div class="pa-field"><span class="pa-field__label">Email</span><span class="pa-field__value">jane@example.com</span></div>
54
+ <div class="pa-field"><span class="pa-field__label">Role</span><span class="pa-field__value">Admin</span></div>
55
+ </div>
56
+
57
+ <!-- Multi-column grid — pair with .pa-fields-container for responsive collapse -->
58
+ <div class="pa-fields-container">
59
+ <div class="pa-fields pa-fields--cols-3">
60
+ <div class="pa-field"><span class="pa-field__label">First</span><span class="pa-field__value">Jane</span></div>
61
+ <div class="pa-field"><span class="pa-field__label">Last</span><span class="pa-field__value">Doe</span></div>
62
+ <div class="pa-field"><span class="pa-field__label">Title</span><span class="pa-field__value">Engineer</span></div>
63
+ <!-- A field that spans all columns -->
64
+ <div class="pa-field pa-field--full">
65
+ <span class="pa-field__label">Bio</span>
66
+ <span class="pa-field__value">Full-stack engineer specialising in observability.</span>
67
+ </div>
68
+ </div>
69
+ </div>
70
+
71
+ <!-- Horizontal: label inline-start, value to the right -->
72
+ <div class="pa-fields pa-fields--horizontal">
73
+ <div class="pa-field"><span class="pa-field__label">Email</span><span class="pa-field__value">jane@example.com</span></div>
74
+ <div class="pa-field"><span class="pa-field__label">Role</span><span class="pa-field__value">Admin</span></div>
75
+ </div>
76
+
77
+ <!-- Table-style: same as horizontal but with consistent label widths
78
+ (so labels line up across rows). -->
79
+ <div class="pa-fields pa-fields--table">
80
+ <div class="pa-field"><span class="pa-field__label">Email</span><span class="pa-field__value">jane@example.com</span></div>
81
+ <div class="pa-field"><span class="pa-field__label">Phone</span><span class="pa-field__value">+1 555 010 4242</span></div>
82
+ </div>
83
+
84
+ <!-- Bordered: bottom-border separator between fields -->
85
+ <div class="pa-fields pa-fields--bordered">…</div>
86
+
87
+ <!-- Striped: alternating background -->
88
+ <div class="pa-fields pa-fields--striped">…</div>
89
+
90
+ <!-- Compact: tighter gap; Relaxed: larger gap -->
91
+ <div class="pa-fields pa-fields--compact">…</div>
92
+ <div class="pa-fields pa-fields--relaxed">…</div>
93
+
94
+ <!-- Inline: fields flow horizontally, wrap as needed -->
95
+ <div class="pa-fields pa-fields--inline">
96
+ <div class="pa-field"><span class="pa-field__label">ID</span><span class="pa-field__value">USR-1234</span></div>
97
+ <div class="pa-field"><span class="pa-field__label">Status</span><span class="pa-field__value">Active</span></div>
98
+ <div class="pa-field"><span class="pa-field__label">Created</span><span class="pa-field__value">2026-04-01</span></div>
99
+ </div>
100
+
101
+ <!-- Row: equal-width columns, auto-collapse to stack on mobile -->
102
+ <div class="pa-fields pa-fields--row">…</div>
103
+
104
+ <!-- Filled: subtle background panel; combine with --color-N for tinted bg -->
105
+ <div class="pa-fields pa-fields--filled pa-fields--color-3">…</div>
106
+
107
+ <!-- No border: drop the inline-start accent border -->
108
+ <div class="pa-fields pa-fields--no-border">…</div>
109
+
110
+ <!-- Linear: ultra-clean side-by-side; no border, no uppercase, weight
111
+ and colour contrast only. Use for properties under a heading. -->
112
+ <div class="pa-fields pa-fields--linear">
113
+ <div class="pa-field"><span class="pa-field__label">Created</span><span class="pa-field__value">2026-04-01</span></div>
114
+ <div class="pa-field"><span class="pa-field__label">Updated</span><span class="pa-field__value">2026-04-25</span></div>
115
+ <div class="pa-field"><span class="pa-field__label">Owner</span><span class="pa-field__value">Jane Doe</span></div>
116
+ </div>
117
+
118
+ <!-- Chips: inline flow, value rendered as a coloured pill.
119
+ Pill colour modifier goes on .pa-field__value. -->
120
+ <div class="pa-fields pa-fields--chips">
121
+ <div class="pa-field">
122
+ <span class="pa-field__label">Plan</span>
123
+ <span class="pa-field__value">Pro</span>
124
+ </div>
125
+ <div class="pa-field">
126
+ <span class="pa-field__label">Status</span>
127
+ <span class="pa-field__value pa-field__value--success">Active</span>
128
+ </div>
129
+ <div class="pa-field">
130
+ <span class="pa-field__label">Renewal</span>
131
+ <span class="pa-field__value pa-field__value--warning">Expiring soon</span>
132
+ </div>
133
+ <div class="pa-field">
134
+ <span class="pa-field__label">Risk</span>
135
+ <span class="pa-field__value pa-field__value--danger">High</span>
136
+ </div>
137
+ </div>
138
+
139
+ <!-- Theme-coloured start border (and tinted bg with --filled).
140
+ --color-1 through --color-9 read from --pa-color-{N}. -->
141
+ <div class="pa-fields pa-fields--color-3">…</div> <!-- accent border -->
142
+ <div class="pa-fields pa-fields--filled pa-fields--color-7">…</div> <!-- tinted background -->
143
+
144
+
145
+ <!-- ================================
146
+ 3. .pa-field-group — TITLED SECTIONS
147
+ A wrapper that puts a thin underlined title above .pa-fields.
148
+ Adjacent groups get vertical spacing automatically.
149
+ ================================ -->
150
+
151
+ <div class="pa-field-group">
152
+ <h3 class="pa-field-group__title">Customer</h3>
153
+ <div class="pa-fields pa-fields--horizontal">
154
+ <div class="pa-field"><span class="pa-field__label">Name</span><span class="pa-field__value">Jane Doe</span></div>
155
+ <div class="pa-field"><span class="pa-field__label">Email</span><span class="pa-field__value">jane@example.com</span></div>
156
+ </div>
157
+ </div>
158
+
159
+ <div class="pa-field-group">
160
+ <h3 class="pa-field-group__title">Delivery address</h3>
161
+ <div class="pa-fields pa-fields--horizontal">
162
+ <div class="pa-field"><span class="pa-field__label">Street</span><span class="pa-field__value">123 Pine St</span></div>
163
+ <div class="pa-field"><span class="pa-field__label">City</span><span class="pa-field__value">Portland, OR</span></div>
164
+ </div>
165
+ </div>
166
+
167
+
168
+ <!-- ================================
169
+ 4. .pa-desc-table — ANT-STYLE DESCRIPTIONS
170
+ Flat grid, tinted label cells with auto-appended ":" via CSS.
171
+ Wrap in .pa-desc-container for container-query responsiveness
172
+ (collapses to 1-column at mobile, label-above-value at <300px).
173
+ ================================ -->
174
+
175
+ <div class="pa-desc-container">
176
+ <div class="pa-desc-table pa-desc-table--cols-2">
177
+ <div class="pa-desc-table__label">Name</div>
178
+ <div class="pa-desc-table__value">Jane Doe</div>
179
+
180
+ <div class="pa-desc-table__label">Email</div>
181
+ <div class="pa-desc-table__value">jane@example.com</div>
182
+
183
+ <div class="pa-desc-table__label">Role</div>
184
+ <div class="pa-desc-table__value">Admin</div>
185
+
186
+ <div class="pa-desc-table__label">Notes</div>
187
+ <!-- __value--full spans both columns of a multi-column row -->
188
+ <div class="pa-desc-table__value pa-desc-table__value--full">
189
+ Long-form notes that span the full grid width.
190
+ </div>
191
+ </div>
192
+ </div>
193
+
194
+ <!-- Fixed label width (override per-instance with --label-width) -->
195
+ <div class="pa-desc-table pa-desc-table--fixed" style="--label-width: 16rem;">
196
+ <div class="pa-desc-table__label">SKU</div>
197
+ <div class="pa-desc-table__value">PA-2024-001</div>
198
+ <div class="pa-desc-table__label">Total bill amount</div>
199
+ <div class="pa-desc-table__value">$1,234.56</div>
200
+ </div>
201
+
202
+ <!-- Alignment + middle vertical centring + truncate -->
203
+ <div class="pa-desc-table pa-desc-table--middle pa-desc-table--label-end pa-desc-table--value-end pa-desc-table--truncate">
204
+ <div class="pa-desc-table__label">Identifier</div>
205
+ <div class="pa-desc-table__value">very-long-identifier-that-truncates-with-ellipsis</div>
206
+ </div>
207
+
208
+
209
+ <!-- ================================
210
+ 5. .pa-prop-card — BORDERED PROPERTY CARD
211
+ Header on top; rows below with inline label / inline-end value
212
+ and thin dividers between rows. Good for spec sheets / metadata.
213
+ ================================ -->
214
+
215
+ <div class="pa-prop-card">
216
+ <div class="pa-prop-card__header">Specifications</div>
217
+
218
+ <div class="pa-prop-card__row">
219
+ <span class="pa-prop-card__label">Resolution</span>
220
+ <span class="pa-prop-card__value">3840 × 2160</span>
221
+ </div>
222
+ <div class="pa-prop-card__row">
223
+ <span class="pa-prop-card__label">Refresh rate</span>
224
+ <span class="pa-prop-card__value">144 Hz</span>
225
+ </div>
226
+ <div class="pa-prop-card__row">
227
+ <span class="pa-prop-card__label">Price</span>
228
+ <!-- __value--bold for emphasis on key rows -->
229
+ <span class="pa-prop-card__value pa-prop-card__value--bold">$899</span>
230
+ </div>
231
+ </div>
232
+
233
+
234
+ <!-- ================================
235
+ 6. .pa-banded — FULL-WIDTH ROWS, TINTED LABEL COLUMN
236
+ Wider visual presence than .pa-prop-card; the label sits in a
237
+ fixed-width tinted column on the inline-start. Container-query
238
+ stacks label above value below the mobile breakpoint.
239
+ ================================ -->
240
+
241
+ <div class="pa-banded-container">
242
+ <div class="pa-banded">
243
+ <div class="pa-banded__row">
244
+ <div class="pa-banded__label">Status</div>
245
+ <div class="pa-banded__value">Active</div>
246
+ </div>
247
+ <div class="pa-banded__row">
248
+ <div class="pa-banded__label">Created</div>
249
+ <div class="pa-banded__value">2026-04-01</div>
250
+ </div>
251
+ <div class="pa-banded__row">
252
+ <div class="pa-banded__label">Notes</div>
253
+ <div class="pa-banded__value">Optional long-form notes that wrap.</div>
254
+ </div>
255
+ </div>
256
+ </div>
257
+
258
+ <!-- Width variants: --narrow, --wide; alignment + truncate share the
259
+ same modifier names as .pa-desc-table. -->
260
+ <div class="pa-banded pa-banded--narrow pa-banded--middle pa-banded--label-end">…</div>
261
+ <div class="pa-banded pa-banded--wide pa-banded--truncate">…</div>
262
+
263
+
264
+ <!-- ================================
265
+ 7. .pa-accent-grid — COLOUR-CODED START-BORDER GRID
266
+ Auto-fill grid; each item gets an inline-start coloured border.
267
+ Default = accent. Items can carry --success, --warning, --danger,
268
+ --info to flip the border colour.
269
+ ================================ -->
270
+
271
+ <div class="pa-accent-grid">
272
+ <div class="pa-accent-grid__item">
273
+ <div class="pa-accent-grid__label">Total revenue</div>
274
+ <div class="pa-accent-grid__value">$847,392</div>
275
+ </div>
276
+ <div class="pa-accent-grid__item pa-accent-grid__item--success">
277
+ <div class="pa-accent-grid__label">Conversion</div>
278
+ <div class="pa-accent-grid__value">3.47%</div>
279
+ </div>
280
+ <div class="pa-accent-grid__item pa-accent-grid__item--warning">
281
+ <div class="pa-accent-grid__label">Open issues</div>
282
+ <div class="pa-accent-grid__value">12</div>
283
+ </div>
284
+ <div class="pa-accent-grid__item pa-accent-grid__item--danger">
285
+ <div class="pa-accent-grid__label">Failed jobs</div>
286
+ <div class="pa-accent-grid__value">3</div>
287
+ </div>
288
+ <div class="pa-accent-grid__item pa-accent-grid__item--info">
289
+ <div class="pa-accent-grid__label">Avg latency</div>
290
+ <div class="pa-accent-grid__value">142 ms</div>
291
+ </div>
292
+ </div>
293
+
294
+
295
+ <!-- ================================
296
+ 8. .pa-dot-leaders — RESTAURANT MENU / INVOICE STYLE
297
+ Label on the start, dotted leader line filling the space, value
298
+ on the end. tabular-nums on the value so digits line up
299
+ vertically across rows. Use __item--total for the bottom line
300
+ with a top divider + heavier weight.
301
+ ================================ -->
302
+
303
+ <div class="pa-dot-leaders">
304
+ <div class="pa-dot-leaders__item">
305
+ <span class="pa-dot-leaders__label">Subscription</span>
306
+ <span class="pa-dot-leaders__leader"></span>
307
+ <span class="pa-dot-leaders__value">$49.00</span>
308
+ </div>
309
+ <div class="pa-dot-leaders__item">
310
+ <span class="pa-dot-leaders__label">Add-on storage</span>
311
+ <span class="pa-dot-leaders__leader"></span>
312
+ <span class="pa-dot-leaders__value">$12.50</span>
313
+ </div>
314
+ <div class="pa-dot-leaders__item">
315
+ <span class="pa-dot-leaders__label">Tax</span>
316
+ <span class="pa-dot-leaders__leader"></span>
317
+ <span class="pa-dot-leaders__value">$5.40</span>
318
+ </div>
319
+ <div class="pa-dot-leaders__item pa-dot-leaders__item--total">
320
+ <span class="pa-dot-leaders__label">Total</span>
321
+ <span class="pa-dot-leaders__leader"></span>
322
+ <span class="pa-dot-leaders__value">$66.90</span>
323
+ </div>
324
+ </div>
325
+
326
+
327
+ <!-- ================================
328
+ COPY PATTERN (shared)
329
+ Four state modifiers, available on most data-display components
330
+ (.pa-field, .pa-desc-table, .pa-prop-card, .pa-banded,
331
+ .pa-accent-grid). Same modifier names everywhere; placement of
332
+ the modifier varies (on the .pa-field for fields, on
333
+ .pa-{x}__row for prop-card / banded, on .pa-{x}__item for
334
+ accent-grid, on .pa-{x}__value for desc-table).
335
+
336
+ --copy-btn Copy button always visible (low opacity).
337
+ --copy-hover Copy button hidden; appears on row/item hover.
338
+ --copy-click The whole value becomes clickable; shows a
339
+ "Click to copy" hint on hover.
340
+ --copied Post-action feedback: replaces the hint with
341
+ "Copied!" in green. Apply briefly via JS.
342
+
343
+ The framework only ships the *visuals* — wire up the actual
344
+ clipboard write yourself (navigator.clipboard.writeText) and
345
+ toggle the --copied class for ~1.5s.
346
+ ================================ -->
347
+
348
+ <!-- pa-field with always-visible copy button -->
349
+ <div class="pa-field pa-field--copy-btn">
350
+ <span class="pa-field__label">API key</span>
351
+ <span class="pa-field__value">
352
+ sk_live_4eC39H…
353
+ <button class="pa-field__copy" type="button" aria-label="Copy API key">
354
+ <i class="fas fa-copy"></i>
355
+ </button>
356
+ </span>
357
+ </div>
358
+
359
+ <!-- Click-to-copy whole value -->
360
+ <div class="pa-field pa-field--copy-click" id="copy-click-field">
361
+ <span class="pa-field__label">User ID</span>
362
+ <span class="pa-field__value" onclick="copyValue(this, 'copy-click-field')">USR-1234</span>
363
+ </div>
364
+
365
+ <!-- desc-table with hover-revealed copy buttons -->
366
+ <div class="pa-desc-table pa-desc-table--cols-2">
367
+ <div class="pa-desc-table__label">Token</div>
368
+ <div class="pa-desc-table__value pa-desc-table__value--copy-hover">
369
+ eyJhbGciOi…
370
+ <button class="pa-desc-table__copy" type="button"><i class="fas fa-copy"></i></button>
371
+ </div>
372
+ </div>
373
+
374
+ <script>
375
+ async function copyValue(valueEl, rootId) {
376
+ await navigator.clipboard.writeText(valueEl.textContent.trim());
377
+ const root = document.getElementById(rootId);
378
+ // Apply --copied to whichever class layer holds the modifier:
379
+ // pa-field uses the block; desc-table / banded use the value/row.
380
+ root.classList.add('pa-field--copied');
381
+ setTimeout(() => root.classList.remove('pa-field--copied'), 1500);
382
+ }
383
+ </script>
384
+
385
+
386
+ <!-- ================================
387
+ COMPONENT REFERENCE
388
+ ================================ -->
389
+
390
+ <!--
391
+ COMPONENT INVENTORY:
392
+
393
+ .pa-field Single label/value. Stacked by default.
394
+ .pa-fields Container of .pa-field. Layout via
395
+ modifiers (see below). Default has a
396
+ subtle inline-start accent border —
397
+ drop with --no-border.
398
+ .pa-field-group Titled wrapper for a section of fields;
399
+ auto vertical spacing between adjacent
400
+ groups.
401
+ .pa-fields-container `container-type: inline-size` parent.
402
+ Lets .pa-fields--cols-N collapse to
403
+ 1 column at the mobile breakpoint via
404
+ container query.
405
+
406
+ .pa-desc-table Ant-style flat grid; tinted label cells
407
+ with auto-appended ":" colon. Wrap in
408
+ .pa-desc-container for container queries.
409
+ .pa-prop-card Bordered card with header + rows.
410
+ .pa-banded Full-width rows, fixed-width tinted
411
+ label column. Wrap in .pa-banded-
412
+ container for container queries.
413
+ .pa-accent-grid Auto-fill grid; items have a coloured
414
+ inline-start border. Default = accent;
415
+ item modifiers --success / --warning /
416
+ --danger / --info flip the colour.
417
+ .pa-dot-leaders Restaurant menu / invoice style. Items
418
+ with __label / __leader / __value;
419
+ __item--total for the summary row.
420
+
421
+ LAYOUT MODIFIERS ON .pa-fields:
422
+
423
+ Grid / column count
424
+ --cols-2, --cols-3, --cols-4 CSS grid; collapses to 1 col on
425
+ mobile (container or media query).
426
+ Per-axis layout
427
+ --horizontal label inline-start, value inline-end
428
+ --table horizontal + consistent label widths
429
+ --inline fields flow on one line, wrap as needed
430
+ --row equal-width columns, stack on mobile
431
+ --linear ultra-clean side-by-side, weight + color
432
+ contrast only (no uppercase, no border)
433
+ --chips inline flow, value as a coloured pill
434
+ (chip colour: __value--success / -warning
435
+ / -danger)
436
+ Spacing
437
+ --bordered bottom-border between fields
438
+ --striped alternating background rows
439
+ --compact tight gaps
440
+ --relaxed loose gaps
441
+ --filled subtle background panel; combine with --color-N
442
+ for a tinted background
443
+ Border tweaks
444
+ --no-border drop the inline-start accent border
445
+ --color-1..9 inline-start border tinted from --pa-color-N;
446
+ with --filled also tints the panel background
447
+
448
+ Single-field modifier:
449
+ .pa-field--full in a .pa-fields--cols-N grid, span the entire
450
+ row.
451
+
452
+ DESC-TABLE MODIFIERS:
453
+
454
+ Layout
455
+ --cols-2 two label/value pairs per row
456
+ --fixed fixed label width via --label-width custom
457
+ property (override per-instance):
458
+ <div class="pa-desc-table pa-desc-table--fixed"
459
+ style="--label-width: 18rem">
460
+ Vertical
461
+ --middle centre cell content vertically
462
+ Horizontal alignment
463
+ --label-end / --label-center
464
+ --value-end / --value-center
465
+ Truncation
466
+ --truncate single-line + ellipsis on labels and values
467
+ Span:
468
+ .pa-desc-table__value--full span all columns of the row.
469
+
470
+ BANDED MODIFIERS:
471
+ --narrow / --wide label column width preset
472
+ --middle vertical centring
473
+ --label-end / --label-center / --value-end / --value-center
474
+ --truncate single-line ellipsis
475
+ Stacks label-above-value below the mobile breakpoint
476
+ (container query — wrap in .pa-banded-container for it to fire on
477
+ parent width rather than viewport width).
478
+
479
+ PROP-CARD VALUE EMPHASIS:
480
+ __value--bold bolded value (e.g. price / total).
481
+
482
+ ACCENT-GRID ITEM COLOURS:
483
+ (default) accent (--pa-accent)
484
+ --success --pa-success-color
485
+ --warning --pa-warning-color
486
+ --danger --pa-danger-color
487
+ --info --pa-info-color
488
+ Auto-fill grid: each item is at least the SCSS variable
489
+ $accent-grid-min-col wide; rows fill as items wrap.
490
+
491
+ COPY PATTERN — SHARED ACROSS COMPONENTS:
492
+
493
+ Modifier placement (inconsistent across components — match the
494
+ one for the pattern you're using):
495
+
496
+ .pa-field--copy-btn / --copy-hover / --copy-click / --copied
497
+ .pa-desc-table__value--copy-btn / --copy-hover / --copy-click / --copied
498
+ .pa-prop-card__row--copy-btn / --copy-hover / --copy-click / (no --copied)
499
+ .pa-banded__row--copy-btn / --copy-hover / --copy-click / --copied
500
+ .pa-accent-grid__item--copy-btn / --copy-hover / --copy-click / --copied
501
+
502
+ Markup pattern (regardless of component):
503
+
504
+ <{value-element} class="…--copy-btn"> <!-- or --copy-hover -->
505
+ The value text
506
+ <button class="pa-{component}__copy" type="button">
507
+ <i class="fas fa-copy"></i>
508
+ </button>
509
+ </{value-element}>
510
+
511
+ JS contract:
512
+ 1. Listen for click on .pa-{component}__copy or, for --copy-click,
513
+ on the value itself.
514
+ 2. navigator.clipboard.writeText(value).
515
+ 3. Add --copied to the modifier-bearing element for ~1.5s, then
516
+ remove. The CSS replaces the "Click to copy" hint with
517
+ "Copied!" in green.
518
+
519
+ WHEN TO USE WHAT:
520
+
521
+ .pa-field / .pa-fields Detail pages, modal bodies, side
522
+ panels. Most flexible; many
523
+ layout modifiers.
524
+ .pa-field-group When a detail page has multiple
525
+ logical sections (Customer,
526
+ Address, Billing, …).
527
+ .pa-desc-table Static read-only data with strong
528
+ visual structure (Ant-style).
529
+ Great for technical specs.
530
+ .pa-prop-card A focused property block with a
531
+ sectional header.
532
+ .pa-banded Heavier, more prominent layout —
533
+ for hero detail panels.
534
+ .pa-accent-grid Status-coloured KPI tiles arranged
535
+ in a responsive grid.
536
+ .pa-dot-leaders Invoices, receipts, menus —
537
+ anywhere the "label …… value"
538
+ visual carries semantic weight.
539
+
540
+ STRUCTURE PATTERNS:
541
+
542
+ Detail card with grouped fields:
543
+ <div class="pa-card">
544
+ <div class="pa-card__body pa-fields-container">
545
+
546
+ <div class="pa-field-group">
547
+ <h3 class="pa-field-group__title">Customer</h3>
548
+ <div class="pa-fields pa-fields--horizontal">
549
+ <div class="pa-field">…</div>
550
+ <div class="pa-field">…</div>
551
+ </div>
552
+ </div>
553
+
554
+ <div class="pa-field-group">
555
+ <h3 class="pa-field-group__title">Address</h3>
556
+ <div class="pa-fields pa-fields--cols-2">…</div>
557
+ </div>
558
+
559
+ </div>
560
+ </div>
561
+
562
+ Invoice with subtotal + total:
563
+ <div class="pa-dot-leaders">
564
+ <div class="pa-dot-leaders__item">…line item…</div>
565
+
566
+ <div class="pa-dot-leaders__item pa-dot-leaders__item--total">
567
+ Total ……………………………………… $66.90
568
+ </div>
569
+ </div>
570
+
571
+ Spec sheet with copyable identifiers:
572
+ <div class="pa-prop-card">
573
+ <div class="pa-prop-card__header">Identifiers</div>
574
+ <div class="pa-prop-card__row pa-prop-card__row--copy-hover">
575
+ <span class="pa-prop-card__label">SKU</span>
576
+ <span class="pa-prop-card__value">
577
+ PA-2024-001
578
+ <button class="pa-prop-card__copy" type="button">
579
+ <i class="fas fa-copy"></i>
580
+ </button>
581
+ </span>
582
+ </div>
583
+ </div>
584
+ -->