@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 +21 -0
- package/dist/css/main.css +263 -0
- package/package.json +1 -1
- package/snippets/detail-panel.html +138 -0
- package/src/scss/_base-css-variables.scss +6 -0
- package/src/scss/_core.scss +3 -0
- package/src/scss/core-components/_detail-panel.scss +335 -0
- package/src/scss/variables/_components.scss +20 -0
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
|
@@ -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
|
// =========================================================================
|
package/src/scss/_core.scss
CHANGED
|
@@ -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
|
// ============================================================================
|