@keenmate/pure-admin-core 1.0.0-rc01

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/dist/css/main.css +11542 -0
  4. package/dist/fonts/Delivery/Delivery_W_Bd.woff2 +0 -0
  5. package/dist/fonts/Delivery/Delivery_W_BdIt.woff2 +0 -0
  6. package/dist/fonts/Delivery/Delivery_W_CdBlk.woff2 +0 -0
  7. package/dist/fonts/Delivery/Delivery_W_CdLt.woff2 +0 -0
  8. package/dist/fonts/Delivery/Delivery_W_It.woff2 +0 -0
  9. package/dist/fonts/Delivery/Delivery_W_Lt.woff2 +0 -0
  10. package/dist/fonts/Delivery/Delivery_W_LtIt.woff2 +0 -0
  11. package/dist/fonts/Delivery/Delivery_W_Rg.woff2 +0 -0
  12. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2 +0 -0
  13. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.1 +0 -0
  14. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8UH-qVHQ.woff2.2 +0 -0
  15. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2 +0 -0
  16. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.1 +0 -0
  17. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8VH-qVHQ.woff2.2 +0 -0
  18. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2 +0 -0
  19. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8bH-o.woff2.1 +0 -0
  20. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2 +0 -0
  21. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.1 +0 -0
  22. package/dist/fonts/google/3y976aknfjLm_3lMKjiMgmUUYBs04Y8fH-qVHQ.woff2.2 +0 -0
  23. package/dist/fonts/google/6aez4K2oVqwIvtE2H68T.woff2 +0 -0
  24. package/dist/fonts/google/6aez4K2oVqwIvtU2Hw.woff2 +0 -0
  25. package/dist/fonts/google/6aez4K2oVqwIvtY2H68T.woff2 +0 -0
  26. package/dist/fonts/google/6aez4K2oVqwIvtg2H68T.woff2 +0 -0
  27. package/dist/fonts/google/6aez4K2oVqwIvto2H68T.woff2 +0 -0
  28. package/dist/fonts/google/6aez4K2oVqwIvts2H68T.woff2 +0 -0
  29. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nejog.woff2 +0 -0
  30. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nijogp5.woff2 +0 -0
  31. package/dist/fonts/google/7Auup_AqnyWWAxW2Wk3swUz56MS91Eww8SX21nmjogp5.woff2 +0 -0
  32. package/dist/fonts/google/PN_xRfK9oXHga0XdZ8g_vT0.woff2 +0 -0
  33. package/dist/fonts/google/PN_xRfK9oXHga0XdZsg_.woff2 +0 -0
  34. package/dist/fonts/google/PN_xRfK9oXHga0XdaMg_vT0.woff2 +0 -0
  35. package/dist/fonts/google/TK3tWkYFABsmjsphPho.woff2 +0 -0
  36. package/dist/fonts/google/TK3tWkYFABsmjspuPho7vA.woff2 +0 -0
  37. package/dist/fonts/google/TK3tWkYFABsmjspvPho7vA.woff2 +0 -0
  38. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjTYJwQj.woff2 +0 -0
  39. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjXYJwQj.woff2 +0 -0
  40. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6Vj_YJwQj.woff2 +0 -0
  41. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjbYJwQj.woff2 +0 -0
  42. package/dist/fonts/google/dg45_pLmvrkcOkBnKsOzXyGWTBcmg-X6VjvYJw.woff2 +0 -0
  43. package/dist/fonts/google/fonts-tracklist.txt +48 -0
  44. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbBjM4.woff2 +0 -0
  45. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbOjM7sfA.woff2 +0 -0
  46. package/dist/fonts/google/vEFO2_JTCgwQ5ejvMV0O96D01E8J0tJXHKbPjM7sfA.woff2 +0 -0
  47. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfLtrftV.woff2 +0 -0
  48. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfXtrftV.woff2 +0 -0
  49. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtrQ.woff2 +0 -0
  50. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfjtrftV.woff2 +0 -0
  51. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfntrftV.woff2 +0 -0
  52. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfrtrftV.woff2 +0 -0
  53. package/dist/fonts/google/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfvtrftV.woff2 +0 -0
  54. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_B-bnBeA.woff2 +0 -0
  55. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_C-bk.woff2 +0 -0
  56. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_G-bnBeA.woff2 +0 -0
  57. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_M-bnBeA.woff2 +0 -0
  58. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_N-bnBeA.woff2 +0 -0
  59. package/dist/fonts/google/xn7_YHE41ni1AdIRqAuZuw1Bx9mbZk79FN_P-bnBeA.woff2 +0 -0
  60. package/package.json +60 -0
  61. package/snippets/alerts.html +281 -0
  62. package/snippets/badges.html +212 -0
  63. package/snippets/buttons.html +287 -0
  64. package/snippets/cards.html +393 -0
  65. package/snippets/checkbox-lists.html +490 -0
  66. package/snippets/code.html +225 -0
  67. package/snippets/command-palette.html +210 -0
  68. package/snippets/comparison.html +428 -0
  69. package/snippets/customization.html +142 -0
  70. package/snippets/forms.html +477 -0
  71. package/snippets/grid.html +338 -0
  72. package/snippets/layout.html +598 -0
  73. package/snippets/lists.html +232 -0
  74. package/snippets/loaders.html +183 -0
  75. package/snippets/manifest.json +388 -0
  76. package/snippets/modal-dialogs.html +411 -0
  77. package/snippets/modals.html +310 -0
  78. package/snippets/popconfirm.html +253 -0
  79. package/snippets/profile.html +264 -0
  80. package/snippets/tables.html +317 -0
  81. package/snippets/tabs.html +930 -0
  82. package/snippets/timeline.html +364 -0
  83. package/snippets/toasts.html +154 -0
  84. package/snippets/tooltips.html +411 -0
  85. package/snippets/typography.html +101 -0
  86. package/snippets/utilities.html +595 -0
  87. package/snippets/virtual-scroll.html +322 -0
  88. package/snippets/web-daterangepicker.html +634 -0
  89. package/snippets/web-multiselect.html +362 -0
  90. package/src/scss/.claude/settings.local.json +11 -0
  91. package/src/scss/_base-css-variables.scss +348 -0
  92. package/src/scss/_core.scss +99 -0
  93. package/src/scss/_fonts.scss +67 -0
  94. package/src/scss/_purecss-grid-responsive.scss +138 -0
  95. package/src/scss/_purecss-grid.scss +58 -0
  96. package/src/scss/_variables.scss +14 -0
  97. package/src/scss/core-components/_alerts.scss +212 -0
  98. package/src/scss/core-components/_badges.scss +16 -0
  99. package/src/scss/core-components/_base.scss +124 -0
  100. package/src/scss/core-components/_buttons.scss +473 -0
  101. package/src/scss/core-components/_cards.scss +285 -0
  102. package/src/scss/core-components/_checkbox-lists.scss +289 -0
  103. package/src/scss/core-components/_code.scss +141 -0
  104. package/src/scss/core-components/_command-palette.scss +518 -0
  105. package/src/scss/core-components/_comparison.scss +172 -0
  106. package/src/scss/core-components/_file-selector.scss +780 -0
  107. package/src/scss/core-components/_forms.scss +16 -0
  108. package/src/scss/core-components/_grid.scss +264 -0
  109. package/src/scss/core-components/_layout.scss +15 -0
  110. package/src/scss/core-components/_lists.scss +211 -0
  111. package/src/scss/core-components/_loaders.scss +277 -0
  112. package/src/scss/core-components/_logic-tree.scss +280 -0
  113. package/src/scss/core-components/_modals.scss +209 -0
  114. package/src/scss/core-components/_notifications.scss +253 -0
  115. package/src/scss/core-components/_pagers.scss +141 -0
  116. package/src/scss/core-components/_popconfirm.scss +170 -0
  117. package/src/scss/core-components/_profile.scss +281 -0
  118. package/src/scss/core-components/_settings-panel.scss +128 -0
  119. package/src/scss/core-components/_statistics.scss +200 -0
  120. package/src/scss/core-components/_tables.scss +555 -0
  121. package/src/scss/core-components/_tabs.scss +438 -0
  122. package/src/scss/core-components/_timeline.scss +589 -0
  123. package/src/scss/core-components/_toasts.scss +281 -0
  124. package/src/scss/core-components/_tooltips.scss +503 -0
  125. package/src/scss/core-components/_utilities.scss +241 -0
  126. package/src/scss/core-components/_web-components-theme.scss +294 -0
  127. package/src/scss/core-components/badges/_badge-base.scss +131 -0
  128. package/src/scss/core-components/badges/_badge-group.scss +25 -0
  129. package/src/scss/core-components/badges/_composite-badge-variants.scss +396 -0
  130. package/src/scss/core-components/badges/_composite-badge.scss +70 -0
  131. package/src/scss/core-components/badges/_index.scss +10 -0
  132. package/src/scss/core-components/badges/_labels.scss +155 -0
  133. package/src/scss/core-components/forms/_checkboxes-radios.scss +205 -0
  134. package/src/scss/core-components/forms/_form-inputs.scss +100 -0
  135. package/src/scss/core-components/forms/_form-layout.scss +66 -0
  136. package/src/scss/core-components/forms/_form-states.scss +89 -0
  137. package/src/scss/core-components/forms/_index.scss +12 -0
  138. package/src/scss/core-components/forms/_input-groups.scss +149 -0
  139. package/src/scss/core-components/forms/_input-wrapper.scss +89 -0
  140. package/src/scss/core-components/forms/_query-editor.scss +313 -0
  141. package/src/scss/core-components/layout/_index.scss +11 -0
  142. package/src/scss/core-components/layout/_layout-container.scss +105 -0
  143. package/src/scss/core-components/layout/_layout-responsive.scss +100 -0
  144. package/src/scss/core-components/layout/_navbar-elements.scss +238 -0
  145. package/src/scss/core-components/layout/_navbar.scss +71 -0
  146. package/src/scss/core-components/layout/_sidebar-states.scss +228 -0
  147. package/src/scss/core-components/layout/_sidebar.scss +177 -0
  148. package/src/scss/main.scss +7 -0
  149. package/src/scss/themes/_dark-base.scss +207 -0
  150. package/src/scss/themes/audi-light.scss +311 -0
  151. package/src/scss/themes/audi.scss +288 -0
  152. package/src/scss/themes/corporate.scss +203 -0
  153. package/src/scss/themes/dark-blue.scss +152 -0
  154. package/src/scss/themes/dark-green.scss +156 -0
  155. package/src/scss/themes/dark-red.scss +160 -0
  156. package/src/scss/themes/dark.scss +145 -0
  157. package/src/scss/themes/express.scss +281 -0
  158. package/src/scss/themes/minimal.scss +121 -0
  159. package/src/scss/utilities.scss +481 -0
  160. package/src/scss/variables/_base.scss +81 -0
  161. package/src/scss/variables/_colors.scss +148 -0
  162. package/src/scss/variables/_components.scss +509 -0
  163. package/src/scss/variables/_index.scss +13 -0
  164. package/src/scss/variables/_layout.scss +65 -0
  165. package/src/scss/variables/_spacing.scss +66 -0
  166. package/src/scss/variables/_system.scss +80 -0
  167. package/src/scss/variables/_typography.scss +37 -0
@@ -0,0 +1,209 @@
1
+ /* ========================================
2
+ Modal Components
3
+ Modal windows with overlay, sizes, and themed headers
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // ===== MODAL COMPONENTS =====
8
+
9
+ // Modal wrapper
10
+ .pa-modal {
11
+ position: fixed;
12
+ top: 0;
13
+ left: 0;
14
+ width: 100%;
15
+ height: 100%;
16
+ display: none;
17
+ justify-content: center;
18
+ align-items: center;
19
+ z-index: $z-index-modal;
20
+
21
+ &.pa-modal--show {
22
+ display: flex;
23
+ }
24
+
25
+ // Top-aligned modifier - positions modal near top instead of center
26
+ &.pa-modal--top {
27
+ align-items: flex-start;
28
+ padding-top: 5vh; // Small offset from top
29
+ }
30
+ }
31
+
32
+ // Modal backdrop (the dark overlay)
33
+ .pa-modal__backdrop {
34
+ position: fixed;
35
+ top: 0;
36
+ left: 0;
37
+ width: 100%;
38
+ height: 100%;
39
+ background-color: var(--pa-modal-overlay-bg);
40
+ z-index: $z-index-modal-backdrop;
41
+ }
42
+
43
+ // Modal container (the actual dialog)
44
+ .pa-modal__container {
45
+ background-color: var(--pa-modal-content-bg);
46
+ border-radius: $modal-border-radius;
47
+ box-shadow: $modal-box-shadow;
48
+ width: 100%;
49
+ max-width: $modal-md-width;
50
+ max-height: 90vh;
51
+ margin: $spacing-base;
52
+ position: relative;
53
+ z-index: $z-index-modal;
54
+ display: flex;
55
+ flex-direction: column;
56
+
57
+ // Size variations
58
+ &--sm {
59
+ max-width: $modal-sm-width;
60
+ }
61
+
62
+ &--lg {
63
+ max-width: $modal-lg-width;
64
+ }
65
+
66
+ &--xl {
67
+ max-width: $modal-xl-width;
68
+ }
69
+
70
+ &--xxl {
71
+ max-width: $modal-xxl-width;
72
+ }
73
+
74
+ &--fw {
75
+ max-width: calc(100vw - ($modal-fw-margin * 2));
76
+ width: calc(100vw - ($modal-fw-margin * 2));
77
+ max-height: calc(100vh - ($modal-fw-margin * 2));
78
+ margin: $modal-fw-margin;
79
+ }
80
+ }
81
+
82
+ // Modal header
83
+ .pa-modal__header {
84
+ padding: $modal-header-padding;
85
+ border-bottom: $border-width-base solid var(--pa-border-color);
86
+ border-radius: $modal-border-radius $modal-border-radius 0 0; // Match container's top corners
87
+ display: flex;
88
+ justify-content: space-between;
89
+ align-items: center;
90
+ flex-shrink: 0;
91
+ }
92
+
93
+ .pa-modal__title {
94
+ margin: 0;
95
+ font-size: $modal-title-font-size;
96
+ font-weight: $font-weight-semibold;
97
+ color: var(--pa-text-primary);
98
+ }
99
+
100
+ // Close button uses standard .pa-btn classes
101
+ // No custom styling needed - handled by button component
102
+
103
+ // Modal body
104
+ .pa-modal__body {
105
+ padding: $modal-body-padding;
106
+ flex: 1;
107
+ overflow-y: auto;
108
+ color: var(--pa-text-primary);
109
+ }
110
+
111
+ // Modal footer
112
+ .pa-modal__footer {
113
+ padding: $modal-footer-padding;
114
+ border-top: $border-width-base solid var(--pa-border-color);
115
+ display: flex;
116
+ justify-content: flex-end;
117
+ gap: $spacing-md;
118
+ flex-shrink: 0;
119
+ }
120
+
121
+ // Modal color variations
122
+ .pa-modal--primary .pa-modal__header {
123
+ background-color: var(--pa-btn-primary-bg);
124
+ color: var(--pa-modal-content-bg);
125
+ border-bottom-color: var(--pa-btn-primary-bg);
126
+
127
+ .pa-modal__title {
128
+ color: var(--pa-modal-content-bg);
129
+ }
130
+ }
131
+
132
+ .pa-modal--success .pa-modal__header {
133
+ background-color: var(--pa-btn-success-bg);
134
+ color: var(--pa-btn-success-text);
135
+ border-bottom-color: var(--pa-btn-success-bg);
136
+
137
+ .pa-modal__title {
138
+ color: var(--pa-btn-success-text);
139
+ }
140
+ }
141
+
142
+ .pa-modal--warning .pa-modal__header {
143
+ background-color: var(--pa-btn-warning-bg);
144
+ color: var(--pa-btn-warning-text);
145
+ border-bottom-color: var(--pa-btn-warning-bg);
146
+
147
+ .pa-modal__title {
148
+ color: var(--pa-btn-warning-text);
149
+ }
150
+ }
151
+
152
+ .pa-modal--danger .pa-modal__header {
153
+ background-color: var(--pa-btn-danger-bg);
154
+ color: var(--pa-btn-danger-text);
155
+ border-bottom-color: var(--pa-btn-danger-bg);
156
+
157
+ .pa-modal__title {
158
+ color: var(--pa-btn-danger-text);
159
+ }
160
+ }
161
+
162
+ // Modal scrollable content
163
+ .pa-modal__body--scrollable {
164
+ max-height: $modal-body-scrollable-max-height;
165
+ overflow-y: auto;
166
+ }
167
+
168
+ // Modal form styles use the same .pa-form-group as regular forms
169
+ // No additional styling needed - proper grid spacing handles alignment
170
+
171
+ // Modal backdrop click handling
172
+ .pa-modal[data-backdrop="static"] {
173
+ // For static modals that don't close on backdrop click
174
+ }
175
+
176
+ // Responsive modal behavior
177
+ @media (max-width: $mobile-breakpoint) {
178
+ .pa-modal__container {
179
+ margin: $modal-mobile-margin;
180
+ max-height: $modal-mobile-max-height;
181
+
182
+ &--lg,
183
+ &--xl,
184
+ &--xxl {
185
+ max-width: calc(100vw - #{$spacing-base});
186
+ }
187
+
188
+ &--fw {
189
+ --modal-fw-margin: $modal-mobile-margin;
190
+ max-width: calc(100vw - ($modal-fw-margin * 2));
191
+ width: calc(100vw - ($modal-fw-margin * 2));
192
+ max-height: calc(100vh - ($modal-fw-margin * 2));
193
+ margin: $modal-fw-margin;
194
+ }
195
+ }
196
+
197
+ .pa-modal__header {
198
+ padding: $modal-header-padding;
199
+ }
200
+
201
+ .pa-modal__body {
202
+ padding: $modal-body-padding;
203
+ }
204
+
205
+ .pa-modal__footer {
206
+ padding: $modal-footer-padding;
207
+ }
208
+ }
209
+
@@ -0,0 +1,253 @@
1
+ /* ========================================
2
+ Notification Bell Component
3
+ Bell button with badge counter and dropdown panel
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // ====================
8
+ // Notification Bell Button
9
+ // ====================
10
+
11
+ .pa-notifications {
12
+ position: relative;
13
+ flex-shrink: 0;
14
+ }
15
+
16
+ .pa-notifications__btn {
17
+ position: relative;
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ width: 3.2rem;
22
+ height: 3.2rem;
23
+ background: none;
24
+ border: none;
25
+ border-radius: $border-radius;
26
+ color: var(--pa-text-primary);
27
+ cursor: pointer;
28
+ transition: background-color $transition-fast $easing-snappy;
29
+
30
+ &:hover {
31
+ background-color: var(--pa-accent-light);
32
+ }
33
+
34
+ &:focus {
35
+ outline: $focus-outline-width solid var(--pa-accent);
36
+ outline-offset: $focus-outline-offset;
37
+ }
38
+ }
39
+
40
+ .pa-notifications__icon {
41
+ font-size: $font-size-lg;
42
+ line-height: 1;
43
+ }
44
+
45
+ // Badge counter on bell
46
+ .pa-notifications__badge {
47
+ position: absolute;
48
+ top: 0.2rem;
49
+ right: 0.2rem;
50
+ min-width: 1.6rem;
51
+ height: 1.6rem;
52
+ padding: 0 0.4rem;
53
+ background-color: $btn-danger-bg;
54
+ color: $btn-danger-text;
55
+ font-size: $font-size-2xs;
56
+ font-weight: $font-weight-semibold;
57
+ border-radius: 0.8rem;
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ line-height: 1;
62
+ }
63
+
64
+ // ====================
65
+ // Notification Panel (Dropdown)
66
+ // ====================
67
+
68
+ .pa-notifications__panel {
69
+ position: absolute;
70
+ top: calc(100% + $spacing-sm);
71
+ right: 0;
72
+ width: 35.2rem;
73
+ max-height: 44.8rem;
74
+ background-color: var(--pa-card-bg);
75
+ border: $border-width-base solid var(--pa-border-color);
76
+ border-radius: $border-radius;
77
+ box-shadow: $shadow-2xl;
78
+ z-index: $z-index-profile-panel; // Same as profile panel (5000)
79
+ display: none;
80
+ flex-direction: column;
81
+ overflow: hidden;
82
+
83
+ &.is-open {
84
+ display: flex;
85
+ }
86
+ }
87
+
88
+ // Panel header
89
+ .pa-notifications__header {
90
+ padding: $spacing-sm $spacing-base;
91
+ border-bottom: $border-width-base solid var(--pa-border-color);
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: space-between;
95
+ gap: $spacing-base;
96
+
97
+ h3 {
98
+ margin: 0;
99
+ font-size: $font-size-sm;
100
+ font-weight: $font-weight-semibold;
101
+ color: var(--pa-text-primary);
102
+ }
103
+ }
104
+
105
+ .pa-notifications__mark-read {
106
+ background: none;
107
+ border: none;
108
+ padding: 0;
109
+ color: $accent-color;
110
+ font-size: $font-size-sm;
111
+ font-weight: $font-weight-medium;
112
+ cursor: pointer;
113
+ transition: color $transition-fast $easing-snappy;
114
+
115
+ &:hover {
116
+ color: $accent-hover;
117
+ }
118
+ }
119
+
120
+ // Notification list
121
+ .pa-notifications__list {
122
+ list-style: none;
123
+ margin: 0;
124
+ padding: 0;
125
+ overflow-y: auto;
126
+ flex: 1;
127
+ }
128
+
129
+ // Individual notification item
130
+ .pa-notifications__item {
131
+ display: flex;
132
+ gap: $spacing-sm;
133
+ padding: $spacing-sm $spacing-base;
134
+ border-bottom: $border-width-base solid var(--pa-border-color);
135
+ transition: background-color $transition-fast $easing-snappy;
136
+ cursor: pointer;
137
+
138
+ &:last-child {
139
+ border-bottom: none;
140
+ }
141
+
142
+ &:hover {
143
+ background-color: var(--pa-accent-light);
144
+ }
145
+
146
+ // Unread notification (darker background)
147
+ &--unread {
148
+ background-color: rgba($accent-color, 0.05);
149
+
150
+ &:hover {
151
+ background-color: rgba($accent-color, 0.1);
152
+ }
153
+ }
154
+ }
155
+
156
+ // Icon wrapper with color variants
157
+ .pa-notifications__icon-wrapper {
158
+ width: 3.2rem;
159
+ height: 3.2rem;
160
+ flex-shrink: 0;
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: center;
164
+ border-radius: 50%;
165
+ font-size: $font-size-base;
166
+ background-color: var(--pa-accent-light);
167
+ color: var(--pa-accent);
168
+
169
+ &--primary {
170
+ background-color: rgba($btn-primary-bg, 0.1);
171
+ color: $btn-primary-bg;
172
+ }
173
+
174
+ &--success {
175
+ background-color: rgba($btn-success-bg, 0.1);
176
+ color: $btn-success-bg;
177
+ }
178
+
179
+ &--warning {
180
+ background-color: rgba($btn-warning-bg, 0.1);
181
+ color: $btn-warning-bg;
182
+ }
183
+
184
+ &--danger {
185
+ background-color: rgba($btn-danger-bg, 0.1);
186
+ color: $btn-danger-bg;
187
+ }
188
+
189
+ &--secondary {
190
+ background-color: rgba(var(--pa-text-secondary), 0.1);
191
+ color: var(--pa-text-secondary);
192
+ }
193
+ }
194
+
195
+ // Notification content
196
+ .pa-notifications__content {
197
+ flex: 1;
198
+ min-width: 0;
199
+
200
+ h4 {
201
+ margin: 0 0 0.2rem 0;
202
+ font-size: $font-size-xs;
203
+ font-weight: $font-weight-semibold;
204
+ color: var(--pa-text-primary);
205
+ }
206
+
207
+ p {
208
+ margin: 0 0 0.2rem 0;
209
+ font-size: $font-size-xs;
210
+ color: var(--pa-text-secondary);
211
+ line-height: 1.3;
212
+ overflow: hidden;
213
+ text-overflow: ellipsis;
214
+ display: -webkit-box;
215
+ -webkit-line-clamp: 2;
216
+ -webkit-box-orient: vertical;
217
+ }
218
+ }
219
+
220
+ .pa-notifications__time {
221
+ font-size: $font-size-2xs;
222
+ color: var(--pa-text-secondary);
223
+ font-weight: $font-weight-normal;
224
+ opacity: 0.7;
225
+ }
226
+
227
+ // Panel footer
228
+ .pa-notifications__footer {
229
+ padding: $spacing-sm $spacing-base;
230
+ border-top: $border-width-base solid var(--pa-border-color);
231
+ text-align: center;
232
+
233
+ a {
234
+ color: $accent-color;
235
+ font-size: $font-size-sm;
236
+ font-weight: $font-weight-medium;
237
+ text-decoration: none;
238
+ transition: color $transition-fast $easing-snappy;
239
+
240
+ &:hover {
241
+ color: $accent-hover;
242
+ }
243
+ }
244
+ }
245
+
246
+ // Responsive adjustments
247
+ @media (max-width: $mobile-breakpoint) {
248
+ .pa-notifications__panel {
249
+ width: calc(100vw - 3.2rem);
250
+ max-width: 35.2rem;
251
+ right: -$spacing-base; // Align to right edge of viewport
252
+ }
253
+ }
@@ -0,0 +1,141 @@
1
+ /* ========================================
2
+ Pager and Load More Components
3
+ Pagination controls and load more buttons
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // Pager
8
+ .pa-pager {
9
+ display: flex;
10
+ margin: $pager-button-margin 0;
11
+
12
+ // Remove margins when first/last child in card body
13
+ .pa-card__body &:first-child {
14
+ margin-top: 0;
15
+ }
16
+ .pa-card__body &:last-child {
17
+ margin-bottom: 0;
18
+ }
19
+
20
+ // Default center alignment
21
+ justify-content: center;
22
+
23
+ // Positioning modifiers
24
+ &--left {
25
+ justify-content: flex-start;
26
+ }
27
+
28
+ &--center {
29
+ justify-content: center;
30
+ }
31
+
32
+ &--right {
33
+ justify-content: flex-end;
34
+ }
35
+
36
+ &__container {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: $spacing-sm;
40
+ white-space: nowrap;
41
+ }
42
+
43
+ &__controls {
44
+ display: flex;
45
+ gap: $pager-controls-gap;
46
+ }
47
+
48
+ &__info {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: $spacing-sm;
52
+ }
53
+
54
+ &__input {
55
+ width: $pager-input-width !important;
56
+ text-align: center;
57
+ }
58
+
59
+ &__text {
60
+ color: var(--pa-text-secondary);
61
+ font-size: $font-size-sm;
62
+ }
63
+ }
64
+
65
+ // Load More
66
+ .pa-load-more {
67
+ display: flex;
68
+ margin: $spacing-base 0;
69
+
70
+ // Remove margins when first/last child in card body
71
+ .pa-card__body &:first-child {
72
+ margin-top: 0;
73
+ }
74
+ .pa-card__body &:last-child {
75
+ margin-bottom: 0;
76
+ }
77
+
78
+ // Default center alignment
79
+ justify-content: center;
80
+
81
+ // Positioning modifiers
82
+ &--left {
83
+ justify-content: flex-start;
84
+ }
85
+
86
+ &--center {
87
+ justify-content: center;
88
+ }
89
+
90
+ &--right {
91
+ justify-content: flex-end;
92
+ }
93
+
94
+ &__button {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: $spacing-sm;
98
+ padding: $btn-padding-v $btn-padding-h;
99
+ background-color: transparent;
100
+ border: $border-width-base solid var(--pa-border-color);
101
+ border-radius: $border-radius;
102
+ color: var(--pa-text-primary);
103
+ font-size: $font-size-sm;
104
+ cursor: pointer;
105
+ transition: all $transition-fast $easing-snappy;
106
+
107
+ &:hover {
108
+ border-color: var(--pa-accent);
109
+ color: var(--pa-accent);
110
+ background-color: var(--pa-accent-light);
111
+ }
112
+
113
+ &--loading {
114
+ pointer-events: none;
115
+ opacity: 0.7;
116
+
117
+ .pa-load-more__spinner {
118
+ animation: pa-spin 1s linear infinite;
119
+ }
120
+ }
121
+ }
122
+
123
+ &__spinner {
124
+ width: $spinner-size;
125
+ height: $spinner-size;
126
+ border: $spinner-border-width solid var(--pa-border-color);
127
+ border-top: $spinner-border-width solid $accent-color;
128
+ border-radius: 50%;
129
+ }
130
+
131
+ &__text {
132
+ color: inherit;
133
+ }
134
+
135
+ &__count {
136
+ color: var(--pa-text-secondary);
137
+ font-size: $font-size-xs;
138
+ margin-left: $spacing-xs;
139
+ }
140
+ }
141
+