@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,555 @@
1
+ /* ========================================
2
+ Table Components
3
+ Tables, virtual tables, with striped, hover, and spacing variants
4
+ ======================================== */
5
+ @use '../variables' as *;
6
+
7
+ // Duplicate alert definition removed - consolidated above with theme-aware colors
8
+
9
+
10
+ // Tables
11
+ .pa-table-container {
12
+ overflow-x: auto;
13
+ border-radius: $border-radius;
14
+ border: $border-width-base solid var(--pa-border-color);
15
+ background-color: var(--pa-table-bg);
16
+ }
17
+
18
+ .pa-table {
19
+ width: 100%;
20
+ border-collapse: collapse;
21
+ font-size: $font-size-sm;
22
+ background-color: var(--pa-table-bg);
23
+
24
+ th,
25
+ td {
26
+ padding: $table-padding-base-v $table-padding-base-h;
27
+ text-align: left;
28
+ border-bottom: $border-width-base solid var(--pa-border-color);
29
+ vertical-align: middle;
30
+ line-height: $line-height-tight;
31
+ }
32
+
33
+ th {
34
+ background-color: var(--pa-table-header-bg);
35
+ font-weight: $font-weight-semibold;
36
+ color: var(--pa-text-primary);
37
+ border-bottom: $border-width-medium solid var(--pa-border-color);
38
+ }
39
+
40
+ td {
41
+ color: var(--pa-text-primary);
42
+ background-color: var(--pa-table-bg);
43
+
44
+ // Buttons in table cells - negative margin to prevent row height growth
45
+ .pa-btn {
46
+ margin-top: -0.25rem;
47
+ margin-bottom: -0.25rem;
48
+ }
49
+ }
50
+
51
+ &:not(&--responsive) {
52
+ // Remove bottom border from last row
53
+ tbody tr:last-child td {
54
+ border-bottom: none;
55
+ }
56
+ }
57
+
58
+ // Striped variant
59
+ &--striped {
60
+ tbody tr:nth-child(even) td {
61
+ background-color: var(--pa-table-stripe);
62
+ }
63
+ }
64
+
65
+ // 2x spacing variant - comfortable padding (calculated from base)
66
+ &--2x {
67
+ th,
68
+ td {
69
+ padding: ($table-padding-base-v * $table-spacing-2x-multiplier)
70
+ ($table-padding-base-h * $table-spacing-2x-multiplier);
71
+ }
72
+ }
73
+
74
+ // 3x spacing variant - spacious padding (calculated from base)
75
+ &--3x {
76
+ th,
77
+ td {
78
+ padding: ($table-padding-base-v * $table-spacing-3x-multiplier)
79
+ ($table-padding-base-h * $table-spacing-3x-multiplier);
80
+ }
81
+ }
82
+
83
+ // Hover effects
84
+ tbody tr {
85
+ // Setup for hover accent border
86
+ @if $table-hover-accent-width > 0 {
87
+ border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
88
+ transition: border-color $transition-normal $easing-smooth;
89
+ }
90
+ }
91
+
92
+ tbody tr:hover {
93
+ background-color: var(--pa-table-hover-bg);
94
+
95
+ // Apply hover accent if enabled
96
+ @if $table-hover-accent-width > 0 {
97
+ border-#{$table-hover-accent-position}-color: var(--pa-table-hover-accent-color);
98
+ }
99
+ }
100
+
101
+ tbody tr:hover td {
102
+ background-color: var(--pa-table-hover-bg);
103
+ }
104
+
105
+ // Remove margin from button groups inside table cells
106
+ td .pa-btn-group {
107
+ margin-bottom: 0;
108
+ flex-wrap: nowrap; // Keep buttons in a row, don't stack vertically
109
+ }
110
+
111
+ // Column width helper - auto-width columns that shrink to content
112
+ .col-auto {
113
+ width: 1%;
114
+ white-space: nowrap;
115
+ }
116
+ }
117
+
118
+ // Pager
119
+ .pa-pager {
120
+ display: flex;
121
+ margin: $pager-button-margin 0;
122
+
123
+ // Remove margins when first/last child in card body
124
+ .pa-card__body &:first-child {
125
+ margin-top: 0;
126
+ }
127
+ .pa-card__body &:last-child {
128
+ margin-bottom: 0;
129
+ }
130
+
131
+ // Default center alignment
132
+ justify-content: center;
133
+
134
+ // Positioning modifiers
135
+ &--left {
136
+ justify-content: flex-start;
137
+ }
138
+
139
+ &--center {
140
+ justify-content: center;
141
+ }
142
+
143
+ &--right {
144
+ justify-content: flex-end;
145
+ }
146
+
147
+ &__container {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: $spacing-sm;
151
+ white-space: nowrap;
152
+ }
153
+
154
+ &__controls {
155
+ display: flex;
156
+ gap: $pager-controls-gap;
157
+ }
158
+
159
+ &__info {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: $spacing-sm;
163
+ }
164
+
165
+ &__input {
166
+ width: $pager-input-width !important;
167
+ text-align: center;
168
+ }
169
+
170
+ &__text {
171
+ color: var(--pa-text-secondary);
172
+ font-size: $font-size-sm;
173
+ }
174
+ }
175
+
176
+ // Load More
177
+ .pa-load-more {
178
+ display: flex;
179
+ margin: $spacing-base 0;
180
+
181
+ // Remove margins when first/last child in card body
182
+ .pa-card__body &:first-child {
183
+ margin-top: 0;
184
+ }
185
+ .pa-card__body &:last-child {
186
+ margin-bottom: 0;
187
+ }
188
+
189
+ // Default center alignment
190
+ justify-content: center;
191
+
192
+ // Positioning modifiers
193
+ &--left {
194
+ justify-content: flex-start;
195
+ }
196
+
197
+ &--center {
198
+ justify-content: center;
199
+ }
200
+
201
+ &--right {
202
+ justify-content: flex-end;
203
+ }
204
+
205
+ &__button {
206
+ display: flex;
207
+ align-items: center;
208
+ gap: $spacing-sm;
209
+ padding: $btn-padding-v $btn-padding-h;
210
+ background-color: transparent;
211
+ border: $border-width-base solid var(--pa-border-color);
212
+ border-radius: $border-radius;
213
+ color: var(--pa-text-primary);
214
+ font-size: $font-size-sm;
215
+ cursor: pointer;
216
+ transition: all $transition-fast $easing-snappy;
217
+
218
+ &:hover {
219
+ border-color: var(--pa-accent);
220
+ color: var(--pa-accent);
221
+ background-color: var(--pa-accent-light);
222
+ }
223
+
224
+ &--loading {
225
+ pointer-events: none;
226
+ opacity: 0.7;
227
+
228
+ .pa-load-more__spinner {
229
+ animation: pa-spin 1s linear infinite;
230
+ }
231
+ }
232
+ }
233
+
234
+ &__spinner {
235
+ width: $spinner-size;
236
+ height: $spinner-size;
237
+ border: $spinner-border-width solid var(--pa-border-color);
238
+ border-top: $spinner-border-width solid var(--pa-accent);
239
+ border-radius: 50%;
240
+ }
241
+
242
+ &__text {
243
+ color: inherit;
244
+ }
245
+
246
+ &__count {
247
+ color: var(--pa-text-secondary);
248
+ font-size: $font-size-xs;
249
+ margin-left: $spacing-xs;
250
+ }
251
+ }
252
+
253
+ // Virtual Table Styles
254
+ .pa-virtual-table {
255
+ border: $border-width-base solid var(--pa-border-color);
256
+ border-radius: $border-radius;
257
+ height: $chart-height;
258
+ overflow: auto;
259
+ position: relative;
260
+ background-color: var(--pa-table-bg);
261
+ font-size: $font-size-sm; // Match pa-table font size
262
+ }
263
+
264
+ .pa-virtual-table__header {
265
+ display: grid;
266
+ grid-template-columns: $dashboard-grid-col-sm 1fr 1fr $dashboard-grid-col-lg $dashboard-grid-col-md $dashboard-grid-col-md;
267
+ background: var(--pa-table-header-bg);
268
+ border-bottom: $border-width-medium solid var(--pa-border-color);
269
+ position: sticky;
270
+ top: 0;
271
+ z-index: 10;
272
+ }
273
+
274
+ .pa-virtual-table__header-cell {
275
+ padding: $virtual-table-cell-padding-v $virtual-table-cell-padding-h;
276
+ font-weight: $font-weight-semibold;
277
+ border-right: $border-width-base solid var(--pa-border-color);
278
+ background: var(--pa-table-header-bg);
279
+ color: var(--pa-text-primary);
280
+ }
281
+
282
+ .pa-virtual-table__header-cell:last-child {
283
+ border-right: none;
284
+ }
285
+
286
+ .pa-virtual-table__body {
287
+ position: relative;
288
+ }
289
+
290
+ .pa-virtual-table__row {
291
+ display: grid;
292
+ grid-template-columns: $dashboard-grid-col-sm 1fr 1fr $dashboard-grid-col-lg $dashboard-grid-col-md $dashboard-grid-col-md;
293
+ border-bottom: $border-width-base solid var(--pa-border-color);
294
+ background: var(--pa-table-bg);
295
+
296
+ // Setup for hover accent border (same as pa-table)
297
+ @if $table-hover-accent-width > 0 {
298
+ border-#{$table-hover-accent-position}: #{$table-hover-accent-width} solid transparent;
299
+ transition: border-color $transition-normal $easing-smooth;
300
+ }
301
+ }
302
+
303
+ .pa-virtual-table__row:nth-child(even) {
304
+ background: var(--pa-table-stripe);
305
+ }
306
+
307
+ .pa-virtual-table__row:hover {
308
+ background: var(--pa-table-hover-bg);
309
+
310
+ // Apply hover accent if enabled (same as pa-table)
311
+ @if $table-hover-accent-width > 0 {
312
+ border-#{$table-hover-accent-position}-color: var(--pa-table-hover-accent-color);
313
+ }
314
+ }
315
+
316
+ .pa-virtual-table__cell {
317
+ padding: $virtual-table-cell-padding-v $virtual-table-cell-padding-h;
318
+ border-right: $border-width-base solid var(--pa-border-color);
319
+ overflow: hidden;
320
+ text-overflow: ellipsis;
321
+ white-space: nowrap;
322
+ color: var(--pa-text-primary);
323
+ background-color: inherit;
324
+ }
325
+
326
+ .pa-virtual-table__cell:last-child {
327
+ border-right: none;
328
+ }
329
+
330
+ // Responsive Tables - Stackable Layout
331
+ .pa-table--responsive {
332
+ // Between tablet and mobile: Enable horizontal scrolling
333
+ @media (max-width: $tablet-breakpoint) and (min-width: $table-responsive-breakpoint + 1) {
334
+ // Table becomes scrollable but maintains desktop layout
335
+ overflow-x: auto;
336
+ -webkit-overflow-scrolling: touch; // Smooth scrolling on iOS
337
+
338
+ // Show subtle scroll hint with border
339
+ border-left: $border-width-base solid var(--pa-border-color);
340
+ border-right: $border-width-base solid var(--pa-border-color);
341
+ }
342
+
343
+ // Mobile: Stack into cards
344
+ @media (max-width: $table-responsive-breakpoint) {
345
+ // Hide table headers
346
+ thead {
347
+ display: none;
348
+ }
349
+
350
+ // Make each row a card
351
+ tbody tr {
352
+ display: block;
353
+ margin-bottom: $table-responsive-card-margin;
354
+ border: $border-width-base solid var(--pa-border-color);
355
+ border-radius: $border-radius;
356
+ overflow: hidden;
357
+
358
+ // Reset hover accent border for mobile
359
+ @if $table-hover-accent-width > 0 {
360
+ border-#{$table-hover-accent-position}: $border-width-base solid var(--pa-border-color) !important;
361
+ }
362
+
363
+ &:last-child {
364
+ margin-bottom: 0;
365
+ }
366
+ }
367
+
368
+ // Make each cell a row within the card
369
+ tbody td {
370
+ display: block;
371
+ text-align: right;
372
+ padding: $table-responsive-card-padding;
373
+ position: relative;
374
+ border-bottom: $border-width-base solid var(--pa-border-color);
375
+
376
+ // Last cell in row has no border
377
+ &:last-child {
378
+ border-bottom: none;
379
+ }
380
+
381
+ // Label before content
382
+ &::before {
383
+ content: attr(data-label);
384
+ position: absolute;
385
+ left: $table-responsive-card-padding;
386
+ top: $table-responsive-card-padding;
387
+ font-weight: $table-responsive-label-font-weight;
388
+ text-align: left;
389
+ width: $table-responsive-label-width;
390
+ }
391
+
392
+ // Value aligned to the right
393
+ padding-left: calc($table-responsive-label-width + $table-responsive-card-padding * 2);
394
+ }
395
+
396
+ // Disable col-auto effect in responsive view
397
+ .col-auto {
398
+ width: auto;
399
+ white-space: normal;
400
+ }
401
+
402
+ // Striped variant - apply background to entire row (card)
403
+ &.pa-table--striped tbody tr:nth-child(even) {
404
+ background-color: var(--pa-table-stripe);
405
+ }
406
+
407
+ // Ensure cells inside striped rows have transparent background
408
+ &.pa-table--striped tbody tr:nth-child(even) td {
409
+ background-color: transparent;
410
+ }
411
+
412
+ // Hover effect on the card
413
+ tbody tr:hover {
414
+ background-color: transparent;
415
+ box-shadow: $shadow-sm;
416
+ }
417
+
418
+ tbody tr:hover td {
419
+ background-color: transparent;
420
+ }
421
+ }
422
+ }
423
+
424
+ // Responsive Tables - CSS Grid Layout
425
+ // Allows custom grid layouts on mobile instead of simple stacking
426
+ .pa-table--responsive-grid {
427
+ // Between tablet and mobile: Enable horizontal scrolling
428
+ @media (max-width: $tablet-breakpoint) and (min-width: $table-responsive-breakpoint + 1) {
429
+ display: block;
430
+ overflow-x: auto;
431
+ -webkit-overflow-scrolling: touch;
432
+ border-left: $border-width-base solid var(--pa-border-color);
433
+ border-right: $border-width-base solid var(--pa-border-color);
434
+ }
435
+
436
+ // Mobile: CSS Grid layout
437
+ @media (max-width: $table-responsive-breakpoint) {
438
+ thead {
439
+ display: none;
440
+ }
441
+
442
+ tbody tr {
443
+ display: block;
444
+ margin-bottom: $table-responsive-card-margin;
445
+ border: $border-width-base solid var(--pa-border-color);
446
+ border-radius: $border-radius;
447
+ overflow: hidden;
448
+
449
+ &:last-child {
450
+ margin-bottom: 0;
451
+ }
452
+ }
453
+
454
+ tbody td {
455
+ display: block;
456
+ padding: $table-responsive-card-padding;
457
+ border-bottom: $border-width-base solid var(--pa-border-color);
458
+
459
+ &:last-child {
460
+ border-bottom: none;
461
+ }
462
+
463
+ // Label above content (block layout by default)
464
+ &::before {
465
+ content: attr(data-label);
466
+ display: block;
467
+ font-weight: $table-responsive-label-font-weight;
468
+ color: var(--pa-text-secondary);
469
+ font-size: $font-size-xs;
470
+ margin-bottom: $spacing-xs;
471
+ text-transform: uppercase;
472
+ letter-spacing: 0.5px;
473
+ }
474
+ }
475
+
476
+ // Grid container modifier - apply to tbody tr
477
+ // Usage: Add data-grid class to <tr> elements that need custom grid
478
+ tbody tr[data-grid] {
479
+ display: grid;
480
+ padding: $table-responsive-card-padding;
481
+ gap: $table-responsive-card-padding;
482
+ }
483
+
484
+ // Grid cell modifier - cells within grid container
485
+ tbody tr[data-grid] td {
486
+ padding: 0;
487
+ border: none;
488
+
489
+ &::before {
490
+ margin-bottom: $spacing-xs;
491
+ }
492
+ }
493
+
494
+ // Predefined grid layouts
495
+ // 2-column grid: data-grid="2"
496
+ tbody tr[data-grid="2"] {
497
+ grid-template-columns: 1fr 1fr;
498
+ }
499
+
500
+ // 3-column grid: data-grid="3"
501
+ tbody tr[data-grid="3"] {
502
+ grid-template-columns: 1fr 1fr 1fr;
503
+ }
504
+
505
+ // Span helpers for custom layouts
506
+ // Use data-span="2" on td to span 2 columns
507
+ tbody tr[data-grid] td[data-span="2"] {
508
+ grid-column: span 2;
509
+ }
510
+
511
+ tbody tr[data-grid] td[data-span="3"] {
512
+ grid-column: span 3;
513
+ }
514
+
515
+ tbody tr[data-grid] td[data-span="full"] {
516
+ grid-column: 1 / -1; // Span all columns
517
+ }
518
+
519
+ // Disable col-auto effect in responsive view
520
+ .col-auto {
521
+ width: auto;
522
+ white-space: normal;
523
+ }
524
+
525
+ // Striped variant - apply background to entire row (card)
526
+ &.pa-table--striped tbody tr:nth-child(even) {
527
+ background-color: var(--pa-table-stripe);
528
+ }
529
+
530
+ // Ensure cells inside striped rows have transparent background
531
+ &.pa-table--striped tbody tr:nth-child(even) td {
532
+ background-color: transparent;
533
+ }
534
+
535
+ // Hover effect
536
+ tbody tr:hover {
537
+ background-color: transparent;
538
+ box-shadow: $shadow-sm;
539
+ }
540
+ }
541
+ }
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
+