@keenmate/pure-admin-core 1.0.0-rc05 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keenmate/pure-admin-core",
3
- "version": "1.0.0-rc05",
3
+ "version": "1.0.0",
4
4
  "description": "Lightweight, data-focused HTML/CSS admin framework built with PureCSS foundation and comprehensive component system",
5
5
  "style": "dist/css/main.css",
6
6
  "exports": {
@@ -42,10 +42,24 @@
42
42
  </div>
43
43
 
44
44
  <!-- Footer (outside inner, inside layout) -->
45
+ <!-- Three-section layout: Left / Center / Right -->
45
46
  <footer class="pa-layout__footer">
46
- <div class="pa-layout__footer__content">
47
+ <!-- Left Section (stays anchored left) -->
48
+ <div class="pa-footer__left">
47
49
  <p>&copy; 2024 Pure Admin Framework</p>
48
50
  </div>
51
+
52
+ <!-- Center Section (flexible, fills space) -->
53
+ <div class="pa-footer__center">
54
+ <!-- Optional center content -->
55
+ </div>
56
+
57
+ <!-- Right Section (stays anchored right) -->
58
+ <div class="pa-footer__right">
59
+ <span>App version: 1.2.1</span>
60
+ <span>Database version: 2.3.1</span>
61
+ <a href="#">Open Source Licenses</a>
62
+ </div>
49
63
  </footer>
50
64
  </div>
51
65
 
@@ -366,52 +380,115 @@
366
380
  </aside>
367
381
 
368
382
 
383
+ <!-- ================================
384
+ SIDEBAR WIDTH CONTROL
385
+ ================================ -->
386
+
387
+ <!-- Default width (28.8rem / 288px from CSS variable) -->
388
+ <aside class="pa-layout__sidebar">
389
+ <!-- Nav content -->
390
+ </aside>
391
+
392
+ <!-- Resizable sidebar (opt-in, drag right edge to resize) -->
393
+ <aside class="pa-layout__sidebar pa-layout__sidebar--resizable">
394
+ <!-- Nav content -->
395
+ <!-- Drag handle appears on right edge -->
396
+ <!-- Width saved to localStorage -->
397
+ <!-- Double-click handle to reset to default -->
398
+ </aside>
399
+
400
+ <!-- Custom fixed width using utility class (overrides default and resize) -->
401
+ <aside class="pa-layout__sidebar wr-25">
402
+ <!-- Fixed 25rem (250px) width -->
403
+ <!-- wr-* sets exact width, blocks resize -->
404
+ </aside>
405
+
406
+ <!-- Custom minimum width using utility class (allows resize above minimum) -->
407
+ <aside class="pa-layout__sidebar pa-layout__sidebar--resizable minwr-20">
408
+ <!-- Minimum 20rem (200px) width -->
409
+ <!-- minwr-* sets floor, resize still works above it -->
410
+ </aside>
411
+
412
+ <!--
413
+ SIDEBAR WIDTH OPTIONS:
414
+ 1. Default: Uses CSS variable --pa-sidebar-width (28.8rem)
415
+ 2. Resizable: Add --resizable class, user can drag to resize (180-500px range)
416
+ 3. Fixed width: Add wr-* utility class (e.g., wr-20, wr-25, wr-30)
417
+ 4. Minimum width: Add minwr-* utility class (e.g., minwr-15, minwr-20)
418
+
419
+ WIDTH UTILITY CLASSES (rem-based, 10px = 1rem):
420
+ - .wr-15 to .wr-25 - Fixed width (15rem to 25rem)
421
+ - .minwr-15 to .minwr-25 - Minimum width (allows resize above)
422
+ - .maxwr-15 to .maxwr-25 - Maximum width (limits resize)
423
+
424
+ NOTE: Fixed width (.wr-*) overrides both default and resizable width.
425
+ Use .minwr-* with --resizable to set a floor while allowing resize.
426
+ -->
427
+
428
+
369
429
  <!-- ================================
370
430
  NAVBAR/HEADER (with burger menu and navigation)
431
+ Three-section layout: Left / Center / Right
371
432
  ================================ -->
372
433
 
373
434
  <!-- Complete Navbar Example (hybrid: pa-navbar wrapper, pa-header__ elements) -->
374
435
  <nav class="pa-navbar">
375
436
  <div class="pa-navbar__inner">
376
- <!-- Hamburger Menu (burger) -->
377
- <button class="pa-header__burger burger-menu" onclick="toggleSidebar()" aria-label="Toggle sidebar">
378
- <span></span>
379
- <span></span>
380
- <span></span>
381
- </button>
382
-
383
- <!-- Brand -->
384
- <div class="pa-header__brand">
385
- <h1>Pure Admin</h1>
437
+ <!-- Left Section: Burger, Brand, Left Nav (stays anchored left) -->
438
+ <div class="pa-header__left">
439
+ <!-- Hamburger Menu (burger) -->
440
+ <button class="pa-header__burger burger-menu" onclick="toggleSidebar()" aria-label="Toggle sidebar">
441
+ <span></span>
442
+ <span></span>
443
+ <span></span>
444
+ </button>
445
+
446
+ <!-- Brand -->
447
+ <div class="pa-header__brand">
448
+ <h1>Pure Admin</h1>
449
+ </div>
450
+
451
+ <!-- Left Navigation Links -->
452
+ <nav class="pa-header__nav pa-header__nav--left">
453
+ <ul>
454
+ <li><a href="/">Dashboard</a></li>
455
+ <li><a href="/components">Components</a></li>
456
+ <li><a href="/forms">Forms</a></li>
457
+ </ul>
458
+ </nav>
386
459
  </div>
387
460
 
388
- <!-- Left Navigation Links -->
389
- <nav class="pa-header__nav pa-header__nav--left">
390
- <ul>
391
- <li><a href="/">📊 Dashboard</a></li>
392
- <li><a href="/components">🧩 Components</a></li>
393
- <li><a href="/forms">📝 Forms</a></li>
394
- </ul>
395
- </nav>
396
-
397
- <!-- Page Title (flexible, with ellipsis) -->
398
- <div class="pa-header__title">
399
- <h2>Dashboard</h2>
461
+ <!-- Center Section: Page Title (flexible, fills space between left/right) -->
462
+ <div class="pa-header__center">
463
+ <div class="pa-header__title">
464
+ <h2>Dashboard</h2>
465
+ </div>
400
466
  </div>
401
467
 
402
- <!-- Right Navigation Links -->
403
- <nav class="pa-header__nav pa-header__nav--right">
404
- <ul>
405
- <li><a href="/alerts">⚠️ Alerts</a></li>
406
- <li><a href="/tables">📋 Tables</a></li>
407
- </ul>
408
- </nav>
409
-
410
- <!-- Profile Button -->
411
- <button class="pa-header__profile-btn" onclick="toggleProfilePanel()" aria-label="User Profile">
412
- <span class="pa-btn__icon">👤</span>
413
- <span class="pa-header__profile-name">John Doe</span>
414
- </button>
468
+ <!-- Right Section: Right Nav, Notifications, Profile (stays anchored right) -->
469
+ <div class="pa-header__right">
470
+ <!-- Right Navigation Links -->
471
+ <nav class="pa-header__nav pa-header__nav--right">
472
+ <ul>
473
+ <li><a href="/alerts">Alerts</a></li>
474
+ <li><a href="/tables">Tables</a></li>
475
+ </ul>
476
+ </nav>
477
+
478
+ <!-- Notification Bell -->
479
+ <div class="pa-notifications">
480
+ <button class="pa-notifications__btn" onclick="toggleNotifications()" aria-label="Notifications">
481
+ <span class="pa-notifications__icon">🔔</span>
482
+ <span class="pa-notifications__badge">3</span>
483
+ </button>
484
+ </div>
485
+
486
+ <!-- Profile Button -->
487
+ <button class="pa-header__profile-btn" onclick="toggleProfilePanel()" aria-label="User Profile">
488
+ <span class="pa-btn__icon">👤</span>
489
+ <span class="pa-header__profile-name">John Doe</span>
490
+ </button>
491
+ </div>
415
492
  </div>
416
493
  </nav>
417
494
 
@@ -518,13 +595,19 @@ NAVBAR CLASSES:
518
595
  - .pa-navbar - Navbar outer wrapper (outside layout container)
519
596
  - .pa-navbar__inner - Navbar inner container
520
597
 
521
- HEADER/NAVBAR ELEMENT CLASSES (inside pa-navbar__inner):
598
+ HEADER SECTION CONTAINERS (inside pa-navbar__inner):
599
+ - .pa-header__left - Left section (burger, brand, nav--left) - stays anchored left
600
+ - .pa-header__center - Center section (title) - flexible, fills space
601
+ - .pa-header__right - Right section (nav--right, notifications, profile) - stays anchored right
602
+
603
+ HEADER/NAVBAR ELEMENT CLASSES (inside section containers):
522
604
  - .pa-header__burger - Burger menu button
523
605
  - .burger-menu - Burger menu class (same as __burger)
524
606
  - .pa-header__brand - Brand/logo area
525
607
  - .pa-header__nav - Navigation container
526
608
  - .pa-header__nav--left/right - Navigation alignment
527
609
  - .pa-header__title - Page title area (flexible, with ellipsis)
610
+ - .pa-notifications - Notification bell container
528
611
  - .pa-header__profile-btn - Profile button
529
612
  - .pa-header__profile-name - Profile name text
530
613
 
@@ -536,7 +619,11 @@ LAYOUT CLASSES:
536
619
  - .pa-layout__main - Main content area
537
620
  - .pa-layout__main__inner - Main content inner wrapper
538
621
  - .pa-layout__footer - Footer container
539
- - .pa-layout__footer__content - Footer content wrapper
622
+
623
+ FOOTER SECTION CONTAINERS (inside pa-layout__footer):
624
+ - .pa-footer__left - Left section (copyright, etc.) - stays anchored left
625
+ - .pa-footer__center - Center section (optional) - flexible, fills space
626
+ - .pa-footer__right - Right section (version info, links) - stays anchored right
540
627
 
541
628
  LAYOUT WIDTH VARIANTS (applied to body tag):
542
629
  - No class - Fluid layout (full width)
@@ -564,6 +651,14 @@ SIDEBAR MODES (modifiers on .pa-layout__sidebar):
564
651
  - Default - Sidebar scrolls with content
565
652
  - .pa-layout__sidebar--sticky - Sidebar stays fixed while content scrolls
566
653
  - .pa-layout__sidebar--icon-collapse - Sidebar collapses to icon bar instead of hiding
654
+ - .pa-layout__sidebar--resizable - Drag right edge to resize (opt-in)
655
+
656
+ SIDEBAR WIDTH CONTROL:
657
+ - Default width: 28.8rem (288px) via CSS variable --pa-sidebar-width
658
+ - Resizable: Add --resizable class for drag-to-resize (180-500px range)
659
+ - Fixed width: Add .wr-* utility class (e.g., wr-25 = 250px) - overrides resize
660
+ - Min width: Add .minwr-* utility class (e.g., minwr-20) - sets floor for resize
661
+ - Max width: Add .maxwr-* utility class (e.g., maxwr-40) - sets ceiling for resize
567
662
 
568
663
  BURGER MENU:
569
664
  - .burger-menu - Burger menu button (same as .pa-header__burger)
@@ -595,4 +690,16 @@ JAVASCRIPT:
595
690
  - toggleSidebar() - Toggle sidebar visibility (burger menu)
596
691
  - toggleSubmenu(button) - Toggle submenu open/closed
597
692
  - Stores state in localStorage for persistence across page loads
693
+
694
+ PROFILE PANEL WIDTH CONTROL:
695
+ - Default width: 20vw via CSS variable --pa-profile-panel-width
696
+ - Default max-width: 48rem (480px) via CSS variable --pa-profile-panel-max-width
697
+ - Override with utility classes: Add .wr-* to .pa-profile-panel__content
698
+ - Examples:
699
+ - .wr-30 = fixed 30rem (300px) width
700
+ - .wr-40 = fixed 40rem (400px) width
701
+ - .minwr-25 = minimum 25rem width
702
+ - .maxwr-50 = maximum 50rem width
703
+ - Uses low specificity (:where) so utility classes can override
704
+ - Available: wr-1 to wr-10, then 15, 20, 25, 30, 35, 40, 45, 50 (same for minwr/maxwr)
598
705
  -->
@@ -262,3 +262,28 @@ $grid-columns-fractions: (
262
262
  padding-bottom: 0;
263
263
  }
264
264
 
265
+ // ============================================================================
266
+ // AUTO-STACK ON MOBILE
267
+ // ============================================================================
268
+ // Base percentage/fraction columns auto-stack to 100% on mobile
269
+ // Use explicit responsive classes (pa-col-sm-*, pa-col-md-*) to override
270
+ @media (max-width: $mobile-breakpoint) {
271
+ // Stack percentage columns
272
+ @each $size in $grid-columns-5 {
273
+ @if $size < 100 {
274
+ .pa-col-#{$size} {
275
+ flex: 0 0 100%;
276
+ max-width: 100%;
277
+ }
278
+ }
279
+ }
280
+
281
+ // Stack fraction columns
282
+ @each $name, $width in $grid-columns-fractions {
283
+ .pa-col-#{$name} {
284
+ flex: 0 0 100%;
285
+ max-width: 100%;
286
+ }
287
+ }
288
+ }
289
+
@@ -251,3 +251,70 @@
251
251
  right: -$spacing-base; // Align to right edge of viewport
252
252
  }
253
253
  }
254
+
255
+ // ====================
256
+ // Page View Modifier
257
+ // ====================
258
+ // Larger variant for full-page notification list
259
+
260
+ .pa-notifications__list--page {
261
+ max-height: none;
262
+ overflow: visible;
263
+
264
+ .pa-notifications__item {
265
+ padding: $spacing-base $spacing-lg;
266
+ }
267
+
268
+ .pa-notifications__icon-wrapper {
269
+ width: 4rem;
270
+ height: 4rem;
271
+ font-size: $font-size-lg;
272
+ }
273
+
274
+ .pa-notifications__content {
275
+ h4 {
276
+ font-size: $font-size-sm;
277
+ margin-bottom: $spacing-xs;
278
+ }
279
+
280
+ p {
281
+ font-size: $font-size-sm;
282
+ -webkit-line-clamp: 3;
283
+ }
284
+ }
285
+
286
+ .pa-notifications__time {
287
+ font-size: $font-size-xs;
288
+ }
289
+ }
290
+
291
+ // Action buttons (for page view)
292
+ .pa-notifications__actions {
293
+ display: flex;
294
+ gap: $spacing-xs;
295
+ flex-shrink: 0;
296
+ opacity: 0;
297
+ transition: opacity $transition-fast $easing-snappy;
298
+ }
299
+
300
+ .pa-notifications__item:hover .pa-notifications__actions {
301
+ opacity: 1;
302
+ }
303
+
304
+ // Mobile: always show actions
305
+ @media (max-width: $mobile-breakpoint) {
306
+ .pa-notifications__list--page {
307
+ .pa-notifications__item {
308
+ flex-wrap: wrap;
309
+ }
310
+
311
+ .pa-notifications__actions {
312
+ opacity: 1;
313
+ width: 100%;
314
+ justify-content: flex-end;
315
+ margin-top: $spacing-sm;
316
+ padding-top: $spacing-sm;
317
+ border-top: $border-width-base solid var(--pa-border-color);
318
+ }
319
+ }
320
+ }
@@ -4,6 +4,18 @@
4
4
  ======================================== */
5
5
  @use '../variables' as *;
6
6
 
7
+ // CSS variable for profile panel width (allows utility class override)
8
+ :root {
9
+ --pa-profile-panel-width: #{$profile-panel-width};
10
+ --pa-profile-panel-max-width: #{$profile-panel-max-width};
11
+ }
12
+
13
+ // Profile panel content width - :where() for low specificity (utility classes can override)
14
+ :where(.pa-profile-panel__content) {
15
+ width: var(--pa-profile-panel-width);
16
+ max-width: var(--pa-profile-panel-max-width);
17
+ }
18
+
7
19
  // ====================
8
20
  // Profile Panel & Header Button
9
21
  // ====================
@@ -73,8 +85,6 @@
73
85
  position: absolute;
74
86
  top: 0;
75
87
  right: 0;
76
- width: $profile-panel-width;
77
- max-width: $profile-panel-max-width;
78
88
  height: 100vh;
79
89
  background-color: var(--pa-card-bg);
80
90
  box-shadow: $shadow-profile-panel;
@@ -16,17 +16,16 @@
16
16
  }
17
17
 
18
18
  *::-webkit-scrollbar-thumb {
19
- background: $border-color;
19
+ background: var(--pa-border-color);
20
20
  border-radius: $scrollbar-border-radius;
21
21
  border: $border-width-base solid var(--pa-primary-bg);
22
22
 
23
23
  &:hover {
24
- background: $accent-color;
25
- border-color: $accent-hover;
24
+ background: var(--pa-accent);
26
25
  }
27
26
 
28
27
  &:active {
29
- background: $accent-hover;
28
+ background: var(--pa-accent-hover);
30
29
  }
31
30
  }
32
31
 
@@ -322,6 +322,7 @@
322
322
  border-radius: $border-radius-lg;
323
323
  padding: $card-body-padding-v $card-body-padding-h;
324
324
  background-color: var(--pa-card-bg);
325
+ margin-bottom: $spacing-base; // Match pa-card margin
325
326
 
326
327
  // Remove bottom border from tabs since wrapper has border
327
328
  .pa-tabs {
@@ -344,6 +345,7 @@
344
345
  border-radius: $card-border-radius;
345
346
  background-color: var(--pa-card-bg);
346
347
  box-shadow: $shadow-sm;
348
+ margin-bottom: $spacing-base; // Match pa-card margin
347
349
 
348
350
  .pa-tabs {
349
351
  height: $card-header-min-height;
@@ -474,6 +476,7 @@
474
476
  border-radius: $border-radius-lg;
475
477
  padding: $card-body-padding-v $card-body-padding-h;
476
478
  background-color: var(--pa-card-bg);
479
+ margin-bottom: $spacing-base; // Match pa-card margin
477
480
 
478
481
  // Add divider between tabs and content (gap already provides spacing)
479
482
  .pa-tabs--vertical {
@@ -122,6 +122,23 @@ html.font-size-4xl {
122
122
  .overflow-hidden { overflow: hidden; }
123
123
  .overflow-visible { overflow: visible; }
124
124
 
125
+ // Overlay scrollbar utilities (scrollbar floats over content, doesn't reduce width)
126
+ // Supported in Chromium browsers; Firefox falls back to auto
127
+ .overflow-overlay {
128
+ overflow: auto;
129
+ overflow: overlay;
130
+ }
131
+
132
+ .overflow-y-overlay {
133
+ overflow-y: auto;
134
+ overflow-y: overlay;
135
+ }
136
+
137
+ .overflow-x-overlay {
138
+ overflow-x: auto;
139
+ overflow-x: overlay;
140
+ }
141
+
125
142
  // Cursor utilities
126
143
  .cursor-pointer { cursor: pointer; }
127
144
  .cursor-help { cursor: help; }
@@ -235,6 +252,13 @@ html.font-size-4xl {
235
252
  .column-gap-base { column-gap: $spacing-base; }
236
253
  .column-gap-lg { column-gap: $spacing-lg; }
237
254
 
255
+ // Align-self utilities (for flex/grid children)
256
+ .self-start { align-self: flex-start; }
257
+ .self-center { align-self: center; }
258
+ .self-end { align-self: flex-end; }
259
+ .self-stretch { align-self: stretch; }
260
+ .self-baseline { align-self: baseline; }
261
+
238
262
  // Font-size utilities (10px rem base)
239
263
  // Direct font-size classes using typography variables
240
264
  .text-2xs { font-size: $font-size-2xs; } // 1rem = 10px
@@ -248,6 +272,13 @@ html.font-size-4xl {
248
272
  .text-3xl { font-size: $font-size-3xl; } // 2.8rem = 28px
249
273
  .text-4xl { font-size: $font-size-4xl; } // 3.2rem = 32px
250
274
 
275
+ // Text truncation with ellipsis
276
+ .text-truncate {
277
+ overflow: hidden;
278
+ text-overflow: ellipsis;
279
+ white-space: nowrap;
280
+ }
281
+
251
282
  // Component showcase styling
252
283
  .component-showcase {
253
284
  display: flex;
@@ -292,3 +323,11 @@ html.font-size-4xl {
292
323
  }
293
324
  }
294
325
 
326
+ // Theme color utilities (color-1 through color-9)
327
+ // Use these to apply theme colors to any element
328
+ @for $i from 1 through 9 {
329
+ .pa-bg-color-#{$i} { background-color: var(--pa-color-#{$i}); }
330
+ .pa-text-color-#{$i} { color: var(--pa-color-#{$i}); }
331
+ .pa-border-color-#{$i} { border-color: var(--pa-color-#{$i}); }
332
+ }
333
+
@@ -35,10 +35,11 @@
35
35
  &__append {
36
36
  display: flex;
37
37
  align-items: center;
38
- padding: $input-padding-v $input-padding-h;
38
+ height: #{$base-input-size-md-height}rem;
39
+ line-height: #{$base-input-size-md-height}rem;
40
+ padding: 0 $input-padding-h;
39
41
  border: $border-width-base solid var(--pa-border-color);
40
42
  font-size: $font-size-sm;
41
- line-height: 1;
42
43
  white-space: nowrap;
43
44
  border-radius: 0;
44
45
  }
@@ -74,8 +75,8 @@
74
75
  border-left: $border-width-base solid var(--pa-border-color);
75
76
  }
76
77
 
77
- // When input is focused, only show focus border on edges adjacent to input
78
- &:focus-within {
78
+ // When input is focused, show focus border on adjacent prepend/append
79
+ &:has(.pa-input:focus) {
79
80
  // Last prepend (one before input) gets focus border
80
81
  .pa-input-group__prepend {
81
82
  border-right: $border-width-base solid var(--pa-input-focus-border-color);
@@ -99,13 +100,10 @@
99
100
 
100
101
  &__button {
101
102
  border-radius: 0;
102
- border-color: var(--pa-border-color);
103
- border-left: none;
104
103
 
105
104
  &:first-child {
106
105
  border-top-left-radius: $border-radius;
107
106
  border-bottom-left-radius: $border-radius;
108
- border-left: $border-width-base solid var(--pa-border-color);
109
107
  }
110
108
 
111
109
  &:last-child {
@@ -118,7 +116,8 @@
118
116
  &--xs {
119
117
  .pa-input-group__prepend,
120
118
  .pa-input-group__append {
121
- padding: $input-padding-xs-v $input-padding-h;
119
+ height: #{$base-input-size-xs-height}rem;
120
+ line-height: #{$base-input-size-xs-height}rem;
122
121
  font-size: $font-size-xs;
123
122
  }
124
123
  }
@@ -126,7 +125,8 @@
126
125
  &--sm {
127
126
  .pa-input-group__prepend,
128
127
  .pa-input-group__append {
129
- padding: $input-padding-v $input-padding-h;
128
+ height: #{$base-input-size-sm-height}rem;
129
+ line-height: #{$base-input-size-sm-height}rem;
130
130
  font-size: $font-size-sm;
131
131
  }
132
132
  }
@@ -134,7 +134,8 @@
134
134
  &--lg {
135
135
  .pa-input-group__prepend,
136
136
  .pa-input-group__append {
137
- padding: $input-padding-v $input-padding-h;
137
+ height: #{$base-input-size-lg-height}rem;
138
+ line-height: #{$base-input-size-lg-height}rem;
138
139
  font-size: $font-size-base;
139
140
  }
140
141
  }
@@ -142,7 +143,8 @@
142
143
  &--xl {
143
144
  .pa-input-group__prepend,
144
145
  .pa-input-group__append {
145
- padding: $input-padding-v $input-padding-h;
146
+ height: #{$base-input-size-xl-height}rem;
147
+ line-height: #{$base-input-size-xl-height}rem;
146
148
  font-size: $font-size-lg;
147
149
  }
148
150
  }
@@ -95,11 +95,73 @@ body.pa-layout--sticky .pa-layout__inner {
95
95
 
96
96
  // Footer - outside inner, sibling to inner
97
97
  .pa-layout__footer {
98
- height: $footer-height;
98
+ min-height: $footer-height;
99
99
  background-color: var(--pa-footer-bg);
100
100
  border-top: $border-width-base solid var(--pa-footer-border-color);
101
101
  display: flex;
102
102
  align-items: center;
103
- padding: 0 $spacing-base;
103
+ padding: $spacing-xs $spacing-base;
104
104
  flex-shrink: 0; // Don't shrink footer
105
+ gap: $spacing-base;
106
+ }
107
+
108
+ // Footer sections - Left/Center/Right layout (mirrors navbar structure)
109
+ .pa-footer__left {
110
+ display: flex;
111
+ align-items: center;
112
+ gap: $spacing-base;
113
+ flex-shrink: 0;
114
+ }
115
+
116
+ .pa-footer__center {
117
+ flex: 1;
118
+ min-width: 0; // Allow shrinking for ellipsis
119
+ display: flex;
120
+ align-items: center;
121
+ justify-content: center;
122
+ }
123
+
124
+ .pa-footer__right {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: $spacing-base;
128
+ flex-shrink: 0;
129
+
130
+ &--vertical {
131
+ flex-direction: column;
132
+ align-items: flex-end;
133
+ gap: $spacing-xs;
134
+ }
135
+ }
136
+
137
+ // Responsive footer - stack sections on mobile
138
+ @media (max-width: $mobile-breakpoint) {
139
+ .pa-layout__footer {
140
+ flex-wrap: wrap;
141
+ min-height: auto;
142
+ padding: $spacing-sm $spacing-base;
143
+ }
144
+
145
+ .pa-footer__left,
146
+ .pa-footer__center,
147
+ .pa-footer__right {
148
+ flex-shrink: 1;
149
+ min-width: 0;
150
+ }
151
+
152
+ .pa-footer__left {
153
+ flex: 1 1 auto;
154
+ }
155
+
156
+ .pa-footer__center {
157
+ display: none; // Hide empty center on mobile
158
+ }
159
+
160
+ .pa-footer__right {
161
+ flex: 0 1 auto;
162
+
163
+ &--vertical {
164
+ align-items: flex-end;
165
+ }
166
+ }
105
167
  }
@@ -60,12 +60,13 @@
60
60
  }
61
61
  }
62
62
 
63
+ // Note: margin auto no longer needed with pa-header__left/center/right structure
63
64
  &--left {
64
- margin-right: auto;
65
+ // Elements in left section
65
66
  }
66
67
 
67
68
  &--right {
68
- margin-left: auto;
69
+ // Elements in right section
69
70
  }
70
71
  }
71
72
 
@@ -69,3 +69,26 @@ body.pa-container-2xl .pa-navbar {
69
69
  align-items: center;
70
70
  gap: $spacing-base;
71
71
  }
72
+
73
+ // Header sections - Left/Center/Right layout
74
+ .pa-header__left {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: $spacing-base;
78
+ flex-shrink: 0;
79
+ }
80
+
81
+ .pa-header__center {
82
+ flex: 1;
83
+ min-width: 0; // Allow shrinking for ellipsis
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ }
88
+
89
+ .pa-header__right {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: $spacing-base;
93
+ flex-shrink: 0;
94
+ }