oceanhelm 0.0.11 → 0.0.13

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.
@@ -1,476 +1,465 @@
1
1
  <template>
2
- <div class="activity-logs">
3
- <!-- Controls -->
4
- <div class="a-controls">
5
- <div class="a-search-box">
6
- <input
7
- type="text"
8
- placeholder="Search activities, users, or actions..."
9
- :value="searchTerm"
10
- @input="$emit('update:searchTerm', $event.target.value)"
11
- />
12
- </div>
13
- <select
14
- class="filter-select"
15
- :value="selectedFilter"
16
- @change="$emit('update:selectedFilter', $event.target.value)"
17
- >
18
- <option value="all">All Activities</option>
19
- <option value="login">Login</option>
20
- <option value="logout">Logout</option>
21
- <option value="create">Create</option>
22
- <option value="update">Update</option>
23
- <option value="delete">Delete</option>
24
- <option value="view">View</option>
25
- </select>
26
- <button class="btn btn-primary" @click="$emit('refresh')">🔄 Refresh</button>
27
- <button class="btn btn-secondary" @click="$emit('download')">📥 Download Report</button>
2
+ <div class="activity-logs">
3
+ <!-- Controls -->
4
+ <div class="a-controls">
5
+ <div class="a-search-box">
6
+ <input type="text" placeholder="Search activities, users, or actions..." :value="searchTerm"
7
+ @input="$emit('update:searchTerm', $event.target.value)" />
28
8
  </div>
29
-
30
- <!-- Stats -->
31
- <div class="stats-grid">
32
- <div class="stat-card">
33
- <h3>Total Activities</h3>
34
- <div class="value">{{ totalActivities }}</div>
35
- </div>
36
- <div class="stat-card">
37
- <h3>Today's Activities</h3>
38
- <div class="value">{{ todayActivities }}</div>
39
- </div>
40
- <div class="stat-card">
41
- <h3>Active Users</h3>
42
- <div class="value">{{ activeUsers }}</div>
43
- </div>
44
- <div class="stat-card">
45
- <h3>Important</h3>
46
- <div class="badge-danger">
47
- Logs are deleted at the end of every month, please download a copy
48
- </div>
49
- </div>
9
+ <select class="filter-select" :value="selectedFilter"
10
+ @change="$emit('update:selectedFilter', $event.target.value)">
11
+ <option value="all">All Activities</option>
12
+ <option value="login">Login</option>
13
+ <option value="logout">Logout</option>
14
+ <option value="create">Create</option>
15
+ <option value="update">Update</option>
16
+ <option value="delete">Delete</option>
17
+ <option value="view">View</option>
18
+ </select>
19
+ <button class="btn btn-primary" @click="$emit('refresh')">🔄 Refresh</button>
20
+ <button class="btn btn-secondary" @click="$emit('download')">📥 Download Report</button>
21
+ </div>
22
+
23
+ <!-- Stats -->
24
+ <div class="stats-grid">
25
+ <div class="stat-card">
26
+ <h3>Total Activities</h3>
27
+ <div class="value">{{ totalActivities }}</div>
50
28
  </div>
51
-
52
- <!-- Logs Table -->
53
- <div class="logs-container">
54
- <div v-if="loading" class="loading">
55
- <div class="spinner"></div>
56
- <p>Loading activity logs...</p>
57
- </div>
58
-
59
- <div v-else-if="logs.length === 0" class="no-logs">
60
- <h3>No activities found</h3>
61
- <p>Try adjusting your search or filter criteria</p>
29
+ <div class="stat-card">
30
+ <h3>Today's Activities</h3>
31
+ <div class="value">{{ todayActivities }}</div>
32
+ </div>
33
+ <div class="stat-card">
34
+ <h3>Active Users</h3>
35
+ <div class="value">{{ activeUsers }}</div>
36
+ </div>
37
+ <div class="stat-card">
38
+ <h3>Important</h3>
39
+ <div class="badge-danger">
40
+ Logs are deleted at the end of every month, please download a copy
62
41
  </div>
63
-
64
- <div v-else>
65
- <table class="logs-table">
66
- <thead>
67
- <tr>
68
- <th>Timestamp</th>
69
- <th>User Name</th>
70
- <th>Action</th>
71
- <th>Details</th>
72
- <th>Section</th>
73
- </tr>
74
- </thead>
75
- <tbody>
76
- <tr v-for="log in paginatedLogs" :key="log.id">
77
- <td>{{ formatDate(log.timestamp) }}</td>
78
- <td>
79
- <div>{{ log.user_name }}</div>
80
- <small style="color: gray">{{ log.email }}</small>
81
- </td>
82
- <td>
83
- <span class="activity-badge" :class="getBadgeClass(log.action)">
84
- {{ log.action }}
85
- </span>
86
- </td>
87
- <td>
88
- {{ log.details.status }}
89
- <div v-for="(change, key) in log.details.information" :key="key">
90
- <strong>{{ key }}: </strong>
91
- <small style="color: gray">
92
- {{ change.from || "" }} → {{ change.to || change }}
93
- </small>
94
- </div>
95
- </td>
96
- <td>{{ log.table_name }}</td>
97
- </tr>
98
- </tbody>
99
- </table>
100
-
101
- <!-- Pagination -->
102
- <div class="pagination">
103
- <button @click="$emit('change-page', currentPage - 1)" :disabled="currentPage === 1">
104
- Previous
105
- </button>
106
- <button
107
- v-for="page in totalPages"
108
- :key="page"
109
- @click="$emit('change-page', page)"
110
- :class="{ active: currentPage === page }"
111
- >
112
- {{ page }}
113
- </button>
114
- <button @click="$emit('change-page', currentPage + 1)" :disabled="currentPage === totalPages">
115
- Next
116
- </button>
117
- </div>
42
+ </div>
43
+ </div>
44
+
45
+ <!-- Logs Table -->
46
+ <div class="logs-container">
47
+ <div v-if="loading" class="loading">
48
+ <div class="spinner"></div>
49
+ <p>Loading activity logs...</p>
50
+ </div>
51
+
52
+ <div v-else-if="logs.length === 0" class="no-logs">
53
+ <h3>No activities found</h3>
54
+ <p>Try adjusting your search or filter criteria</p>
55
+ </div>
56
+
57
+ <div v-else>
58
+ <table class="logs-table">
59
+ <thead>
60
+ <tr>
61
+ <th>Timestamp</th>
62
+ <th>User Name</th>
63
+ <th>Action</th>
64
+ <th>Details</th>
65
+ <th>Section</th>
66
+ </tr>
67
+ </thead>
68
+ <tbody>
69
+ <tr v-for="log in paginatedLogs" :key="log.id">
70
+ <td>{{ formatDate(log.timestamp) }}</td>
71
+ <td>
72
+ <div>{{ log.user_name }}</div>
73
+ <small style="color: gray">{{ log.email }}</small>
74
+ </td>
75
+ <td>
76
+ <span class="activity-badge" :class="getBadgeClass(log.action)">
77
+ {{ log.action }}
78
+ </span>
79
+ </td>
80
+ <td>
81
+ {{ log.details.status }}
82
+ <div v-for="(change, key) in log.details.information" :key="key">
83
+ <strong>{{ key }}: </strong>
84
+ <small style="color: gray">
85
+ {{ change?.from ?? "" }} → {{ change?.to ?? change ?? "" }}
86
+ </small>
87
+ </div>
88
+ </td>
89
+ <td>{{ log.table_name }}</td>
90
+ </tr>
91
+ </tbody>
92
+ </table>
93
+
94
+ <!-- Pagination -->
95
+ <div class="pagination">
96
+ <button @click="$emit('change-page', currentPage - 1)" :disabled="currentPage === 1">
97
+ Previous
98
+ </button>
99
+ <button v-for="page in totalPages" :key="page" @click="$emit('change-page', page)"
100
+ :class="{ active: currentPage === page }">
101
+ {{ page }}
102
+ </button>
103
+ <button @click="$emit('change-page', currentPage + 1)" :disabled="currentPage === totalPages">
104
+ Next
105
+ </button>
118
106
  </div>
119
107
  </div>
120
108
  </div>
121
- </template>
122
-
123
- <script>
124
- export default {
125
- name: "ActivityLogs",
126
- props: {
127
- loading: Boolean,
128
- searchTerm: String,
129
- selectedFilter: String,
130
- logs: Array,
131
- paginatedLogs: Array,
132
- totalActivities: Number,
133
- todayActivities: Number,
134
- activeUsers: Number,
135
- totalPages: Number,
136
- currentPage: Number,
109
+ </div>
110
+ </template>
111
+
112
+ <script>
113
+ export default {
114
+ name: "ActivityLogs",
115
+ props: {
116
+ loading: Boolean,
117
+ searchTerm: String,
118
+ selectedFilter: String,
119
+ logs: Array,
120
+ paginatedLogs: Array,
121
+ totalActivities: Number,
122
+ todayActivities: Number,
123
+ activeUsers: Number,
124
+ totalPages: Number,
125
+ currentPage: Number,
126
+ },
127
+ emits: ["update:searchTerm", "update:selectedFilter", "refresh", "download", "change-page"],
128
+ methods: {
129
+ formatDate(timestamp) {
130
+ return new Date(timestamp).toLocaleString();
137
131
  },
138
- emits: ["update:searchTerm", "update:selectedFilter", "refresh", "download", "change-page"],
139
- methods: {
140
- formatDate(timestamp) {
141
- return new Date(timestamp).toLocaleString();
142
- },
143
- getBadgeClass(action) {
144
- const classes = {
145
- login: "badge-login",
146
- logout: "badge-logout",
147
- create: "badge-create",
148
- update: "badge-update",
149
- delete: "badge-delete",
150
- view: "badge-view",
151
- };
152
- return classes[action] || "badge-view";
153
- },
132
+ getBadgeClass(action) {
133
+ const classes = {
134
+ login: "badge-login",
135
+ logout: "badge-logout",
136
+ create: "badge-create",
137
+ update: "badge-update",
138
+ delete: "badge-delete",
139
+ view: "badge-view",
140
+ };
141
+ return classes[action] || "badge-view";
154
142
  },
155
- };
156
- </script>
157
-
143
+ },
144
+ };
145
+ </script>
146
+
158
147
  <style>
159
148
  .a-header {
160
- background: linear-gradient(135deg, var(--dashprimary-color), var(--dashsecondary-color));
161
- color: white;
162
- padding: 2rem 0;
163
- margin-bottom: 2rem;
164
- border-radius: 12px;
165
- box-shadow: 0 10px 30px rgba(52, 153, 64, 0.3);
149
+ background: linear-gradient(135deg, var(--dashprimary-color), var(--dashsecondary-color));
150
+ color: white;
151
+ padding: 2rem 0;
152
+ margin-bottom: 2rem;
153
+ border-radius: 12px;
154
+ box-shadow: 0 10px 30px rgba(52, 153, 64, 0.3);
166
155
  }
167
156
 
168
157
  .a-header h1 {
169
- font-size: 2.5rem;
170
- font-weight: 700;
171
- margin-bottom: 0.5rem;
172
- text-align: center;
158
+ font-size: 2.5rem;
159
+ font-weight: 700;
160
+ margin-bottom: 0.5rem;
161
+ text-align: center;
173
162
  }
174
163
 
175
164
  .a-header p {
176
- text-align: center;
177
- opacity: 0.9;
178
- font-size: 1.1rem;
165
+ text-align: center;
166
+ opacity: 0.9;
167
+ font-size: 1.1rem;
179
168
  }
180
169
 
181
170
  .a-controls {
182
- display: flex;
183
- gap: 1rem;
184
- margin-bottom: 2rem;
185
- flex-wrap: wrap;
186
- align-items: center;
171
+ display: flex;
172
+ gap: 1rem;
173
+ margin-bottom: 2rem;
174
+ flex-wrap: wrap;
175
+ align-items: center;
187
176
  }
188
177
 
189
178
  .a-search-box {
190
- flex: 1;
191
- min-width: 250px;
192
- position: relative;
179
+ flex: 1;
180
+ min-width: 250px;
181
+ position: relative;
193
182
  }
194
183
 
195
184
  .a-search-box input {
196
- width: 100%;
197
- padding: 12px 16px;
198
- border: 2px solid #e0e0e0;
199
- border-radius: 8px;
200
- font-size: 1rem;
201
- transition: all 0.3s ease;
185
+ width: 100%;
186
+ padding: 12px 16px;
187
+ border: 2px solid #e0e0e0;
188
+ border-radius: 8px;
189
+ font-size: 1rem;
190
+ transition: all 0.3s ease;
202
191
  }
203
192
 
204
193
  .a-search-box input:focus {
205
- outline: none;
206
- border-color: var(--dashsecondary-color);
207
- box-shadow: 0 0 0 3px rgba(52, 153, 64, 0.1);
194
+ outline: none;
195
+ border-color: var(--dashsecondary-color);
196
+ box-shadow: 0 0 0 3px rgba(52, 153, 64, 0.1);
208
197
  }
209
198
 
210
199
  .filter-select {
211
- padding: 12px 16px;
212
- border: 2px solid #e0e0e0;
213
- border-radius: 8px;
214
- font-size: 1rem;
215
- background: white;
216
- cursor: pointer;
217
- transition: all 0.3s ease;
200
+ padding: 12px 16px;
201
+ border: 2px solid #e0e0e0;
202
+ border-radius: 8px;
203
+ font-size: 1rem;
204
+ background: white;
205
+ cursor: pointer;
206
+ transition: all 0.3s ease;
218
207
  }
219
208
 
220
209
  .filter-select:focus {
221
- outline: none;
222
- border-color: var(--dashsecondary-color);
223
- box-shadow: 0 0 0 3px rgba(52, 153, 64, 0.1);
210
+ outline: none;
211
+ border-color: var(--dashsecondary-color);
212
+ box-shadow: 0 0 0 3px rgba(52, 153, 64, 0.1);
224
213
  }
225
214
 
226
215
  .btn {
227
- padding: 12px 24px;
228
- border-radius: 8px;
229
- font-size: 1rem;
230
- font-weight: 600;
231
- cursor: pointer;
232
- transition: all 0.3s ease;
233
- display: flex;
234
- align-items: center;
235
- gap: 8px;
236
- }
216
+ padding: 12px 24px;
217
+ border-radius: 8px;
218
+ font-size: 1rem;
219
+ font-weight: 600;
220
+ cursor: pointer;
221
+ transition: all 0.3s ease;
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 8px;
225
+ }
237
226
 
238
227
  .btn-primary {
239
- background: var(--primary);
240
- color: white;
228
+ background: var(--primary);
229
+ color: white;
241
230
  }
242
231
 
243
232
  .btn-primary:hover {
244
- background: var(--primary-dark);
245
- transform: translateY(-1px);
246
- box-shadow: 0 4px 12px rgba(52, 153, 64, 0.3);
233
+ background: var(--primary-dark);
234
+ transform: translateY(-1px);
235
+ box-shadow: 0 4px 12px rgba(52, 153, 64, 0.3);
247
236
  }
248
237
 
249
238
  .btn-secondary {
250
- background: var(--secondary);
251
- color: var(--dark);
239
+ background: var(--secondary);
240
+ color: var(--dark);
252
241
  }
253
242
 
254
243
  .btn-secondary:hover {
255
- background: #e6a200;
256
- transform: translateY(-1px);
257
- box-shadow: 0 4px 12px rgba(244, 180, 0, 0.3);
244
+ background: #e6a200;
245
+ transform: translateY(-1px);
246
+ box-shadow: 0 4px 12px rgba(244, 180, 0, 0.3);
258
247
  }
259
248
 
260
249
  .stats-grid {
261
- display: grid;
262
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
263
- gap: 1.5rem;
264
- margin-bottom: 2rem;
250
+ display: grid;
251
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
252
+ gap: 1.5rem;
253
+ margin-bottom: 2rem;
265
254
  }
266
255
 
267
256
  .stat-card {
268
- background: white;
269
- padding: 1.5rem;
270
- border-radius: 12px;
271
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
272
- transition: transform 0.3s ease;
257
+ background: white;
258
+ padding: 1.5rem;
259
+ border-radius: 12px;
260
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
261
+ transition: transform 0.3s ease;
273
262
  }
274
263
 
275
264
  .stat-card:hover {
276
- transform: translateY(-2px);
265
+ transform: translateY(-2px);
277
266
  }
278
267
 
279
268
  .stat-card h3 {
280
- color: var(--gray);
281
- font-size: 0.9rem;
282
- font-weight: 600;
283
- text-transform: uppercase;
284
- letter-spacing: 0.5px;
285
- margin-bottom: 0.5rem;
269
+ color: var(--gray);
270
+ font-size: 0.9rem;
271
+ font-weight: 600;
272
+ text-transform: uppercase;
273
+ letter-spacing: 0.5px;
274
+ margin-bottom: 0.5rem;
286
275
  }
287
276
 
288
277
  .stat-card .value {
289
- font-size: 2rem;
290
- font-weight: 700;
291
- color: var(--dashsecondary-color);
278
+ font-size: 2rem;
279
+ font-weight: 700;
280
+ color: var(--dashsecondary-color);
292
281
  }
293
282
 
294
283
  .logs-container {
295
- background: white;
296
- border-radius: 12px;
297
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
298
- overflow: hidden;
284
+ background: white;
285
+ border-radius: 12px;
286
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
287
+ overflow: hidden;
299
288
  }
300
289
 
301
290
  .logs-header {
302
- background: var(--light);
303
- padding: 1.5rem;
304
- border-bottom: 1px solid #e0e0e0;
291
+ background: var(--light);
292
+ padding: 1.5rem;
293
+ border-bottom: 1px solid #e0e0e0;
305
294
  }
306
295
 
307
296
  .logs-header h2 {
308
- color: var(--dark);
309
- font-size: 1.3rem;
310
- font-weight: 600;
297
+ color: var(--dark);
298
+ font-size: 1.3rem;
299
+ font-weight: 600;
311
300
  }
312
301
 
313
302
  .logs-table {
314
- width: 100%;
315
- border-collapse: collapse;
303
+ width: 100%;
304
+ border-collapse: collapse;
316
305
  }
317
306
 
318
307
  .logs-table th,
319
308
  .logs-table td {
320
- padding: 1rem;
321
- text-align: left;
322
- border-bottom: 1px solid #f0f0f0;
309
+ padding: 1rem;
310
+ text-align: left;
311
+ border-bottom: 1px solid #f0f0f0;
323
312
  }
324
313
 
325
314
  .logs-table th {
326
- background: var(--light);
327
- font-weight: 600;
328
- color: var(--dark);
329
- font-size: 0.9rem;
330
- text-transform: uppercase;
331
- letter-spacing: 0.5px;
315
+ background: var(--light);
316
+ font-weight: 600;
317
+ color: var(--dark);
318
+ font-size: 0.9rem;
319
+ text-transform: uppercase;
320
+ letter-spacing: 0.5px;
332
321
  }
333
322
 
334
323
  .logs-table tr:hover {
335
- background: #f8f9fa;
324
+ background: #f8f9fa;
336
325
  }
337
326
 
338
327
  .activity-badge {
339
- padding: 4px 12px;
340
- border-radius: 20px;
341
- font-size: 0.8rem;
342
- font-weight: 600;
343
- text-transform: uppercase;
344
- letter-spacing: 0.5px;
328
+ padding: 4px 12px;
329
+ border-radius: 20px;
330
+ font-size: 0.8rem;
331
+ font-weight: 600;
332
+ text-transform: uppercase;
333
+ letter-spacing: 0.5px;
345
334
  }
346
335
 
347
336
  .badge-login {
348
- background: var(--success);
349
- color: white;
337
+ background: var(--success);
338
+ color: white;
350
339
  }
351
340
 
352
341
  .badge-logout {
353
- background: var(--gray);
354
- color: white;
342
+ background: var(--gray);
343
+ color: white;
355
344
  }
356
345
 
357
346
  .badge-create {
358
- background: var(--dashprimary-color);
359
- color: white;
347
+ background: var(--dashprimary-color);
348
+ color: white;
360
349
  }
361
350
 
362
351
  .badge-update {
363
- background: var(--warning);
364
- color: white;
352
+ background: var(--warning);
353
+ color: white;
365
354
  }
366
355
 
367
356
  .badge-delete {
368
- background: var(--danger);
369
- color: white;
357
+ background: var(--danger);
358
+ color: white;
370
359
  }
371
360
 
372
361
  .badge-danger {
373
- color: var(--danger);
362
+ color: var(--danger);
374
363
  }
375
364
 
376
365
  .badge-view {
377
- background: var(--maitsecondary);
378
- color: white;
366
+ background: var(--maitsecondary);
367
+ color: white;
379
368
  }
380
369
 
381
370
  .pagination {
382
- display: flex;
383
- justify-content: center;
384
- align-items: center;
385
- gap: 0.5rem;
386
- padding: 1.5rem;
387
- background: var(--light);
371
+ display: flex;
372
+ justify-content: center;
373
+ align-items: center;
374
+ gap: 0.5rem;
375
+ padding: 1.5rem;
376
+ background: var(--light);
388
377
  }
389
378
 
390
379
  .pagination button {
391
- padding: 8px 12px;
392
- border: 1px solid #e0e0e0;
393
- background: white;
394
- border-radius: 6px;
395
- cursor: pointer;
396
- transition: all 0.3s ease;
380
+ padding: 8px 12px;
381
+ border: 1px solid #e0e0e0;
382
+ background: white;
383
+ border-radius: 6px;
384
+ cursor: pointer;
385
+ transition: all 0.3s ease;
397
386
  }
398
387
 
399
388
  .pagination button:hover {
400
- background: var(--primary);
401
- color: white;
402
- border-color: var(--primary);
389
+ background: var(--primary);
390
+ color: white;
391
+ border-color: var(--primary);
403
392
  }
404
393
 
405
394
  .pagination button.active {
406
- background: var(--primary);
407
- color: white;
408
- border-color: var(--primary);
395
+ background: var(--primary);
396
+ color: white;
397
+ border-color: var(--primary);
409
398
  }
410
399
 
411
400
  .pagination button:disabled {
412
- opacity: 0.5;
413
- cursor: not-allowed;
401
+ opacity: 0.5;
402
+ cursor: not-allowed;
414
403
  }
415
404
 
416
405
  .no-logs {
417
- text-align: center;
418
- padding: 3rem;
419
- color: var(--gray);
406
+ text-align: center;
407
+ padding: 3rem;
408
+ color: var(--gray);
420
409
  }
421
410
 
422
411
  .no-logs h3 {
423
- font-size: 1.5rem;
424
- margin-bottom: 1rem;
412
+ font-size: 1.5rem;
413
+ margin-bottom: 1rem;
425
414
  }
426
415
 
427
416
  .loading {
428
- text-align: center;
429
- padding: 3rem;
430
- color: var(--gray);
417
+ text-align: center;
418
+ padding: 3rem;
419
+ color: var(--gray);
431
420
  }
432
421
 
433
422
  .spinner {
434
- border: 3px solid #f3f3f3;
435
- border-top: 3px solid var(--primary);
436
- border-radius: 50%;
437
- width: 40px;
438
- height: 40px;
439
- animation: spin 1s linear infinite;
440
- margin: 0 auto 1rem;
423
+ border: 3px solid #f3f3f3;
424
+ border-top: 3px solid var(--primary);
425
+ border-radius: 50%;
426
+ width: 40px;
427
+ height: 40px;
428
+ animation: spin 1s linear infinite;
429
+ margin: 0 auto 1rem;
441
430
  }
442
431
 
443
432
  @keyframes spin {
444
- 0% {
445
- transform: rotate(0deg);
446
- }
433
+ 0% {
434
+ transform: rotate(0deg);
435
+ }
447
436
 
448
- 100% {
449
- transform: rotate(360deg);
450
- }
437
+ 100% {
438
+ transform: rotate(360deg);
439
+ }
451
440
  }
452
441
 
453
442
  @media (max-width: 768px) {
454
- .a-controls {
455
- flex-direction: column;
456
- align-items: stretch;
457
- }
458
-
459
- .a-search-box {
460
- min-width: 100%;
461
- }
462
-
463
- .stats-grid {
464
- grid-template-columns: 1fr;
465
- }
466
-
467
- .logs-table {
468
- font-size: 0.9rem;
469
- }
470
-
471
- .logs-table th,
472
- .logs-table td {
473
- padding: 0.5rem;
474
- }
443
+ .a-controls {
444
+ flex-direction: column;
445
+ align-items: stretch;
446
+ }
447
+
448
+ .a-search-box {
449
+ min-width: 100%;
450
+ }
451
+
452
+ .stats-grid {
453
+ grid-template-columns: 1fr;
454
+ }
455
+
456
+ .logs-table {
457
+ font-size: 0.9rem;
458
+ }
459
+
460
+ .logs-table th,
461
+ .logs-table td {
462
+ padding: 0.5rem;
463
+ }
475
464
  }
476
465
  </style>