@keenmate/pure-admin-core 1.1.3 → 1.2.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 CHANGED
@@ -77,6 +77,7 @@ The `snippets/` directory contains clean HTML patterns for all components:
77
77
  - `utilities.html` - Utility classes
78
78
  - `virtual-scroll.html` - Virtual scrolling
79
79
  - `web-daterangepicker.html` - Date range picker web component
80
+ - `detail-panel.html` - Detail panel (inline, overlay, full-screen)
80
81
  - `web-multiselect.html` - Multiselect web component
81
82
 
82
83
  These snippets are the canonical reference for building framework components in any frontend framework (React, Vue, Svelte, etc.).
@@ -310,6 +311,26 @@ This enables dark mode support for web components like `@keenmate/web-grid` that
310
311
  - `.pa-notifications__time` - Timestamp
311
312
  - `.pa-notifications__footer` - Panel footer with "View all" link
312
313
 
314
+ ### Detail Panel
315
+ - `.pa-detail-view` - Flex wrapper for inline split-view (table + panel side by side)
316
+ - `.pa-detail-view__main` - Left side (table area), `flex: 1`
317
+ - `.pa-detail-view__panel` - Right side panel, hidden by default (`width: 0`)
318
+ - `.pa-detail-view__panel--open` - Shows panel with configured width
319
+ - `.pa-detail-view--overlay` - Card overlay modifier (panel overlays table within card)
320
+ - `.pa-detail-view__overlay` - Backdrop element (click to close), use `--visible` to show
321
+ - `.pa-detail-panel--overlay` - Full-screen overlay mode (fixed position, like profile panel)
322
+ - `.pa-detail-panel--open` - Makes overlay panel visible with slide-in transition
323
+ - `.pa-detail-panel__content` - Panel content wrapper (flex column: header/body/footer)
324
+ - `.pa-detail-panel__header` - Panel header with title, optional action buttons, close button
325
+ - `.pa-detail-panel__title` - Truncated panel title
326
+ - `.pa-detail-panel__close` - Close button
327
+ - `.pa-detail-panel__tabs` - Optional tab navigation (between header and body)
328
+ - `.pa-detail-panel__body` - Scrollable body area
329
+ - `.pa-detail-panel__footer` - Fixed footer with action buttons
330
+ - `.pa-detail-panel__overlay` - Backdrop (overlay mode, click to close)
331
+ - `.pa-detail-panel-resize` - Drag handle on left edge for resizing
332
+ - `.is-selected` - Applied to `<tr>` to highlight selected row
333
+
313
334
  ### Profile Panel
314
335
  - `.pa-profile-panel` - Slide-in profile panel
315
336
  - `.pa-profile-panel--open` - Open state
package/dist/css/main.css CHANGED
@@ -13301,6 +13301,269 @@ code {
13301
13301
  padding: 0.4rem 0.8rem;
13302
13302
  }
13303
13303
 
13304
+ /* ========================================
13305
+ Detail Panel Components
13306
+ Inline split-view and overlay detail panels
13307
+ ======================================== */
13308
+ :root {
13309
+ --pa-local-detail-panel-width: 40rem;
13310
+ --pa-local-detail-panel-max-width: 64rem;
13311
+ }
13312
+
13313
+ :where(.pa-detail-view__panel) {
13314
+ width: var(--pa-local-detail-panel-width);
13315
+ max-width: var(--pa-local-detail-panel-max-width);
13316
+ }
13317
+
13318
+ .pa-detail-view {
13319
+ display: flex;
13320
+ gap: 0;
13321
+ width: 100%;
13322
+ }
13323
+ .pa-detail-view__main {
13324
+ flex: 1;
13325
+ min-width: 0;
13326
+ overflow: auto;
13327
+ }
13328
+ .pa-detail-view__panel {
13329
+ width: 0;
13330
+ min-width: 0;
13331
+ overflow: hidden;
13332
+ flex-shrink: 0;
13333
+ border-left: 0 solid var(--pa-border-color);
13334
+ }
13335
+ .pa-detail-view__panel--open {
13336
+ width: var(--pa-local-detail-panel-width);
13337
+ min-width: 28rem;
13338
+ max-width: var(--pa-local-detail-panel-max-width);
13339
+ border-left-width: 1px;
13340
+ overflow: visible;
13341
+ }
13342
+
13343
+ .pa-detail-view--overlay {
13344
+ position: relative;
13345
+ overflow: hidden;
13346
+ }
13347
+ .pa-detail-view--overlay .pa-detail-view__panel {
13348
+ position: absolute;
13349
+ top: 0;
13350
+ right: 0;
13351
+ height: 100%;
13352
+ z-index: 2;
13353
+ }
13354
+
13355
+ .pa-detail-view__overlay {
13356
+ position: absolute;
13357
+ top: 0;
13358
+ left: 0;
13359
+ width: 100%;
13360
+ height: 100%;
13361
+ background-color: var(--pa-detail-panel-overlay-bg);
13362
+ z-index: 1;
13363
+ opacity: 0;
13364
+ visibility: hidden;
13365
+ cursor: pointer;
13366
+ }
13367
+ .pa-detail-view__overlay--visible {
13368
+ opacity: 1;
13369
+ visibility: visible;
13370
+ }
13371
+
13372
+ .pa-detail-panel--overlay {
13373
+ position: fixed;
13374
+ top: 0;
13375
+ right: 0;
13376
+ height: 100vh;
13377
+ z-index: 4500;
13378
+ pointer-events: none;
13379
+ opacity: 0;
13380
+ visibility: hidden;
13381
+ }
13382
+ .pa-detail-panel--overlay.pa-detail-panel--open {
13383
+ opacity: 1;
13384
+ visibility: visible;
13385
+ pointer-events: all;
13386
+ }
13387
+ .pa-detail-panel--overlay.pa-detail-panel--open .pa-detail-panel__content {
13388
+ transform: translateX(0);
13389
+ }
13390
+
13391
+ .pa-detail-panel__content {
13392
+ display: flex;
13393
+ flex-direction: column;
13394
+ height: 100%;
13395
+ background-color: var(--pa-card-bg);
13396
+ position: relative;
13397
+ }
13398
+ .pa-detail-panel--overlay .pa-detail-panel__content {
13399
+ position: absolute;
13400
+ top: 0;
13401
+ right: 0;
13402
+ height: 100vh;
13403
+ width: var(--pa-local-detail-panel-width);
13404
+ max-width: var(--pa-local-detail-panel-max-width);
13405
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);
13406
+ transform: translateX(100%);
13407
+ }
13408
+
13409
+ .pa-detail-panel__overlay {
13410
+ position: absolute;
13411
+ top: 0;
13412
+ left: 0;
13413
+ width: 100vw;
13414
+ height: 100vh;
13415
+ background-color: var(--pa-detail-panel-overlay-bg);
13416
+ cursor: pointer;
13417
+ }
13418
+
13419
+ .pa-detail-panel__header {
13420
+ flex-shrink: 0;
13421
+ display: flex;
13422
+ align-items: center;
13423
+ gap: 0.8rem;
13424
+ padding: 1.2rem 1.6rem;
13425
+ border-bottom: 1px solid var(--pa-border-color);
13426
+ background-color: var(--pa-card-bg);
13427
+ min-height: 0;
13428
+ }
13429
+
13430
+ .pa-detail-panel__title {
13431
+ flex: 1;
13432
+ margin: 0;
13433
+ font-size: 1.8rem;
13434
+ font-weight: 600;
13435
+ color: var(--pa-text-color-1);
13436
+ overflow: hidden;
13437
+ text-overflow: ellipsis;
13438
+ white-space: nowrap;
13439
+ }
13440
+
13441
+ .pa-detail-panel__close {
13442
+ width: 3.2rem;
13443
+ height: 3.2rem;
13444
+ flex-shrink: 0;
13445
+ background: none;
13446
+ border: none;
13447
+ cursor: pointer;
13448
+ display: flex;
13449
+ align-items: center;
13450
+ justify-content: center;
13451
+ color: var(--pa-text-color-2);
13452
+ border-radius: 4px;
13453
+ }
13454
+ .pa-detail-panel__close:hover {
13455
+ background-color: var(--pa-accent-light);
13456
+ color: var(--pa-accent);
13457
+ }
13458
+ .pa-detail-panel__close:focus {
13459
+ outline: 2px solid var(--pa-accent);
13460
+ outline-offset: 2px;
13461
+ }
13462
+
13463
+ .pa-detail-panel__tabs {
13464
+ flex-shrink: 0;
13465
+ padding: 0 1.6rem;
13466
+ border-bottom: 1px solid var(--pa-border-color);
13467
+ background-color: var(--pa-card-bg);
13468
+ }
13469
+ .pa-detail-panel__tabs .pa-tabs__item {
13470
+ color: var(--pa-text-color-2);
13471
+ border-bottom-color: transparent;
13472
+ }
13473
+ .pa-detail-panel__tabs .pa-tabs__item:hover {
13474
+ color: var(--pa-text-color-1);
13475
+ background-color: var(--pa-accent-light);
13476
+ }
13477
+ .pa-detail-panel__tabs .pa-tabs__item--active {
13478
+ color: var(--pa-text-color-1);
13479
+ border-bottom-color: var(--pa-accent);
13480
+ }
13481
+
13482
+ .pa-detail-panel__body {
13483
+ flex: 1;
13484
+ overflow-y: auto;
13485
+ padding: 1.2rem 1.6rem;
13486
+ }
13487
+
13488
+ .pa-detail-panel__footer {
13489
+ flex-shrink: 0;
13490
+ padding: 1.2rem 1.6rem;
13491
+ border-top: 1px solid var(--pa-border-color);
13492
+ background-color: var(--pa-card-bg);
13493
+ display: flex;
13494
+ align-items: center;
13495
+ gap: 0.8rem;
13496
+ }
13497
+
13498
+ .pa-detail-panel-resize {
13499
+ position: absolute;
13500
+ top: 0;
13501
+ left: 0;
13502
+ width: 6px;
13503
+ height: 100%;
13504
+ cursor: col-resize;
13505
+ z-index: 1;
13506
+ }
13507
+ .pa-detail-panel-resize:hover, .pa-detail-panel-resize--active {
13508
+ background-color: var(--pa-accent);
13509
+ opacity: 0.3;
13510
+ }
13511
+
13512
+ .pa-detail-panel-resizing {
13513
+ cursor: col-resize !important;
13514
+ user-select: none !important;
13515
+ }
13516
+
13517
+ .pa-table tbody tr.is-selected {
13518
+ background-color: var(--pa-detail-panel-selected-bg);
13519
+ }
13520
+ .pa-table tbody tr.is-selected:hover {
13521
+ background-color: var(--pa-detail-panel-selected-bg);
13522
+ }
13523
+
13524
+ @media (max-width: 768px) {
13525
+ .pa-detail-view__panel {
13526
+ display: none;
13527
+ }
13528
+ .pa-detail-panel--mobile-overlay {
13529
+ display: block;
13530
+ position: fixed;
13531
+ top: 0;
13532
+ right: 0;
13533
+ height: 100vh;
13534
+ z-index: 4500;
13535
+ pointer-events: none;
13536
+ opacity: 0;
13537
+ visibility: hidden;
13538
+ }
13539
+ .pa-detail-panel--mobile-overlay.pa-detail-panel--open {
13540
+ opacity: 1;
13541
+ visibility: visible;
13542
+ pointer-events: all;
13543
+ }
13544
+ .pa-detail-panel--mobile-overlay.pa-detail-panel--open .pa-detail-panel__content {
13545
+ transform: translateX(0);
13546
+ }
13547
+ .pa-detail-panel--mobile-overlay .pa-detail-panel__content {
13548
+ position: absolute;
13549
+ top: 0;
13550
+ right: 0;
13551
+ height: 100vh;
13552
+ width: 90vw;
13553
+ max-width: none;
13554
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);
13555
+ transform: translateX(100%);
13556
+ }
13557
+ .pa-detail-panel--mobile-overlay .pa-detail-panel__overlay {
13558
+ position: absolute;
13559
+ top: 0;
13560
+ left: 0;
13561
+ width: 100vw;
13562
+ height: 100vh;
13563
+ background-color: var(--pa-detail-panel-overlay-bg);
13564
+ cursor: pointer;
13565
+ }
13566
+ }
13304
13567
  /* ========================================
13305
13568
  Settings Panel Component
13306
13569
  Floating panel for global settings management
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keenmate/pure-admin-core",
3
- "version": "1.1.3",
3
+ "version": "1.2.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": {
@@ -0,0 +1,138 @@
1
+ <!-- =============================================
2
+ Detail Panel - Inline Split-View Mode
3
+ ============================================= -->
4
+
5
+ <!-- Inline split-view: table + side panel -->
6
+ <div class="pa-detail-view">
7
+ <!-- Left side: table -->
8
+ <div class="pa-detail-view__main">
9
+ <table class="pa-table pa-table--hover pa-table--striped">
10
+ <thead>
11
+ <tr>
12
+ <th>Name</th>
13
+ <th>Email</th>
14
+ <th>Role</th>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ <tr class="is-selected" onclick="openInlinePanel(1)">
19
+ <td>John Doe</td>
20
+ <td>john@example.com</td>
21
+ <td>Admin</td>
22
+ </tr>
23
+ <tr onclick="openInlinePanel(2)">
24
+ <td>Jane Smith</td>
25
+ <td>jane@example.com</td>
26
+ <td>Editor</td>
27
+ </tr>
28
+ </tbody>
29
+ </table>
30
+ </div>
31
+
32
+ <!-- Right side: detail panel -->
33
+ <div class="pa-detail-view__panel pa-detail-view__panel--open">
34
+ <div class="pa-detail-panel__content">
35
+ <div class="pa-detail-panel-resize"></div>
36
+ <div class="pa-detail-panel__header">
37
+ <h4 class="pa-detail-panel__title">User Details</h4>
38
+ <button class="pa-detail-panel__close" onclick="closeInlinePanel()">
39
+ <i class="fas fa-times"></i>
40
+ </button>
41
+ </div>
42
+ <div class="pa-detail-panel__body">
43
+ <p>Detail content goes here...</p>
44
+ </div>
45
+ <div class="pa-detail-panel__footer">
46
+ <button class="pa-btn pa-btn--primary pa-btn--sm">Edit</button>
47
+ <button class="pa-btn pa-btn--secondary pa-btn--sm">Delete</button>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+
53
+
54
+ <!-- =============================================
55
+ Detail Panel - Card Overlay Mode
56
+ ============================================= -->
57
+
58
+ <!-- Card overlay: panel floats over the table within the card -->
59
+ <div class="pa-detail-view pa-detail-view--overlay">
60
+ <!-- Backdrop (click to close) -->
61
+ <div class="pa-detail-view__overlay" onclick="closeCardOverlayPanel()"></div>
62
+
63
+ <!-- Table (stays full width) -->
64
+ <div class="pa-detail-view__main">
65
+ <table class="pa-table pa-table--hover pa-table--striped">
66
+ <thead>
67
+ <tr>
68
+ <th>Name</th>
69
+ <th>Email</th>
70
+ <th>Role</th>
71
+ </tr>
72
+ </thead>
73
+ <tbody>
74
+ <tr class="is-selected" onclick="openCardOverlayPanel(1)">
75
+ <td>John Doe</td>
76
+ <td>john@example.com</td>
77
+ <td>Admin</td>
78
+ </tr>
79
+ <tr onclick="openCardOverlayPanel(2)">
80
+ <td>Jane Smith</td>
81
+ <td>jane@example.com</td>
82
+ <td>Editor</td>
83
+ </tr>
84
+ </tbody>
85
+ </table>
86
+ </div>
87
+
88
+ <!-- Detail panel (overlays the table) -->
89
+ <div class="pa-detail-view__panel pa-detail-view__panel--open">
90
+ <div class="pa-detail-panel__content">
91
+ <div class="pa-detail-panel-resize"></div>
92
+ <div class="pa-detail-panel__header">
93
+ <h4 class="pa-detail-panel__title">User Details</h4>
94
+ <button class="pa-detail-panel__close" onclick="closeCardOverlayPanel()">
95
+ <i class="fas fa-times"></i>
96
+ </button>
97
+ </div>
98
+ <div class="pa-detail-panel__body">
99
+ <p>Detail content goes here...</p>
100
+ </div>
101
+ <div class="pa-detail-panel__footer">
102
+ <button class="pa-btn pa-btn--primary pa-btn--sm">Edit</button>
103
+ <button class="pa-btn pa-btn--secondary pa-btn--sm">Delete</button>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ </div>
108
+
109
+
110
+ <!-- =============================================
111
+ Detail Panel - Overlay Mode
112
+ ============================================= -->
113
+
114
+ <!-- Trigger button (typically a table row click) -->
115
+ <button class="pa-btn pa-btn--primary" onclick="openOverlayPanel(1)">
116
+ Open Detail Panel
117
+ </button>
118
+
119
+ <!-- Overlay panel (fixed position, like profile panel) -->
120
+ <div class="pa-detail-panel--overlay" id="detailPanelOverlay">
121
+ <div class="pa-detail-panel__overlay" onclick="closeOverlayPanel()"></div>
122
+ <div class="pa-detail-panel__content">
123
+ <div class="pa-detail-panel-resize"></div>
124
+ <div class="pa-detail-panel__header">
125
+ <h4 class="pa-detail-panel__title">User Details</h4>
126
+ <button class="pa-detail-panel__close" onclick="closeOverlayPanel()">
127
+ <i class="fas fa-times"></i>
128
+ </button>
129
+ </div>
130
+ <div class="pa-detail-panel__body">
131
+ <p>Detail content goes here...</p>
132
+ </div>
133
+ <div class="pa-detail-panel__footer">
134
+ <button class="pa-btn pa-btn--primary pa-btn--sm">Edit</button>
135
+ <button class="pa-btn pa-btn--secondary pa-btn--sm">Delete</button>
136
+ </div>
137
+ </div>
138
+ </div>
@@ -443,6 +443,12 @@
443
443
  // =========================================================================
444
444
  --pa-profile-overlay-bg: #{$profile-overlay-bg};
445
445
 
446
+ // =========================================================================
447
+ // DETAIL PANEL COLORS
448
+ // =========================================================================
449
+ --pa-detail-panel-overlay-bg: #{$detail-panel-overlay-bg};
450
+ --pa-detail-panel-selected-bg: #{$detail-panel-selected-bg};
451
+
446
452
  // =========================================================================
447
453
  // COMMAND PALETTE COLORS
448
454
  // =========================================================================
@@ -98,6 +98,9 @@
98
98
  // Popconfirm (anchored confirmation dialogs)
99
99
  @use 'core-components/popconfirm' as *;
100
100
 
101
+ // Detail Panel
102
+ @use 'core-components/detail-panel' as *;
103
+
101
104
  // Settings Panel
102
105
  @use 'core-components/settings-panel' as *;
103
106
 
@@ -0,0 +1,335 @@
1
+ /* ========================================
2
+ Detail Panel Components
3
+ Inline split-view and overlay detail panels
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // Local CSS variables for detail panel (runtime state, modified by JS for resize)
8
+ :root {
9
+ --pa-local-detail-panel-width: #{$detail-panel-width};
10
+ --pa-local-detail-panel-max-width: #{$detail-panel-max-width};
11
+ }
12
+
13
+ // Detail panel content width - :where() for low specificity (utility classes can override)
14
+ :where(.pa-detail-view__panel) {
15
+ width: var(--pa-local-detail-panel-width);
16
+ max-width: var(--pa-local-detail-panel-max-width);
17
+ }
18
+
19
+ // ============================================================================
20
+ // INLINE SPLIT-VIEW MODE
21
+ // .pa-detail-view wraps a table (left) + panel (right)
22
+ // ============================================================================
23
+
24
+ .pa-detail-view {
25
+ display: flex;
26
+ gap: 0;
27
+ width: 100%;
28
+
29
+ // Left side: table/content area
30
+ &__main {
31
+ flex: 1;
32
+ min-width: 0;
33
+ overflow: auto;
34
+ }
35
+
36
+ // Right side: detail panel (hidden by default)
37
+ &__panel {
38
+ width: 0;
39
+ min-width: 0;
40
+ overflow: hidden;
41
+ flex-shrink: 0;
42
+ border-left: 0 solid var(--pa-border-color);
43
+
44
+ // Open state: show panel with configured width
45
+ &--open {
46
+ width: var(--pa-local-detail-panel-width);
47
+ min-width: $detail-panel-min-width;
48
+ max-width: var(--pa-local-detail-panel-max-width);
49
+ border-left-width: $border-width-base;
50
+ overflow: visible;
51
+ }
52
+ }
53
+ }
54
+
55
+ // ============================================================================
56
+ // CARD OVERLAY MODE
57
+ // .pa-detail-view--overlay: panel overlays the table within the card
58
+ // ============================================================================
59
+
60
+ .pa-detail-view--overlay {
61
+ position: relative;
62
+ overflow: hidden;
63
+
64
+ .pa-detail-view__panel {
65
+ position: absolute;
66
+ top: 0;
67
+ right: 0;
68
+ height: 100%;
69
+ z-index: 2;
70
+ }
71
+ }
72
+
73
+ // Backdrop for card overlay mode
74
+ .pa-detail-view__overlay {
75
+ position: absolute;
76
+ top: 0;
77
+ left: 0;
78
+ width: 100%;
79
+ height: 100%;
80
+ background-color: var(--pa-detail-panel-overlay-bg);
81
+ z-index: 1;
82
+ opacity: 0;
83
+ visibility: hidden;
84
+ cursor: pointer;
85
+
86
+ &--visible {
87
+ opacity: 1;
88
+ visibility: visible;
89
+ }
90
+ }
91
+
92
+ // ============================================================================
93
+ // OVERLAY MODE
94
+ // .pa-detail-panel--overlay is a fixed overlay (like profile panel)
95
+ // ============================================================================
96
+
97
+ .pa-detail-panel--overlay {
98
+ position: fixed;
99
+ top: 0;
100
+ right: 0;
101
+ height: 100vh;
102
+ z-index: $detail-panel-z-index;
103
+ pointer-events: none;
104
+ opacity: 0;
105
+ visibility: hidden;
106
+
107
+ &.pa-detail-panel--open {
108
+ opacity: 1;
109
+ visibility: visible;
110
+ pointer-events: all;
111
+
112
+ .pa-detail-panel__content {
113
+ transform: translateX(0);
114
+ }
115
+ }
116
+ }
117
+
118
+ // ============================================================================
119
+ // SHARED PANEL STRUCTURE (used by both inline and overlay modes)
120
+ // ============================================================================
121
+
122
+ // Panel content wrapper (flex column: header/body/footer)
123
+ .pa-detail-panel__content {
124
+ display: flex;
125
+ flex-direction: column;
126
+ height: 100%;
127
+ background-color: var(--pa-card-bg);
128
+ position: relative;
129
+
130
+ // In overlay mode: slide-in from right
131
+ .pa-detail-panel--overlay & {
132
+ position: absolute;
133
+ top: 0;
134
+ right: 0;
135
+ height: 100vh;
136
+ width: var(--pa-local-detail-panel-width);
137
+ max-width: var(--pa-local-detail-panel-max-width);
138
+ box-shadow: $detail-panel-shadow;
139
+ transform: translateX(100%);
140
+ }
141
+ }
142
+
143
+ // Backdrop overlay (overlay mode only)
144
+ .pa-detail-panel__overlay {
145
+ position: absolute;
146
+ top: 0;
147
+ left: 0;
148
+ width: 100vw;
149
+ height: 100vh;
150
+ background-color: var(--pa-detail-panel-overlay-bg);
151
+ cursor: pointer;
152
+ }
153
+
154
+ // Panel header
155
+ .pa-detail-panel__header {
156
+ flex-shrink: 0;
157
+ display: flex;
158
+ align-items: center;
159
+ gap: $spacing-sm;
160
+ padding: $detail-panel-header-padding-v $detail-panel-header-padding-h;
161
+ border-bottom: $border-width-base solid var(--pa-border-color);
162
+ background-color: var(--pa-card-bg);
163
+ min-height: 0;
164
+ }
165
+
166
+ // Panel title
167
+ .pa-detail-panel__title {
168
+ flex: 1;
169
+ margin: 0;
170
+ font-size: $font-size-lg;
171
+ font-weight: $font-weight-semibold;
172
+ color: var(--pa-text-color-1);
173
+ overflow: hidden;
174
+ text-overflow: ellipsis;
175
+ white-space: nowrap;
176
+ }
177
+
178
+ // Close button
179
+ .pa-detail-panel__close {
180
+ width: $detail-panel-close-size;
181
+ height: $detail-panel-close-size;
182
+ flex-shrink: 0;
183
+ background: none;
184
+ border: none;
185
+ cursor: pointer;
186
+ display: flex;
187
+ align-items: center;
188
+ justify-content: center;
189
+ color: var(--pa-text-color-2);
190
+ border-radius: $border-radius;
191
+
192
+ &:hover {
193
+ background-color: var(--pa-accent-light);
194
+ color: var(--pa-accent);
195
+ }
196
+
197
+ &:focus {
198
+ outline: $focus-outline-width solid var(--pa-accent);
199
+ outline-offset: $focus-outline-offset;
200
+ }
201
+ }
202
+
203
+ // Panel tabs (between header and body, like profile panel)
204
+ .pa-detail-panel__tabs {
205
+ flex-shrink: 0;
206
+ padding: 0 $detail-panel-header-padding-h;
207
+ border-bottom: $border-width-base solid var(--pa-border-color);
208
+ background-color: var(--pa-card-bg);
209
+
210
+ .pa-tabs__item {
211
+ color: var(--pa-text-color-2);
212
+ border-bottom-color: transparent;
213
+
214
+ &:hover {
215
+ color: var(--pa-text-color-1);
216
+ background-color: var(--pa-accent-light);
217
+ }
218
+
219
+ &--active {
220
+ color: var(--pa-text-color-1);
221
+ border-bottom-color: var(--pa-accent);
222
+ }
223
+ }
224
+ }
225
+
226
+ // Panel body (scrollable)
227
+ .pa-detail-panel__body {
228
+ flex: 1;
229
+ overflow-y: auto;
230
+ padding: $detail-panel-body-padding-v $detail-panel-body-padding-h;
231
+ }
232
+
233
+ // Panel footer
234
+ .pa-detail-panel__footer {
235
+ flex-shrink: 0;
236
+ padding: $detail-panel-footer-padding-v $detail-panel-footer-padding-h;
237
+ border-top: $border-width-base solid var(--pa-border-color);
238
+ background-color: var(--pa-card-bg);
239
+ display: flex;
240
+ align-items: center;
241
+ gap: $spacing-sm;
242
+ }
243
+
244
+ // ============================================================================
245
+ // RESIZE HANDLE
246
+ // ============================================================================
247
+
248
+ .pa-detail-panel-resize {
249
+ position: absolute;
250
+ top: 0;
251
+ left: 0;
252
+ width: $detail-panel-resize-handle-width;
253
+ height: 100%;
254
+ cursor: col-resize;
255
+ z-index: 1;
256
+
257
+ &:hover,
258
+ &--active {
259
+ background-color: var(--pa-accent);
260
+ opacity: 0.3;
261
+ }
262
+ }
263
+
264
+ // Body class applied during resize drag
265
+ .pa-detail-panel-resizing {
266
+ cursor: col-resize !important;
267
+ user-select: none !important;
268
+ }
269
+
270
+ // ============================================================================
271
+ // TABLE ROW SELECTION
272
+ // ============================================================================
273
+
274
+ .pa-table tbody tr.is-selected {
275
+ background-color: var(--pa-detail-panel-selected-bg);
276
+
277
+ &:hover {
278
+ background-color: var(--pa-detail-panel-selected-bg);
279
+ }
280
+ }
281
+
282
+ // ============================================================================
283
+ // RESPONSIVE: Inline collapses to overlay on mobile
284
+ // ============================================================================
285
+
286
+ @media (max-width: $mobile-breakpoint) {
287
+ // Inline mode: hide the panel from the flex layout
288
+ .pa-detail-view__panel {
289
+ display: none;
290
+ }
291
+
292
+ // Mobile overlay: shown as fixed overlay instead
293
+ .pa-detail-panel--mobile-overlay {
294
+ display: block;
295
+ position: fixed;
296
+ top: 0;
297
+ right: 0;
298
+ height: 100vh;
299
+ z-index: $detail-panel-z-index;
300
+ pointer-events: none;
301
+ opacity: 0;
302
+ visibility: hidden;
303
+
304
+ &.pa-detail-panel--open {
305
+ opacity: 1;
306
+ visibility: visible;
307
+ pointer-events: all;
308
+
309
+ .pa-detail-panel__content {
310
+ transform: translateX(0);
311
+ }
312
+ }
313
+
314
+ .pa-detail-panel__content {
315
+ position: absolute;
316
+ top: 0;
317
+ right: 0;
318
+ height: 100vh;
319
+ width: $detail-panel-mobile-width;
320
+ max-width: none;
321
+ box-shadow: $detail-panel-shadow;
322
+ transform: translateX(100%);
323
+ }
324
+
325
+ .pa-detail-panel__overlay {
326
+ position: absolute;
327
+ top: 0;
328
+ left: 0;
329
+ width: 100vw;
330
+ height: 100vh;
331
+ background-color: var(--pa-detail-panel-overlay-bg);
332
+ cursor: pointer;
333
+ }
334
+ }
335
+ }
@@ -147,6 +147,26 @@ $profile-role-letter-spacing: 0.5px !default;
147
147
  $profile-panel-mobile-max-width: 40rem !default; // 400px (was 25rem)
148
148
  $profile-panel-content-padding: 1.6rem !default; // Matches sidebar-padding horizontal (16px)
149
149
 
150
+ // ============================================================================
151
+ // DETAIL PANEL SYSTEM
152
+ // ============================================================================
153
+ $detail-panel-width: 40rem !default;
154
+ $detail-panel-min-width: 28rem !default;
155
+ $detail-panel-max-width: 64rem !default;
156
+ $detail-panel-mobile-width: 90vw !default;
157
+ $detail-panel-header-padding-v: 1.2rem !default;
158
+ $detail-panel-header-padding-h: 1.6rem !default;
159
+ $detail-panel-body-padding-v: 1.2rem !default;
160
+ $detail-panel-body-padding-h: 1.6rem !default;
161
+ $detail-panel-footer-padding-v: 1.2rem !default;
162
+ $detail-panel-footer-padding-h: 1.6rem !default;
163
+ $detail-panel-overlay-bg: rgba(0, 0, 0, 0.3) !default;
164
+ $detail-panel-z-index: 4500 !default;
165
+ $detail-panel-shadow: $shadow-profile-panel !default;
166
+ $detail-panel-close-size: 3.2rem !default;
167
+ $detail-panel-resize-handle-width: 6px !default;
168
+ $detail-panel-selected-bg: rgba($accent-color, 0.08) !default;
169
+
150
170
  // ============================================================================
151
171
  // CARD SYSTEM
152
172
  // ============================================================================