@keenmate/pure-admin-core 1.0.0-rc02 → 1.0.0-rc03

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -45,18 +45,6 @@ $btn-primary-bg: #your-button-color;
45
45
  @import '@keenmate/pure-admin-core/src/scss/main';
46
46
  ```
47
47
 
48
- ### JavaScript Utilities
49
-
50
- ```js
51
- import { createToast, openModal, closeModal } from '@pure-admin/core';
52
-
53
- // Show a success toast
54
- createToast('top-right', 'success', 'Success!', 'Operation completed');
55
-
56
- // Open a modal
57
- openModal('myModal');
58
- ```
59
-
60
48
  ## Using HTML Snippets
61
49
 
62
50
  The `snippets/` directory contains clean HTML patterns for all components:
@@ -64,11 +52,13 @@ The `snippets/` directory contains clean HTML patterns for all components:
64
52
  - `alerts.html` - Alert components
65
53
  - `badges.html` - Badge and composite badge patterns
66
54
  - `buttons.html` - All button variants and patterns
55
+ - `callouts.html` - Documentation-style callouts with left border accent
67
56
  - `cards.html` - Card layouts
68
57
  - `checkbox-lists.html` - Checkbox list patterns
69
58
  - `code.html` - Code display blocks
70
59
  - `command-palette.html` - Command palette (Ctrl+K)
71
60
  - `comparison.html` - Comparison tables
61
+ - `customization.html` - Theme customization examples
72
62
  - `forms.html` - Form elements and validation
73
63
  - `grid.html` - Grid system layouts
74
64
  - `layout.html` - Page layout structure
@@ -83,25 +73,14 @@ The `snippets/` directory contains clean HTML patterns for all components:
83
73
  - `timeline.html` - Timeline components
84
74
  - `toasts.html` - Toast notifications
85
75
  - `tooltips.html` - Tooltips and popovers
76
+ - `typography.html` - Typography styles and headings
86
77
  - `utilities.html` - Utility classes
87
78
  - `virtual-scroll.html` - Virtual scrolling
79
+ - `web-daterangepicker.html` - Date range picker web component
80
+ - `web-multiselect.html` - Multiselect web component
88
81
 
89
82
  These snippets are the canonical reference for building framework components in any frontend framework (React, Vue, Svelte, etc.).
90
83
 
91
- ## Framework Integration
92
-
93
- ### Svelte
94
-
95
- See `@pure-admin/svelte` package for Svelte component wrappers.
96
-
97
- ### React
98
-
99
- See `@pure-admin/react` package for React component wrappers.
100
-
101
- ### Vue
102
-
103
- See `@pure-admin/vue` package for Vue component wrappers.
104
-
105
84
  ## Themes
106
85
 
107
86
  Themes are available as separate npm packages:
@@ -165,6 +144,14 @@ The Dark theme supports color accent variants:
165
144
  - `.pa-alert--primary/success/danger/warning/info` - Variants
166
145
  - `.pa-alert--dismissible` - Closeable alerts
167
146
 
147
+ ### Callouts
148
+ - `.pa-callout` - Base callout (documentation-style with left border)
149
+ - `.pa-callout--primary/secondary/success/danger/warning/info` - Variants
150
+ - `.pa-callout--sm/lg` - Sizes
151
+ - `.pa-callout__icon` - Icon container
152
+ - `.pa-callout__heading` - Callout heading
153
+ - `.pa-callout__content` - Content wrapper (for icon + text layout)
154
+
168
155
  ### Modals
169
156
  - `.pa-modal` - Base modal
170
157
  - `.pa-modal__container--sm/md/lg/xl/xxl` - Sizes
@@ -188,6 +175,7 @@ The Dark theme supports color accent variants:
188
175
  - `.pa-profile-panel` - Slide-in profile panel
189
176
  - `.pa-profile-panel--open` - Open state
190
177
  - `.pa-profile-panel__header` - Header with avatar and user info
178
+ - `.pa-profile-panel__header--no-avatar` - Header variant without avatar (for corporate apps)
191
179
  - `.pa-profile-panel__tabs` - Tab navigation (Profile/Favorites)
192
180
  - `.pa-profile-panel__nav-item` - Navigation link
193
181
  - `.pa-profile-panel__favorite-item` - Favorite link (with remove button)
package/dist/css/main.css CHANGED
@@ -872,26 +872,82 @@
872
872
  white-space: nowrap !important;
873
873
  }
874
874
 
875
+ .w-5 {
876
+ width: 5% !important;
877
+ }
878
+
879
+ .w-10 {
880
+ width: 10% !important;
881
+ }
882
+
883
+ .w-15 {
884
+ width: 15% !important;
885
+ }
886
+
887
+ .w-20 {
888
+ width: 20% !important;
889
+ }
890
+
875
891
  .w-25 {
876
892
  width: 25% !important;
877
893
  }
878
894
 
879
- .w-33 {
880
- width: 33.333333% !important;
895
+ .w-30 {
896
+ width: 30% !important;
897
+ }
898
+
899
+ .w-35 {
900
+ width: 35% !important;
901
+ }
902
+
903
+ .w-40 {
904
+ width: 40% !important;
905
+ }
906
+
907
+ .w-45 {
908
+ width: 45% !important;
881
909
  }
882
910
 
883
911
  .w-50 {
884
912
  width: 50% !important;
885
913
  }
886
914
 
887
- .w-66 {
888
- width: 66.666667% !important;
915
+ .w-55 {
916
+ width: 55% !important;
917
+ }
918
+
919
+ .w-60 {
920
+ width: 60% !important;
921
+ }
922
+
923
+ .w-65 {
924
+ width: 65% !important;
925
+ }
926
+
927
+ .w-70 {
928
+ width: 70% !important;
889
929
  }
890
930
 
891
931
  .w-75 {
892
932
  width: 75% !important;
893
933
  }
894
934
 
935
+ .w-80 {
936
+ width: 80% !important;
937
+ }
938
+
939
+ .w-85 {
940
+ width: 85% !important;
941
+ }
942
+
943
+ .w-90 {
944
+ width: 90% !important;
945
+ }
946
+
947
+ .w-95 {
948
+ width: 95% !important;
949
+ }
950
+
895
951
  .w-100 {
896
952
  width: 100% !important;
897
953
  }
@@ -900,20 +956,20 @@
900
956
  width: auto !important;
901
957
  }
902
958
 
903
- .mw-25 {
904
- min-width: 25% !important;
959
+ .w-1-3 {
960
+ width: 33.333333% !important;
905
961
  }
906
962
 
907
- .mw-33 {
908
- min-width: 33.333333% !important;
963
+ .w-2-3 {
964
+ width: 66.666667% !important;
909
965
  }
910
966
 
911
- .mw-50 {
912
- min-width: 50% !important;
967
+ .mw-25 {
968
+ min-width: 25% !important;
913
969
  }
914
970
 
915
- .mw-66 {
916
- min-width: 66.666667% !important;
971
+ .mw-50 {
972
+ min-width: 50% !important;
917
973
  }
918
974
 
919
975
  .mw-75 {
@@ -928,26 +984,24 @@
928
984
  min-width: auto !important;
929
985
  }
930
986
 
987
+ .mw-1-3 {
988
+ min-width: 33.333333% !important;
989
+ }
990
+
991
+ .mw-2-3 {
992
+ min-width: 66.666667% !important;
993
+ }
994
+
931
995
  .w-25-fixed {
932
996
  min-width: 25% !important;
933
997
  width: 25% !important;
934
998
  }
935
999
 
936
- .w-33-fixed {
937
- min-width: 33.333333% !important;
938
- width: 33.333333% !important;
939
- }
940
-
941
1000
  .w-50-fixed {
942
1001
  min-width: 50% !important;
943
1002
  width: 50% !important;
944
1003
  }
945
1004
 
946
- .w-66-fixed {
947
- min-width: 66.666667% !important;
948
- width: 66.666667% !important;
949
- }
950
-
951
1005
  .w-75-fixed {
952
1006
  min-width: 75% !important;
953
1007
  width: 75% !important;
@@ -958,6 +1012,16 @@
958
1012
  width: 100% !important;
959
1013
  }
960
1014
 
1015
+ .w-1-3-fixed {
1016
+ min-width: 33.333333% !important;
1017
+ width: 33.333333% !important;
1018
+ }
1019
+
1020
+ .w-2-3-fixed {
1021
+ min-width: 66.666667% !important;
1022
+ width: 66.666667% !important;
1023
+ }
1024
+
961
1025
  .h-25 {
962
1026
  height: 25% !important;
963
1027
  }
@@ -1038,6 +1102,78 @@
1038
1102
  border-left: 0 !important;
1039
1103
  }
1040
1104
 
1105
+ .border-solid {
1106
+ border-style: solid !important;
1107
+ }
1108
+
1109
+ .border-dashed {
1110
+ border-style: dashed !important;
1111
+ }
1112
+
1113
+ .border-dotted {
1114
+ border-style: dotted !important;
1115
+ }
1116
+
1117
+ .border-none {
1118
+ border-style: none !important;
1119
+ }
1120
+
1121
+ .text-primary {
1122
+ color: var(--pa-accent) !important;
1123
+ }
1124
+
1125
+ .text-success {
1126
+ color: var(--pa-success-text) !important;
1127
+ }
1128
+
1129
+ .text-danger {
1130
+ color: var(--pa-danger-text) !important;
1131
+ }
1132
+
1133
+ .text-warning {
1134
+ color: var(--pa-warning-text) !important;
1135
+ }
1136
+
1137
+ .text-info {
1138
+ color: var(--pa-info-text) !important;
1139
+ }
1140
+
1141
+ .text-color-1 {
1142
+ color: var(--pa-color-1) !important;
1143
+ }
1144
+
1145
+ .text-color-2 {
1146
+ color: var(--pa-color-2) !important;
1147
+ }
1148
+
1149
+ .text-color-3 {
1150
+ color: var(--pa-color-3) !important;
1151
+ }
1152
+
1153
+ .text-color-4 {
1154
+ color: var(--pa-color-4) !important;
1155
+ }
1156
+
1157
+ .text-color-5 {
1158
+ color: var(--pa-color-5) !important;
1159
+ }
1160
+
1161
+ .text-color-6 {
1162
+ color: var(--pa-color-6) !important;
1163
+ }
1164
+
1165
+ .text-color-7 {
1166
+ color: var(--pa-color-7) !important;
1167
+ }
1168
+
1169
+ .text-color-8 {
1170
+ color: var(--pa-color-8) !important;
1171
+ }
1172
+
1173
+ .text-color-9 {
1174
+ color: var(--pa-color-9) !important;
1175
+ }
1176
+
1041
1177
  .rounded {
1042
1178
  border-radius: var(--border-radius) !important;
1043
1179
  }
@@ -6283,6 +6419,112 @@ a.pa-card p {
6283
6419
  border-top: 1px solid rgba(0, 0, 0, 0.1);
6284
6420
  }
6285
6421
 
6422
+ /* ========================================
6423
+ Reset and Base Styles
6424
+ ======================================== */
6425
+ /* ========================================
6426
+ Callout Components
6427
+ Documentation-style callouts with left border accent
6428
+ For tips, notes, warnings in content areas
6429
+ ======================================== */
6430
+ .pa-callout {
6431
+ position: relative;
6432
+ padding: 1.2rem 1rem;
6433
+ margin-bottom: 1.6rem;
6434
+ border-left: 0.4rem solid var(--pa-border-color);
6435
+ border-radius: 4px;
6436
+ font-size: 1.4rem;
6437
+ background-color: var(--pa-card-bg);
6438
+ }
6439
+ .pa-card__body .pa-callout:first-child {
6440
+ margin-top: 0;
6441
+ }
6442
+ .pa-card__body .pa-callout:last-child {
6443
+ margin-bottom: 0;
6444
+ }
6445
+ .pa-callout--primary {
6446
+ border-left-color: var(--pa-accent);
6447
+ background-color: rgba(0, 123, 255, 0.08);
6448
+ }
6449
+ .pa-callout--secondary {
6450
+ border-left-color: var(--pa-text-secondary);
6451
+ background-color: color-mix(in srgb, var(--pa-text-secondary) 5%, transparent);
6452
+ }
6453
+ .pa-callout--success {
6454
+ border-left-color: var(--pa-success-bg);
6455
+ background-color: var(--pa-success-bg-subtle);
6456
+ }
6457
+ .pa-callout--danger {
6458
+ border-left-color: var(--pa-danger-bg);
6459
+ background-color: var(--pa-danger-bg-subtle);
6460
+ }
6461
+ .pa-callout--warning {
6462
+ border-left-color: var(--pa-warning-bg);
6463
+ background-color: var(--pa-warning-bg-subtle);
6464
+ }
6465
+ .pa-callout--info {
6466
+ border-left-color: var(--pa-info-bg);
6467
+ background-color: var(--pa-info-bg-subtle);
6468
+ }
6469
+ .pa-callout--sm {
6470
+ padding: 0.8rem 1.2rem;
6471
+ font-size: 1.2rem;
6472
+ }
6473
+ .pa-callout--lg {
6474
+ padding: 2.4rem 3.2rem;
6475
+ font-size: 1.6rem;
6476
+ }
6477
+ .pa-callout__icon {
6478
+ float: left;
6479
+ margin-right: 0.8rem;
6480
+ font-size: 1.8rem;
6481
+ line-height: 1;
6482
+ }
6483
+ .pa-callout__heading {
6484
+ margin: 0 0 0.8rem 0;
6485
+ font-size: 1.6rem;
6486
+ font-weight: 600;
6487
+ }
6488
+ .pa-callout__content::after {
6489
+ content: "";
6490
+ display: table;
6491
+ clear: both;
6492
+ }
6493
+ .pa-callout > *:last-child {
6494
+ margin-bottom: 0;
6495
+ }
6496
+ .pa-callout p {
6497
+ margin: 0 0 0.8rem 0;
6498
+ }
6499
+ .pa-callout p:last-child {
6500
+ margin-bottom: 0;
6501
+ }
6502
+ .pa-callout ul, .pa-callout ol {
6503
+ margin: 0.8rem 0;
6504
+ padding-left: 2.4rem;
6505
+ }
6506
+ .pa-callout ul:last-child, .pa-callout ol:last-child {
6507
+ margin-bottom: 0;
6508
+ }
6509
+ .pa-callout code {
6510
+ background-color: rgba(0, 0, 0, 0.08);
6511
+ padding: 0.1em 0.3em;
6512
+ border-radius: 2px;
6513
+ font-size: 0.9em;
6514
+ }
6515
+ .pa-callout a {
6516
+ color: inherit;
6517
+ text-decoration: underline;
6518
+ font-weight: 500;
6519
+ }
6520
+ .pa-callout a:hover {
6521
+ text-decoration: none;
6522
+ }
6523
+ .pa-callout h1, .pa-callout h2, .pa-callout h3, .pa-callout h4, .pa-callout h5, .pa-callout h6 {
6524
+ color: inherit;
6525
+ margin-top: 0;
6526
+ }
6527
+
6286
6528
  /* ========================================
6287
6529
  Form Components
6288
6530
  Form groups, inputs, selects, textareas, checkboxes, radio buttons, states
@@ -8632,18 +8874,6 @@ web-daterangepicker {
8632
8874
  }
8633
8875
  }
8634
8876
 
8635
- .text-success {
8636
- color: var(--pa-success-bg);
8637
- }
8638
-
8639
- .text-danger {
8640
- color: var(--pa-danger-bg);
8641
- }
8642
-
8643
- .text-warning {
8644
- color: var(--pa-warning-bg);
8645
- }
8646
-
8647
8877
  /* ========================================
8648
8878
  Reset and Base Styles
8649
8879
  ======================================== */
@@ -9091,12 +9321,15 @@ code {
9091
9321
  .pa-profile-panel__header {
9092
9322
  padding: 2.4rem;
9093
9323
  background-color: var(--pa-header-bg);
9094
- border-bottom: 1px solid var(--pa-border-color);
9324
+ border-bottom: 1px solid var(--pa-text-primary);
9095
9325
  display: flex;
9096
9326
  align-items: flex-start;
9097
9327
  gap: 1.6rem;
9098
9328
  position: relative;
9099
9329
  }
9330
+ .pa-profile-panel__header--no-avatar .pa-profile-panel__avatar {
9331
+ display: none;
9332
+ }
9100
9333
  .pa-profile-panel__avatar {
9101
9334
  width: 6.4rem;
9102
9335
  height: 6.4rem;
@@ -9114,12 +9347,16 @@ code {
9114
9347
  .pa-profile-panel__info {
9115
9348
  flex: 1;
9116
9349
  min-width: 0;
9350
+ padding-right: 3.2rem;
9117
9351
  }
9118
9352
  .pa-profile-panel__name {
9119
9353
  margin: 0 0 0.4rem 0;
9120
9354
  font-size: 1.8rem;
9121
9355
  font-weight: 600;
9122
9356
  color: var(--pa-text-primary);
9357
+ overflow: hidden;
9358
+ text-overflow: ellipsis;
9359
+ white-space: nowrap;
9123
9360
  }
9124
9361
  .pa-profile-panel__email {
9125
9362
  margin: 0 0 0.8rem 0;
@@ -11592,6 +11829,170 @@ html.font-size-4xl {
11592
11829
  line-height: 1.8;
11593
11830
  }
11594
11831
 
11832
+ .gap-0 {
11833
+ gap: 0;
11834
+ }
11835
+
11836
+ .gap-xs {
11837
+ gap: 0.4rem;
11838
+ }
11839
+
11840
+ .gap-sm {
11841
+ gap: 0.8rem;
11842
+ }
11843
+
11844
+ .gap-md {
11845
+ gap: 1.2rem;
11846
+ }
11847
+
11848
+ .gap-base {
11849
+ gap: 1.6rem;
11850
+ }
11851
+
11852
+ .gap-lg {
11853
+ gap: 2.4rem;
11854
+ }
11855
+
11856
+ .gap-xl {
11857
+ gap: 3.2rem;
11858
+ }
11859
+
11860
+ .gap-2xl {
11861
+ gap: 4.8rem;
11862
+ }
11863
+
11864
+ .gap-1 {
11865
+ gap: 0.1rem;
11866
+ }
11867
+
11868
+ .gap-2 {
11869
+ gap: 0.2rem;
11870
+ }
11871
+
11872
+ .gap-3 {
11873
+ gap: 0.3rem;
11874
+ }
11875
+
11876
+ .gap-4 {
11877
+ gap: 0.4rem;
11878
+ }
11879
+
11880
+ .gap-5 {
11881
+ gap: 0.5rem;
11882
+ }
11883
+
11884
+ .gap-6 {
11885
+ gap: 0.6rem;
11886
+ }
11887
+
11888
+ .gap-8 {
11889
+ gap: 0.8rem;
11890
+ }
11891
+
11892
+ .gap-10 {
11893
+ gap: 1rem;
11894
+ }
11895
+
11896
+ .gap-12 {
11897
+ gap: 1.2rem;
11898
+ }
11899
+
11900
+ .gap-15 {
11901
+ gap: 1.5rem;
11902
+ }
11903
+
11904
+ .gap-20 {
11905
+ gap: 2rem;
11906
+ }
11907
+
11908
+ .row-gap-0 {
11909
+ row-gap: 0;
11910
+ }
11911
+
11912
+ .row-gap-xs {
11913
+ row-gap: 0.4rem;
11914
+ }
11915
+
11916
+ .row-gap-sm {
11917
+ row-gap: 0.8rem;
11918
+ }
11919
+
11920
+ .row-gap-md {
11921
+ row-gap: 1.2rem;
11922
+ }
11923
+
11924
+ .row-gap-base {
11925
+ row-gap: 1.6rem;
11926
+ }
11927
+
11928
+ .row-gap-lg {
11929
+ row-gap: 2.4rem;
11930
+ }
11931
+
11932
+ .column-gap-0 {
11933
+ column-gap: 0;
11934
+ }
11935
+
11936
+ .column-gap-xs {
11937
+ column-gap: 0.4rem;
11938
+ }
11939
+
11940
+ .column-gap-sm {
11941
+ column-gap: 0.8rem;
11942
+ }
11943
+
11944
+ .column-gap-md {
11945
+ column-gap: 1.2rem;
11946
+ }
11947
+
11948
+ .column-gap-base {
11949
+ column-gap: 1.6rem;
11950
+ }
11951
+
11952
+ .column-gap-lg {
11953
+ column-gap: 2.4rem;
11954
+ }
11955
+
11956
+ .text-2xs {
11957
+ font-size: 1rem;
11958
+ }
11959
+
11960
+ .text-xs {
11961
+ font-size: 1.2rem;
11962
+ }
11963
+
11964
+ .text-sm {
11965
+ font-size: 1.4rem;
11966
+ }
11967
+
11968
+ .text-md {
11969
+ font-size: 1.5rem;
11970
+ }
11971
+
11972
+ .text-base {
11973
+ font-size: 1.6rem;
11974
+ }
11975
+
11976
+ .text-lg {
11977
+ font-size: 1.8rem;
11978
+ }
11979
+
11980
+ .text-xl {
11981
+ font-size: 2rem;
11982
+ }
11983
+
11984
+ .text-2xl {
11985
+ font-size: 2.4rem;
11986
+ }
11987
+
11988
+ .text-3xl {
11989
+ font-size: 2.8rem;
11990
+ }
11991
+
11992
+ .text-4xl {
11993
+ font-size: 3.2rem;
11994
+ }
11995
+
11595
11996
  .component-showcase {
11596
11997
  display: flex;
11597
11998
  flex-wrap: wrap;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keenmate/pure-admin-core",
3
- "version": "1.0.0-rc02",
3
+ "version": "1.0.0-rc03",
4
4
  "description": "Lightweight, data-focused HTML/CSS admin framework built with PureCSS foundation and comprehensive component system",
5
5
  "style": "dist/css/main.css",
6
6
  "exports": {
@@ -0,0 +1,129 @@
1
+ <!-- ========================================
2
+ Callout Components
3
+ Documentation-style callouts with left border accent
4
+ ======================================== -->
5
+
6
+ <!-- BASIC CALLOUTS -->
7
+
8
+ <!-- Info Callout -->
9
+ <div class="pa-callout pa-callout--info">
10
+ <strong>Note:</strong> This is an informational callout for documentation tips and notes.
11
+ </div>
12
+
13
+ <!-- Success Callout -->
14
+ <div class="pa-callout pa-callout--success">
15
+ <strong>Success:</strong> Operation completed successfully. Your changes have been saved.
16
+ </div>
17
+
18
+ <!-- Warning Callout -->
19
+ <div class="pa-callout pa-callout--warning">
20
+ <strong>Warning:</strong> This action cannot be undone. Please proceed with caution.
21
+ </div>
22
+
23
+ <!-- Danger Callout -->
24
+ <div class="pa-callout pa-callout--danger">
25
+ <strong>Important:</strong> This feature is deprecated and will be removed in the next version.
26
+ </div>
27
+
28
+ <!-- Primary Callout -->
29
+ <div class="pa-callout pa-callout--primary">
30
+ <strong>Pro Tip:</strong> You can use keyboard shortcuts to speed up your workflow.
31
+ </div>
32
+
33
+ <!-- Secondary Callout -->
34
+ <div class="pa-callout pa-callout--secondary">
35
+ <strong>Note:</strong> This is a secondary callout with neutral styling.
36
+ </div>
37
+
38
+ <!-- ========================================
39
+ CALLOUTS WITH ICONS
40
+ ======================================== -->
41
+
42
+ <!-- Info with Icon -->
43
+ <div class="pa-callout pa-callout--info">
44
+ <span class="pa-callout__icon">💡</span>
45
+ <div class="pa-callout__content">
46
+ <div class="pa-callout__heading">Did you know?</div>
47
+ <p>You can hover over any element to see its tooltip. Tooltips provide additional context without cluttering the interface.</p>
48
+ </div>
49
+ </div>
50
+
51
+ <!-- Warning with Icon -->
52
+ <div class="pa-callout pa-callout--warning">
53
+ <span class="pa-callout__icon">⚠️</span>
54
+ <div class="pa-callout__content">
55
+ <div class="pa-callout__heading">Breaking Change</div>
56
+ <p>The <code>getData()</code> method now returns a Promise. Update your code to use <code>await</code> or <code>.then()</code>.</p>
57
+ </div>
58
+ </div>
59
+
60
+ <!-- Danger with Icon -->
61
+ <div class="pa-callout pa-callout--danger">
62
+ <span class="pa-callout__icon">🚨</span>
63
+ <div class="pa-callout__content">
64
+ <div class="pa-callout__heading">Security Notice</div>
65
+ <p>Never commit API keys or secrets to version control. Use environment variables instead.</p>
66
+ </div>
67
+ </div>
68
+
69
+ <!-- Success with Icon -->
70
+ <div class="pa-callout pa-callout--success">
71
+ <span class="pa-callout__icon">✅</span>
72
+ <div class="pa-callout__content">
73
+ <div class="pa-callout__heading">Best Practice</div>
74
+ <p>Always validate user input on both client and server side for maximum security.</p>
75
+ </div>
76
+ </div>
77
+
78
+ <!-- ========================================
79
+ CALLOUT SIZES
80
+ ======================================== -->
81
+
82
+ <!-- Small Callout -->
83
+ <div class="pa-callout pa-callout--info pa-callout--sm">
84
+ <strong>Note:</strong> This is a small callout for compact spaces.
85
+ </div>
86
+
87
+ <!-- Default Callout -->
88
+ <div class="pa-callout pa-callout--info">
89
+ <strong>Note:</strong> This is a default-sized callout.
90
+ </div>
91
+
92
+ <!-- Large Callout -->
93
+ <div class="pa-callout pa-callout--info pa-callout--lg">
94
+ <strong>Note:</strong> This is a large callout for prominent notices.
95
+ </div>
96
+
97
+ <!-- ========================================
98
+ CALLOUTS WITH LISTS
99
+ ======================================== -->
100
+
101
+ <!-- Callout with Unordered List -->
102
+ <div class="pa-callout pa-callout--info">
103
+ <div class="pa-callout__heading">Requirements</div>
104
+ <ul>
105
+ <li>Node.js version 16 or higher</li>
106
+ <li>npm version 8 or higher</li>
107
+ <li>A modern web browser</li>
108
+ </ul>
109
+ </div>
110
+
111
+ <!-- Callout with Ordered List -->
112
+ <div class="pa-callout pa-callout--warning">
113
+ <div class="pa-callout__heading">Migration Steps</div>
114
+ <ol>
115
+ <li>Backup your database</li>
116
+ <li>Update dependencies with <code>npm update</code></li>
117
+ <li>Run migrations with <code>npm run migrate</code></li>
118
+ <li>Verify the application starts correctly</li>
119
+ </ol>
120
+ </div>
121
+
122
+ <!-- ========================================
123
+ CALLOUTS WITH CODE
124
+ ======================================== -->
125
+
126
+ <!-- Callout with Inline Code -->
127
+ <div class="pa-callout pa-callout--primary">
128
+ <strong>Tip:</strong> Use <code>console.table()</code> instead of <code>console.log()</code> for arrays and objects to get a nicely formatted table output.
129
+ </div>
@@ -25,6 +25,7 @@
25
25
  ================================ -->
26
26
 
27
27
  <!-- Complete Profile Panel (place before closing </body> tag) -->
28
+ <!-- Note: Use title attributes on name/email for tooltips when text may be truncated -->
28
29
  <div class="pa-profile-panel" id="profilePanel">
29
30
  <div class="pa-profile-panel__overlay" onclick="closeProfilePanel()"></div>
30
31
  <div class="pa-profile-panel__content">
@@ -33,8 +34,8 @@
33
34
  <span class="pa-profile-panel__avatar-icon">👤</span>
34
35
  </div>
35
36
  <div class="pa-profile-panel__info">
36
- <h3 class="pa-profile-panel__name">John Doe</h3>
37
- <p class="pa-profile-panel__email">john.doe@company.com</p>
37
+ <h3 class="pa-profile-panel__name" title="John Doe">John Doe</h3>
38
+ <p class="pa-profile-panel__email" title="john.doe@company.com">john.doe@company.com</p>
38
39
  <span class="pa-profile-panel__role">Administrator</span>
39
40
  </div>
40
41
  <button class="pa-profile-panel__close" onclick="closeProfilePanel()" aria-label="Close Profile">
@@ -81,6 +82,48 @@
81
82
  </div>
82
83
 
83
84
 
85
+ <!-- ================================
86
+ PROFILE PANEL - NO AVATAR (CORPORATE)
87
+ For apps without user photos
88
+ ================================ -->
89
+
90
+ <!-- Profile Panel without avatar (for corporate apps that don't have user photos) -->
91
+ <!-- Add --no-avatar modifier to header to hide the avatar -->
92
+ <div class="pa-profile-panel" id="profilePanel">
93
+ <div class="pa-profile-panel__overlay" onclick="closeProfilePanel()"></div>
94
+ <div class="pa-profile-panel__content">
95
+ <div class="pa-profile-panel__header pa-profile-panel__header--no-avatar">
96
+ <div class="pa-profile-panel__avatar">
97
+ <span class="pa-profile-panel__avatar-icon">👤</span>
98
+ </div>
99
+ <div class="pa-profile-panel__info">
100
+ <h3 class="pa-profile-panel__name" title="John Doe">John Doe</h3>
101
+ <p class="pa-profile-panel__email" title="john.doe@company.com">john.doe@company.com</p>
102
+ <span class="pa-profile-panel__role">Administrator</span>
103
+ </div>
104
+ <button class="pa-profile-panel__close" onclick="closeProfilePanel()" aria-label="Close Profile">
105
+
106
+ </button>
107
+ </div>
108
+
109
+ <div class="pa-profile-panel__body">
110
+ <nav class="pa-profile-panel__nav">
111
+ <ul>
112
+ <li><a href="#profile" class="pa-profile-panel__nav-item">
113
+ <span class="pa-profile-panel__nav-icon">👤</span>
114
+ Profile Settings
115
+ </a></li>
116
+ <li><a href="#logout" class="pa-profile-panel__nav-item">
117
+ <span class="pa-profile-panel__nav-icon">🚪</span>
118
+ Sign Out
119
+ </a></li>
120
+ </ul>
121
+ </nav>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+
84
127
  <!-- ================================
85
128
  PROFILE PANEL - WITH TABS (PROFILE + FAVORITES)
86
129
  ================================ -->
@@ -383,11 +426,12 @@ PROFILE PANEL STRUCTURE:
383
426
 
384
427
  PANEL HEADER:
385
428
  - .pa-profile-panel__header - Header container
429
+ - .pa-profile-panel__header--no-avatar - Modifier to hide avatar (for corporate apps)
386
430
  - .pa-profile-panel__avatar - Avatar container
387
431
  - .pa-profile-panel__avatar-icon - Avatar icon/image
388
432
  - .pa-profile-panel__info - User info container
389
- - .pa-profile-panel__name - User name
390
- - .pa-profile-panel__email - User email
433
+ - .pa-profile-panel__name - User name (truncates with ellipsis, add title for tooltip)
434
+ - .pa-profile-panel__email - User email (truncates with ellipsis, add title for tooltip)
391
435
  - .pa-profile-panel__role - User role badge
392
436
  - .pa-profile-panel__close - Close button
393
437
 
@@ -405,4 +405,18 @@
405
405
  --pa-multiselect-option-hover-bg: #{$multiselect-option-hover-bg};
406
406
  --pa-multiselect-pill-bg: #{$multiselect-pill-bg};
407
407
  --pa-multiselect-pill-border: #{$multiselect-pill-border};
408
+
409
+ // =========================================================================
410
+ // CUSTOM THEME COLORS (1-9)
411
+ // Themes can override $color-1 through $color-9 to define branded colors
412
+ // =========================================================================
413
+ --pa-color-1: #{$color-1};
414
+ --pa-color-2: #{$color-2};
415
+ --pa-color-3: #{$color-3};
416
+ --pa-color-4: #{$color-4};
417
+ --pa-color-5: #{$color-5};
418
+ --pa-color-6: #{$color-6};
419
+ --pa-color-7: #{$color-7};
420
+ --pa-color-8: #{$color-8};
421
+ --pa-color-9: #{$color-9};
408
422
  }
@@ -47,6 +47,9 @@
47
47
  // Alert components
48
48
  @use 'core-components/alerts' as *;
49
49
 
50
+ // Callout components (documentation-style)
51
+ @use 'core-components/callouts' as *;
52
+
50
53
  // Form elements
51
54
  @use 'core-components/forms' as *;
52
55
 
@@ -0,0 +1,139 @@
1
+ /* ========================================
2
+ Callout Components
3
+ Documentation-style callouts with left border accent
4
+ For tips, notes, warnings in content areas
5
+ ======================================== */
6
+ @use '../variables' as *;
7
+
8
+ // Callout base
9
+ .pa-callout {
10
+ position: relative;
11
+ padding: $card-footer-padding-v $card-footer-padding-h;
12
+ margin-bottom: $spacing-base;
13
+ border-left: $callout-border-width solid var(--pa-border-color);
14
+ border-radius: $border-radius;
15
+ font-size: $font-size-sm;
16
+ background-color: var(--pa-card-bg);
17
+
18
+ // Remove margins when first/last child in card body
19
+ .pa-card__body &:first-child {
20
+ margin-top: 0;
21
+ }
22
+ .pa-card__body &:last-child {
23
+ margin-bottom: 0;
24
+ }
25
+
26
+ // Callout variants
27
+ &--primary {
28
+ border-left-color: var(--pa-accent);
29
+ background-color: rgba($accent-color, $opacity-subtle);
30
+ }
31
+
32
+ &--secondary {
33
+ border-left-color: var(--pa-text-secondary);
34
+ background-color: color-mix(in srgb, var(--pa-text-secondary) 5%, transparent);
35
+ }
36
+
37
+ &--success {
38
+ border-left-color: var(--pa-success-bg);
39
+ background-color: var(--pa-success-bg-subtle);
40
+ }
41
+
42
+ &--danger {
43
+ border-left-color: var(--pa-danger-bg);
44
+ background-color: var(--pa-danger-bg-subtle);
45
+ }
46
+
47
+ &--warning {
48
+ border-left-color: var(--pa-warning-bg);
49
+ background-color: var(--pa-warning-bg-subtle);
50
+ }
51
+
52
+ &--info {
53
+ border-left-color: var(--pa-info-bg);
54
+ background-color: var(--pa-info-bg-subtle);
55
+ }
56
+
57
+ // Callout sizes
58
+ &--sm {
59
+ padding: $spacing-sm $spacing-md;
60
+ font-size: $font-size-xs;
61
+ }
62
+
63
+ &--lg {
64
+ padding: $spacing-lg $spacing-xl;
65
+ font-size: $font-size-base;
66
+ }
67
+
68
+ // Callout components
69
+ &__icon {
70
+ float: left;
71
+ margin-right: $spacing-sm;
72
+ font-size: $font-size-lg;
73
+ line-height: 1;
74
+ }
75
+
76
+ &__heading {
77
+ margin: 0 0 $spacing-sm 0;
78
+ font-size: $font-size-base;
79
+ font-weight: $font-weight-semibold;
80
+ }
81
+
82
+ &__content {
83
+ // Clearfix for floated icon
84
+ &::after {
85
+ content: '';
86
+ display: table;
87
+ clear: both;
88
+ }
89
+ }
90
+
91
+ // Remove margin from last child
92
+ > *:last-child {
93
+ margin-bottom: 0;
94
+ }
95
+
96
+ // Paragraphs inside callouts
97
+ p {
98
+ margin: 0 0 $spacing-sm 0;
99
+
100
+ &:last-child {
101
+ margin-bottom: 0;
102
+ }
103
+ }
104
+
105
+ // Lists inside callouts
106
+ ul, ol {
107
+ margin: $spacing-sm 0;
108
+ padding-left: $spacing-lg;
109
+
110
+ &:last-child {
111
+ margin-bottom: 0;
112
+ }
113
+ }
114
+
115
+ // Code inside callouts
116
+ code {
117
+ background-color: rgba(0, 0, 0, $opacity-subtle);
118
+ padding: 0.1em 0.3em;
119
+ border-radius: $border-radius-sm;
120
+ font-size: 0.9em;
121
+ }
122
+
123
+ // Links styling
124
+ a {
125
+ color: inherit;
126
+ text-decoration: underline;
127
+ font-weight: $font-weight-medium;
128
+
129
+ &:hover {
130
+ text-decoration: none;
131
+ }
132
+ }
133
+
134
+ // Headings inside callouts
135
+ h1, h2, h3, h4, h5, h6 {
136
+ color: inherit;
137
+ margin-top: 0;
138
+ }
139
+ }
@@ -88,11 +88,18 @@
88
88
  &__header {
89
89
  padding: $spacing-lg;
90
90
  background-color: var(--pa-header-bg);
91
- border-bottom: $border-width-base solid var(--pa-border-color);
91
+ border-bottom: 1px solid var(--pa-text-primary);
92
92
  display: flex;
93
93
  align-items: flex-start;
94
94
  gap: $spacing-base;
95
95
  position: relative;
96
+
97
+ // No-avatar variant for corporate apps without user photos
98
+ &--no-avatar {
99
+ .pa-profile-panel__avatar {
100
+ display: none;
101
+ }
102
+ }
96
103
  }
97
104
 
98
105
  &__avatar {
@@ -114,6 +121,7 @@
114
121
  &__info {
115
122
  flex: 1;
116
123
  min-width: 0;
124
+ padding-right: $profile-close-size; // Space for close button
117
125
  }
118
126
 
119
127
  &__name {
@@ -121,6 +129,10 @@
121
129
  font-size: $font-size-lg;
122
130
  font-weight: $font-weight-semibold;
123
131
  color: var(--pa-text-primary);
132
+ // Truncate long names
133
+ overflow: hidden;
134
+ text-overflow: ellipsis;
135
+ white-space: nowrap;
124
136
  }
125
137
 
126
138
  &__email {
@@ -540,16 +540,3 @@
540
540
  }
541
541
  }
542
542
 
543
- // Text utilities for tables
544
- .text-success {
545
- color: var(--pa-success-bg);
546
- }
547
-
548
- .text-danger {
549
- color: var(--pa-danger-bg);
550
- }
551
-
552
- .text-warning {
553
- color: var(--pa-warning-bg);
554
- }
555
-
@@ -195,6 +195,59 @@ html.font-size-4xl {
195
195
  }
196
196
  }
197
197
 
198
+ // Gap utilities (10px rem base)
199
+ // Semantic gap classes using spacing variables
200
+ .gap-0 { gap: 0; }
201
+ .gap-xs { gap: $spacing-xs; } // 0.25rem = 2.5px
202
+ .gap-sm { gap: $spacing-sm; } // 0.5rem = 5px
203
+ .gap-md { gap: $spacing-md; } // 0.75rem = 7.5px
204
+ .gap-base { gap: $spacing-base; } // 1rem = 10px
205
+ .gap-lg { gap: $spacing-lg; } // 1.5rem = 15px
206
+ .gap-xl { gap: $spacing-xl; } // 2rem = 20px
207
+ .gap-2xl { gap: $spacing-2xl; } // 3rem = 30px
208
+
209
+ // Numeric gap classes (in 10px rem units)
210
+ .gap-1 { gap: 0.1rem; } // 1px
211
+ .gap-2 { gap: 0.2rem; } // 2px
212
+ .gap-3 { gap: 0.3rem; } // 3px
213
+ .gap-4 { gap: 0.4rem; } // 4px
214
+ .gap-5 { gap: 0.5rem; } // 5px
215
+ .gap-6 { gap: 0.6rem; } // 6px
216
+ .gap-8 { gap: 0.8rem; } // 8px
217
+ .gap-10 { gap: 1rem; } // 10px
218
+ .gap-12 { gap: 1.2rem; } // 12px
219
+ .gap-15 { gap: 1.5rem; } // 15px
220
+ .gap-20 { gap: 2rem; } // 20px
221
+
222
+ // Row gap utilities
223
+ .row-gap-0 { row-gap: 0; }
224
+ .row-gap-xs { row-gap: $spacing-xs; }
225
+ .row-gap-sm { row-gap: $spacing-sm; }
226
+ .row-gap-md { row-gap: $spacing-md; }
227
+ .row-gap-base { row-gap: $spacing-base; }
228
+ .row-gap-lg { row-gap: $spacing-lg; }
229
+
230
+ // Column gap utilities
231
+ .column-gap-0 { column-gap: 0; }
232
+ .column-gap-xs { column-gap: $spacing-xs; }
233
+ .column-gap-sm { column-gap: $spacing-sm; }
234
+ .column-gap-md { column-gap: $spacing-md; }
235
+ .column-gap-base { column-gap: $spacing-base; }
236
+ .column-gap-lg { column-gap: $spacing-lg; }
237
+
238
+ // Font-size utilities (10px rem base)
239
+ // Direct font-size classes using typography variables
240
+ .text-2xs { font-size: $font-size-2xs; } // 1rem = 10px
241
+ .text-xs { font-size: $font-size-xs; } // 1.2rem = 12px
242
+ .text-sm { font-size: $font-size-sm; } // 1.4rem = 14px
243
+ .text-md { font-size: $font-size-md; } // 1.5rem = 15px
244
+ .text-base { font-size: $font-size-base; } // 1.6rem = 16px
245
+ .text-lg { font-size: $font-size-lg; } // 1.8rem = 18px
246
+ .text-xl { font-size: $font-size-xl; } // 2rem = 20px
247
+ .text-2xl { font-size: $font-size-2xl; } // 2.4rem = 24px
248
+ .text-3xl { font-size: $font-size-3xl; } // 2.8rem = 28px
249
+ .text-4xl { font-size: $font-size-4xl; } // 3.2rem = 32px
250
+
198
251
  // Component showcase styling
199
252
  .component-showcase {
200
253
  display: flex;
@@ -254,94 +254,49 @@ $spacers: (
254
254
  white-space: nowrap !important;
255
255
  }
256
256
 
257
- // Width utilities
258
- .w-25 {
259
- width: 25% !important;
260
- }
261
-
262
- .w-33 {
263
- width: 33.333333% !important;
264
- }
265
-
266
- .w-50 {
267
- width: 50% !important;
268
- }
269
-
270
- .w-66 {
271
- width: 66.666667% !important;
272
- }
273
-
274
- .w-75 {
275
- width: 75% !important;
276
- }
277
-
278
- .w-100 {
279
- width: 100% !important;
280
- }
281
-
282
- .w-auto {
283
- width: auto !important;
284
- }
257
+ // Width utilities (5% increments)
258
+ .w-5 { width: 5% !important; }
259
+ .w-10 { width: 10% !important; }
260
+ .w-15 { width: 15% !important; }
261
+ .w-20 { width: 20% !important; }
262
+ .w-25 { width: 25% !important; }
263
+ .w-30 { width: 30% !important; }
264
+ .w-35 { width: 35% !important; }
265
+ .w-40 { width: 40% !important; }
266
+ .w-45 { width: 45% !important; }
267
+ .w-50 { width: 50% !important; }
268
+ .w-55 { width: 55% !important; }
269
+ .w-60 { width: 60% !important; }
270
+ .w-65 { width: 65% !important; }
271
+ .w-70 { width: 70% !important; }
272
+ .w-75 { width: 75% !important; }
273
+ .w-80 { width: 80% !important; }
274
+ .w-85 { width: 85% !important; }
275
+ .w-90 { width: 90% !important; }
276
+ .w-95 { width: 95% !important; }
277
+ .w-100 { width: 100% !important; }
278
+ .w-auto { width: auto !important; }
279
+
280
+ // Width utilities (fractions) - matches grid naming: pa-col-1-3, pa-col-2-3
281
+ .w-1-3 { width: 33.333333% !important; }
282
+ .w-2-3 { width: 66.666667% !important; }
285
283
 
286
284
  // Min-width utilities
287
- .mw-25 {
288
- min-width: 25% !important;
289
- }
290
-
291
- .mw-33 {
292
- min-width: 33.333333% !important;
293
- }
294
-
295
- .mw-50 {
296
- min-width: 50% !important;
297
- }
298
-
299
- .mw-66 {
300
- min-width: 66.666667% !important;
301
- }
302
-
303
- .mw-75 {
304
- min-width: 75% !important;
305
- }
306
-
307
- .mw-100 {
308
- min-width: 100% !important;
309
- }
310
-
311
- .mw-auto {
312
- min-width: auto !important;
313
- }
285
+ .mw-25 { min-width: 25% !important; }
286
+ .mw-50 { min-width: 50% !important; }
287
+ .mw-75 { min-width: 75% !important; }
288
+ .mw-100 { min-width: 100% !important; }
289
+ .mw-auto { min-width: auto !important; }
290
+ .mw-1-3 { min-width: 33.333333% !important; }
291
+ .mw-2-3 { min-width: 66.666667% !important; }
314
292
 
315
293
  // Fixed width utilities (min-width + width locked)
316
- .w-25-fixed {
317
- min-width: 25% !important;
318
- width: 25% !important;
319
- }
320
-
321
- .w-33-fixed {
322
- min-width: 33.333333% !important;
323
- width: 33.333333% !important;
324
- }
325
-
326
- .w-50-fixed {
327
- min-width: 50% !important;
328
- width: 50% !important;
329
- }
330
-
331
- .w-66-fixed {
332
- min-width: 66.666667% !important;
333
- width: 66.666667% !important;
334
- }
335
-
336
- .w-75-fixed {
337
- min-width: 75% !important;
338
- width: 75% !important;
339
- }
340
-
341
- .w-100-fixed {
342
- min-width: 100% !important;
343
- width: 100% !important;
344
- }
294
+ .w-25-fixed { min-width: 25% !important; width: 25% !important; }
295
+ .w-50-fixed { min-width: 50% !important; width: 50% !important; }
296
+ .w-75-fixed { min-width: 75% !important; width: 75% !important; }
297
+ .w-100-fixed { min-width: 100% !important; width: 100% !important; }
298
+ .w-1-3-fixed { min-width: 33.333333% !important; width: 33.333333% !important; }
299
+ .w-2-3-fixed { min-width: 66.666667% !important; width: 66.666667% !important; }
345
300
 
346
301
  // Height utilities
347
302
  .h-25 {
@@ -426,6 +381,30 @@ $spacers: (
426
381
  border-left: 0 !important;
427
382
  }
428
383
 
384
+ // Border style utilities
385
+ .border-solid { border-style: solid !important; }
386
+ .border-dashed { border-style: dashed !important; }
387
+ .border-dotted { border-style: dotted !important; }
388
+ .border-none { border-style: none !important; }
389
+
390
+ // Text color utilities (semantic colors)
391
+ .text-primary { color: var(--pa-accent) !important; }
392
+ .text-success { color: var(--pa-success-text) !important; }
393
+ .text-danger { color: var(--pa-danger-text) !important; }
394
+ .text-warning { color: var(--pa-warning-text) !important; }
395
+ .text-info { color: var(--pa-info-text) !important; }
396
+
397
+ // Text color utilities (theme custom colors 1-9)
398
+ .text-color-1 { color: var(--pa-color-1) !important; }
399
+ .text-color-2 { color: var(--pa-color-2) !important; }
400
+ .text-color-3 { color: var(--pa-color-3) !important; }
401
+ .text-color-4 { color: var(--pa-color-4) !important; }
402
+ .text-color-5 { color: var(--pa-color-5) !important; }
403
+ .text-color-6 { color: var(--pa-color-6) !important; }
404
+ .text-color-7 { color: var(--pa-color-7) !important; }
405
+ .text-color-8 { color: var(--pa-color-8) !important; }
406
+ .text-color-9 { color: var(--pa-color-9) !important; }
407
+
429
408
  // Rounded utilities
430
409
  .rounded {
431
410
  border-radius: var(--border-radius) !important;
@@ -200,3 +200,18 @@ $code-syntax-property: #dd4a68 !default;
200
200
 
201
201
  $comparison-accent-pink: #ec4899 !default;
202
202
  $comparison-accent-orange: #f97316 !default;
203
+
204
+ // =============================================================================
205
+ // CUSTOM THEME COLOR SLOTS (1-9)
206
+ // Themes can override these to provide additional branded colors
207
+ // =============================================================================
208
+
209
+ $color-1: transparent !default;
210
+ $color-2: transparent !default;
211
+ $color-3: transparent !default;
212
+ $color-4: transparent !default;
213
+ $color-5: transparent !default;
214
+ $color-6: transparent !default;
215
+ $color-7: transparent !default;
216
+ $color-8: transparent !default;
217
+ $color-9: transparent !default;
@@ -266,6 +266,11 @@ $alert-info-bg: $info-bg-subtle !default;
266
266
  $alert-info-border: $info-border !default;
267
267
  $alert-info-text: $info-bg !default;
268
268
 
269
+ // ============================================================================
270
+ // CALLOUT SYSTEM
271
+ // ============================================================================
272
+ $callout-border-width: 0.4rem !default; // 4px left border accent
273
+
269
274
  // ============================================================================
270
275
  // STATS SYSTEM
271
276
  // ============================================================================