@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/README.md +56 -0
- package/dist/css/main.css +703 -28
- package/package.json +1 -1
- package/snippets/layout.html +145 -38
- package/src/scss/core-components/_grid.scss +25 -0
- package/src/scss/core-components/_notifications.scss +67 -0
- package/src/scss/core-components/_profile.scss +12 -2
- package/src/scss/core-components/_scrollbars.scss +3 -4
- package/src/scss/core-components/_tabs.scss +3 -0
- package/src/scss/core-components/_utilities.scss +39 -0
- package/src/scss/core-components/forms/_input-groups.scss +13 -11
- package/src/scss/core-components/layout/_layout-container.scss +64 -2
- package/src/scss/core-components/layout/_navbar-elements.scss +3 -2
- package/src/scss/core-components/layout/_navbar.scss +23 -0
- package/src/scss/core-components/layout/_sidebar.scss +53 -2
- package/src/scss/themes/audi-light.scss +26 -0
- package/src/scss/themes/audi.scss +13 -0
- package/src/scss/themes/corporate.scss +26 -0
- package/src/scss/themes/dark-blue.scss +13 -0
- package/src/scss/themes/dark-green.scss +13 -0
- package/src/scss/themes/dark-red.scss +13 -0
- package/src/scss/themes/dark.scss +13 -0
- package/src/scss/themes/express.scss +13 -0
- package/src/scss/themes/minimal.scss +13 -0
- package/src/scss/utilities.scss +57 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keenmate/pure-admin-core",
|
|
3
|
-
"version": "1.0.0
|
|
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": {
|
package/snippets/layout.html
CHANGED
|
@@ -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
|
-
|
|
47
|
+
<!-- Left Section (stays anchored left) -->
|
|
48
|
+
<div class="pa-footer__left">
|
|
47
49
|
<p>© 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
|
-
<!--
|
|
377
|
-
<
|
|
378
|
-
|
|
379
|
-
<
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
<!--
|
|
389
|
-
<
|
|
390
|
-
<
|
|
391
|
-
<
|
|
392
|
-
|
|
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
|
|
403
|
-
<
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
<
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
<
|
|
414
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
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:
|
|
25
|
-
border-color: $accent-hover;
|
|
24
|
+
background: var(--pa-accent);
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
&:active {
|
|
29
|
-
background:
|
|
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
|
-
|
|
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,
|
|
78
|
-
&:focus
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
65
|
+
// Elements in left section
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
&--right {
|
|
68
|
-
|
|
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
|
+
}
|