@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
@@ -6,42 +6,42 @@
6
6
  <!-- BASIC ALERTS -->
7
7
 
8
8
  <!-- Primary Alert -->
9
- <div class="pa-alert pa-alert--primary">
9
+ <div class="pa-alert pa-alert--primary" role="alert">
10
10
  <strong>Primary!</strong> This is a primary alert — check it out!
11
11
  </div>
12
12
 
13
13
  <!-- Secondary Alert -->
14
- <div class="pa-alert pa-alert--secondary">
14
+ <div class="pa-alert pa-alert--secondary" role="alert">
15
15
  <strong>Secondary!</strong> This is a secondary alert — check it out!
16
16
  </div>
17
17
 
18
18
  <!-- Success Alert -->
19
- <div class="pa-alert pa-alert--success">
19
+ <div class="pa-alert pa-alert--success" role="alert">
20
20
  <strong>Success!</strong> This is a success alert — your operation completed successfully.
21
21
  </div>
22
22
 
23
23
  <!-- Danger Alert -->
24
- <div class="pa-alert pa-alert--danger">
24
+ <div class="pa-alert pa-alert--danger" role="alert">
25
25
  <strong>Danger!</strong> This is a danger alert — something went wrong!
26
26
  </div>
27
27
 
28
28
  <!-- Warning Alert -->
29
- <div class="pa-alert pa-alert--warning">
29
+ <div class="pa-alert pa-alert--warning" role="alert">
30
30
  <strong>Warning!</strong> This is a warning alert — please review before proceeding.
31
31
  </div>
32
32
 
33
33
  <!-- Info Alert -->
34
- <div class="pa-alert pa-alert--info">
34
+ <div class="pa-alert pa-alert--info" role="alert">
35
35
  <strong>Info!</strong> This is an info alert — here's some useful information.
36
36
  </div>
37
37
 
38
38
  <!-- Light Alert -->
39
- <div class="pa-alert pa-alert--light">
39
+ <div class="pa-alert pa-alert--light" role="alert">
40
40
  <strong>Light!</strong> This is a light alert — subtle but important.
41
41
  </div>
42
42
 
43
43
  <!-- Dark Alert -->
44
- <div class="pa-alert pa-alert--dark">
44
+ <div class="pa-alert pa-alert--dark" role="alert">
45
45
  <strong>Dark!</strong> This is a dark alert — for high contrast messaging.
46
46
  </div>
47
47
 
@@ -49,7 +49,7 @@
49
49
  <!-- ALERTS WITH ICONS -->
50
50
 
51
51
  <!-- Success Alert with Icon -->
52
- <div class="pa-alert pa-alert--success">
52
+ <div class="pa-alert pa-alert--success" role="alert">
53
53
  <span class="pa-alert__icon">✓</span>
54
54
  <div class="pa-alert__content">
55
55
  <strong>Success!</strong> Your changes have been saved successfully.
@@ -57,7 +57,7 @@
57
57
  </div>
58
58
 
59
59
  <!-- Danger Alert with Icon -->
60
- <div class="pa-alert pa-alert--danger">
60
+ <div class="pa-alert pa-alert--danger" role="alert">
61
61
  <span class="pa-alert__icon">⚠</span>
62
62
  <div class="pa-alert__content">
63
63
  <strong>Error!</strong> Unable to process your request. Please try again.
@@ -65,7 +65,7 @@
65
65
  </div>
66
66
 
67
67
  <!-- Warning Alert with Icon -->
68
- <div class="pa-alert pa-alert--warning">
68
+ <div class="pa-alert pa-alert--warning" role="alert">
69
69
  <span class="pa-alert__icon">!</span>
70
70
  <div class="pa-alert__content">
71
71
  <strong>Warning!</strong> Your session will expire in 5 minutes.
@@ -73,7 +73,7 @@
73
73
  </div>
74
74
 
75
75
  <!-- Info Alert with Icon -->
76
- <div class="pa-alert pa-alert--info">
76
+ <div class="pa-alert pa-alert--info" role="alert">
77
77
  <span class="pa-alert__icon">ⓘ</span>
78
78
  <div class="pa-alert__content">
79
79
  <strong>Information!</strong> New features are now available in your account.
@@ -81,10 +81,17 @@
81
81
  </div>
82
82
 
83
83
 
84
- <!-- DISMISSIBLE ALERTS -->
84
+ <!--
85
+ DISMISSIBLE ALERTS
86
+ --dismissible adds padding-inline-end so the text doesn't run under the
87
+ close button. It's a spacing modifier, not a structural one — you still
88
+ render __content + __close yourself, and wire dismissal via JS.
89
+ __close uses inset-inline-end (logical) so it lands on the reading-end
90
+ side in both LTR and RTL.
91
+ -->
85
92
 
86
93
  <!-- Dismissible Success Alert -->
87
- <div class="pa-alert pa-alert--success pa-alert--dismissible">
94
+ <div class="pa-alert pa-alert--success pa-alert--dismissible" role="alert">
88
95
  <div class="pa-alert__content">
89
96
  <strong>Well done!</strong> You successfully read this important alert message.
90
97
  </div>
@@ -94,7 +101,7 @@
94
101
  </div>
95
102
 
96
103
  <!-- Dismissible Danger Alert -->
97
- <div class="pa-alert pa-alert--danger pa-alert--dismissible">
104
+ <div class="pa-alert pa-alert--danger pa-alert--dismissible" role="alert">
98
105
  <div class="pa-alert__content">
99
106
  <strong>Oh snap!</strong> Change a few things and try submitting again.
100
107
  </div>
@@ -104,19 +111,50 @@
104
111
  </div>
105
112
 
106
113
 
107
- <!-- ALERTS WITH ADDITIONAL CONTENT -->
114
+ <!-- ALERTS WITH ADDITIONAL CONTENT
115
+
116
+ When an alert has a separate title element and body content (paragraph,
117
+ list, actions), use .pa-alert__heading for the title — never roll your
118
+ own <strong> + <p> stack. The heading defaults to the alert's body
119
+ font-size (compact); add --lg when you want the bigger, semibold-block
120
+ treatment for alerts that need deliberate attention.
121
+
122
+ NB: <strong> is still right for *inline* emphasis on a single-line
123
+ alert ("<strong>Primary!</strong> This is a primary alert"). The
124
+ heading element is for the case where the title sits on its own line
125
+ above body content.
126
+ -->
127
+
128
+ <!-- Multi-line alert (compact heading — default size) -->
129
+ <div class="pa-alert pa-alert--danger" role="alert">
130
+ <h4 class="pa-alert__heading">Validation failed</h4>
131
+ <p class="mb-0">Please fix the errors below.</p>
132
+ </div>
133
+
134
+ <!-- Same pattern, dismissible -->
135
+ <div class="pa-alert pa-alert--danger pa-alert--dismissible" role="alert">
136
+ <h4 class="pa-alert__heading">Validation failed</h4>
137
+ <p class="mb-0">Please fix the errors below.</p>
138
+ <button class="pa-alert__close" onclick="dismissAlert(this)" aria-label="Close">
139
+ <span aria-hidden="true">×</span>
140
+ </button>
141
+ </div>
108
142
 
109
- <!-- Alert with Heading and Paragraph -->
110
- <div class="pa-alert pa-alert--success">
111
- <h4 class="pa-alert__heading">Success!</h4>
143
+ <!-- Punchy heading adds the --lg modifier for the bigger presentation -->
144
+ <div class="pa-alert pa-alert--success" role="alert">
145
+ <h4 class="pa-alert__heading pa-alert__heading--lg">Success!</h4>
112
146
  <p>Aww yeah, you successfully read this important alert message. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content.</p>
113
147
  <hr>
114
148
  <p class="mb-0">Whenever you need to, be sure to use margin utilities to keep things nice and tidy.</p>
115
149
  </div>
116
150
 
117
- <!-- Alert with List -->
118
- <div class="pa-alert pa-alert--info">
119
- <h4 class="pa-alert__heading">System Update</h4>
151
+ <!-- Alert with List and Actions.
152
+ .pa-alert__actions sits below a thin divider with symmetric
153
+ padding — same separator pattern as .pa-toast__actions, so a
154
+ "System update / Update now" alert has the same visual weight
155
+ as a custom-action toast. -->
156
+ <div class="pa-alert pa-alert--info" role="alert">
157
+ <h4 class="pa-alert__heading pa-alert__heading--lg">System Update</h4>
120
158
  <p>A new version of the application is available. This update includes:</p>
121
159
  <ul class="pa-alert__list">
122
160
  <li>Performance improvements</li>
@@ -130,63 +168,65 @@
130
168
  </div>
131
169
 
132
170
 
133
- <!-- OUTLINE ALERTS -->
171
+ <!-- OUTLINE ALERTS — border-only, transparent background -->
134
172
 
135
173
  <!-- Outline Primary Alert -->
136
- <div class="pa-alert pa-alert--outline-primary">
174
+ <div class="pa-alert pa-alert--outline-primary" role="alert">
137
175
  <strong>Primary Outline!</strong> This is a primary outline alert.
138
176
  </div>
139
177
 
140
178
  <!-- Outline Success Alert -->
141
- <div class="pa-alert pa-alert--outline-success">
179
+ <div class="pa-alert pa-alert--outline-success" role="alert">
142
180
  <strong>Success Outline!</strong> This is a success outline alert.
143
181
  </div>
144
182
 
145
183
  <!-- Outline Danger Alert -->
146
- <div class="pa-alert pa-alert--outline-danger">
184
+ <div class="pa-alert pa-alert--outline-danger" role="alert">
147
185
  <strong>Danger Outline!</strong> This is a danger outline alert.
148
186
  </div>
149
187
 
150
188
  <!-- Outline Warning Alert -->
151
- <div class="pa-alert pa-alert--outline-warning">
189
+ <div class="pa-alert pa-alert--outline-warning" role="alert">
152
190
  <strong>Warning Outline!</strong> This is a warning outline alert.
153
191
  </div>
154
192
 
155
193
  <!-- Outline Info Alert -->
156
- <div class="pa-alert pa-alert--outline-info">
194
+ <div class="pa-alert pa-alert--outline-info" role="alert">
157
195
  <strong>Info Outline!</strong> This is an info outline alert.
158
196
  </div>
159
197
 
198
+ <!-- Note: no outline variants for secondary / light / dark. -->
199
+
160
200
 
161
201
  <!-- THEME COLOR ALERTS (color-1 through color-9) -->
162
202
 
163
203
  <!-- Theme Color 1 Alert (filled) -->
164
- <div class="pa-alert pa-alert--color-1">
204
+ <div class="pa-alert pa-alert--color-1" role="alert">
165
205
  <strong>Color 1!</strong> Theme color slot 1 alert.
166
206
  </div>
167
207
 
168
208
  <!-- Theme Color 1 Alert (outline) -->
169
- <div class="pa-alert pa-alert--outline-color-1">
209
+ <div class="pa-alert pa-alert--outline-color-1" role="alert">
170
210
  <strong>Color 1 Outline!</strong> Theme color slot 1 outline alert.
171
211
  </div>
172
212
 
173
- <!-- Pattern: pa-alert--color-{1-9} and pa-alert--outline-color-{1-9} -->
213
+ <!-- Pattern: pa-alert--color-{1..9} (filled) and pa-alert--outline-color-{1..9} (outline). -->
174
214
 
175
215
 
176
216
  <!-- ALERT SIZES -->
177
217
 
178
218
  <!-- Small Alert -->
179
- <div class="pa-alert pa-alert--success pa-alert--sm">
219
+ <div class="pa-alert pa-alert--success pa-alert--sm" role="alert">
180
220
  <span class="pa-alert__icon">✓</span> Saved
181
221
  </div>
182
222
 
183
223
  <!-- Default Alert -->
184
- <div class="pa-alert pa-alert--info">
224
+ <div class="pa-alert pa-alert--info" role="alert">
185
225
  <span class="pa-alert__icon">ⓘ</span> Default size alert with standard padding
186
226
  </div>
187
227
 
188
228
  <!-- Large Alert -->
189
- <div class="pa-alert pa-alert--warning pa-alert--lg">
229
+ <div class="pa-alert pa-alert--warning pa-alert--lg" role="alert">
190
230
  <span class="pa-alert__icon">!</span>
191
231
  <div class="pa-alert__content">
192
232
  <strong>Large Alert!</strong> This is a large alert with increased font size for better prominence.
@@ -194,24 +234,6 @@
194
234
  </div>
195
235
 
196
236
 
197
- <!-- COMPACT ALERTS -->
198
-
199
- <!-- Small Success Alert -->
200
- <div class="pa-alert pa-alert--success pa-alert--sm">
201
- <span class="pa-alert__icon">✓</span> Saved
202
- </div>
203
-
204
- <!-- Small Warning Alert -->
205
- <div class="pa-alert pa-alert--warning pa-alert--sm">
206
- <span class="pa-alert__icon">!</span> Pending
207
- </div>
208
-
209
- <!-- Small Danger Alert -->
210
- <div class="pa-alert pa-alert--danger pa-alert--sm">
211
- <span class="pa-alert__icon">×</span> Failed
212
- </div>
213
-
214
-
215
237
  <!-- JAVASCRIPT FOR DISMISSIBLE ALERTS -->
216
238
  <script>
217
239
  function dismissAlert(button) {
@@ -231,63 +253,210 @@ function dismissAlert(button) {
231
253
 
232
254
  <!--
233
255
  ALERT CLASSES:
234
- - .pa-alert: Base alert class
235
-
236
- VARIANTS (solid background):
237
- - .pa-alert--primary: Blue alert
238
- - .pa-alert--secondary: Gray alert
239
- - .pa-alert--success: Green alert
240
- - .pa-alert--danger: Red alert
241
- - .pa-alert--warning: Yellow/orange alert
242
- - .pa-alert--info: Cyan alert
243
- - .pa-alert--light: Light gray alert
244
- - .pa-alert--dark: Dark alert
245
-
246
- OUTLINE VARIANTS (border only):
247
- - .pa-alert--outline-primary: Blue outline
248
- - .pa-alert--outline-success: Green outline
249
- - .pa-alert--outline-danger: Red outline
250
- - .pa-alert--outline-warning: Orange outline
251
- - .pa-alert--outline-info: Cyan outline
256
+ - .pa-alert: Base alert — flex container, $spacing-sm gap, aligned flex-start
257
+
258
+ VARIANTS (solid tint background):
259
+ - .pa-alert--primary accent-tinted
260
+ - .pa-alert--secondary muted/neutral
261
+ - .pa-alert--success green
262
+ - .pa-alert--danger red (also honours $alert-danger-text-transform —
263
+ some themes set this to uppercase)
264
+ - .pa-alert--warning yellow/orange
265
+ - .pa-alert--info cyan/blue
266
+ - .pa-alert--light subtle light
267
+ - .pa-alert--dark subtle dark
268
+
269
+ OUTLINE VARIANTS (transparent background, coloured border):
270
+ - .pa-alert--outline-primary
271
+ - .pa-alert--outline-success
272
+ - .pa-alert--outline-danger
273
+ - .pa-alert--outline-warning
274
+ - .pa-alert--outline-info
275
+ (No outline variants for secondary / light / dark.)
252
276
 
253
277
  THEME COLOR VARIANTS (1-9):
254
- - .pa-alert--color-{1-9}: Filled theme color slot
255
- - .pa-alert--outline-color-{1-9}: Outline theme color slot
278
+ - .pa-alert--color-{1-9} filled theme colour slot
279
+ - .pa-alert--outline-color-{1-9} outline theme colour slot
256
280
 
257
281
  SIZES:
258
- - .pa-alert--sm: Small alert (reduced padding and font)
259
- - (default): Standard size
260
- - .pa-alert--lg: Large alert (increased padding and font)
282
+ - .pa-alert--sm $alert-padding-sm-{v,h} (0.5rem / 1rem),
283
+ $alert-font-size-sm
284
+ ($font-size-xs = 1.2rem)
285
+ - (default) $alert-padding-{v,h} (0.75rem / 1.25rem),
286
+ $font-size-sm (1.4rem)
287
+ - .pa-alert--lg $alert-padding-lg-{v,h} (1rem / 1.5rem),
288
+ $alert-font-size-lg
289
+ ($font-size-base = 1.6rem)
290
+ V steps 0.5 → 0.75 → 1; H steps 1 → 1.25 → 1.5. Clean 0.25rem
291
+ increments. Themes can override $alert-padding-{v,h},
292
+ $alert-padding-{sm,lg}-{v,h}, and $alert-font-size-{sm,lg} in
293
+ variables/_components.scss to retune the scale.
294
+ (No --xs / --xl.)
261
295
 
262
296
  MODIFIERS:
263
- - .pa-alert--dismissible: Adds padding-right for close button
297
+ - .pa-alert--dismissible adds padding-inline-end so __close doesn't overlap
298
+ content; you still render the button yourself.
299
+ - .pa-alert--multiline opts out of the default `align-items: center`
300
+ and aligns flex children to flex-start. Use when
301
+ you have an icon (.pa-alert__icon) next to a
302
+ multi-line .pa-alert__content (heading + body +
303
+ actions) — without it the icon would sit in the
304
+ vertical middle of the content stack instead of
305
+ at the top with the heading. Not needed for
306
+ structural stacks without an icon (their children
307
+ are flex-basis: 100% and each take their own
308
+ row anyway).
264
309
 
265
310
  ELEMENTS:
266
- - .pa-alert__icon: Icon container (displays to left of content)
267
- - .pa-alert__content: Content wrapper (used with icon layout)
268
- - .pa-alert__heading: Alert title/heading (h4)
269
- - .pa-alert__list: List container (ul) for bullet points
270
- - .pa-alert__actions: Button container for action buttons
271
- - .pa-alert__close: Close/dismiss button
311
+ - .pa-alert__icon leading icon (flex-shrink: 0, font-size-base)
312
+ - .pa-alert__content content wrapper (flex: 1, min-width: 0). When you
313
+ have an icon AND structured content (heading,
314
+ paragraph, list, actions), wrap everything that
315
+ isn't the icon inside __content block-flow
316
+ inside the wrapper handles vertical stacking.
317
+ Drop the wrapper when there's no icon; direct
318
+ children work too.
319
+ - .pa-alert__heading alert title on <h4>; semibold, defaults to the
320
+ alert's body font-size (compact look). Add
321
+ --lg to bump to font-size-lg for the louder,
322
+ deliberate-read presentation. Spacing to the
323
+ next element is the alert's flex gap (no
324
+ built-in margin-bottom).
325
+ - .pa-alert__list <ul> inside the alert. Spacing to siblings is
326
+ the alert's flex gap (no built-in margin).
327
+ - .pa-alert__actions button row below a thin divider (border-top +
328
+ $spacing-base padding-top). Same separator
329
+ pattern as .pa-toast__actions, so action-bearing
330
+ alerts and toasts feel visually consistent.
331
+ Always renders on its own row — sits at the
332
+ bottom of the alert's content stack.
333
+ - .pa-alert__close absolutely positioned close button on the
334
+ inline-end side (logical — RTL-aware).
335
+
336
+ LAYOUT NOTE:
337
+ The alert is `display: flex; flex-wrap: wrap` with `gap: $spacing-sm`
338
+ and `align-items: center` (so an icon vertically centres against
339
+ single-line __content). Structural children (__heading, __list,
340
+ __actions, top-level <p>, <hr>) are forced to `flex-basis: 100%` so
341
+ they each take their own row. Inline siblings (__icon, __content,
342
+ bare text + <strong>) stay on the flex row.
343
+
344
+ For the icon + multi-line __content case, add .pa-alert--multiline
345
+ so the icon stops centring against the tall content stack and
346
+ top-aligns with the heading instead.
347
+
348
+ MARKUP SHAPES — WITH vs WITHOUT ICON:
349
+ The alert has two valid shapes depending on whether you have an icon:
350
+
351
+ - WITH icon: wrap the rest of the content in .pa-alert__content.
352
+ .pa-alert is a flex row, the icon is one flex item, __content is
353
+ the other flex item (flex: 1) that takes the remaining width.
354
+ Without the wrapper, every word/element next to the icon would
355
+ become its own flex item and the layout breaks.
356
+
357
+ <div class="pa-alert pa-alert--info">
358
+ <span class="pa-alert__icon">ⓘ</span>
359
+ <div class="pa-alert__content">
360
+ <strong>Title</strong> Body text…
361
+ </div>
362
+ </div>
363
+
364
+ - WITHOUT icon: skip __content and put the structural children
365
+ directly inside .pa-alert. There's no icon to flow around, and
366
+ __heading / __list / __actions / top-level <p>, <hr> get
367
+ flex-basis: 100% so each takes its own row anyway. Wrapping them
368
+ in __content for "consistency" would just add an empty <div>
369
+ with no visual or semantic gain — and it'd actually move them
370
+ out of the `> p` / `> hr` selector reach, breaking the layout
371
+ rules.
372
+
373
+ <div class="pa-alert pa-alert--danger">
374
+ <h4 class="pa-alert__heading">Sync failed</h4>
375
+ <p class="mb-0">We couldn't reach the server.</p>
376
+ <div class="pa-alert__actions">…</div>
377
+ </div>
378
+
379
+ Same alert system, two markup shapes — pick by whether there's an
380
+ icon to flow around. Both are first-class.
381
+
382
+ HEADING SIZE — DEFAULT vs --lg:
383
+ - Default: <h4 class="pa-alert__heading">Title</h4> sits at the
384
+ alert's body font-size + semibold weight. Compact look,
385
+ good for status banners ("Validation failed", "Saved",
386
+ "Connection lost") and most title+paragraph cases.
387
+ - --lg: <h4 class="pa-alert__heading pa-alert__heading--lg">Title</h4>
388
+ bumps to font-size-lg for the louder, deliberate-read
389
+ treatment. Use for blocking errors, system updates,
390
+ quota warnings — alerts the user has to deal with.
391
+
392
+ INLINE STYLE (no separate title element):
393
+ For single-line alerts where the bold word is just inline emphasis,
394
+ keep using <strong> directly — no heading element involved:
395
+ <strong>Primary!</strong> This is a primary alert.
396
+ This is a different pattern from .pa-alert__heading. Don't add the
397
+ heading class to inline <strong>s.
398
+
399
+ AUTOMATIC BEHAVIOUR:
400
+ - When the alert is the first or last child of .pa-card__body, its
401
+ top/bottom margin collapses — no extra classes needed.
402
+ - <a> inside an alert inherits colour, is underlined, and drops the
403
+ underline on hover.
404
+ - <hr> inside an alert gets a subtle thin border and tighter margins
405
+ for in-alert dividers.
406
+
407
+ ACCESSIBILITY:
408
+ - Add role="alert" on dynamic or dismissible alerts so screen readers
409
+ announce them as they appear.
272
410
 
273
411
  STRUCTURE PATTERNS:
274
412
 
275
- Simple alert:
276
- <div class="pa-alert pa-alert--success">
413
+ Simple inline alert (one line, inline <strong> emphasis):
414
+ <div class="pa-alert pa-alert--success" role="alert">
277
415
  <strong>Success!</strong> Message here.
278
416
  </div>
279
417
 
280
- Alert with icon:
281
- <div class="pa-alert pa-alert--success">
418
+ Multi-line alert with default-size heading:
419
+ <div class="pa-alert pa-alert--danger" role="alert">
420
+ <h4 class="pa-alert__heading">Validation failed</h4>
421
+ <p class="mb-0">Please fix the errors below.</p>
422
+ </div>
423
+
424
+ Multi-line alert with --lg heading (deliberate read):
425
+ <div class="pa-alert pa-alert--info" role="alert">
426
+ <h4 class="pa-alert__heading pa-alert__heading--lg">System update</h4>
427
+ <p class="mb-0">A new version is available.</p>
428
+ </div>
429
+
430
+ Alert with icon — single-line content (icon + __content centred):
431
+ <div class="pa-alert pa-alert--success" role="alert">
282
432
  <span class="pa-alert__icon">✓</span>
283
433
  <div class="pa-alert__content">
284
434
  <strong>Success!</strong> Message here.
285
435
  </div>
286
436
  </div>
287
437
 
288
- Alert with list and actions:
289
- <div class="pa-alert pa-alert--info">
290
- <h4 class="pa-alert__heading">Title</h4>
438
+ Alert with icon multi-line content (use --multiline so the icon
439
+ sticks to the top with the heading instead of centring against
440
+ the whole stack):
441
+ <div class="pa-alert pa-alert--info pa-alert--multiline" role="alert">
442
+ <span class="pa-alert__icon">ⓘ</span>
443
+ <div class="pa-alert__content">
444
+ <h4 class="pa-alert__heading pa-alert__heading--lg">Heads up</h4>
445
+ <p class="mb-0">Long body text spans multiple lines…</p>
446
+ </div>
447
+ </div>
448
+
449
+ Dismissible alert (no icon — no __content needed):
450
+ <div class="pa-alert pa-alert--danger pa-alert--dismissible" role="alert">
451
+ <strong>Oh snap!</strong> Something went wrong.
452
+ <button class="pa-alert__close" aria-label="Close">
453
+ <span aria-hidden="true">×</span>
454
+ </button>
455
+ </div>
456
+
457
+ Alert with heading, list, and actions (--lg heading for prominence):
458
+ <div class="pa-alert pa-alert--info" role="alert">
459
+ <h4 class="pa-alert__heading pa-alert__heading--lg">Title</h4>
291
460
  <p>Description text.</p>
292
461
  <ul class="pa-alert__list">
293
462
  <li>Item 1</li>
@@ -297,4 +466,10 @@ Alert with list and actions:
297
466
  <button class="pa-btn pa-btn--sm pa-btn--primary">Action</button>
298
467
  </div>
299
468
  </div>
469
+
470
+ CALLOUT vs ALERT:
471
+ - Alert: full background tint or outline; supports --dismissible; fits
472
+ dynamic feedback, notifications, message banners.
473
+ - Callout: documentation-style, left border only, no dismiss; use for
474
+ static tips/notes/warnings inside content areas.
300
475
  -->