@keenmate/pure-admin-core 2.9.0-rc01 → 2.9.0-rc04

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 (36) hide show
  1. package/README.md +61 -14
  2. package/dist/css/main.css +748 -2
  3. package/package.json +3 -1
  4. package/snippets/buttons.html +51 -0
  5. package/snippets/cards.html +34 -4
  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 +216 -0
  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 +10 -0
  30. package/src/scss/core-components/_buttons.scss +59 -0
  31. package/src/scss/core-components/_cards.scss +206 -0
  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/_splitter.scss +206 -0
  35. package/src/scss/core-components/_statistics.scss +163 -0
  36. package/src/scss/variables/_components.scss +56 -2
package/dist/css/main.css CHANGED
@@ -5484,11 +5484,35 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5484
5484
  .pa-card__header .pa-btn-group {
5485
5485
  flex-shrink: 0;
5486
5486
  }
5487
+ .pa-card__header .pa-card__actions--overflow {
5488
+ flex-shrink: 1;
5489
+ }
5490
+ .pa-card__header:has(> .pa-card__actions--overflow) > .pa-card__title {
5491
+ min-width: 6rem;
5492
+ }
5493
+ .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 {
5494
+ flex-shrink: 9999;
5495
+ min-width: 8rem;
5496
+ }
5497
+ .pa-card__header .pa-card__actions:has(> .pa-btn-toolbar) {
5498
+ flex-shrink: 1;
5499
+ min-width: 0;
5500
+ }
5487
5501
  .pa-card__header .pa-btn {
5488
5502
  margin-top: -0.25rem;
5489
5503
  margin-bottom: -0.25rem;
5490
5504
  flex-shrink: 0;
5491
5505
  }
5506
+ .pa-card__header .pa-btn-toolbar,
5507
+ .pa-card__header .pa-card__actions--overflow {
5508
+ margin-top: -0.25rem;
5509
+ margin-bottom: -0.25rem;
5510
+ }
5511
+ .pa-card__header .pa-btn-toolbar .pa-btn,
5512
+ .pa-card__header .pa-card__actions--overflow .pa-btn {
5513
+ margin-top: 0;
5514
+ margin-bottom: 0;
5515
+ }
5492
5516
  .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 {
5493
5517
  border-bottom: 2px solid var(--pa-accent);
5494
5518
  padding-bottom: 0.8rem;
@@ -5593,6 +5617,25 @@ body:not(.sidebar-hidden) .pa-layout__sidebar--icon-collapse .pa-sidebar__icon {
5593
5617
  gap: 0.8rem;
5594
5618
  align-items: center;
5595
5619
  }
5620
+ .pa-card__actions--responsive > .pa-card__actions-full {
5621
+ display: flex;
5622
+ gap: 0.8rem;
5623
+ align-items: center;
5624
+ }
5625
+ .pa-card__actions--responsive > .pa-card__actions-collapsed {
5626
+ display: none;
5627
+ }
5628
+ .pa-card__actions--overflow {
5629
+ min-width: 0;
5630
+ overflow: hidden;
5631
+ }
5632
+ .pa-card__actions--overflow > * {
5633
+ flex-shrink: 0;
5634
+ }
5635
+ .pa-card__header:has(> .pa-card__actions--responsive) {
5636
+ container-type: inline-size;
5637
+ container-name: pa-card-header;
5638
+ }
5596
5639
  .pa-card__meta {
5597
5640
  color: var(--pa-text-color-2);
5598
5641
  font-size: 1.4rem;
@@ -5922,6 +5965,48 @@ a.pa-card p {
5922
5965
  padding-bottom: 0.8rem;
5923
5966
  }
5924
5967
 
5968
+ @container pa-card-header (max-width: 28rem) {
5969
+ .pa-card__actions--responsive > .pa-card__actions-full {
5970
+ display: none;
5971
+ }
5972
+ .pa-card__actions--responsive > .pa-card__actions-collapsed {
5973
+ display: flex;
5974
+ align-items: center;
5975
+ }
5976
+ }
5977
+ .pa-splitter__pane--minimized > .pa-card {
5978
+ height: 100%;
5979
+ display: flex;
5980
+ flex-direction: column;
5981
+ margin: 0;
5982
+ }
5983
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__body,
5984
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__footer {
5985
+ display: none;
5986
+ }
5987
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__header {
5988
+ flex: 1 1 auto;
5989
+ justify-content: flex-start;
5990
+ writing-mode: sideways-rl;
5991
+ }
5992
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__header i,
5993
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__header svg {
5994
+ writing-mode: initial;
5995
+ }
5996
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__header .pa-card__title {
5997
+ padding-top: calc((4rem - 1.6rem) / 2 - 0.5rem);
5998
+ }
5999
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__header .pa-btn,
6000
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__header .pa-btn-group,
6001
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__header button,
6002
+ .pa-splitter__pane--minimized > .pa-card > .pa-card__header input {
6003
+ display: none;
6004
+ }
6005
+
6006
+ .pa-splitter--minimize-mirror .pa-splitter__pane--minimized > .pa-card > .pa-card__header :is(h1, h2, h3, h4, h5, h6) {
6007
+ transform: scale(-1, -1);
6008
+ }
6009
+
5925
6010
  /* ========================================
5926
6011
  Tabs Component
5927
6012
  Standalone tabs for organizing content into separate sections
@@ -6402,6 +6487,7 @@ a.pa-card p {
6402
6487
  padding: 2.4rem;
6403
6488
  min-height: 12.8rem;
6404
6489
  min-width: 12.8rem;
6490
+ max-height: 16rem;
6405
6491
  position: relative;
6406
6492
  border-radius: var(--pa-border-radius);
6407
6493
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
@@ -6413,7 +6499,7 @@ a.pa-card p {
6413
6499
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
6414
6500
  }
6415
6501
  .pa-stat--square .pa-stat__number {
6416
- font-size: clamp(3.2rem, 25cqi, 9.6rem);
6502
+ font-size: clamp(3.2rem, 25cqi, 7.2rem);
6417
6503
  font-weight: 700;
6418
6504
  line-height: 1;
6419
6505
  color: inherit;
@@ -6423,7 +6509,7 @@ a.pa-card p {
6423
6509
  white-space: nowrap;
6424
6510
  }
6425
6511
  .pa-stat--square .pa-stat__symbol {
6426
- font-size: clamp(1.6rem, 12cqi, 4.8rem);
6512
+ font-size: clamp(1.6rem, 12cqi, 3.6rem);
6427
6513
  font-weight: 700;
6428
6514
  line-height: 1;
6429
6515
  color: inherit;
@@ -6459,6 +6545,10 @@ a.pa-card p {
6459
6545
  background-color: var(--pa-warning-bg);
6460
6546
  color: var(--pa-btn-warning-text);
6461
6547
  }
6548
+ .pa-stat--square.pa-stat--warning .pa-stat__number {
6549
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
6550
+ filter: none;
6551
+ }
6462
6552
  .pa-stat--square.pa-stat--danger {
6463
6553
  background-color: var(--pa-danger-bg);
6464
6554
  color: var(--pa-btn-danger-text);
@@ -6467,6 +6557,127 @@ a.pa-card p {
6467
6557
  background-color: var(--pa-text-color-2);
6468
6558
  color: var(--pa-btn-primary-text);
6469
6559
  }
6560
+ .pa-stat--square[data-pa-stat-fit] {
6561
+ container-type: size;
6562
+ container-name: pa-stat;
6563
+ flex-direction: column;
6564
+ flex-wrap: nowrap;
6565
+ align-content: stretch;
6566
+ align-items: stretch;
6567
+ max-height: none;
6568
+ }
6569
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__slot {
6570
+ flex: 1 1 auto;
6571
+ min-height: 0;
6572
+ display: flex;
6573
+ align-items: center;
6574
+ justify-content: flex-start;
6575
+ }
6576
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__group {
6577
+ display: inline-flex;
6578
+ align-items: baseline;
6579
+ column-gap: 0.15em;
6580
+ line-height: 1;
6581
+ white-space: nowrap;
6582
+ font-weight: 700;
6583
+ }
6584
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__group .pa-stat__number {
6585
+ font-size: 1em;
6586
+ }
6587
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__group .pa-stat__symbol {
6588
+ font-size: 0.5em;
6589
+ opacity: 0.85;
6590
+ }
6591
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__meta {
6592
+ display: flex;
6593
+ flex-direction: column;
6594
+ min-width: 0;
6595
+ flex: 0 0 auto;
6596
+ font-size: 1.2rem;
6597
+ }
6598
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__label {
6599
+ flex: 0 0 auto;
6600
+ margin-top: 0.35em;
6601
+ font-size: 1em;
6602
+ }
6603
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change {
6604
+ flex: 0 0 auto;
6605
+ margin-top: 0.35em;
6606
+ font-size: 0.9em;
6607
+ font-weight: 600;
6608
+ line-height: 1.2;
6609
+ color: inherit;
6610
+ white-space: nowrap;
6611
+ overflow: hidden;
6612
+ text-overflow: ellipsis;
6613
+ }
6614
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change--positive {
6615
+ color: var(--pa-positive);
6616
+ }
6617
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change--neutral {
6618
+ color: var(--pa-neutral);
6619
+ }
6620
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change--negative {
6621
+ color: var(--pa-negative);
6622
+ }
6623
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__context {
6624
+ flex: 0 0 auto;
6625
+ margin-top: 0.35em;
6626
+ font-size: 0.8em;
6627
+ opacity: 0.7;
6628
+ white-space: nowrap;
6629
+ overflow: hidden;
6630
+ text-overflow: ellipsis;
6631
+ }
6632
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__symbol,
6633
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__label,
6634
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change,
6635
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__context {
6636
+ display: none;
6637
+ }
6638
+ @container pa-stat (min-width: 8rem) and (min-height: 4.5rem) {
6639
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__symbol {
6640
+ display: inline;
6641
+ }
6642
+ }
6643
+ @container pa-stat (min-width: 13rem) and (min-height: 6.5rem) {
6644
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__label {
6645
+ display: block;
6646
+ }
6647
+ }
6648
+ @container pa-stat (min-width: 18rem) and (min-height: 9.5rem) {
6649
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__change {
6650
+ display: block;
6651
+ }
6652
+ }
6653
+ @container pa-stat (min-width: 24rem) and (min-height: 13rem) {
6654
+ .pa-stat--square[data-pa-stat-fit] .pa-stat__context {
6655
+ display: block;
6656
+ }
6657
+ }
6658
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide {
6659
+ flex-direction: row;
6660
+ align-items: stretch;
6661
+ column-gap: 2.4rem;
6662
+ }
6663
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__slot {
6664
+ flex: 0 0 44%;
6665
+ min-width: 0;
6666
+ justify-content: center;
6667
+ }
6668
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__meta {
6669
+ flex: 1 1 auto;
6670
+ min-width: 0;
6671
+ justify-content: center;
6672
+ }
6673
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__symbol {
6674
+ display: inline;
6675
+ }
6676
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__label,
6677
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__change,
6678
+ .pa-stat--square[data-pa-stat-fit].pa-stat--fit-wide .pa-stat__context {
6679
+ display: block;
6680
+ }
6470
6681
 
6471
6682
  .pa-kpi-grid {
6472
6683
  margin: -0.8rem;
@@ -7306,6 +7517,15 @@ a.pa-card p {
7306
7517
  background-color: var(--pa-main-bg);
7307
7518
  border-color: var(--pa-accent);
7308
7519
  }
7520
+ .pa-btn--ghost {
7521
+ background-color: transparent;
7522
+ border-color: transparent;
7523
+ color: var(--pa-text-secondary);
7524
+ }
7525
+ .pa-btn--ghost:hover {
7526
+ background-color: var(--pa-surface-hover);
7527
+ color: var(--pa-text-color-1);
7528
+ }
7309
7529
  .pa-btn--xs {
7310
7530
  height: 3.1rem;
7311
7531
  padding: 0.6rem 0.8rem;
@@ -7810,6 +8030,10 @@ a.pa-card p {
7810
8030
  border-start-start-radius: 0;
7811
8031
  border-end-start-radius: 0;
7812
8032
  }
8033
+ .pa-btn-split--collapsed > .pa-btn-split__toggle:first-child {
8034
+ border-radius: var(--pa-border-radius);
8035
+ border-inline-start: none;
8036
+ }
7813
8037
  .pa-btn-split__toggle {
7814
8038
  border-inline-start: 1px solid rgba(255, 255, 255, 0.25);
7815
8039
  padding-inline: 0;
@@ -7907,6 +8131,18 @@ a.pa-card p {
7907
8131
  opacity: 0.7;
7908
8132
  }
7909
8133
 
8134
+ .pa-btn-toolbar {
8135
+ display: flex;
8136
+ align-items: center;
8137
+ gap: 0.8rem;
8138
+ min-width: 0;
8139
+ overflow: hidden;
8140
+ flex-shrink: 1;
8141
+ }
8142
+ .pa-btn-toolbar > * {
8143
+ flex-shrink: 0;
8144
+ }
8145
+
7910
8146
  /* ========================================
7911
8147
  Loader Components
7912
8148
  Spinners, dots, bars, pulse, ring, wave loaders and animations
@@ -11782,6 +12018,356 @@ web-multiselect {
11782
12018
  pointer-events: none;
11783
12019
  }
11784
12020
 
12021
+ /* ========================================
12022
+ Range Group
12023
+ A compact multi-range filter: one toggle that summarises several
12024
+ numeric range filters (e.g. "Age / Salary / Children") inline, and
12025
+ expands into a floating panel with one slider per dimension.
12026
+
12027
+ Two blocks live here, on purpose:
12028
+
12029
+ - .pa-range — the slider primitive. Single- OR dual-thumb,
12030
+ driven entirely by CSS custom properties that JS
12031
+ sets (--_pos on each thumb, --_fill-start /
12032
+ --_fill-end on the fill). Positioning uses LOGICAL
12033
+ properties (inset-inline-*) so RTL mirrors for
12034
+ free — JS only ever deals in 0–100 percentages.
12035
+ - .pa-range-group — the compact control: a __toggle summarising the
12036
+ rows, and a floating __panel of .pa-range rows.
12037
+ The panel is anchored with Floating UI (see the
12038
+ demo's range-group.js, mirroring split-button.js).
12039
+
12040
+ The group is meant to drop into a filter-card __filters row as a
12041
+ single control that stands in for N sliders. See snippets/range-group.html.
12042
+ ======================================== */
12043
+ /* ----------------------------------------
12044
+ Slider primitive — pa-range
12045
+ ---------------------------------------- */
12046
+ .pa-range {
12047
+ position: relative;
12048
+ height: 2.2rem;
12049
+ touch-action: none;
12050
+ user-select: none;
12051
+ cursor: pointer;
12052
+ }
12053
+
12054
+ .pa-range--ticks-labeled {
12055
+ height: calc(2.2rem + 1.6rem);
12056
+ }
12057
+ .pa-range--ticks-labeled .pa-range__rail {
12058
+ top: calc(2.2rem / 2);
12059
+ }
12060
+
12061
+ .pa-range__rail {
12062
+ position: absolute;
12063
+ inset-inline: calc(var(--pa-range-thumb-size, 1.6rem) / 2);
12064
+ top: 50%;
12065
+ transform: translateY(-50%);
12066
+ height: var(--pa-range-track-height, 0.4rem);
12067
+ }
12068
+
12069
+ .pa-range__track {
12070
+ position: absolute;
12071
+ inset: 0;
12072
+ border-radius: 999px;
12073
+ background-color: var(--pa-range-track, var(--pa-surface-track));
12074
+ }
12075
+
12076
+ .pa-range__fill {
12077
+ position: absolute;
12078
+ top: 0;
12079
+ bottom: 0;
12080
+ height: var(--pa-range-track-height, 0.4rem);
12081
+ border-radius: 999px;
12082
+ background-color: var(--pa-range-fill, var(--pa-accent));
12083
+ inset-inline-start: var(--_fill-start, 0%);
12084
+ inset-inline-end: var(--_fill-end, 0%);
12085
+ }
12086
+
12087
+ /* ---- Tick marks ----
12088
+ Built by range-group.js when a row has data-ticks. The container lives
12089
+ INSIDE the rail (so 0–100% maps to the same travel as the thumbs) and is
12090
+ the rail's first child — painted behind the track/fill, so each tick shows
12091
+ only as protruding ends. Marks are pointer-events:none, so a track click
12092
+ still reaches the .pa-range click-to-seek handler. */
12093
+ .pa-range__ticks {
12094
+ position: absolute;
12095
+ inset: 0;
12096
+ pointer-events: none;
12097
+ }
12098
+
12099
+ .pa-range__tick {
12100
+ position: absolute;
12101
+ top: 50%;
12102
+ inset-inline-start: var(--_pos, 0%);
12103
+ width: 0.1rem;
12104
+ height: 0.9rem;
12105
+ margin-inline-start: calc(0.1rem / -2);
12106
+ transform: translateY(-50%);
12107
+ border-radius: 999px;
12108
+ background-color: var(--pa-range-tick, var(--pa-border-color));
12109
+ }
12110
+
12111
+ .pa-range__tick--major {
12112
+ width: 0.2rem;
12113
+ height: 1.4rem;
12114
+ margin-inline-start: calc(0.2rem / -2);
12115
+ background-color: var(--pa-range-tick-major, var(--pa-text-tertiary));
12116
+ }
12117
+
12118
+ .pa-range__tick-labels {
12119
+ position: absolute;
12120
+ inset-inline: 0;
12121
+ top: calc(100% + 0.3rem);
12122
+ height: 0;
12123
+ pointer-events: none;
12124
+ }
12125
+
12126
+ .pa-range__tick-label {
12127
+ position: absolute;
12128
+ inset-inline-start: var(--_pos, 0%);
12129
+ transform: translateX(-50%);
12130
+ font-size: 1rem;
12131
+ color: var(--pa-text-tertiary);
12132
+ white-space: nowrap;
12133
+ font-variant-numeric: tabular-nums;
12134
+ }
12135
+
12136
+ .pa-range__thumb {
12137
+ --_thumb-w: var(--pa-range-thumb-size, 1.6rem);
12138
+ --_thumb-h: var(--pa-range-thumb-size, 1.6rem);
12139
+ position: absolute;
12140
+ top: 50%;
12141
+ inset-inline-start: var(--_pos, 0%);
12142
+ margin-inline-start: calc(var(--_thumb-w) / -2);
12143
+ transform: translateY(-50%);
12144
+ width: var(--_thumb-w);
12145
+ height: var(--_thumb-h);
12146
+ padding: 0;
12147
+ border: 0.2rem solid var(--pa-range-thumb-border, var(--pa-accent));
12148
+ border-radius: 50%;
12149
+ background-color: var(--pa-range-thumb-bg, var(--pa-card-bg));
12150
+ cursor: grab;
12151
+ touch-action: none;
12152
+ transition: box-shadow 0.15s ease, border-color 0.15s ease;
12153
+ }
12154
+ .pa-range__thumb:hover {
12155
+ border-color: var(--pa-range-thumb-border-hover, var(--pa-accent-hover));
12156
+ }
12157
+ .pa-range__thumb:focus-visible {
12158
+ outline: none;
12159
+ box-shadow: 0 0 0 0.3rem var(--pa-range-focus-ring, var(--pa-accent-light));
12160
+ }
12161
+ .pa-range__thumb:active, .pa-range__thumb.pa-range__thumb--grabbing {
12162
+ cursor: grabbing;
12163
+ box-shadow: 0 0 0 0.3rem var(--pa-range-focus-ring, var(--pa-accent-light));
12164
+ }
12165
+
12166
+ /* ---- Handle shapes ----
12167
+ Modifiers on .pa-range that restyle its thumbs. Purely cosmetic — no JS
12168
+ involvement — so a shape can be mixed per row. Each just overrides the
12169
+ private size props + border-radius; centring follows automatically. */
12170
+ .pa-range--handle-rect .pa-range__thumb {
12171
+ --_thumb-w: 1.2rem;
12172
+ --_thumb-h: 1.9rem;
12173
+ border-radius: var(--pa-border-radius-sm);
12174
+ }
12175
+
12176
+ .pa-range--handle-bar .pa-range__thumb {
12177
+ --_thumb-w: 0.35rem;
12178
+ --_thumb-h: 2.2rem;
12179
+ border-radius: 999px;
12180
+ background-color: var(--pa-range-thumb-border, var(--pa-accent));
12181
+ }
12182
+ .pa-range--handle-bar .pa-range__thumb:hover {
12183
+ background-color: var(--pa-range-thumb-border-hover, var(--pa-accent-hover));
12184
+ }
12185
+
12186
+ .pa-range--handle-arrow .pa-range__thumb {
12187
+ --_thumb-w: 1.6rem;
12188
+ --_thumb-h: 2rem;
12189
+ border-radius: var(--pa-border-radius-sm);
12190
+ }
12191
+ .pa-range--handle-arrow .pa-range__thumb::before {
12192
+ content: "";
12193
+ position: absolute;
12194
+ top: 50%;
12195
+ inset-inline-start: 50%;
12196
+ width: 0.5rem;
12197
+ height: 0.5rem;
12198
+ border-block-start: 0.2rem solid var(--pa-range-thumb-border, var(--pa-accent));
12199
+ border-inline-end: 0.2rem solid var(--pa-range-thumb-border, var(--pa-accent));
12200
+ transform: translateX(-0.177rem) translate(-50%, -50%) rotate(45deg);
12201
+ }
12202
+
12203
+ .pa-range--handle-arrow .pa-range__thumb--min::before {
12204
+ transform: translateX(0.177rem) translate(-50%, -50%) rotate(-135deg);
12205
+ }
12206
+
12207
+ .pa-range--handle-needle .pa-range__thumb {
12208
+ --_thumb-w: 1.2rem;
12209
+ --_thumb-h: 2.2rem;
12210
+ background-color: transparent;
12211
+ border-color: transparent;
12212
+ border-radius: var(--pa-border-radius-sm);
12213
+ }
12214
+ .pa-range--handle-needle .pa-range__thumb::before {
12215
+ content: "";
12216
+ position: absolute;
12217
+ inset-inline-start: 50%;
12218
+ bottom: 50%;
12219
+ width: 1.2rem;
12220
+ height: 1.1rem;
12221
+ margin-inline-start: calc(1.2rem / -2);
12222
+ background-color: var(--pa-range-thumb-border, var(--pa-accent));
12223
+ clip-path: polygon(50% 100%, 0 0, 100% 0);
12224
+ transition: background-color 0.15s ease;
12225
+ }
12226
+ .pa-range--handle-needle .pa-range__thumb:hover::before {
12227
+ background-color: var(--pa-range-thumb-border-hover, var(--pa-accent-hover));
12228
+ }
12229
+
12230
+ .pa-range--single .pa-range__thumb--min {
12231
+ display: none;
12232
+ }
12233
+
12234
+ .pa-range--disabled {
12235
+ opacity: 0.5;
12236
+ pointer-events: none;
12237
+ }
12238
+
12239
+ /* ----------------------------------------
12240
+ Compact control — pa-range-group
12241
+ ---------------------------------------- */
12242
+ .pa-range-group {
12243
+ position: relative;
12244
+ display: inline-flex;
12245
+ }
12246
+
12247
+ .pa-range-group__toggle {
12248
+ display: inline-flex;
12249
+ align-items: center;
12250
+ gap: 1.2rem;
12251
+ width: 100%;
12252
+ padding: 0.8rem 1.2rem;
12253
+ border: 1px solid var(--pa-border-color);
12254
+ border-radius: var(--pa-border-radius);
12255
+ background-color: var(--pa-input-bg);
12256
+ color: var(--pa-text-color-1);
12257
+ font-size: 1.4rem;
12258
+ line-height: 1.3;
12259
+ text-align: start;
12260
+ cursor: pointer;
12261
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
12262
+ }
12263
+ .pa-range-group__toggle:hover {
12264
+ border-color: var(--pa-accent-hover);
12265
+ }
12266
+ .pa-range-group__toggle:focus-visible {
12267
+ outline: none;
12268
+ border-color: var(--pa-accent);
12269
+ box-shadow: 0 0 0 0.3rem var(--pa-accent-light);
12270
+ }
12271
+
12272
+ .pa-range-group__summary {
12273
+ flex: 1;
12274
+ min-width: 0;
12275
+ font-size: 1.4rem;
12276
+ white-space: nowrap;
12277
+ overflow: hidden;
12278
+ text-overflow: ellipsis;
12279
+ }
12280
+
12281
+ .pa-range-group__seg-label {
12282
+ font-size: 1rem;
12283
+ font-weight: 600;
12284
+ letter-spacing: 0.02em;
12285
+ text-transform: uppercase;
12286
+ color: var(--pa-text-tertiary);
12287
+ }
12288
+
12289
+ .pa-range-group__seg-value {
12290
+ font-weight: 500;
12291
+ color: var(--pa-text-color-1);
12292
+ font-variant-numeric: tabular-nums;
12293
+ }
12294
+
12295
+ .pa-range-group__seg-value--empty {
12296
+ color: var(--pa-text-tertiary);
12297
+ font-weight: 400;
12298
+ }
12299
+
12300
+ .pa-range-group__seg-sep {
12301
+ color: var(--pa-text-tertiary);
12302
+ margin-inline: 0.4rem;
12303
+ }
12304
+
12305
+ .pa-range-group__caret {
12306
+ flex-shrink: 0;
12307
+ font-size: 1.2rem;
12308
+ color: var(--pa-text-secondary);
12309
+ transition: transform 0.2s ease;
12310
+ }
12311
+
12312
+ .pa-range-group--open .pa-range-group__caret {
12313
+ transform: rotate(180deg);
12314
+ }
12315
+
12316
+ /* ---- Floating panel ---- */
12317
+ .pa-range-group__panel {
12318
+ display: none;
12319
+ flex-direction: column;
12320
+ gap: 2.4rem;
12321
+ min-width: var(--pa-range-group-panel-min-width, 32rem);
12322
+ padding: 1.6rem;
12323
+ border: 1px solid var(--pa-border-color);
12324
+ border-radius: var(--pa-border-radius-lg);
12325
+ background-color: var(--pa-card-bg);
12326
+ box-shadow: var(--pa-detail-shadow);
12327
+ z-index: 7500;
12328
+ }
12329
+ .pa-range-group__panel.pa-range-group__panel--open {
12330
+ display: flex;
12331
+ }
12332
+
12333
+ .pa-range-group__row {
12334
+ display: flex;
12335
+ flex-direction: column;
12336
+ gap: 0.8rem;
12337
+ }
12338
+
12339
+ .pa-range-group__row-head {
12340
+ display: flex;
12341
+ align-items: baseline;
12342
+ justify-content: space-between;
12343
+ gap: 0.8rem;
12344
+ }
12345
+
12346
+ .pa-range-group__row-label {
12347
+ font-size: 1.4rem;
12348
+ font-weight: 600;
12349
+ color: var(--pa-text-color-1);
12350
+ }
12351
+
12352
+ .pa-range-group__row-value {
12353
+ font-size: 1.4rem;
12354
+ font-weight: 500;
12355
+ font-variant-numeric: tabular-nums;
12356
+ color: var(--pa-range-fill, var(--pa-accent));
12357
+ }
12358
+ .pa-range-group__row-value.pa-range-group__row-value--empty {
12359
+ color: var(--pa-text-tertiary);
12360
+ }
12361
+
12362
+ .pa-range-group__actions {
12363
+ display: flex;
12364
+ justify-content: flex-end;
12365
+ gap: 0.8rem;
12366
+ margin-top: 0.4rem;
12367
+ padding-top: 2.4rem;
12368
+ border-top: 1px solid var(--pa-border-color);
12369
+ }
12370
+
11785
12371
  /* ========================================
11786
12372
  Comparison Table Component
11787
12373
  Two-column and three-column comparison tables for version control, data changes, and merge operations
@@ -15242,6 +15828,166 @@ code {
15242
15828
  transform: rotate(180deg);
15243
15829
  }
15244
15830
 
15831
+ /* ========================================
15832
+ Splitter Component
15833
+ Resizable container with draggable gutters (2 or more panes).
15834
+ Modifiers:
15835
+ --horizontal panes side-by-side, vertical gutter (default)
15836
+ --vertical panes stacked, horizontal gutter
15837
+ --dragging applied to root while user is dragging
15838
+ --collapsed start pane has been collapsed to 0
15839
+ --minimize-mirror flip rail-title text 180° (bottom-to-top reading)
15840
+
15841
+ Rail mode is fully decoupled from any specific component. The splitter
15842
+ only rotates elements marked `[data-pa-splitter-rail-title]` inside a
15843
+ minimized pane; per-component adaptation (e.g. card body / footer
15844
+ hiding) lives in that component's SCSS, keyed off
15845
+ `.pa-splitter__pane--minimized > .pa-foo`. Card integration is in
15846
+ `_cards.scss`.
15847
+ ======================================== */
15848
+ :root {
15849
+ --pa-splitter-rail-size: 4rem;
15850
+ }
15851
+
15852
+ .pa-splitter {
15853
+ display: flex;
15854
+ width: 100%;
15855
+ height: 100%;
15856
+ min-width: 0;
15857
+ min-height: 0;
15858
+ overflow: hidden;
15859
+ }
15860
+ .pa-splitter--horizontal {
15861
+ flex-direction: row;
15862
+ }
15863
+ .pa-splitter--horizontal > .pa-splitter__gutter {
15864
+ cursor: col-resize;
15865
+ width: var(--pa-splitter-gutter-size, 0.6rem);
15866
+ height: auto;
15867
+ align-self: stretch;
15868
+ }
15869
+ .pa-splitter--horizontal > .pa-splitter__gutter::before {
15870
+ width: 2px;
15871
+ height: 2.4rem;
15872
+ }
15873
+ .pa-splitter--vertical {
15874
+ flex-direction: column;
15875
+ }
15876
+ .pa-splitter--vertical > .pa-splitter__gutter {
15877
+ cursor: row-resize;
15878
+ width: auto;
15879
+ height: var(--pa-splitter-gutter-size, 0.6rem);
15880
+ align-self: stretch;
15881
+ }
15882
+ .pa-splitter--vertical > .pa-splitter__gutter::before {
15883
+ width: 2.4rem;
15884
+ height: 2px;
15885
+ }
15886
+ .pa-splitter--dragging {
15887
+ user-select: none;
15888
+ }
15889
+ .pa-splitter--dragging > .pa-splitter__pane {
15890
+ pointer-events: none;
15891
+ }
15892
+ .pa-splitter--dragging > .pa-splitter__gutter:not(.pa-splitter__gutter--active) {
15893
+ pointer-events: none;
15894
+ }
15895
+ .pa-splitter--dragging > .pa-splitter__gutter:not(.pa-splitter__gutter--active):focus-visible {
15896
+ box-shadow: none;
15897
+ }
15898
+ .pa-splitter--dragging > .pa-splitter__gutter:not(.pa-splitter__gutter--active):focus-visible::before {
15899
+ background-color: rgba(128, 128, 128, 0.45);
15900
+ }
15901
+ .pa-splitter__gutter--active {
15902
+ background-color: rgba(0, 123, 255, 0.35);
15903
+ }
15904
+ .pa-splitter__gutter--active::before {
15905
+ background-color: #007bff;
15906
+ }
15907
+ .pa-splitter__pane {
15908
+ overflow: auto;
15909
+ min-width: 0;
15910
+ min-height: 0;
15911
+ }
15912
+ .pa-splitter__pane--start {
15913
+ flex: 0 0 auto;
15914
+ }
15915
+ .pa-splitter__pane--end {
15916
+ flex: 1 1 0;
15917
+ }
15918
+ .pa-splitter__pane--minimized {
15919
+ cursor: pointer;
15920
+ overflow: hidden;
15921
+ }
15922
+ .pa-splitter__pane--minimized [data-pa-splitter-rail-title] {
15923
+ writing-mode: sideways-rl;
15924
+ }
15925
+ .pa-splitter__pane--minimized [data-pa-splitter-rail-title] i,
15926
+ .pa-splitter__pane--minimized [data-pa-splitter-rail-title] svg {
15927
+ writing-mode: initial;
15928
+ }
15929
+ .pa-splitter--minimize-mirror .pa-splitter__pane--minimized [data-pa-splitter-rail-title] :is(h1, h2, h3, h4, h5, h6) {
15930
+ transform: scale(-1, -1);
15931
+ }
15932
+ .pa-splitter__gutter {
15933
+ position: relative;
15934
+ flex: 0 0 auto;
15935
+ background-color: rgba(128, 128, 128, 0.08);
15936
+ transition: background-color 0.15s ease;
15937
+ touch-action: none;
15938
+ outline: none;
15939
+ }
15940
+ .pa-splitter__gutter::before {
15941
+ content: "";
15942
+ position: absolute;
15943
+ top: 50%;
15944
+ left: 50%;
15945
+ transform: translate(-50%, -50%);
15946
+ background-color: rgba(128, 128, 128, 0.45);
15947
+ border-radius: 2px;
15948
+ transition: background-color 0.15s ease;
15949
+ }
15950
+ .pa-splitter__gutter:hover {
15951
+ background-color: rgba(128, 128, 128, 0.18);
15952
+ }
15953
+ .pa-splitter__gutter:hover::before {
15954
+ background-color: #007bff;
15955
+ }
15956
+ .pa-splitter__gutter:focus-visible {
15957
+ box-shadow: inset 0 0 0 2px rgba(0, 123, 255, 0.4);
15958
+ }
15959
+ .pa-splitter__gutter:focus-visible::before {
15960
+ background-color: #007bff;
15961
+ }
15962
+
15963
+ /* ========================================
15964
+ Overflow (progressive-collapse row)
15965
+
15966
+ Generic primitive: a horizontal flex row whose children get walked into
15967
+ a "more" menu when the row can't fit, driven by `overflow.js`. Use
15968
+ anywhere you want a button toolbar, breadcrumb row, chip row, or tab bar
15969
+ to collapse gracefully on narrow widths.
15970
+
15971
+ <div class="pa-overflow" data-pa-actions-overflow-from="end">
15972
+ <button class="pa-btn pa-btn--xs">Save</button>
15973
+ <button class="pa-btn pa-btn--xs" data-pa-actions-priority="10">Run</button>
15974
+ </div>
15975
+
15976
+ The card-flavoured alias `pa-card__actions--overflow` carries equivalent
15977
+ rules under `.pa-card__header` (see `_cards.scss`); both wire into the
15978
+ same JS module. ======================================== */
15979
+ .pa-overflow {
15980
+ display: flex;
15981
+ align-items: center;
15982
+ gap: 0.8rem;
15983
+ min-width: 0;
15984
+ overflow: hidden;
15985
+ flex-shrink: 1;
15986
+ }
15987
+ .pa-overflow > * {
15988
+ flex-shrink: 0;
15989
+ }
15990
+
15245
15991
  /* ========================================
15246
15992
  Data Display Components
15247
15993
  Read-only label-value field pairs