@keenmate/pure-admin-core 2.9.0-rc03 → 2.9.0-rc05

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.
Files changed (35) hide show
  1. package/README.md +55 -13
  2. package/dist/css/main.css +554 -7
  3. package/package.json +3 -1
  4. package/snippets/buttons.html +51 -0
  5. package/snippets/cards.html +132 -47
  6. package/snippets/comparison.html +26 -22
  7. package/snippets/manifest.json +180 -115
  8. package/snippets/range-group.html +125 -0
  9. package/snippets/splitter.html +44 -38
  10. package/snippets/statistics.html +31 -0
  11. package/src/js/btn-split-auto-absorb.js +327 -0
  12. package/src/js/command-palette.js +472 -0
  13. package/src/js/file-selector.js +1275 -0
  14. package/src/js/internal/logging.js +121 -0
  15. package/src/js/logic-tree-renderer.js +303 -0
  16. package/src/js/modal-dialogs.js +460 -0
  17. package/src/js/overflow.js +371 -0
  18. package/src/js/pa-stat-fit.js +184 -0
  19. package/src/js/range-group.js +663 -0
  20. package/src/js/search-autocomplete-v2.js +907 -0
  21. package/src/js/search-autocomplete.js +434 -0
  22. package/src/js/settings-panel.js +245 -0
  23. package/src/js/split-button.js +141 -0
  24. package/src/js/splitter.js +1323 -0
  25. package/src/js/toast-service.js +302 -0
  26. package/src/js/tooltips-popovers.js +275 -0
  27. package/src/js/virtual-scroll.js +143 -0
  28. package/src/js/virtual-textbox.js +803 -0
  29. package/src/scss/_core.scss +7 -0
  30. package/src/scss/core-components/_buttons.scss +44 -0
  31. package/src/scss/core-components/_cards.scss +95 -6
  32. package/src/scss/core-components/_overflow.scss +50 -0
  33. package/src/scss/core-components/_range-group.scss +474 -0
  34. package/src/scss/core-components/_statistics.scss +163 -0
  35. package/src/scss/variables/_components.scss +41 -2
package/dist/css/main.css CHANGED
@@ -5471,7 +5471,8 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5471
5471
  text-overflow: ellipsis;
5472
5472
  white-space: nowrap;
5473
5473
  }
5474
- .pa-card__header > p {
5474
+ .pa-card__header > p,
5475
+ .pa-card__header > .pa-card__description {
5475
5476
  flex: 1;
5476
5477
  min-width: 0;
5477
5478
  overflow: hidden;
@@ -5479,6 +5480,8 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5479
5480
  white-space: nowrap;
5480
5481
  color: var(--pa-text-color-2);
5481
5482
  font-size: 1.4rem;
5483
+ position: relative;
5484
+ top: var(--pa-card-description-offset-y, 1px);
5482
5485
  }
5483
5486
  .pa-card__header .pa-card__actions,
5484
5487
  .pa-card__header .pa-btn-group {
@@ -5490,11 +5493,29 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5490
5493
  .pa-card__header:has(> .pa-card__actions--overflow) > .pa-card__title {
5491
5494
  min-width: 6rem;
5492
5495
  }
5496
+ .pa-card__header:has(.pa-btn-toolbar) > h1, .pa-card__header:has(.pa-btn-toolbar) > h2, .pa-card__header:has(.pa-btn-toolbar) > h3, .pa-card__header:has(.pa-btn-toolbar) > h4, .pa-card__header:has(.pa-btn-toolbar) > h5, .pa-card__header:has(.pa-btn-toolbar) > h6, .pa-card__header:has(.pa-btn-toolbar) > .pa-card__title {
5497
+ flex-shrink: 9999;
5498
+ min-width: 8rem;
5499
+ }
5500
+ .pa-card__header .pa-card__actions:has(> .pa-btn-toolbar) {
5501
+ flex-shrink: 1;
5502
+ min-width: 0;
5503
+ }
5493
5504
  .pa-card__header .pa-btn {
5494
5505
  margin-top: -0.25rem;
5495
5506
  margin-bottom: -0.25rem;
5496
5507
  flex-shrink: 0;
5497
5508
  }
5509
+ .pa-card__header .pa-btn-toolbar,
5510
+ .pa-card__header .pa-card__actions--overflow {
5511
+ margin-top: -0.25rem;
5512
+ margin-bottom: -0.25rem;
5513
+ }
5514
+ .pa-card__header .pa-btn-toolbar .pa-btn,
5515
+ .pa-card__header .pa-card__actions--overflow .pa-btn {
5516
+ margin-top: 0;
5517
+ margin-bottom: 0;
5518
+ }
5498
5519
  .pa-card__header--underlined h1, .pa-card__header--underlined h2, .pa-card__header--underlined h3, .pa-card__header--underlined h4, .pa-card__header--underlined h5, .pa-card__header--underlined h6 {
5499
5520
  border-bottom: 2px solid var(--pa-accent);
5500
5521
  padding-bottom: 0.8rem;
@@ -5541,12 +5562,14 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5541
5562
  .pa-card__header--wrap {
5542
5563
  flex-wrap: wrap;
5543
5564
  }
5544
- .pa-card__header--wrap > h1, .pa-card__header--wrap > h2, .pa-card__header--wrap > h3, .pa-card__header--wrap > h4, .pa-card__header--wrap > h5, .pa-card__header--wrap > h6 {
5565
+ .pa-card__header--wrap > h1, .pa-card__header--wrap > h2, .pa-card__header--wrap > h3, .pa-card__header--wrap > h4, .pa-card__header--wrap > h5, .pa-card__header--wrap > h6,
5566
+ .pa-card__header--wrap > .pa-card__title .pa-card__title-text {
5545
5567
  white-space: normal;
5546
5568
  overflow: visible;
5547
5569
  text-overflow: clip;
5548
5570
  }
5549
- .pa-card__header--wrap > p {
5571
+ .pa-card__header--wrap > p,
5572
+ .pa-card__header--wrap > .pa-card__description {
5550
5573
  white-space: normal;
5551
5574
  flex-basis: 100%;
5552
5575
  order: 1;
@@ -5557,7 +5580,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5557
5580
  align-items: center;
5558
5581
  gap: 0.8rem;
5559
5582
  min-width: 0;
5560
- flex: 1;
5583
+ flex: 0 1 auto;
5561
5584
  }
5562
5585
  .pa-card__title-icon {
5563
5586
  flex-shrink: 0;
@@ -5572,7 +5595,7 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5572
5595
  color: var(--pa-text-color-1);
5573
5596
  font-size: 1.6rem;
5574
5597
  font-weight: 600;
5575
- line-height: 1;
5598
+ line-height: 1.4;
5576
5599
  }
5577
5600
  .pa-card__body {
5578
5601
  padding: 1.6rem 1rem;
@@ -5593,6 +5616,10 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5593
5616
  display: flex;
5594
5617
  justify-content: space-between;
5595
5618
  align-items: center;
5619
+ gap: 0.8rem;
5620
+ }
5621
+ .pa-card__footer .pa-card__actions {
5622
+ margin-inline-start: auto;
5596
5623
  }
5597
5624
  .pa-card__actions {
5598
5625
  display: flex;
@@ -6469,6 +6496,7 @@ a.pa-card p {
6469
6496
  padding: 2.4rem;
6470
6497
  min-height: 12.8rem;
6471
6498
  min-width: 12.8rem;
6499
+ max-height: 16rem;
6472
6500
  position: relative;
6473
6501
  border-radius: var(--pa-border-radius);
6474
6502
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
@@ -6480,7 +6508,7 @@ a.pa-card p {
6480
6508
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
6481
6509
  }
6482
6510
  .pa-stat--square .pa-stat__number {
6483
- font-size: clamp(3.2rem, 25cqi, 9.6rem);
6511
+ font-size: clamp(3.2rem, 25cqi, 7.2rem);
6484
6512
  font-weight: 700;
6485
6513
  line-height: 1;
6486
6514
  color: inherit;
@@ -6490,7 +6518,7 @@ a.pa-card p {
6490
6518
  white-space: nowrap;
6491
6519
  }
6492
6520
  .pa-stat--square .pa-stat__symbol {
6493
- font-size: clamp(1.6rem, 12cqi, 4.8rem);
6521
+ font-size: clamp(1.6rem, 12cqi, 3.6rem);
6494
6522
  font-weight: 700;
6495
6523
  line-height: 1;
6496
6524
  color: inherit;
@@ -6526,6 +6554,10 @@ a.pa-card p {
6526
6554
  background-color: var(--pa-warning-bg);
6527
6555
  color: var(--pa-btn-warning-text);
6528
6556
  }
6557
+ .pa-stat--square.pa-stat--warning .pa-stat__number {
6558
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
6559
+ filter: none;
6560
+ }
6529
6561
  .pa-stat--square.pa-stat--danger {
6530
6562
  background-color: var(--pa-danger-bg);
6531
6563
  color: var(--pa-btn-danger-text);
@@ -6534,6 +6566,127 @@ a.pa-card p {
6534
6566
  background-color: var(--pa-text-color-2);
6535
6567
  color: var(--pa-btn-primary-text);
6536
6568
  }
6569
+ .pa-stat--square[data-pa-stat-fit] {
6570
+ container-type: size;
6571
+ container-name: pa-stat;
6572
+ flex-direction: column;
6573
+ flex-wrap: nowrap;
6574
+ align-content: stretch;
6575
+ align-items: stretch;
6576
+ max-height: none;
6577
+ }
6578
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__slot {
6579
+ flex: 1 1 auto;
6580
+ min-height: 0;
6581
+ display: flex;
6582
+ align-items: center;
6583
+ justify-content: flex-start;
6584
+ }
6585
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__group {
6586
+ display: inline-flex;
6587
+ align-items: baseline;
6588
+ column-gap: 0.15em;
6589
+ line-height: 1;
6590
+ white-space: nowrap;
6591
+ font-weight: 700;
6592
+ }
6593
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__group .pa-stat__number {
6594
+ font-size: 1em;
6595
+ }
6596
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__group .pa-stat__symbol {
6597
+ font-size: 0.5em;
6598
+ opacity: 0.85;
6599
+ }
6600
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__meta {
6601
+ display: flex;
6602
+ flex-direction: column;
6603
+ min-width: 0;
6604
+ flex: 0 0 auto;
6605
+ font-size: 1.2rem;
6606
+ }
6607
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__label {
6608
+ flex: 0 0 auto;
6609
+ margin-top: 0.35em;
6610
+ font-size: 1em;
6611
+ }
6612
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change {
6613
+ flex: 0 0 auto;
6614
+ margin-top: 0.35em;
6615
+ font-size: 0.9em;
6616
+ font-weight: 600;
6617
+ line-height: 1.2;
6618
+ color: inherit;
6619
+ white-space: nowrap;
6620
+ overflow: hidden;
6621
+ text-overflow: ellipsis;
6622
+ }
6623
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change--positive {
6624
+ color: var(--pa-positive);
6625
+ }
6626
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change--neutral {
6627
+ color: var(--pa-neutral);
6628
+ }
6629
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change--negative {
6630
+ color: var(--pa-negative);
6631
+ }
6632
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__context {
6633
+ flex: 0 0 auto;
6634
+ margin-top: 0.35em;
6635
+ font-size: 0.8em;
6636
+ opacity: 0.7;
6637
+ white-space: nowrap;
6638
+ overflow: hidden;
6639
+ text-overflow: ellipsis;
6640
+ }
6641
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__symbol,
6642
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__label,
6643
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change,
6644
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__context {
6645
+ display: none;
6646
+ }
6647
+ @container pa-stat (min-width: 8rem) and (min-height: 4.5rem) {
6648
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__symbol {
6649
+ display: inline;
6650
+ }
6651
+ }
6652
+ @container pa-stat (min-width: 13rem) and (min-height: 6.5rem) {
6653
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__label {
6654
+ display: block;
6655
+ }
6656
+ }
6657
+ @container pa-stat (min-width: 18rem) and (min-height: 9.5rem) {
6658
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change {
6659
+ display: block;
6660
+ }
6661
+ }
6662
+ @container pa-stat (min-width: 24rem) and (min-height: 13rem) {
6663
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__context {
6664
+ display: block;
6665
+ }
6666
+ }
6667
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide {
6668
+ flex-direction: row;
6669
+ align-items: stretch;
6670
+ column-gap: 2.4rem;
6671
+ }
6672
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__slot {
6673
+ flex: 0 0 44%;
6674
+ min-width: 0;
6675
+ justify-content: center;
6676
+ }
6677
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__meta {
6678
+ flex: 1 1 auto;
6679
+ min-width: 0;
6680
+ justify-content: center;
6681
+ }
6682
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__symbol {
6683
+ display: inline;
6684
+ }
6685
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__label,
6686
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__change,
6687
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__context {
6688
+ display: block;
6689
+ }
6537
6690
 
6538
6691
  .pa-kpi-grid {
6539
6692
  margin: -0.8rem;
@@ -7886,6 +8039,10 @@ a.pa-card p {
7886
8039
  border-start-start-radius: 0;
7887
8040
  border-end-start-radius: 0;
7888
8041
  }
8042
+ .pa-btn-split--collapsed > .pa-btn-split__toggle:first-child {
8043
+ border-radius: var(--pa-border-radius);
8044
+ border-inline-start: none;
8045
+ }
7889
8046
  .pa-btn-split__toggle {
7890
8047
  border-inline-start: 1px solid rgba(255, 255, 255, 0.25);
7891
8048
  padding-inline: 0;
@@ -7983,6 +8140,18 @@ a.pa-card p {
7983
8140
  opacity: 0.7;
7984
8141
  }
7985
8142
 
8143
+ .pa-btn-toolbar {
8144
+ display: flex;
8145
+ align-items: center;
8146
+ gap: 0.8rem;
8147
+ min-width: 0;
8148
+ overflow: hidden;
8149
+ flex-shrink: 1;
8150
+ }
8151
+ .pa-btn-toolbar > * {
8152
+ flex-shrink: 0;
8153
+ }
8154
+
7986
8155
  /* ========================================
7987
8156
  Loader Components
7988
8157
  Spinners, dots, bars, pulse, ring, wave loaders and animations
@@ -11858,6 +12027,356 @@ web-multiselect {
11858
12027
  pointer-events: none;
11859
12028
  }
11860
12029
 
12030
+ /* ========================================
12031
+ Range Group
12032
+ A compact multi-range filter: one toggle that summarises several
12033
+ numeric range filters (e.g. "Age / Salary / Children") inline, and
12034
+ expands into a floating panel with one slider per dimension.
12035
+
12036
+ Two blocks live here, on purpose:
12037
+
12038
+ - .pa-range — the slider primitive. Single- OR dual-thumb,
12039
+ driven entirely by CSS custom properties that JS
12040
+ sets (--_pos on each thumb, --_fill-start /
12041
+ --_fill-end on the fill). Positioning uses LOGICAL
12042
+ properties (inset-inline-*) so RTL mirrors for
12043
+ free — JS only ever deals in 0–100 percentages.
12044
+ - .pa-range-group — the compact control: a __toggle summarising the
12045
+ rows, and a floating __panel of .pa-range rows.
12046
+ The panel is anchored with Floating UI (see the
12047
+ demo's range-group.js, mirroring split-button.js).
12048
+
12049
+ The group is meant to drop into a filter-card __filters row as a
12050
+ single control that stands in for N sliders. See snippets/range-group.html.
12051
+ ======================================== */
12052
+ /* ----------------------------------------
12053
+ Slider primitive — pa-range
12054
+ ---------------------------------------- */
12055
+ .pa-range {
12056
+ position: relative;
12057
+ height: 2.2rem;
12058
+ touch-action: none;
12059
+ user-select: none;
12060
+ cursor: pointer;
12061
+ }
12062
+
12063
+ .pa-range--ticks-labeled {
12064
+ height: calc(2.2rem + 1.6rem);
12065
+ }
12066
+ .pa-range--ticks-labeled .pa-range__rail {
12067
+ top: calc(2.2rem / 2);
12068
+ }
12069
+
12070
+ .pa-range__rail {
12071
+ position: absolute;
12072
+ inset-inline: calc(var(--pa-range-thumb-size, 1.6rem) / 2);
12073
+ top: 50%;
12074
+ transform: translateY(-50%);
12075
+ height: var(--pa-range-track-height, 0.4rem);
12076
+ }
12077
+
12078
+ .pa-range__track {
12079
+ position: absolute;
12080
+ inset: 0;
12081
+ border-radius: 999px;
12082
+ background-color: var(--pa-range-track, var(--pa-surface-track));
12083
+ }
12084
+
12085
+ .pa-range__fill {
12086
+ position: absolute;
12087
+ top: 0;
12088
+ bottom: 0;
12089
+ height: var(--pa-range-track-height, 0.4rem);
12090
+ border-radius: 999px;
12091
+ background-color: var(--pa-range-fill, var(--pa-accent));
12092
+ inset-inline-start: var(--_fill-start, 0%);
12093
+ inset-inline-end: var(--_fill-end, 0%);
12094
+ }
12095
+
12096
+ /* ---- Tick marks ----
12097
+ Built by range-group.js when a row has data-ticks. The container lives
12098
+ INSIDE the rail (so 0–100% maps to the same travel as the thumbs) and is
12099
+ the rail's first child — painted behind the track/fill, so each tick shows
12100
+ only as protruding ends. Marks are pointer-events:none, so a track click
12101
+ still reaches the .pa-range click-to-seek handler. */
12102
+ .pa-range__ticks {
12103
+ position: absolute;
12104
+ inset: 0;
12105
+ pointer-events: none;
12106
+ }
12107
+
12108
+ .pa-range__tick {
12109
+ position: absolute;
12110
+ top: 50%;
12111
+ inset-inline-start: var(--_pos, 0%);
12112
+ width: 0.1rem;
12113
+ height: 0.9rem;
12114
+ margin-inline-start: calc(0.1rem / -2);
12115
+ transform: translateY(-50%);
12116
+ border-radius: 999px;
12117
+ background-color: var(--pa-range-tick, var(--pa-border-color));
12118
+ }
12119
+
12120
+ .pa-range__tick--major {
12121
+ width: 0.2rem;
12122
+ height: 1.4rem;
12123
+ margin-inline-start: calc(0.2rem / -2);
12124
+ background-color: var(--pa-range-tick-major, var(--pa-text-tertiary));
12125
+ }
12126
+
12127
+ .pa-range__tick-labels {
12128
+ position: absolute;
12129
+ inset-inline: 0;
12130
+ top: calc(100% + 0.3rem);
12131
+ height: 0;
12132
+ pointer-events: none;
12133
+ }
12134
+
12135
+ .pa-range__tick-label {
12136
+ position: absolute;
12137
+ inset-inline-start: var(--_pos, 0%);
12138
+ transform: translateX(-50%);
12139
+ font-size: 1rem;
12140
+ color: var(--pa-text-tertiary);
12141
+ white-space: nowrap;
12142
+ font-variant-numeric: tabular-nums;
12143
+ }
12144
+
12145
+ .pa-range__thumb {
12146
+ --_thumb-w: var(--pa-range-thumb-size, 1.6rem);
12147
+ --_thumb-h: var(--pa-range-thumb-size, 1.6rem);
12148
+ position: absolute;
12149
+ top: 50%;
12150
+ inset-inline-start: var(--_pos, 0%);
12151
+ margin-inline-start: calc(var(--_thumb-w) / -2);
12152
+ transform: translateY(-50%);
12153
+ width: var(--_thumb-w);
12154
+ height: var(--_thumb-h);
12155
+ padding: 0;
12156
+ border: 0.2rem solid var(--pa-range-thumb-border, var(--pa-accent));
12157
+ border-radius: 50%;
12158
+ background-color: var(--pa-range-thumb-bg, var(--pa-card-bg));
12159
+ cursor: grab;
12160
+ touch-action: none;
12161
+ transition: box-shadow 0.15s ease, border-color 0.15s ease;
12162
+ }
12163
+ .pa-range__thumb:hover {
12164
+ border-color: var(--pa-range-thumb-border-hover, var(--pa-accent-hover));
12165
+ }
12166
+ .pa-range__thumb:focus-visible {
12167
+ outline: none;
12168
+ box-shadow: 0 0 0 0.3rem var(--pa-range-focus-ring, var(--pa-accent-light));
12169
+ }
12170
+ .pa-range__thumb:active, .pa-range__thumb.pa-range__thumb--grabbing {
12171
+ cursor: grabbing;
12172
+ box-shadow: 0 0 0 0.3rem var(--pa-range-focus-ring, var(--pa-accent-light));
12173
+ }
12174
+
12175
+ /* ---- Handle shapes ----
12176
+ Modifiers on .pa-range that restyle its thumbs. Purely cosmetic — no JS
12177
+ involvement — so a shape can be mixed per row. Each just overrides the
12178
+ private size props + border-radius; centring follows automatically. */
12179
+ .pa-range--handle-rect .pa-range__thumb {
12180
+ --_thumb-w: 1.2rem;
12181
+ --_thumb-h: 1.9rem;
12182
+ border-radius: var(--pa-border-radius-sm);
12183
+ }
12184
+
12185
+ .pa-range--handle-bar .pa-range__thumb {
12186
+ --_thumb-w: 0.35rem;
12187
+ --_thumb-h: 2.2rem;
12188
+ border-radius: 999px;
12189
+ background-color: var(--pa-range-thumb-border, var(--pa-accent));
12190
+ }
12191
+ .pa-range--handle-bar .pa-range__thumb:hover {
12192
+ background-color: var(--pa-range-thumb-border-hover, var(--pa-accent-hover));
12193
+ }
12194
+
12195
+ .pa-range--handle-arrow .pa-range__thumb {
12196
+ --_thumb-w: 1.6rem;
12197
+ --_thumb-h: 2rem;
12198
+ border-radius: var(--pa-border-radius-sm);
12199
+ }
12200
+ .pa-range--handle-arrow .pa-range__thumb::before {
12201
+ content: "";
12202
+ position: absolute;
12203
+ top: 50%;
12204
+ inset-inline-start: 50%;
12205
+ width: 0.5rem;
12206
+ height: 0.5rem;
12207
+ border-block-start: 0.2rem solid var(--pa-range-thumb-border, var(--pa-accent));
12208
+ border-inline-end: 0.2rem solid var(--pa-range-thumb-border, var(--pa-accent));
12209
+ transform: translateX(-0.177rem) translate(-50%, -50%) rotate(45deg);
12210
+ }
12211
+
12212
+ .pa-range--handle-arrow .pa-range__thumb--min::before {
12213
+ transform: translateX(0.177rem) translate(-50%, -50%) rotate(-135deg);
12214
+ }
12215
+
12216
+ .pa-range--handle-needle .pa-range__thumb {
12217
+ --_thumb-w: 1.2rem;
12218
+ --_thumb-h: 2.2rem;
12219
+ background-color: transparent;
12220
+ border-color: transparent;
12221
+ border-radius: var(--pa-border-radius-sm);
12222
+ }
12223
+ .pa-range--handle-needle .pa-range__thumb::before {
12224
+ content: "";
12225
+ position: absolute;
12226
+ inset-inline-start: 50%;
12227
+ bottom: 50%;
12228
+ width: 1.2rem;
12229
+ height: 1.1rem;
12230
+ margin-inline-start: calc(1.2rem / -2);
12231
+ background-color: var(--pa-range-thumb-border, var(--pa-accent));
12232
+ clip-path: polygon(50% 100%, 0 0, 100% 0);
12233
+ transition: background-color 0.15s ease;
12234
+ }
12235
+ .pa-range--handle-needle .pa-range__thumb:hover::before {
12236
+ background-color: var(--pa-range-thumb-border-hover, var(--pa-accent-hover));
12237
+ }
12238
+
12239
+ .pa-range--single .pa-range__thumb--min {
12240
+ display: none;
12241
+ }
12242
+
12243
+ .pa-range--disabled {
12244
+ opacity: 0.5;
12245
+ pointer-events: none;
12246
+ }
12247
+
12248
+ /* ----------------------------------------
12249
+ Compact control — pa-range-group
12250
+ ---------------------------------------- */
12251
+ .pa-range-group {
12252
+ position: relative;
12253
+ display: inline-flex;
12254
+ }
12255
+
12256
+ .pa-range-group__toggle {
12257
+ display: inline-flex;
12258
+ align-items: center;
12259
+ gap: 1.2rem;
12260
+ width: 100%;
12261
+ padding: 0.8rem 1.2rem;
12262
+ border: 1px solid var(--pa-border-color);
12263
+ border-radius: var(--pa-border-radius);
12264
+ background-color: var(--pa-input-bg);
12265
+ color: var(--pa-text-color-1);
12266
+ font-size: 1.4rem;
12267
+ line-height: 1.3;
12268
+ text-align: start;
12269
+ cursor: pointer;
12270
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
12271
+ }
12272
+ .pa-range-group__toggle:hover {
12273
+ border-color: var(--pa-accent-hover);
12274
+ }
12275
+ .pa-range-group__toggle:focus-visible {
12276
+ outline: none;
12277
+ border-color: var(--pa-accent);
12278
+ box-shadow: 0 0 0 0.3rem var(--pa-accent-light);
12279
+ }
12280
+
12281
+ .pa-range-group__summary {
12282
+ flex: 1;
12283
+ min-width: 0;
12284
+ font-size: 1.4rem;
12285
+ white-space: nowrap;
12286
+ overflow: hidden;
12287
+ text-overflow: ellipsis;
12288
+ }
12289
+
12290
+ .pa-range-group__seg-label {
12291
+ font-size: 1rem;
12292
+ font-weight: 600;
12293
+ letter-spacing: 0.02em;
12294
+ text-transform: uppercase;
12295
+ color: var(--pa-text-tertiary);
12296
+ }
12297
+
12298
+ .pa-range-group__seg-value {
12299
+ font-weight: 500;
12300
+ color: var(--pa-text-color-1);
12301
+ font-variant-numeric: tabular-nums;
12302
+ }
12303
+
12304
+ .pa-range-group__seg-value--empty {
12305
+ color: var(--pa-text-tertiary);
12306
+ font-weight: 400;
12307
+ }
12308
+
12309
+ .pa-range-group__seg-sep {
12310
+ color: var(--pa-text-tertiary);
12311
+ margin-inline: 0.4rem;
12312
+ }
12313
+
12314
+ .pa-range-group__caret {
12315
+ flex-shrink: 0;
12316
+ font-size: 1.2rem;
12317
+ color: var(--pa-text-secondary);
12318
+ transition: transform 0.2s ease;
12319
+ }
12320
+
12321
+ .pa-range-group--open .pa-range-group__caret {
12322
+ transform: rotate(180deg);
12323
+ }
12324
+
12325
+ /* ---- Floating panel ---- */
12326
+ .pa-range-group__panel {
12327
+ display: none;
12328
+ flex-direction: column;
12329
+ gap: 2.4rem;
12330
+ min-width: var(--pa-range-group-panel-min-width, 32rem);
12331
+ padding: 1.6rem;
12332
+ border: 1px solid var(--pa-border-color);
12333
+ border-radius: var(--pa-border-radius-lg);
12334
+ background-color: var(--pa-card-bg);
12335
+ box-shadow: var(--pa-detail-shadow);
12336
+ z-index: 7500;
12337
+ }
12338
+ .pa-range-group__panel.pa-range-group__panel--open {
12339
+ display: flex;
12340
+ }
12341
+
12342
+ .pa-range-group__row {
12343
+ display: flex;
12344
+ flex-direction: column;
12345
+ gap: 0.8rem;
12346
+ }
12347
+
12348
+ .pa-range-group__row-head {
12349
+ display: flex;
12350
+ align-items: baseline;
12351
+ justify-content: space-between;
12352
+ gap: 0.8rem;
12353
+ }
12354
+
12355
+ .pa-range-group__row-label {
12356
+ font-size: 1.4rem;
12357
+ font-weight: 600;
12358
+ color: var(--pa-text-color-1);
12359
+ }
12360
+
12361
+ .pa-range-group__row-value {
12362
+ font-size: 1.4rem;
12363
+ font-weight: 500;
12364
+ font-variant-numeric: tabular-nums;
12365
+ color: var(--pa-range-fill, var(--pa-accent));
12366
+ }
12367
+ .pa-range-group__row-value.pa-range-group__row-value--empty {
12368
+ color: var(--pa-text-tertiary);
12369
+ }
12370
+
12371
+ .pa-range-group__actions {
12372
+ display: flex;
12373
+ justify-content: flex-end;
12374
+ gap: 0.8rem;
12375
+ margin-top: 0.4rem;
12376
+ padding-top: 2.4rem;
12377
+ border-top: 1px solid var(--pa-border-color);
12378
+ }
12379
+
11861
12380
  /* ========================================
11862
12381
  Comparison Table Component
11863
12382
  Two-column and three-column comparison tables for version control, data changes, and merge operations
@@ -15450,6 +15969,34 @@ code {
15450
15969
  background-color: #007bff;
15451
15970
  }
15452
15971
 
15972
+ /* ========================================
15973
+ Overflow (progressive-collapse row)
15974
+
15975
+ Generic primitive: a horizontal flex row whose children get walked into
15976
+ a "more" menu when the row can't fit, driven by `overflow.js`. Use
15977
+ anywhere you want a button toolbar, breadcrumb row, chip row, or tab bar
15978
+ to collapse gracefully on narrow widths.
15979
+
15980
+ <div class="pa-overflow" data-pa-actions-overflow-from="end">
15981
+ <button class="pa-btn pa-btn--xs">Save</button>
15982
+ <button class="pa-btn pa-btn--xs" data-pa-actions-priority="10">Run</button>
15983
+ </div>
15984
+
15985
+ The card-flavoured alias `pa-card__actions--overflow` carries equivalent
15986
+ rules under `.pa-card__header` (see `_cards.scss`); both wire into the
15987
+ same JS module. ======================================== */
15988
+ .pa-overflow {
15989
+ display: flex;
15990
+ align-items: center;
15991
+ gap: 0.8rem;
15992
+ min-width: 0;
15993
+ overflow: hidden;
15994
+ flex-shrink: 1;
15995
+ }
15996
+ .pa-overflow > * {
15997
+ flex-shrink: 0;
15998
+ }
15999
+
15453
16000
  /* ========================================
15454
16001
  Data Display Components
15455
16002
  Read-only label-value field pairs
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keenmate/pure-admin-core",
3
- "version": "2.9.0-rc03",
3
+ "version": "2.9.0-rc05",
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": {
@@ -9,11 +9,13 @@
9
9
  "./css/*": "./dist/css/*",
10
10
  "./scss": "./src/scss/main.scss",
11
11
  "./scss/*": "./src/scss/*",
12
+ "./js/*": "./src/js/*",
12
13
  "./snippets/*": "./snippets/*"
13
14
  },
14
15
  "files": [
15
16
  "dist/",
16
17
  "src/scss/",
18
+ "src/js/",
17
19
  "schemas/",
18
20
  "scripts/pack-theme.js",
19
21
  "snippets/",