vs-datatable 0.1.1 → 0.3.0

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.
@@ -0,0 +1,416 @@
1
+ /* ===========================================
2
+ VsDataTable - Base Styles (Library Independent)
3
+ =========================================== */
4
+
5
+ /* CSS Custom Properties for Easy Customization */
6
+ :root {
7
+ /* Colors */
8
+ --vs-primary: #007bff;
9
+ --vs-secondary: #6c757d;
10
+ --vs-success: #28a745;
11
+ --vs-danger: #dc3545;
12
+ --vs-warning: #ffc107;
13
+ --vs-info: #17a2b8;
14
+ --vs-light: #f8f9fa;
15
+ --vs-dark: #343a40;
16
+
17
+ /* Table Colors */
18
+ --vs-table-bg: #ffffff;
19
+ --vs-table-border: #dee2e6;
20
+ --vs-table-header-bg: #f8f9fa;
21
+ --vs-table-header-color: #495057;
22
+ --vs-table-hover-bg: #f5f5f5;
23
+ --vs-table-stripe-bg: #fafafa;
24
+
25
+ /* Typography */
26
+ --vs-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
27
+ --vs-font-size: 14px;
28
+ --vs-font-size-sm: 12px;
29
+ --vs-font-size-lg: 16px;
30
+ --vs-font-weight-normal: 400;
31
+ --vs-font-weight-bold: 600;
32
+
33
+ /* Spacing */
34
+ --vs-spacing-xs: 4px;
35
+ --vs-spacing-sm: 8px;
36
+ --vs-spacing-md: 16px;
37
+ --vs-spacing-lg: 24px;
38
+ --vs-spacing-xl: 32px;
39
+
40
+ /* Border Radius */
41
+ --vs-border-radius: 4px;
42
+ --vs-border-radius-sm: 2px;
43
+ --vs-border-radius-lg: 8px;
44
+
45
+ /* Shadows */
46
+ --vs-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
47
+ --vs-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
48
+ --vs-shadow-lg: 0 4px 8px rgba(0, 0, 0, 0.15);
49
+
50
+ /* Transitions */
51
+ --vs-transition: all 0.2s ease-in-out;
52
+ --vs-transition-fast: all 0.15s ease-in-out;
53
+
54
+ /* Z-index */
55
+ --vs-z-dropdown: 1000;
56
+ --vs-z-sticky: 1020;
57
+ --vs-z-fixed: 1030;
58
+ --vs-z-modal: 1040;
59
+ --vs-z-popover: 1050;
60
+ --vs-z-tooltip: 1060;
61
+ }
62
+
63
+ /* Reset and Base Styles */
64
+ .vs-datatable {
65
+ font-family: var(--vs-font-family);
66
+ font-size: var(--vs-font-size);
67
+ line-height: 1.5;
68
+ color: var(--vs-dark);
69
+ background-color: var(--vs-table-bg);
70
+ box-sizing: border-box;
71
+
72
+ *,
73
+ *::before,
74
+ *::after {
75
+ box-sizing: border-box;
76
+ }
77
+ }
78
+
79
+ /* Table Container */
80
+ .vs-table-container {
81
+ position: relative;
82
+ background-color: var(--vs-table-bg);
83
+ border: 1px solid var(--vs-table-border);
84
+ border-radius: var(--vs-border-radius);
85
+ overflow: hidden;
86
+ box-shadow: var(--vs-shadow-sm);
87
+ }
88
+
89
+ /* Table Styles */
90
+ .vs-table {
91
+ width: 100%;
92
+ margin: 0;
93
+ border-collapse: separate;
94
+ border-spacing: 0;
95
+ background-color: var(--vs-table-bg);
96
+
97
+ thead {
98
+ background-color: var(--vs-table-header-bg);
99
+
100
+ th {
101
+ padding: var(--vs-spacing-sm);
102
+ font-weight: var(--vs-font-weight-bold);
103
+ color: var(--vs-table-header-color);
104
+ text-align: left;
105
+ vertical-align: middle;
106
+ border-bottom: 2px solid var(--vs-table-border);
107
+ position: relative;
108
+ user-select: none;
109
+
110
+ &:first-child {
111
+ border-top-left-radius: var(--vs-border-radius);
112
+ }
113
+
114
+ &:last-child {
115
+ border-top-right-radius: var(--vs-border-radius);
116
+ }
117
+ }
118
+ }
119
+
120
+ tbody {
121
+ tr {
122
+ transition: var(--vs-transition-fast);
123
+ border-bottom: 1px solid var(--vs-table-border);
124
+
125
+ &:hover {
126
+ background-color: var(--vs-table-hover-bg);
127
+ }
128
+
129
+ &:nth-child(even) {
130
+ background-color: var(--vs-table-stripe-bg);
131
+ }
132
+
133
+ &:last-child {
134
+ border-bottom: none;
135
+ }
136
+
137
+ td {
138
+ padding: var(--vs-spacing-md);
139
+ vertical-align: middle;
140
+ border-right: 1px solid var(--vs-table-border);
141
+
142
+ &:last-child {
143
+ border-right: none;
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+ /* Sortable Headers */
151
+ .vs-sortable {
152
+ cursor: pointer;
153
+ position: relative;
154
+
155
+ &:hover {
156
+ background-color: rgba(var(--vs-primary), 0.1);
157
+ }
158
+
159
+ .vs-sort-icons {
160
+ display: inline-flex;
161
+ flex-direction: column;
162
+ margin-left: var(--vs-spacing-sm);
163
+ vertical-align: middle;
164
+
165
+ .vs-sort-icon {
166
+ font-size: 10px;
167
+ line-height: 1;
168
+ color: var(--vs-secondary);
169
+ transition: var(--vs-transition-fast);
170
+ margin: -8px 0;
171
+
172
+ &.vs-sort-asc,
173
+ &.vs-sort-desc {
174
+ color: var(--vs-primary);
175
+ }
176
+ }
177
+
178
+ .vs-sort-icon svg {
179
+ fill: #e3e3e3; // default color
180
+ }
181
+
182
+ .vs-sort-icon.vs-active svg {
183
+ fill: currentColor; // use inherited text color when active
184
+ }
185
+ }
186
+
187
+ .vs-sort-priority {
188
+ display: inline-block;
189
+ background-color: var(--vs-primary);
190
+ color: white;
191
+ font-size: 10px;
192
+ padding: 2px 6px;
193
+ border-radius: var(--vs-border-radius-sm);
194
+ margin-left: var(--vs-spacing-sm);
195
+ font-weight: var(--vs-font-weight-bold);
196
+ }
197
+ }
198
+
199
+ /* Loading State */
200
+ .vs-loading {
201
+ display: flex;
202
+ align-items: center;
203
+ justify-content: center;
204
+ padding: var(--vs-spacing-xl);
205
+ color: var(--vs-secondary);
206
+
207
+ .vs-spinner {
208
+ width: 20px;
209
+ height: 20px;
210
+ border: 2px solid var(--vs-table-border);
211
+ border-top: 2px solid var(--vs-primary);
212
+ border-radius: 50%;
213
+ animation: vs-spin 1s linear infinite;
214
+ margin-right: var(--vs-spacing-sm);
215
+ }
216
+ }
217
+
218
+ @keyframes vs-spin {
219
+ 0% { transform: rotate(0deg); }
220
+ 100% { transform: rotate(360deg); }
221
+ }
222
+
223
+ /* No Data State */
224
+ .vs-no-data {
225
+ text-align: center;
226
+ padding: var(--vs-spacing-xl);
227
+ color: var(--vs-secondary);
228
+
229
+ .vs-no-data-icon {
230
+ width: 60px;
231
+ height: 60px;
232
+ margin: 0 auto var(--vs-spacing-md);
233
+ opacity: 0.5;
234
+ }
235
+
236
+ .vs-no-data-message {
237
+ font-size: var(--vs-font-size-lg);
238
+ font-weight: var(--vs-font-weight-bold);
239
+ margin-bottom: var(--vs-spacing-sm);
240
+ }
241
+
242
+ .vs-no-data-description {
243
+ font-size: var(--vs-font-size-sm);
244
+ color: var(--vs-secondary);
245
+ }
246
+ }
247
+
248
+ /* Search Component */
249
+ .vs-search {
250
+ position: relative;
251
+ margin-bottom: var(--vs-spacing-md);
252
+
253
+ .vs-search-input {
254
+ width: 100%;
255
+ padding: var(--vs-spacing-sm) var(--vs-spacing-md);
256
+ padding-left: 40px;
257
+ border: 1px solid var(--vs-table-border);
258
+ border-radius: var(--vs-border-radius);
259
+ font-size: var(--vs-font-size);
260
+ transition: var(--vs-transition-fast);
261
+
262
+ &:focus {
263
+ outline: none;
264
+ border-color: var(--vs-primary);
265
+ box-shadow: 0 0 0 2px rgba(var(--vs-primary), 0.25);
266
+ }
267
+ }
268
+
269
+ .vs-search-icon {
270
+ position: absolute;
271
+ left: var(--vs-spacing-md);
272
+ top: 50%;
273
+ transform: translateY(-50%);
274
+ color: var(--vs-secondary);
275
+ pointer-events: none;
276
+ }
277
+ }
278
+
279
+ /* Pagination */
280
+ .vs-pagination {
281
+ display: flex;
282
+ align-items: center;
283
+ justify-content: center;
284
+ gap: var(--vs-spacing-sm);
285
+ margin-top: var(--vs-spacing-md);
286
+
287
+ .vs-pagination-button {
288
+ display: inline-flex;
289
+ align-items: center;
290
+ justify-content: center;
291
+ min-width: 32px;
292
+ height: 32px;
293
+ padding: 0 var(--vs-spacing-sm);
294
+ border: 1px solid var(--vs-table-border);
295
+ background-color: var(--vs-table-bg);
296
+ color: var(--vs-dark);
297
+ text-decoration: none;
298
+ border-radius: var(--vs-border-radius);
299
+ font-size: var(--vs-font-size-sm);
300
+ transition: var(--vs-transition-fast);
301
+ cursor: pointer;
302
+
303
+ &:hover:not(:disabled) {
304
+ background-color: var(--vs-table-hover-bg);
305
+ border-color: var(--vs-primary);
306
+ }
307
+
308
+ &.vs-active {
309
+ background-color: var(--vs-primary);
310
+ border-color: var(--vs-primary);
311
+ color: white;
312
+ }
313
+
314
+ &:disabled {
315
+ opacity: 0.5;
316
+ cursor: not-allowed;
317
+ }
318
+ }
319
+
320
+ .vs-pagination-ellipsis {
321
+ color: var(--vs-secondary);
322
+ padding: 0 var(--vs-spacing-sm);
323
+ }
324
+ }
325
+
326
+ /* Row Selection */
327
+ .vs-checkbox {
328
+ display: inline-flex;
329
+ align-items: center;
330
+ cursor: pointer;
331
+
332
+ input[type="checkbox"] {
333
+ width: 16px;
334
+ height: 16px;
335
+ margin: 0;
336
+ cursor: pointer;
337
+ accent-color: var(--vs-primary);
338
+ }
339
+
340
+ label {
341
+ margin: 0;
342
+ cursor: pointer;
343
+ font-size: var(--vs-font-size-sm);
344
+ }
345
+ }
346
+
347
+ /* Responsive Design */
348
+ @media (max-width: 768px) {
349
+ .vs-table-container {
350
+ overflow-x: auto;
351
+ }
352
+
353
+ .vs-table {
354
+ min-width: 600px;
355
+ }
356
+
357
+ .vs-pagination {
358
+ flex-wrap: wrap;
359
+ gap: var(--vs-spacing-xs);
360
+
361
+ .vs-pagination-button {
362
+ min-width: 28px;
363
+ height: 28px;
364
+ font-size: 12px;
365
+ }
366
+ }
367
+ }
368
+
369
+ /* Utility Classes */
370
+ .vs-text-center { text-align: center; }
371
+ .vs-text-left { text-align: left; }
372
+ .vs-text-right { text-align: right; }
373
+ .vs-text-muted { color: var(--vs-secondary); }
374
+ .vs-text-primary { color: var(--vs-primary); }
375
+ .vs-text-success { color: var(--vs-success); }
376
+ .vs-text-danger { color: var(--vs-danger); }
377
+ .vs-text-warning { color: var(--vs-warning); }
378
+
379
+ .vs-bg-primary { background-color: var(--vs-primary); }
380
+ .vs-bg-success { background-color: var(--vs-success); }
381
+ .vs-bg-danger { background-color: var(--vs-danger); }
382
+ .vs-bg-warning { background-color: var(--vs-warning); }
383
+ .vs-bg-light { background-color: var(--vs-light); }
384
+
385
+ .vs-border { border: 1px solid var(--vs-table-border); }
386
+ .vs-border-top { border-top: 1px solid var(--vs-table-border); }
387
+ .vs-border-bottom { border-bottom: 1px solid var(--vs-table-border); }
388
+ .vs-border-left { border-left: 1px solid var(--vs-table-border); }
389
+ .vs-border-right { border-right: 1px solid var(--vs-table-border); }
390
+
391
+ .vs-rounded { border-radius: var(--vs-border-radius); }
392
+ .vs-rounded-sm { border-radius: var(--vs-border-radius-sm); }
393
+ .vs-rounded-lg { border-radius: var(--vs-border-radius-lg); }
394
+
395
+ .vs-shadow { box-shadow: var(--vs-shadow); }
396
+ .vs-shadow-sm { box-shadow: var(--vs-shadow-sm); }
397
+ .vs-shadow-lg { box-shadow: var(--vs-shadow-lg); }
398
+
399
+ /* Animation Classes */
400
+ .vs-fade-in {
401
+ animation: vs-fade-in 0.3s ease-in-out;
402
+ }
403
+
404
+ @keyframes vs-fade-in {
405
+ from { opacity: 0; transform: translateY(-10px); }
406
+ to { opacity: 1; transform: translateY(0); }
407
+ }
408
+
409
+ .vs-slide-in {
410
+ animation: vs-slide-in 0.3s ease-in-out;
411
+ }
412
+
413
+ @keyframes vs-slide-in {
414
+ from { transform: translateX(-20px); opacity: 0; }
415
+ to { transform: translateX(0); opacity: 1; }
416
+ }
@@ -1,2 +1,2 @@
1
- @import "bootstrap/scss/bootstrap";
2
- @import "./datatable.scss";
1
+ @use "./base";
2
+ @use "./themes";
@@ -0,0 +1,215 @@
1
+ /* ===========================================
2
+ VsDataTable - Theme Examples
3
+ =========================================== */
4
+
5
+ /* Dark Theme */
6
+ .vs-datatable.vs-theme-dark {
7
+ --vs-primary: #0d6efd;
8
+ --vs-secondary: #6c757d;
9
+ --vs-success: #198754;
10
+ --vs-danger: #dc3545;
11
+ --vs-warning: #ffc107;
12
+ --vs-info: #0dcaf0;
13
+ --vs-light: #f8f9fa;
14
+ --vs-dark: #212529;
15
+
16
+ --vs-table-bg: #1a1a1a;
17
+ --vs-table-border: #333333;
18
+ --vs-table-header-bg: #2d2d2d;
19
+ --vs-table-header-color: #ffffff;
20
+ --vs-table-hover-bg: #333333;
21
+ --vs-table-stripe-bg: #222222;
22
+
23
+ color: #ffffff;
24
+ background-color: var(--vs-table-bg);
25
+ }
26
+
27
+ /* Minimal Theme */
28
+ .vs-datatable.vs-theme-minimal {
29
+ --vs-primary: #000000;
30
+ --vs-secondary: #666666;
31
+ --vs-success: #000000;
32
+ --vs-danger: #000000;
33
+ --vs-warning: #000000;
34
+ --vs-info: #000000;
35
+ --vs-light: #f9f9f9;
36
+ --vs-dark: #000000;
37
+
38
+ --vs-table-bg: #ffffff;
39
+ --vs-table-border: #e0e0e0;
40
+ --vs-table-header-bg: #ffffff;
41
+ --vs-table-header-color: #000000;
42
+ --vs-table-hover-bg: #f5f5f5;
43
+ --vs-table-stripe-bg: #ffffff;
44
+
45
+ .vs-table {
46
+ border: none;
47
+ box-shadow: none;
48
+ }
49
+
50
+ .vs-table thead th {
51
+ border-bottom: 2px solid var(--vs-table-border);
52
+ font-weight: 500;
53
+ }
54
+
55
+ .vs-table tbody tr {
56
+ border-bottom: 1px solid var(--vs-table-border);
57
+ }
58
+ }
59
+
60
+ /* Colorful Theme */
61
+ .vs-datatable.vs-theme-colorful {
62
+ --vs-primary: #e91e63;
63
+ --vs-secondary: #9c27b0;
64
+ --vs-success: #4caf50;
65
+ --vs-danger: #f44336;
66
+ --vs-warning: #ff9800;
67
+ --vs-info: #2196f3;
68
+ --vs-light: #f3e5f5;
69
+ --vs-dark: #2e2e2e;
70
+
71
+ --vs-table-bg: #ffffff;
72
+ --vs-table-border: #e1bee7;
73
+ --vs-table-header-bg: linear-gradient(135deg, #e91e63, #9c27b0);
74
+ --vs-table-header-color: #ffffff;
75
+ --vs-table-hover-bg: #f3e5f5;
76
+ --vs-table-stripe-bg: #fafafa;
77
+
78
+ .vs-table thead th {
79
+ background: var(--vs-table-header-bg);
80
+ color: var(--vs-table-header-color);
81
+ font-weight: 600;
82
+ }
83
+
84
+ .vs-pagination-button.vs-active {
85
+ background: linear-gradient(135deg, var(--vs-primary), var(--vs-secondary));
86
+ }
87
+ }
88
+
89
+ /* Corporate Theme */
90
+ .vs-datatable.vs-theme-corporate {
91
+ --vs-primary: #1e3a8a;
92
+ --vs-secondary: #64748b;
93
+ --vs-success: #059669;
94
+ --vs-danger: #dc2626;
95
+ --vs-warning: #d97706;
96
+ --vs-info: #0891b2;
97
+ --vs-light: #f8fafc;
98
+ --vs-dark: #1e293b;
99
+
100
+ --vs-table-bg: #ffffff;
101
+ --vs-table-border: #e2e8f0;
102
+ --vs-table-header-bg: #f1f5f9;
103
+ --vs-table-header-color: #334155;
104
+ --vs-table-hover-bg: #f8fafc;
105
+ --vs-table-stripe-bg: #ffffff;
106
+
107
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
108
+
109
+ .vs-table {
110
+ border-radius: 8px;
111
+ overflow: hidden;
112
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
113
+ }
114
+
115
+ .vs-table thead th {
116
+ font-size: 13px;
117
+ font-weight: 600;
118
+ text-transform: uppercase;
119
+ letter-spacing: 0.05em;
120
+ padding: 16px 20px;
121
+ }
122
+
123
+ .vs-table tbody td {
124
+ padding: 16px 20px;
125
+ font-size: 14px;
126
+ }
127
+ }
128
+
129
+ /* Compact Theme */
130
+ .vs-datatable.vs-theme-compact {
131
+ --vs-spacing-xs: 2px;
132
+ --vs-spacing-sm: 4px;
133
+ --vs-spacing-md: 8px;
134
+ --vs-spacing-lg: 12px;
135
+ --vs-spacing-xl: 16px;
136
+
137
+ --vs-font-size: 12px;
138
+ --vs-font-size-sm: 10px;
139
+ --vs-font-size-lg: 14px;
140
+
141
+ .vs-table thead th {
142
+ padding: var(--vs-spacing-sm) var(--vs-spacing-md);
143
+ font-size: var(--vs-font-size-sm);
144
+ }
145
+
146
+ .vs-table tbody td {
147
+ padding: var(--vs-spacing-sm) var(--vs-spacing-md);
148
+ font-size: var(--vs-font-size);
149
+ }
150
+
151
+ .vs-pagination-button {
152
+ min-width: 24px;
153
+ height: 24px;
154
+ font-size: var(--vs-font-size-sm);
155
+ }
156
+ }
157
+
158
+ /* Rounded Theme */
159
+ .vs-datatable.vs-theme-rounded {
160
+ --vs-border-radius: 12px;
161
+ --vs-border-radius-sm: 6px;
162
+ --vs-border-radius-lg: 16px;
163
+
164
+ .vs-table-container {
165
+ border-radius: var(--vs-border-radius);
166
+ overflow: hidden;
167
+ }
168
+
169
+ .vs-table thead th:first-child {
170
+ border-top-left-radius: var(--vs-border-radius);
171
+ }
172
+
173
+ .vs-table thead th:last-child {
174
+ border-top-right-radius: var(--vs-border-radius);
175
+ }
176
+
177
+ .vs-pagination-button {
178
+ border-radius: var(--vs-border-radius-sm);
179
+ }
180
+ }
181
+
182
+ /* Custom Brand Theme Example */
183
+ .vs-datatable.vs-theme-brand {
184
+ /* Brand Colors */
185
+ --vs-primary: #ff6b35;
186
+ --vs-secondary: #004e89;
187
+ --vs-success: #00a896;
188
+ --vs-danger: #e63946;
189
+ --vs-warning: #f77f00;
190
+ --vs-info: #06a77d;
191
+
192
+ /* Custom Brand Styling */
193
+ .vs-table-container {
194
+ border: 2px solid var(--vs-primary);
195
+ border-radius: 16px;
196
+ box-shadow: 0 8px 32px rgba(255, 107, 53, 0.2);
197
+ }
198
+
199
+ .vs-table thead th {
200
+ background: linear-gradient(135deg, var(--vs-primary), var(--vs-secondary));
201
+ color: white;
202
+ font-weight: 700;
203
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
204
+ }
205
+
206
+ .vs-pagination-button.vs-active {
207
+ background: var(--vs-primary);
208
+ transform: scale(1.05);
209
+ }
210
+
211
+ .vs-pagination-button:hover:not(:disabled) {
212
+ border-color: var(--vs-primary);
213
+ transform: translateY(-1px);
214
+ }
215
+ }
@@ -1,7 +0,0 @@
1
- // 1. Override Bootstrap variables BEFORE importing
2
- $primary: #4CAF50; // Example: change primary color (green)
3
- $table-cell-padding-y: 0.5rem;
4
- $table-cell-padding-x: 0.75rem;
5
-
6
- // 2. Import all Bootstrap
7
- @import "bootstrap/scss/bootstrap";
@@ -1,40 +0,0 @@
1
- // Import only what you need from bootstrap (optional, leaner)
2
- @import "bootstrap/scss/functions";
3
- @import "bootstrap/scss/variables";
4
- @import "bootstrap/scss/mixins";
5
-
6
- // Example custom styles for the table
7
- .vs-table {
8
- border-collapse: separate;
9
- border-spacing: 0;
10
-
11
- thead {
12
- background-color: $gray-100;
13
- th {
14
- font-weight: 600;
15
- vertical-align: middle;
16
- padding: 0.75rem;
17
- }
18
- }
19
-
20
- tbody {
21
- tr {
22
- transition: background-color 0.2s ease;
23
-
24
- &:hover {
25
- background-color: $gray-200;
26
- }
27
-
28
- td {
29
- padding: 0.65rem 0.75rem;
30
- vertical-align: middle;
31
- }
32
- }
33
- }
34
-
35
- // Example: custom sort icon
36
- .sort-icon {
37
- font-size: 0.75rem;
38
- vertical-align: middle;
39
- }
40
- }