@keenmate/pure-admin-core 1.5.0 → 1.5.1

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.
@@ -21,7 +21,7 @@
21
21
  opacity: $field-label-opacity;
22
22
  line-height: $line-height-tight;
23
23
  text-transform: uppercase;
24
- letter-spacing: 0.05em;
24
+ letter-spacing: $field-label-letter-spacing;
25
25
  }
26
26
 
27
27
  &__value {
@@ -50,17 +50,17 @@
50
50
 
51
51
  .pa-field__copy {
52
52
  flex-shrink: 0;
53
- padding: 0.4rem;
53
+ padding: $field-copy-padding;
54
54
  background: transparent;
55
55
  border: none;
56
56
  border-radius: $border-radius;
57
57
  cursor: pointer;
58
- opacity: 0.5;
59
- transition: opacity 0.15s, background 0.15s;
58
+ opacity: $field-copy-opacity;
59
+ transition: opacity $field-copy-transition, background $field-copy-transition;
60
60
 
61
61
  &:hover {
62
- opacity: 1;
63
- background: rgba(128, 128, 128, 0.1);
62
+ opacity: $field-copy-hover-opacity;
63
+ background: $field-copy-hover-bg;
64
64
  }
65
65
  }
66
66
  }
@@ -69,10 +69,10 @@
69
69
  &--copy-click {
70
70
  .pa-field__value {
71
71
  cursor: pointer;
72
- transition: opacity 0.15s;
72
+ transition: opacity $field-copy-transition;
73
73
 
74
74
  &:hover {
75
- opacity: 0.7;
75
+ opacity: $field-copy-click-hover-opacity;
76
76
  }
77
77
 
78
78
  &::after {
@@ -80,11 +80,11 @@
80
80
  font-size: $font-size-2xs;
81
81
  opacity: 0;
82
82
  margin-inline-start: $spacing-sm; // RTL: flips to right
83
- transition: opacity 0.15s;
83
+ transition: opacity $field-copy-transition;
84
84
  }
85
85
 
86
86
  &:hover::after {
87
- opacity: 0.6;
87
+ opacity: $field-copy-hint-opacity;
88
88
  }
89
89
  }
90
90
  }
@@ -99,21 +99,21 @@
99
99
 
100
100
  .pa-field__copy {
101
101
  flex-shrink: 0;
102
- padding: 0.4rem;
102
+ padding: $field-copy-padding;
103
103
  background: transparent;
104
104
  border: none;
105
105
  border-radius: $border-radius;
106
106
  cursor: pointer;
107
107
  opacity: 0;
108
- transition: opacity 0.15s, background 0.15s;
108
+ transition: opacity $field-copy-transition, background $field-copy-transition;
109
109
  }
110
110
 
111
111
  &:hover .pa-field__copy {
112
- opacity: 0.5;
112
+ opacity: $field-copy-opacity;
113
113
 
114
114
  &:hover {
115
- opacity: 1;
116
- background: rgba(128, 128, 128, 0.1);
115
+ opacity: $field-copy-hover-opacity;
116
+ background: $field-copy-hover-bg;
117
117
  }
118
118
  }
119
119
  }
@@ -158,6 +158,14 @@
158
158
  margin-top: $field-group-spacing;
159
159
  }
160
160
 
161
+ // ============================================================================
162
+ // Container wrapper for responsive fields
163
+ // ============================================================================
164
+
165
+ .pa-fields-container {
166
+ container-type: inline-size;
167
+ }
168
+
161
169
  // ============================================================================
162
170
  // FIELD CONTAINER (.pa-fields)
163
171
  // Container for multiple .pa-field items
@@ -184,6 +192,14 @@
184
192
  &--cols-3 { grid-template-columns: repeat(3, 1fr); }
185
193
  &--cols-4 { grid-template-columns: repeat(4, 1fr); }
186
194
 
195
+ @container (max-width: #{$mobile-breakpoint}) {
196
+ &--cols-2,
197
+ &--cols-3,
198
+ &--cols-4 {
199
+ grid-template-columns: 1fr;
200
+ }
201
+ }
202
+
187
203
  @media (max-width: $mobile-breakpoint) {
188
204
  &--cols-2,
189
205
  &--cols-3,
@@ -204,8 +220,8 @@
204
220
 
205
221
  .pa-field__label {
206
222
  flex: 0 0 auto;
207
- min-width: 8rem;
208
- max-width: 40%;
223
+ min-width: $field-horizontal-label-min-width;
224
+ max-width: $field-horizontal-label-max-width;
209
225
  }
210
226
 
211
227
  .pa-field__value {
@@ -226,8 +242,8 @@
226
242
 
227
243
  .pa-field__label {
228
244
  flex: 0 0 auto;
229
- min-width: 8rem;
230
- max-width: 40%;
245
+ min-width: $field-horizontal-label-min-width;
246
+ max-width: $field-horizontal-label-max-width;
231
247
  }
232
248
 
233
249
  .pa-field__value {
@@ -308,6 +324,10 @@
308
324
  min-width: 0;
309
325
  }
310
326
 
327
+ @container (max-width: #{$mobile-breakpoint}) {
328
+ flex-direction: column;
329
+ }
330
+
311
331
  @media (max-width: $mobile-breakpoint) {
312
332
  flex-direction: column;
313
333
  }
@@ -344,4 +364,479 @@
344
364
  border-inline-start: none; // RTL: flips to right
345
365
  padding-inline-start: 0; // RTL: flips to right
346
366
  }
367
+
368
+ // ------------------------------------------------------------------
369
+ // LINEAR: ultra-clean side-by-side, weight + color contrast only
370
+ // ------------------------------------------------------------------
371
+ &--linear {
372
+ gap: $fields-linear-gap;
373
+ border-inline-start: none;
374
+ padding-inline-start: 0;
375
+
376
+ .pa-field {
377
+ flex-direction: row;
378
+ align-items: center;
379
+ gap: $fields-linear-field-gap;
380
+ font-size: $fields-linear-font-size;
381
+ line-height: $line-height-base;
382
+ min-height: $fields-linear-min-height;
383
+ }
384
+
385
+ .pa-field__label {
386
+ flex: 0 0 $fields-linear-label-width;
387
+ font-size: $fields-linear-font-size;
388
+ text-transform: none;
389
+ letter-spacing: normal;
390
+ opacity: 1;
391
+ font-weight: $font-weight-normal;
392
+ color: var(--pa-text-color-2);
393
+ }
394
+
395
+ .pa-field__value {
396
+ flex: 1;
397
+ min-width: 0;
398
+ font-size: $fields-linear-font-size;
399
+ font-weight: $font-weight-medium;
400
+ color: var(--pa-text-color-1);
401
+ }
402
+ }
403
+
404
+ // ------------------------------------------------------------------
405
+ // CHIPS: inline flow, values displayed as pills/chips
406
+ // ------------------------------------------------------------------
407
+ &--chips {
408
+ flex-direction: row;
409
+ flex-wrap: wrap;
410
+ gap: $fields-chips-gap-v $fields-chips-gap-h;
411
+ padding: $fields-chips-padding-v 0;
412
+ border-inline-start: none;
413
+ padding-inline-start: 0;
414
+
415
+ .pa-field {
416
+ flex-direction: row;
417
+ align-items: center;
418
+ gap: $fields-chips-field-gap;
419
+ font-size: $fields-chips-font-size;
420
+ }
421
+
422
+ .pa-field__label {
423
+ font-size: $fields-chips-font-size;
424
+ text-transform: none;
425
+ letter-spacing: normal;
426
+ opacity: 1;
427
+ font-weight: $font-weight-normal;
428
+ color: var(--pa-text-color-2);
429
+ }
430
+
431
+ .pa-field__value {
432
+ background: $fields-chips-value-bg;
433
+ color: var(--pa-text-color-1);
434
+ font-weight: $fields-chips-value-font-weight;
435
+ padding: $fields-chips-value-padding-v $fields-chips-value-padding-h;
436
+ border-radius: $fields-chips-value-border-radius;
437
+ font-size: $fields-chips-value-font-size;
438
+
439
+ &--success {
440
+ background: var(--pa-success-bg-light, rgba(0, 200, 80, 0.12));
441
+ color: var(--pa-success-color, #28a745);
442
+ }
443
+
444
+ &--warning {
445
+ background: var(--pa-warning-bg-light, rgba(255, 165, 0, 0.12));
446
+ color: var(--pa-warning-color, #e68a00);
447
+ }
448
+
449
+ &--danger {
450
+ background: var(--pa-danger-bg-light, rgba(255, 0, 0, 0.12));
451
+ color: var(--pa-danger-color, #dc3545);
452
+ }
453
+ }
454
+ }
455
+ }
456
+
457
+ // ============================================================================
458
+ // Container wrapper for responsive desc-tables
459
+ // Add to a parent element (e.g. card body) so desc-tables collapse in narrow spaces
460
+ // ============================================================================
461
+
462
+ .pa-desc-container {
463
+ container-type: inline-size;
464
+ }
465
+
466
+ // ============================================================================
467
+ // DESCRIPTIONS TABLE (.pa-desc-table)
468
+ // Ant Design style — flat grid with label/value cells, label cells get tint
469
+ // ============================================================================
470
+
471
+ .pa-desc-table {
472
+ display: grid;
473
+ grid-template-columns: repeat($desc-table-cols, auto 1fr);
474
+ border: $border-width-thin solid var(--pa-border-color);
475
+ border-radius: $border-radius;
476
+ overflow: hidden;
477
+
478
+ &--cols-2 {
479
+ grid-template-columns: repeat(2, auto 1fr);
480
+ }
481
+
482
+ // Fixed label width: uses --label-width custom property (default from SCSS var)
483
+ // Override per-instance: style="--label-width: 20rem"
484
+ // Uses minmax(0, ...) so label columns shrink gracefully when container is narrow
485
+ &--fixed {
486
+ grid-template-columns: repeat($desc-table-cols, minmax(0, var(--label-width, #{$desc-table-label-fixed-width})) minmax(0, 1fr));
487
+
488
+ &.pa-desc-table--cols-2 {
489
+ grid-template-columns: repeat(2, minmax(0, var(--label-width, #{$desc-table-label-fixed-width})) minmax(0, 1fr));
490
+ }
491
+ }
492
+
493
+ &__label,
494
+ &__value {
495
+ padding: $desc-table-cell-padding-v $desc-table-cell-padding-h;
496
+ border-bottom: $border-width-thin solid var(--pa-border-color);
497
+ font-size: $desc-table-font-size;
498
+ line-height: $line-height-base;
499
+ }
500
+
501
+ &__label {
502
+ background: $desc-table-label-bg;
503
+ color: var(--pa-text-color-2);
504
+ font-weight: $font-weight-normal;
505
+ white-space: nowrap;
506
+ border-inline-end: $border-width-thin solid var(--pa-border-color);
507
+
508
+ &::after {
509
+ content: ':';
510
+ margin-inline-start: $desc-table-label-colon-spacing;
511
+ }
512
+ }
513
+
514
+ &__value {
515
+ color: var(--pa-text-color-1);
516
+ font-weight: $desc-table-value-font-weight;
517
+ border-inline-end: $border-width-thin solid var(--pa-border-color);
518
+ min-width: 0;
519
+
520
+ &--full {
521
+ grid-column: 2 / -1;
522
+ }
523
+ }
524
+
525
+ // Middle: cells stretch to fill the grid row, content centered inside
526
+ &--middle &__label,
527
+ &--middle &__value {
528
+ display: flex;
529
+ align-items: center;
530
+ }
531
+
532
+ // Label horizontal alignment
533
+ &--label-end &__label {
534
+ text-align: end;
535
+ justify-content: flex-end; // when --middle makes it flex
536
+ }
537
+
538
+ &--label-center &__label {
539
+ text-align: center;
540
+ justify-content: center; // when --middle makes it flex
541
+ }
542
+
543
+ // Truncate: single-line ellipsis on labels and values
544
+ &--truncate &__label,
545
+ &--truncate &__value {
546
+ overflow: hidden;
547
+ text-overflow: ellipsis;
548
+ white-space: nowrap;
549
+ }
550
+
551
+ // Responsive: collapse to single label-value pair per row
552
+ // Selectors must match compound specificity of &--fixed#{&}--cols-2 (0,2,0)
553
+ // Container query (responds to parent container width, e.g. card body)
554
+ @container (max-width: #{$mobile-breakpoint}) {
555
+ &, &--cols-2 {
556
+ grid-template-columns: auto 1fr;
557
+ }
558
+
559
+ &--fixed, &--fixed#{&}--cols-2 {
560
+ grid-template-columns: minmax(0, var(--label-width, #{$desc-table-label-fixed-width})) minmax(0, 1fr);
561
+ }
562
+
563
+ .pa-desc-table__value--full {
564
+ grid-column: 2;
565
+ }
566
+ }
567
+
568
+ // Media fallback (for desc-tables outside a container context)
569
+ @media (max-width: $mobile-breakpoint) {
570
+ &, &--cols-2 {
571
+ grid-template-columns: auto 1fr;
572
+ }
573
+
574
+ &--fixed, &--fixed#{&}--cols-2 {
575
+ grid-template-columns: minmax(0, var(--label-width, #{$desc-table-label-fixed-width})) minmax(0, 1fr);
576
+ }
577
+
578
+ .pa-desc-table__value--full {
579
+ grid-column: 2;
580
+ }
581
+ }
582
+ }
583
+
584
+ // ============================================================================
585
+ // DOT LEADERS (.pa-dot-leaders)
586
+ // Restaurant menu / invoice style — dotted line connects label to value
587
+ // ============================================================================
588
+
589
+ .pa-dot-leaders {
590
+ display: flex;
591
+ flex-direction: column;
592
+ gap: 0;
593
+
594
+ &__item {
595
+ display: flex;
596
+ align-items: baseline;
597
+ padding: $dot-leaders-item-padding-v 0;
598
+
599
+ &--total {
600
+ margin-top: $dot-leaders-total-margin-top;
601
+ padding-top: $dot-leaders-total-padding-top;
602
+ border-top: $dot-leaders-total-border-width solid var(--pa-text-color-1);
603
+ }
604
+ }
605
+
606
+ &__label {
607
+ font-size: $dot-leaders-font-size;
608
+ font-weight: $dot-leaders-label-font-weight;
609
+ color: var(--pa-text-color-2);
610
+ white-space: nowrap;
611
+ flex-shrink: 0;
612
+ }
613
+
614
+ &__leader {
615
+ flex: 1;
616
+ border-bottom: $dot-leaders-leader-width dotted var(--pa-border-color);
617
+ margin: 0 $dot-leaders-leader-margin;
618
+ margin-bottom: 0.25em;
619
+ min-width: $dot-leaders-leader-min-width;
620
+ }
621
+
622
+ &__value {
623
+ font-size: $dot-leaders-font-size;
624
+ font-weight: $dot-leaders-value-font-weight;
625
+ color: var(--pa-text-color-1);
626
+ white-space: nowrap;
627
+ text-align: end;
628
+ font-variant-numeric: tabular-nums;
629
+ }
630
+
631
+ &__item--total &__label {
632
+ font-weight: $dot-leaders-total-font-weight;
633
+ color: var(--pa-text-color-1);
634
+ }
635
+
636
+ &__item--total &__value {
637
+ font-size: $dot-leaders-total-font-size;
638
+ font-weight: $dot-leaders-total-font-weight;
639
+ }
640
+ }
641
+
642
+ // ============================================================================
643
+ // PROPERTY CARD (.pa-prop-card)
644
+ // Bordered card with header + rows, thin dividers between rows
645
+ // ============================================================================
646
+
647
+ .pa-prop-card {
648
+ border: $border-width-thin solid var(--pa-border-color);
649
+ border-radius: $prop-card-border-radius;
650
+ overflow: hidden;
651
+
652
+ &__header {
653
+ padding: $prop-card-header-padding-v $prop-card-header-padding-h;
654
+ font-weight: $prop-card-header-font-weight;
655
+ font-size: $prop-card-header-font-size;
656
+ text-transform: uppercase;
657
+ letter-spacing: $prop-card-header-letter-spacing;
658
+ color: var(--pa-text-color-2);
659
+ background: $prop-card-header-bg;
660
+ border-bottom: $border-width-thin solid var(--pa-border-color);
661
+ }
662
+
663
+ &__row {
664
+ display: flex;
665
+ justify-content: space-between;
666
+ align-items: center;
667
+ padding: $prop-card-row-padding-v $prop-card-row-padding-h;
668
+ border-bottom: $border-width-thin solid $prop-card-row-divider-color;
669
+ font-size: $prop-card-row-font-size;
670
+ gap: $prop-card-row-gap;
671
+
672
+ &:last-child {
673
+ border-bottom: none;
674
+ }
675
+ }
676
+
677
+ &__label {
678
+ color: var(--pa-text-color-2);
679
+ font-weight: $font-weight-normal;
680
+ flex-shrink: 0;
681
+ }
682
+
683
+ &__value {
684
+ color: var(--pa-text-color-1);
685
+ font-weight: $font-weight-medium;
686
+ text-align: end;
687
+ overflow-wrap: anywhere;
688
+
689
+ &--bold {
690
+ font-weight: $font-weight-bold;
691
+ }
692
+ }
693
+ }
694
+
695
+ // ============================================================================
696
+ // Container wrapper for responsive banded rows
697
+ // ============================================================================
698
+
699
+ .pa-banded-container {
700
+ container-type: inline-size;
701
+ }
702
+
703
+ // ============================================================================
704
+ // BANDED ROWS (.pa-banded)
705
+ // Full-width rows with fixed-width tinted label column
706
+ // ============================================================================
707
+
708
+ .pa-banded {
709
+ border: $border-width-thin solid var(--pa-border-color);
710
+ border-radius: $border-radius;
711
+ overflow: hidden;
712
+
713
+ &__row {
714
+ display: flex;
715
+ border-bottom: $border-width-thin solid var(--pa-border-color);
716
+ font-size: $banded-font-size;
717
+ align-items: stretch;
718
+
719
+ &:last-child {
720
+ border-bottom: none;
721
+ }
722
+ }
723
+
724
+ &__label {
725
+ flex: 0 0 auto;
726
+ width: $banded-label-width;
727
+ padding: $banded-label-padding-v $banded-label-padding-h;
728
+ background: $banded-label-bg;
729
+ color: var(--pa-text-color-2);
730
+ font-weight: $banded-label-font-weight;
731
+ border-inline-end: $border-width-thin solid var(--pa-border-color);
732
+ display: flex;
733
+ align-items: flex-start;
734
+ }
735
+
736
+ &__value {
737
+ flex: 1;
738
+ padding: $banded-value-padding-v $banded-value-padding-h;
739
+ color: var(--pa-text-color-1);
740
+ font-weight: $font-weight-normal;
741
+ display: flex;
742
+ align-items: flex-start;
743
+ overflow-wrap: anywhere;
744
+ min-width: 0;
745
+ }
746
+
747
+ // Width variants
748
+ &--narrow &__label { width: $banded-label-width-narrow; }
749
+ &--wide &__label { width: $banded-label-width-wide; }
750
+
751
+ // Middle: vertically center labels and values
752
+ &--middle &__label,
753
+ &--middle &__value {
754
+ align-items: center;
755
+ }
756
+
757
+ // Label horizontal alignment
758
+ &--label-end &__label { justify-content: flex-end; }
759
+ &--label-center &__label { justify-content: center; }
760
+
761
+ // Truncate: single-line ellipsis on both labels and values
762
+ &--truncate &__label,
763
+ &--truncate &__value {
764
+ overflow: hidden;
765
+ text-overflow: ellipsis;
766
+ white-space: nowrap;
767
+ }
768
+
769
+ // Responsive: stack label above value in narrow containers
770
+ // Uses & &__label (0,2,0) + !important to beat wr-* utilities (0,1,0 + !important)
771
+ @container (max-width: #{$mobile-breakpoint}) {
772
+ &__row {
773
+ flex-direction: column;
774
+ }
775
+
776
+ & &__label {
777
+ width: auto !important;
778
+ border-inline-end: none;
779
+ border-bottom: $border-width-thin solid var(--pa-border-color);
780
+ }
781
+
782
+ & &__label,
783
+ & &__value {
784
+ display: block; // override flex so text-overflow: ellipsis works
785
+ }
786
+ }
787
+
788
+ @media (max-width: $mobile-breakpoint) {
789
+ &__row {
790
+ flex-direction: column;
791
+ }
792
+
793
+ & &__label {
794
+ width: auto !important;
795
+ border-inline-end: none;
796
+ border-bottom: $border-width-thin solid var(--pa-border-color);
797
+ }
798
+
799
+ & &__label,
800
+ & &__value {
801
+ display: block;
802
+ }
803
+ }
804
+ }
805
+
806
+ // ============================================================================
807
+ // ACCENT GRID (.pa-accent-grid)
808
+ // Grid of items with color-coded left borders
809
+ // ============================================================================
810
+
811
+ .pa-accent-grid {
812
+ display: grid;
813
+ grid-template-columns: repeat(auto-fill, minmax($accent-grid-min-col, 1fr));
814
+ gap: $accent-grid-gap;
815
+
816
+ &__item {
817
+ padding: $accent-grid-item-padding-v $accent-grid-item-padding-h;
818
+ padding-inline-start: $accent-grid-item-padding-start;
819
+ border-inline-start: $accent-grid-border-width solid var(--pa-accent, #3b82f6);
820
+
821
+ &--success { border-inline-start-color: var(--pa-success-color, #28a745); }
822
+ &--warning { border-inline-start-color: var(--pa-warning-color, #e68a00); }
823
+ &--danger { border-inline-start-color: var(--pa-danger-color, #dc3545); }
824
+ &--info { border-inline-start-color: var(--pa-info-color, #17a2b8); }
825
+ }
826
+
827
+ &__label {
828
+ font-size: $accent-grid-label-font-size;
829
+ font-weight: $accent-grid-label-font-weight;
830
+ color: var(--pa-text-color-2);
831
+ margin-bottom: $accent-grid-label-margin-bottom;
832
+ text-transform: uppercase;
833
+ letter-spacing: $accent-grid-label-letter-spacing;
834
+ }
835
+
836
+ &__value {
837
+ font-size: $accent-grid-value-font-size;
838
+ font-weight: $accent-grid-value-font-weight;
839
+ color: var(--pa-text-color-1);
840
+ line-height: $accent-grid-value-line-height;
841
+ }
347
842
  }
@@ -127,6 +127,11 @@
127
127
  background-color: var(--pa-card-bg);
128
128
  position: relative;
129
129
 
130
+ // Bordered modifier: adds top and bottom borders
131
+ &--bordered {
132
+ border-block: $border-width-base solid var(--pa-border-color);
133
+ }
134
+
130
135
  // In overlay mode: slide-in from end side (right in LTR, left in RTL)
131
136
  .pa-detail-panel--overlay & {
132
137
  position: absolute;
@@ -237,6 +242,7 @@
237
242
  .pa-detail-panel__body {
238
243
  flex: 1;
239
244
  overflow-y: auto;
245
+ overscroll-behavior: contain; // Prevent scroll chaining to parent
240
246
  padding: $detail-panel-body-padding-v $detail-panel-body-padding-h;
241
247
  }
242
248
 
@@ -84,6 +84,13 @@
84
84
  .pa-table-card__body {
85
85
  position: relative;
86
86
  overflow: hidden; // Clip detail panel to card boundaries
87
+ display: flex;
88
+ flex-direction: column;
89
+
90
+ // Detail view stretches to fill body
91
+ .pa-detail-view {
92
+ flex: 1;
93
+ }
87
94
  }
88
95
  }
89
96
 
@@ -456,6 +456,11 @@ $spacers: (
456
456
  .minhr-40 { min-height: 40rem !important; }
457
457
  .minhr-45 { min-height: 45rem !important; }
458
458
  .minhr-50 { min-height: 50rem !important; }
459
+ .minhr-60 { min-height: 60rem !important; }
460
+ .minhr-70 { min-height: 70rem !important; }
461
+ .minhr-80 { min-height: 80rem !important; }
462
+ .minhr-90 { min-height: 90rem !important; }
463
+ .minhr-100 { min-height: 100rem !important; }
459
464
 
460
465
  // Max-height (rem)
461
466
  .maxhr-1 { max-height: 1rem !important; }
@@ -725,4 +730,12 @@ $spacers: (
725
730
 
726
731
  .shadow-lg {
727
732
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15) !important;
733
+ }
734
+
735
+ // ============================================================================
736
+ // Container queries
737
+ // ============================================================================
738
+
739
+ .pa-cq {
740
+ container-type: inline-size;
728
741
  }