@keenmate/pure-admin-core 1.0.0-rc04 → 1.0.0-rc06

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-rc04",
3
+ "version": "1.0.0-rc06",
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
 
@@ -368,50 +382,67 @@
368
382
 
369
383
  <!-- ================================
370
384
  NAVBAR/HEADER (with burger menu and navigation)
385
+ Three-section layout: Left / Center / Right
371
386
  ================================ -->
372
387
 
373
388
  <!-- Complete Navbar Example (hybrid: pa-navbar wrapper, pa-header__ elements) -->
374
389
  <nav class="pa-navbar">
375
390
  <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>
391
+ <!-- Left Section: Burger, Brand, Left Nav (stays anchored left) -->
392
+ <div class="pa-header__left">
393
+ <!-- Hamburger Menu (burger) -->
394
+ <button class="pa-header__burger burger-menu" onclick="toggleSidebar()" aria-label="Toggle sidebar">
395
+ <span></span>
396
+ <span></span>
397
+ <span></span>
398
+ </button>
399
+
400
+ <!-- Brand -->
401
+ <div class="pa-header__brand">
402
+ <h1>Pure Admin</h1>
403
+ </div>
404
+
405
+ <!-- Left Navigation Links -->
406
+ <nav class="pa-header__nav pa-header__nav--left">
407
+ <ul>
408
+ <li><a href="/">Dashboard</a></li>
409
+ <li><a href="/components">Components</a></li>
410
+ <li><a href="/forms">Forms</a></li>
411
+ </ul>
412
+ </nav>
386
413
  </div>
387
414
 
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>
415
+ <!-- Center Section: Page Title (flexible, fills space between left/right) -->
416
+ <div class="pa-header__center">
417
+ <div class="pa-header__title">
418
+ <h2>Dashboard</h2>
419
+ </div>
400
420
  </div>
401
421
 
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>
422
+ <!-- Right Section: Right Nav, Notifications, Profile (stays anchored right) -->
423
+ <div class="pa-header__right">
424
+ <!-- Right Navigation Links -->
425
+ <nav class="pa-header__nav pa-header__nav--right">
426
+ <ul>
427
+ <li><a href="/alerts">Alerts</a></li>
428
+ <li><a href="/tables">Tables</a></li>
429
+ </ul>
430
+ </nav>
431
+
432
+ <!-- Notification Bell -->
433
+ <div class="pa-notifications">
434
+ <button class="pa-notifications__btn" onclick="toggleNotifications()" aria-label="Notifications">
435
+ <span class="pa-notifications__icon">🔔</span>
436
+ <span class="pa-notifications__badge">3</span>
437
+ </button>
438
+ </div>
439
+
440
+ <!-- Profile Button -->
441
+ <button class="pa-header__profile-btn" onclick="toggleProfilePanel()" aria-label="User Profile">
442
+ <span class="pa-btn__icon">👤</span>
443
+ <span class="pa-header__profile-name">John Doe</span>
444
+ </button>
445
+ </div>
415
446
  </div>
416
447
  </nav>
417
448
 
@@ -518,13 +549,19 @@ NAVBAR CLASSES:
518
549
  - .pa-navbar - Navbar outer wrapper (outside layout container)
519
550
  - .pa-navbar__inner - Navbar inner container
520
551
 
521
- HEADER/NAVBAR ELEMENT CLASSES (inside pa-navbar__inner):
552
+ HEADER SECTION CONTAINERS (inside pa-navbar__inner):
553
+ - .pa-header__left - Left section (burger, brand, nav--left) - stays anchored left
554
+ - .pa-header__center - Center section (title) - flexible, fills space
555
+ - .pa-header__right - Right section (nav--right, notifications, profile) - stays anchored right
556
+
557
+ HEADER/NAVBAR ELEMENT CLASSES (inside section containers):
522
558
  - .pa-header__burger - Burger menu button
523
559
  - .burger-menu - Burger menu class (same as __burger)
524
560
  - .pa-header__brand - Brand/logo area
525
561
  - .pa-header__nav - Navigation container
526
562
  - .pa-header__nav--left/right - Navigation alignment
527
563
  - .pa-header__title - Page title area (flexible, with ellipsis)
564
+ - .pa-notifications - Notification bell container
528
565
  - .pa-header__profile-btn - Profile button
529
566
  - .pa-header__profile-name - Profile name text
530
567
 
@@ -536,7 +573,11 @@ LAYOUT CLASSES:
536
573
  - .pa-layout__main - Main content area
537
574
  - .pa-layout__main__inner - Main content inner wrapper
538
575
  - .pa-layout__footer - Footer container
539
- - .pa-layout__footer__content - Footer content wrapper
576
+
577
+ FOOTER SECTION CONTAINERS (inside pa-layout__footer):
578
+ - .pa-footer__left - Left section (copyright, etc.) - stays anchored left
579
+ - .pa-footer__center - Center section (optional) - flexible, fills space
580
+ - .pa-footer__right - Right section (version info, links) - stays anchored right
540
581
 
541
582
  LAYOUT WIDTH VARIANTS (applied to body tag):
542
583
  - No class - Fluid layout (full width)
@@ -8,6 +8,7 @@ MODAL WRAPPER CLASSES:
8
8
  - pa-modal: Base modal wrapper
9
9
  - pa-modal--show: Show the modal (add/remove via JavaScript)
10
10
  - pa-modal--top: Position modal near top instead of center (useful for search/command interfaces)
11
+ - pa-modal--static: Prevent closing via ESC key or backdrop click (must use explicit button)
11
12
  - pa-modal--primary: Primary themed modal (blue header)
12
13
  - pa-modal--success: Success themed modal (green header)
13
14
  - pa-modal--warning: Warning themed modal (orange header)
@@ -75,6 +76,42 @@ HEADER THEME CLASSES (alternative to modal-level themes):
75
76
  </div>
76
77
 
77
78
 
79
+ <!-- STATIC MODAL (No ESC, No Backdrop Click) -->
80
+
81
+ <!--
82
+ Static modals cannot be closed by:
83
+ - Pressing the Escape key
84
+ - Clicking the backdrop
85
+
86
+ User MUST click an explicit button to close.
87
+ Use for: license agreements, critical confirmations, required actions.
88
+
89
+ Implementation:
90
+ 1. Add pa-modal--static class to the modal wrapper
91
+ 2. Do NOT add onclick to the backdrop
92
+ 3. Optionally remove the X close button from header
93
+ 4. JavaScript must check for --static class before closing on ESC
94
+ -->
95
+
96
+ <div class="pa-modal pa-modal--static" id="staticModal">
97
+ <div class="pa-modal__backdrop"></div><!-- No onclick here! -->
98
+ <div class="pa-modal__container pa-modal__container--sm">
99
+ <div class="pa-modal__header pa-modal__header--warning">
100
+ <h3 class="pa-modal__title">License Agreement</h3>
101
+ <!-- No X close button - user must use footer buttons -->
102
+ </div>
103
+ <div class="pa-modal__body">
104
+ <p>You must accept the terms to continue.</p>
105
+ <p>This modal cannot be dismissed with ESC or by clicking outside.</p>
106
+ </div>
107
+ <div class="pa-modal__footer">
108
+ <button class="pa-btn pa-btn--secondary" onclick="closeModal('staticModal')">Decline</button>
109
+ <button class="pa-btn pa-btn--warning" onclick="closeModal('staticModal')">Accept</button>
110
+ </div>
111
+ </div>
112
+ </div>
113
+
114
+
78
115
  <!-- MODAL SIZES -->
79
116
 
80
117
  <!-- Small Modal -->
@@ -278,21 +315,23 @@ function closeModal(modalId) {
278
315
  }
279
316
  }
280
317
 
281
- // Close modal with Escape key
318
+ // Close modal with Escape key (skip static modals)
282
319
  document.addEventListener('keydown', function(e) {
283
320
  if (e.key === 'Escape') {
284
321
  const openModal = document.querySelector('.pa-modal--show');
285
- if (openModal) {
322
+ // Don't close static modals with ESC
323
+ if (openModal && !openModal.classList.contains('pa-modal--static')) {
286
324
  closeModal(openModal.id);
287
325
  }
288
326
  }
289
327
  });
290
328
 
291
- // Close modal when clicking backdrop
329
+ // Close modal when clicking backdrop (skip static modals)
292
330
  document.querySelectorAll('.pa-modal__backdrop').forEach(backdrop => {
293
331
  backdrop.addEventListener('click', function() {
294
332
  const modal = this.closest('.pa-modal');
295
- if (modal) {
333
+ // Don't close static modals on backdrop click
334
+ if (modal && !modal.classList.contains('pa-modal--static')) {
296
335
  closeModal(modal.id);
297
336
  }
298
337
  });
@@ -100,8 +100,8 @@
100
100
  </tbody>
101
101
  </table>
102
102
 
103
- <!-- 2x Spacing (comfortable padding) -->
104
- <table class="pa-table pa-table--2x">
103
+ <!-- XS Size (compact, fits button-xs) -->
104
+ <table class="pa-table pa-table--xs">
105
105
  <thead>
106
106
  <tr>
107
107
  <th>Name</th>
@@ -116,8 +116,8 @@
116
116
  </tbody>
117
117
  </table>
118
118
 
119
- <!-- 3x Spacing (spacious padding) -->
120
- <table class="pa-table pa-table--3x">
119
+ <!-- LG Size (spacious, fits button-lg) -->
120
+ <table class="pa-table pa-table--lg">
121
121
  <thead>
122
122
  <tr>
123
123
  <th>Name</th>
@@ -294,8 +294,10 @@ BASE CLASS:
294
294
 
295
295
  MODIFIERS:
296
296
  - pa-table--striped (alternating row colors)
297
- - pa-table--2x (comfortable padding, 2x base)
298
- - pa-table--3x (spacious padding, 3x base)
297
+ - pa-table--xs (compact, fits button-xs)
298
+ - pa-table--sm (slightly wider horizontal padding)
299
+ - pa-table--lg (spacious, fits button-lg)
300
+ - pa-table--xl (extra spacious, fits button-xl)
299
301
 
300
302
  HELPERS:
301
303
  - col-auto (auto-width column that shrinks to content)
@@ -75,6 +75,20 @@
75
75
  </span>
76
76
 
77
77
 
78
+ <!-- THEME COLOR TOOLTIPS (color-1 to color-9) -->
79
+
80
+ <!-- Theme colors use --pa-color-* CSS variables defined by themes -->
81
+ <span class="pa-tooltip pa-tooltip--color-1" data-tooltip="Color 1">Color 1</span>
82
+ <span class="pa-tooltip pa-tooltip--color-2" data-tooltip="Color 2">Color 2</span>
83
+ <span class="pa-tooltip pa-tooltip--color-3" data-tooltip="Color 3">Color 3</span>
84
+ <span class="pa-tooltip pa-tooltip--color-4" data-tooltip="Color 4">Color 4</span>
85
+ <span class="pa-tooltip pa-tooltip--color-5" data-tooltip="Color 5">Color 5</span>
86
+ <span class="pa-tooltip pa-tooltip--color-6" data-tooltip="Color 6">Color 6</span>
87
+ <span class="pa-tooltip pa-tooltip--color-7" data-tooltip="Color 7">Color 7</span>
88
+ <span class="pa-tooltip pa-tooltip--color-8" data-tooltip="Color 8">Color 8</span>
89
+ <span class="pa-tooltip pa-tooltip--color-9" data-tooltip="Color 9">Color 9</span>
90
+
91
+
78
92
  <!-- CURSOR MODIFIERS -->
79
93
 
80
94
  <!-- Default tooltip (inherits parent cursor - good for clickable elements like buttons, tabs) -->
@@ -270,6 +284,55 @@
270
284
  </div>
271
285
 
272
286
 
287
+ <!-- POPOVER ALIGNMENT -->
288
+
289
+ <!-- Left Aligned (default) -->
290
+ <div class="pa-popover" data-placement="bottom">
291
+ <button class="pa-popover__trigger">?</button>
292
+ <div class="pa-popover__content">
293
+ <div class="pa-popover__header">
294
+ <h4>Left Aligned</h4>
295
+ <button class="pa-popover__close">×</button>
296
+ </div>
297
+ <div class="pa-popover__body">
298
+ <p>Default alignment is left.</p>
299
+ <ul>
300
+ <li>Lists look natural</li>
301
+ <li>Easy to read</li>
302
+ </ul>
303
+ </div>
304
+ </div>
305
+ </div>
306
+
307
+ <!-- Center Aligned -->
308
+ <div class="pa-popover pa-popover--center" data-placement="bottom">
309
+ <button class="pa-popover__trigger">?</button>
310
+ <div class="pa-popover__content">
311
+ <div class="pa-popover__header">
312
+ <h4>Centered</h4>
313
+ <button class="pa-popover__close">×</button>
314
+ </div>
315
+ <div class="pa-popover__body">
316
+ <p>Use --center modifier for centered text.</p>
317
+ </div>
318
+ </div>
319
+ </div>
320
+
321
+ <!-- Right Aligned -->
322
+ <div class="pa-popover pa-popover--right" data-placement="bottom">
323
+ <button class="pa-popover__trigger">?</button>
324
+ <div class="pa-popover__content">
325
+ <div class="pa-popover__header">
326
+ <h4>Right Aligned</h4>
327
+ <button class="pa-popover__close">×</button>
328
+ </div>
329
+ <div class="pa-popover__body">
330
+ <p>Use --right modifier for RTL layouts.</p>
331
+ </div>
332
+ </div>
333
+ </div>
334
+
335
+
273
336
  <!-- POPOVER WITH RICH CONTENT -->
274
337
 
275
338
  <!-- Popover with List -->
@@ -346,6 +409,7 @@ VARIANTS:
346
409
  - pa-tooltip--success (success colored background)
347
410
  - pa-tooltip--warning (warning colored background)
348
411
  - pa-tooltip--danger (danger colored background)
412
+ - pa-tooltip--color-1 through pa-tooltip--color-9 (theme-defined colors)
349
413
 
350
414
  MULTILINE:
351
415
  - pa-tooltip--multiline (allows text wrapping)
@@ -363,6 +427,10 @@ SIZES:
363
427
  - pa-popover--sm (small)
364
428
  - pa-popover--lg (large)
365
429
 
430
+ ALIGNMENT:
431
+ - pa-popover--center (centered body text)
432
+ - pa-popover--right (right-aligned body text)
433
+
366
434
  COMPONENTS:
367
435
  - pa-popover__trigger (button/trigger element)
368
436
  - pa-popover__content (popover container)
@@ -7,6 +7,7 @@
7
7
  // Buttons
8
8
  .pa-btn {
9
9
  display: inline-block;
10
+ height: $btn-height-base;
10
11
  padding: $btn-padding-v $btn-padding-h;
11
12
  border: $btn-border-width solid transparent;
12
13
  border-radius: $border-radius;
@@ -46,21 +47,25 @@
46
47
  }
47
48
 
48
49
  &--xs {
50
+ height: $btn-height-xs;
49
51
  padding: $btn-padding-xs-v $btn-padding-xs-h;
50
52
  font-size: $font-size-xs;
51
53
  }
52
54
 
53
55
  &--sm {
56
+ height: $btn-height-sm;
54
57
  padding: $btn-padding-sm-v $btn-padding-sm-h;
55
58
  font-size: $font-size-sm;
56
59
  }
57
60
 
58
61
  &--lg {
62
+ height: $btn-height-lg;
59
63
  padding: $btn-padding-lg-v $btn-padding-lg-h;
60
64
  font-size: $font-size-base;
61
65
  }
62
66
 
63
67
  &--xl {
68
+ height: $btn-height-xl;
64
69
  padding: $btn-padding-xl-v $btn-padding-xl-h;
65
70
  font-size: $font-size-lg;
66
71
  }
@@ -265,6 +270,7 @@
265
270
  display: flex;
266
271
  align-items: center;
267
272
  justify-content: center;
273
+ line-height: 1;
268
274
 
269
275
  // Size-specific icon-only dimensions
270
276
  &.pa-btn--xs {
@@ -7,8 +7,8 @@
7
7
  // Cards
8
8
  .pa-card {
9
9
  background: var(--pa-card-bg);
10
- border: $border-width-base solid var(--pa-border-color);
11
- border-radius: $border-radius-lg;
10
+ border: $card-border-width solid var(--pa-border-color);
11
+ border-radius: $card-border-radius;
12
12
  margin-bottom: $spacing-base;
13
13
  box-shadow: $shadow-sm;
14
14
  transition: box-shadow $transition-fast $easing-snappy;
@@ -22,8 +22,8 @@
22
22
  &__header {
23
23
  padding: $card-header-padding-v $card-header-padding-h;
24
24
  min-height: $card-header-min-height;
25
- border-top-left-radius: $border-radius-lg;
26
- border-top-right-radius: $border-radius-lg;
25
+ border-top-left-radius: $card-border-radius;
26
+ border-top-right-radius: $card-border-radius;
27
27
  border-bottom: $border-width-base solid var(--pa-border-color);
28
28
  background: var(--pa-card-header-bg);
29
29
  display: flex;
@@ -60,6 +60,12 @@
60
60
  color: var(--pa-text-primary);
61
61
  font-size: $font-size-base;
62
62
  }
63
+
64
+ // Buttons in card headers - negative margin to prevent header height growth
65
+ .pa-btn {
66
+ margin-top: -0.25rem;
67
+ margin-bottom: -0.25rem;
68
+ }
63
69
  }
64
70
 
65
71
  &__title {
@@ -241,6 +247,36 @@
241
247
  display: block;
242
248
  }
243
249
  }
250
+
251
+ // Inline tabs in header (for side-by-side card alignment)
252
+ &__tabs--inline {
253
+ display: flex;
254
+ gap: $spacing-xs;
255
+ margin: -$card-header-padding-v 0; // Negative margin to fill header height
256
+ border-bottom: none;
257
+ background: none;
258
+
259
+ .pa-card__tab {
260
+ padding: $card-tab-inline-padding-v $card-tab-inline-padding-h;
261
+ border: none;
262
+ border-radius: $border-radius;
263
+ font-size: $font-size-sm;
264
+ background: transparent;
265
+ color: var(--pa-text-secondary);
266
+ cursor: pointer;
267
+ transition: all $transition-fast $easing-snappy;
268
+
269
+ &:hover {
270
+ background-color: rgba($accent-color, $card-tab-hover-opacity);
271
+ color: var(--pa-text-primary);
272
+ }
273
+
274
+ &--active {
275
+ background: var(--pa-accent);
276
+ color: var(--pa-btn-primary-text);
277
+ }
278
+ }
279
+ }
244
280
  }
245
281
 
246
282
  // Clickable cards (anchor-wrapped)
@@ -40,6 +40,7 @@
40
40
  td {
41
41
  color: var(--pa-text-primary);
42
42
  background-color: var(--pa-table-bg);
43
+ height: $table-cell-height;
43
44
 
44
45
  // Buttons in table cells - negative margin to prevent row height growth
45
46
  .pa-btn {
@@ -62,28 +63,51 @@
62
63
  }
63
64
  }
64
65
 
65
- // 2x spacing variant - comfortable padding (calculated from base)
66
- &--2x {
67
- th,
66
+ // Size variants - synchronized with button/input sizes
67
+ &--xs {
68
+ th, td {
69
+ padding: $table-padding-xs-v $table-padding-xs-h;
70
+ }
68
71
  td {
69
- padding: ($table-padding-base-v * $table-spacing-2x-multiplier)
70
- ($table-padding-base-h * $table-spacing-2x-multiplier);
72
+ height: $table-cell-height-xs;
71
73
  }
72
74
  }
73
75
 
74
- // 3x spacing variant - spacious padding (calculated from base)
75
- &--3x {
76
- th,
76
+ &--sm {
77
+ th, td {
78
+ padding: $table-padding-sm-v $table-padding-sm-h;
79
+ }
77
80
  td {
78
- padding: ($table-padding-base-v * $table-spacing-3x-multiplier)
79
- ($table-padding-base-h * $table-spacing-3x-multiplier);
81
+ height: $table-cell-height-sm;
82
+ }
83
+ }
84
+
85
+ &--lg {
86
+ th, td {
87
+ padding: $table-padding-lg-v $table-padding-lg-h;
88
+ }
89
+ td {
90
+ height: $table-cell-height-lg;
91
+ }
92
+ }
93
+
94
+ &--xl {
95
+ th, td {
96
+ padding: $table-padding-xl-v $table-padding-xl-h;
97
+ }
98
+ td {
99
+ height: $table-cell-height-xl;
80
100
  }
81
101
  }
82
102
 
83
103
  // Hover effects
84
- tbody tr {
85
- // Setup for hover accent border
86
- @if $table-hover-accent-width > 0 {
104
+ @if $table-hover-accent-width > 0 {
105
+ // Header alignment - add padding-left instead of border
106
+ th:first-child {
107
+ padding-left: $table-hover-accent-width + $table-padding-base-h;
108
+ }
109
+
110
+ tbody tr {
87
111
  border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
88
112
  transition: border-color $transition-normal $easing-smooth;
89
113
  }