@fylib/adapter-angular 0.1.0 → 0.2.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.
Files changed (28) hide show
  1. package/dist/components/accordion.component.js +128 -128
  2. package/dist/components/badge.component.js +43 -43
  3. package/dist/components/button.component.js +103 -103
  4. package/dist/components/card.component.js +103 -103
  5. package/dist/components/chart.component.js +72 -72
  6. package/dist/components/icon.component.js +29 -29
  7. package/dist/components/input.component.js +111 -111
  8. package/dist/components/modal.component.js +122 -122
  9. package/dist/components/nav-link.component.js +56 -56
  10. package/dist/components/notification-menu.component.js +388 -388
  11. package/dist/components/select.component.js +122 -122
  12. package/dist/components/table.component.js +371 -371
  13. package/dist/components/text.component.js +2 -2
  14. package/dist/components/toast.component.js +115 -115
  15. package/dist/directives/theme-vars.directive.js +10 -10
  16. package/dist/directives/wallpaper.directive.js +5 -5
  17. package/dist/layouts/layout.component.js +69 -69
  18. package/dist/layouts/slot.component.js +584 -584
  19. package/dist/schematics/collection.json +9 -0
  20. package/dist/schematics/ng-add/index.d.ts +2 -0
  21. package/dist/schematics/ng-add/index.js +64 -0
  22. package/dist/schematics/ng-add/index.js.map +1 -0
  23. package/dist/schematics/ng-add/schema.json +8 -0
  24. package/dist/schematics/templates/fylib/crypto.config.ts.template +7 -0
  25. package/dist/schematics/templates/fylib/logging.config.ts.template +9 -0
  26. package/dist/schematics/templates/fylib/sse.config.ts.template +7 -0
  27. package/dist/schematics/templates/fylib/theme.config.ts.template +9 -0
  28. package/package.json +46 -43
@@ -263,378 +263,378 @@ FyTableComponent = __decorate([
263
263
  FyInputComponent,
264
264
  FyButtonComponent
265
265
  ],
266
- template: `
267
- <div
268
- class="fy-table-container"
269
- [class.fy-table--scrollable]="scrollable"
270
- [class.fy-table--sticky]="stickyHeader"
271
- [class]="composeAnimClasses(animationClassSuffix)"
272
- [style]="getHostStyles(customStyles)"
273
-
274
- >
275
- <!-- Header / Search / Title -->
276
- @if (showHeader || title || showSearch) {
277
- <header class="fy-table__header">
278
- @if (title || subtitle) {
279
- <div class="fy-table__header-main">
280
- @if (title) { <h3 class="fy-table__title">{{ title }}</h3> }
281
- @if (subtitle) { <p class="fy-table__subtitle">{{ subtitle }}</p> }
282
- </div>
283
- }
284
-
285
- <div class="fy-table__header-tools">
286
- @if (showSearch) {
287
- <div class="fy-table__search">
288
- <fy-input
289
- placeholder="Pesquisar..."
290
- iconLeftName="search"
291
- size="sm"
292
- (fyInput)="onSearch($event)"
293
- ></fy-input>
294
- </div>
295
- }
296
- <ng-content select="[fy-table-tools]"></ng-content>
297
- </div>
298
- </header>
299
- }
300
-
301
- <!-- Table Content -->
302
- <div class="fy-table__content" [style.maxHeight]="maxHeight">
303
- <table class="fy-table" [class]="'fy-table--' + variant">
304
- <thead>
305
- <tr>
306
- @for (col of visibleColumns; track col.key) {
307
- <th
308
- [style.width]="col.width"
309
- [class.fy-table__th--sortable]="col.sortable"
310
- [style.textAlign]="col.align || 'left'"
311
- (click)="onSort(col)"
312
- >
313
- <div class="fy-table__th-content">
314
- @if (col.iconName) {
315
- <fy-icon
316
- [name]="col.iconName"
317
- [set]="col.iconSet"
318
- class="fy-table__th-icon"
319
- ></fy-icon>
320
- }
321
- <span>{{ col.label }}</span>
322
- @if (col.sortable) {
323
- <fy-icon
324
- [name]="getSortIcon(col)"
325
- class="fy-table__sort-icon"
326
- ></fy-icon>
327
- }
328
- </div>
329
- </th>
330
- }
331
- @if (actions && actions.length > 0) {
332
- <th class="fy-table__th--actions">
333
- Ações
334
- </th>
335
- }
336
- </tr>
337
- </thead>
338
- <tbody>
339
- @if (loading) {
340
- <tr class="fy-table__row--loading">
341
- <td [attr.colspan]="totalColumns" class="fy-table__td--loading">
342
- <div class="fy-table__loader"></div>
343
- </td>
344
- </tr>
345
- }
346
-
347
- @if (!loading && (!data || data.length === 0)) {
348
- <tr class="fy-table__row--empty">
349
- <td [attr.colspan]="totalColumns" class="fy-table__td--empty">
350
- Nenhum registro encontrado.
351
- </td>
352
- </tr>
353
- }
354
-
355
- @if (!loading) {
356
- @for (row of paginatedData; track $index) {
357
- <tr
358
- class="fy-table__row"
359
- [class.fy-table__row--clickable]="rowClickable"
360
- (click)="onRowClick(row)"
361
- >
362
- @for (col of visibleColumns; track col.key) {
363
- <td
364
- [style.textAlign]="col.align || 'left'"
365
- >
366
- <!-- Custom Cell Template -->
367
- @if (cellTemplate) {
368
- <ng-container *ngTemplateOutlet="cellTemplate; context: { $implicit: row, column: col }"></ng-container>
369
- } @else {
370
- {{ row[col.key] }}
371
- }
372
- </td>
373
- }
374
-
375
- @if (actions && actions.length > 0) {
376
- <td class="fy-table__td--actions">
377
- <div class="fy-table__actions-group">
378
- @for (action of actions; track action.label) {
379
- <fy-button
380
- [iconName]="action.iconName"
381
- [label]="action.label"
382
- [variant]="action.variant || 'ghost'"
383
- size="sm"
384
- (fyClick)="onActionClick($event, action, row)"
385
- ></fy-button>
386
- }
387
- </div>
388
- </td>
389
- }
390
- </tr>
391
- }
392
- }
393
- </tbody>
394
- </table>
395
- </div>
396
-
397
- <!-- Footer / Pagination -->
398
- @if (showFooter || showPagination || footer) {
399
- <footer class="fy-table__footer">
400
- @if (footer || showPagination) {
401
- <div class="fy-table__footer-info">
402
- @if (footer) { <span>{{ footer }}</span> }
403
- @if (showPagination) {
404
- <span class="fy-table__pagination-summary">
405
- Mostrando {{ startItem }} - {{ endItem }} de {{ displayTotal }}
406
- </span>
407
- }
408
- </div>
409
- }
410
-
411
- @if (showPagination) {
412
- <div class="fy-table__pagination">
413
- <fy-button
414
- variant="ghost"
415
- size="sm"
416
- iconName="caret-left"
417
- [disabled]="currentPage === 1"
418
- (fyClick)="onPageChange(currentPage - 1)"
419
- ></fy-button>
420
-
421
- <div class="fy-table__pages">
422
- <span class="fy-table__page-info">{{ currentPage }} / {{ totalPages }}</span>
423
- </div>
424
-
425
- <fy-button
426
- variant="ghost"
427
- size="sm"
428
- iconName="caret-right"
429
- [disabled]="currentPage === totalPages"
430
- (fyClick)="onPageChange(currentPage + 1)"
431
- ></fy-button>
432
- </div>
433
- }
434
- </footer>
435
- }
436
- </div>
266
+ template: `
267
+ <div
268
+ class="fy-table-container"
269
+ [class.fy-table--scrollable]="scrollable"
270
+ [class.fy-table--sticky]="stickyHeader"
271
+ [class]="composeAnimClasses(animationClassSuffix)"
272
+ [style]="getHostStyles(customStyles)"
273
+
274
+ >
275
+ <!-- Header / Search / Title -->
276
+ @if (showHeader || title || showSearch) {
277
+ <header class="fy-table__header">
278
+ @if (title || subtitle) {
279
+ <div class="fy-table__header-main">
280
+ @if (title) { <h3 class="fy-table__title">{{ title }}</h3> }
281
+ @if (subtitle) { <p class="fy-table__subtitle">{{ subtitle }}</p> }
282
+ </div>
283
+ }
284
+
285
+ <div class="fy-table__header-tools">
286
+ @if (showSearch) {
287
+ <div class="fy-table__search">
288
+ <fy-input
289
+ placeholder="Pesquisar..."
290
+ iconLeftName="search"
291
+ size="sm"
292
+ (fyInput)="onSearch($event)"
293
+ ></fy-input>
294
+ </div>
295
+ }
296
+ <ng-content select="[fy-table-tools]"></ng-content>
297
+ </div>
298
+ </header>
299
+ }
300
+
301
+ <!-- Table Content -->
302
+ <div class="fy-table__content" [style.maxHeight]="maxHeight">
303
+ <table class="fy-table" [class]="'fy-table--' + variant">
304
+ <thead>
305
+ <tr>
306
+ @for (col of visibleColumns; track col.key) {
307
+ <th
308
+ [style.width]="col.width"
309
+ [class.fy-table__th--sortable]="col.sortable"
310
+ [style.textAlign]="col.align || 'left'"
311
+ (click)="onSort(col)"
312
+ >
313
+ <div class="fy-table__th-content">
314
+ @if (col.iconName) {
315
+ <fy-icon
316
+ [name]="col.iconName"
317
+ [set]="col.iconSet"
318
+ class="fy-table__th-icon"
319
+ ></fy-icon>
320
+ }
321
+ <span>{{ col.label }}</span>
322
+ @if (col.sortable) {
323
+ <fy-icon
324
+ [name]="getSortIcon(col)"
325
+ class="fy-table__sort-icon"
326
+ ></fy-icon>
327
+ }
328
+ </div>
329
+ </th>
330
+ }
331
+ @if (actions && actions.length > 0) {
332
+ <th class="fy-table__th--actions">
333
+ Ações
334
+ </th>
335
+ }
336
+ </tr>
337
+ </thead>
338
+ <tbody>
339
+ @if (loading) {
340
+ <tr class="fy-table__row--loading">
341
+ <td [attr.colspan]="totalColumns" class="fy-table__td--loading">
342
+ <div class="fy-table__loader"></div>
343
+ </td>
344
+ </tr>
345
+ }
346
+
347
+ @if (!loading && (!data || data.length === 0)) {
348
+ <tr class="fy-table__row--empty">
349
+ <td [attr.colspan]="totalColumns" class="fy-table__td--empty">
350
+ Nenhum registro encontrado.
351
+ </td>
352
+ </tr>
353
+ }
354
+
355
+ @if (!loading) {
356
+ @for (row of paginatedData; track $index) {
357
+ <tr
358
+ class="fy-table__row"
359
+ [class.fy-table__row--clickable]="rowClickable"
360
+ (click)="onRowClick(row)"
361
+ >
362
+ @for (col of visibleColumns; track col.key) {
363
+ <td
364
+ [style.textAlign]="col.align || 'left'"
365
+ >
366
+ <!-- Custom Cell Template -->
367
+ @if (cellTemplate) {
368
+ <ng-container *ngTemplateOutlet="cellTemplate; context: { $implicit: row, column: col }"></ng-container>
369
+ } @else {
370
+ {{ row[col.key] }}
371
+ }
372
+ </td>
373
+ }
374
+
375
+ @if (actions && actions.length > 0) {
376
+ <td class="fy-table__td--actions">
377
+ <div class="fy-table__actions-group">
378
+ @for (action of actions; track action.label) {
379
+ <fy-button
380
+ [iconName]="action.iconName"
381
+ [label]="action.label"
382
+ [variant]="action.variant || 'ghost'"
383
+ size="sm"
384
+ (fyClick)="onActionClick($event, action, row)"
385
+ ></fy-button>
386
+ }
387
+ </div>
388
+ </td>
389
+ }
390
+ </tr>
391
+ }
392
+ }
393
+ </tbody>
394
+ </table>
395
+ </div>
396
+
397
+ <!-- Footer / Pagination -->
398
+ @if (showFooter || showPagination || footer) {
399
+ <footer class="fy-table__footer">
400
+ @if (footer || showPagination) {
401
+ <div class="fy-table__footer-info">
402
+ @if (footer) { <span>{{ footer }}</span> }
403
+ @if (showPagination) {
404
+ <span class="fy-table__pagination-summary">
405
+ Mostrando {{ startItem }} - {{ endItem }} de {{ displayTotal }}
406
+ </span>
407
+ }
408
+ </div>
409
+ }
410
+
411
+ @if (showPagination) {
412
+ <div class="fy-table__pagination">
413
+ <fy-button
414
+ variant="ghost"
415
+ size="sm"
416
+ iconName="caret-left"
417
+ [disabled]="currentPage === 1"
418
+ (fyClick)="onPageChange(currentPage - 1)"
419
+ ></fy-button>
420
+
421
+ <div class="fy-table__pages">
422
+ <span class="fy-table__page-info">{{ currentPage }} / {{ totalPages }}</span>
423
+ </div>
424
+
425
+ <fy-button
426
+ variant="ghost"
427
+ size="sm"
428
+ iconName="caret-right"
429
+ [disabled]="currentPage === totalPages"
430
+ (fyClick)="onPageChange(currentPage + 1)"
431
+ ></fy-button>
432
+ </div>
433
+ }
434
+ </footer>
435
+ }
436
+ </div>
437
437
  `,
438
- styles: [`
439
- .fy-table-container {
440
- display: flex;
441
- flex-direction: column;
442
- width: 100%;
443
- background: var(--fy-effects-table-background, #fff);
444
- border: 1px solid var(--fy-effects-table-borderColor, rgba(0,0,0,0.08));
445
- border-radius: var(--fy-borderRadius-lg, 12px);
446
- overflow: hidden;
447
- }
448
-
449
- .fy-table__header {
450
- padding: var(--fy-spacing-md);
451
- display: flex;
452
- justify-content: space-between;
453
- align-items: center;
454
- border-bottom: 1px solid var(--fy-effects-table-borderColor);
455
- gap: 16px;
456
- flex-wrap: wrap;
457
- }
458
-
459
- .fy-table__header-tools {
460
- display: flex;
461
- gap: 12px;
462
- align-items: center;
463
- flex: 1;
464
- justify-content: flex-end;
465
- }
466
-
467
- .fy-table__header-tools ::ng-deep [fy-table-tools] {
468
- display: flex;
469
- gap: 8px;
470
- }
471
-
472
- .fy-table__actions-group {
473
- display: flex;
474
- gap: 6px;
475
- }
476
-
477
- @media (max-width: 640px) {
478
- .fy-table__header-tools {
479
- justify-content: flex-start;
480
- }
481
-
482
- .fy-table__header-tools ::ng-deep [fy-table-tools] {
483
- width: 100%;
484
- overflow-x: auto;
485
- padding-bottom: 4px;
486
- }
487
-
488
- .fy-table__header-tools ::ng-deep [fy-table-tools] fy-button .fy-button__label {
489
- display: none;
490
- }
491
-
492
- .fy-table__header-tools ::ng-deep [fy-table-tools] fy-button .fy-button {
493
- padding: var(--fy-spacing-sm);
494
- }
495
- }
496
-
497
- .fy-table__title {
498
- margin: 0;
499
- font-size: var(--fy-typography-fontSize-lg);
500
- font-weight: var(--fy-typography-fontWeight-bold);
501
- }
502
-
503
- .fy-table__subtitle {
504
- margin: 4px 0 0;
505
- font-size: var(--fy-typography-fontSize-sm);
506
- color: var(--fy-colors-secondary);
507
- }
508
-
509
- .fy-table__header-tools {
510
- display: flex;
511
- gap: 12px;
512
- align-items: center;
513
- flex: 1;
514
- justify-content: flex-end;
515
- }
516
-
517
- .fy-table__search {
518
- max-width: 300px;
519
- width: 100%;
520
- }
521
-
522
- .fy-table__content {
523
- width: 100%;
524
- overflow-x: auto;
525
- }
526
-
527
- .fy-table {
528
- width: 100%;
529
- border-collapse: collapse;
530
- text-align: left;
531
- font-size: var(--fy-typography-fontSize-md);
532
- }
533
-
534
- .fy-table th {
535
- padding: var(--fy-spacing-md);
536
- background: var(--fy-effects-table-headerBackground, rgba(0,0,0,0.02));
537
- color: var(--fy-colors-text);
538
- font-weight: var(--fy-typography-fontWeight-bold);
539
- border-bottom: 1px solid var(--fy-effects-table-borderColor);
540
- white-space: nowrap;
541
- }
542
-
543
- .fy-table td {
544
- padding: var(--fy-spacing-md);
545
- border-bottom: 1px solid var(--fy-effects-table-borderColor);
546
- color: var(--fy-colors-text);
547
- }
548
-
549
- .fy-table__row:last-child td {
550
- border-bottom: none;
551
- }
552
-
553
- .fy-table__row:hover {
554
- background: var(--fy-effects-table-rowHoverBackground, rgba(0,0,0,0.01));
555
- }
556
-
557
- .fy-table__row--clickable {
558
- cursor: pointer;
559
- }
560
-
561
- .fy-table--striped tbody tr:nth-child(even) {
562
- background: var(--fy-effects-table-stripedBackground, rgba(0,0,0,0.005));
563
- }
564
-
565
- .fy-table--bordered td,
566
- .fy-table--bordered th {
567
- border: 1px solid var(--fy-effects-table-borderColor);
568
- }
569
-
570
- .fy-table--compact td,
571
- .fy-table--compact th {
572
- padding: var(--fy-spacing-sm);
573
- }
574
-
575
- .fy-table__th-content {
576
- display: flex;
577
- align-items: center;
578
- gap: 8px;
579
- }
580
-
581
- .fy-table__th--sortable {
582
- cursor: pointer;
583
- user-select: none;
584
- }
585
-
586
- .fy-table__th--sortable:hover {
587
- background: rgba(0,0,0,0.04);
588
- }
589
-
590
- .fy-table__footer {
591
- padding: var(--fy-spacing-md);
592
- display: flex;
593
- justify-content: space-between;
594
- align-items: center;
595
- border-top: 1px solid var(--fy-effects-table-borderColor);
596
- background: var(--fy-effects-table-headerBackground);
597
- }
598
-
599
- .fy-table__pagination {
600
- display: flex;
601
- align-items: center;
602
- gap: 12px;
603
- }
604
-
605
- .fy-table__page-info {
606
- font-size: var(--fy-typography-fontSize-sm);
607
- font-weight: var(--fy-typography-fontWeight-bold);
608
- }
609
-
610
- .fy-table__loader {
611
- width: 24px;
612
- height: 24px;
613
- border: 3px solid var(--fy-colors-primary);
614
- border-bottom-color: transparent;
615
- border-radius: 50%;
616
- margin: 24px auto;
617
- animation: fy-spin 0.8s linear infinite;
618
- }
619
-
620
- @keyframes fy-spin {
621
- from { transform: rotate(0deg); }
622
- to { transform: rotate(360deg); }
623
- }
624
-
625
- @media (max-width: 640px) {
626
- .fy-table__header {
627
- flex-direction: column;
628
- align-items: stretch;
629
- }
630
- .fy-table__search {
631
- max-width: 100%;
632
- }
633
- .fy-table__footer {
634
- flex-direction: column;
635
- gap: 16px;
636
- }
637
- }
438
+ styles: [`
439
+ .fy-table-container {
440
+ display: flex;
441
+ flex-direction: column;
442
+ width: 100%;
443
+ background: var(--fy-effects-table-background, #fff);
444
+ border: 1px solid var(--fy-effects-table-borderColor, rgba(0,0,0,0.08));
445
+ border-radius: var(--fy-borderRadius-lg, 12px);
446
+ overflow: hidden;
447
+ }
448
+
449
+ .fy-table__header {
450
+ padding: var(--fy-spacing-md);
451
+ display: flex;
452
+ justify-content: space-between;
453
+ align-items: center;
454
+ border-bottom: 1px solid var(--fy-effects-table-borderColor);
455
+ gap: 16px;
456
+ flex-wrap: wrap;
457
+ }
458
+
459
+ .fy-table__header-tools {
460
+ display: flex;
461
+ gap: 12px;
462
+ align-items: center;
463
+ flex: 1;
464
+ justify-content: flex-end;
465
+ }
466
+
467
+ .fy-table__header-tools ::ng-deep [fy-table-tools] {
468
+ display: flex;
469
+ gap: 8px;
470
+ }
471
+
472
+ .fy-table__actions-group {
473
+ display: flex;
474
+ gap: 6px;
475
+ }
476
+
477
+ @media (max-width: 640px) {
478
+ .fy-table__header-tools {
479
+ justify-content: flex-start;
480
+ }
481
+
482
+ .fy-table__header-tools ::ng-deep [fy-table-tools] {
483
+ width: 100%;
484
+ overflow-x: auto;
485
+ padding-bottom: 4px;
486
+ }
487
+
488
+ .fy-table__header-tools ::ng-deep [fy-table-tools] fy-button .fy-button__label {
489
+ display: none;
490
+ }
491
+
492
+ .fy-table__header-tools ::ng-deep [fy-table-tools] fy-button .fy-button {
493
+ padding: var(--fy-spacing-sm);
494
+ }
495
+ }
496
+
497
+ .fy-table__title {
498
+ margin: 0;
499
+ font-size: var(--fy-typography-fontSize-lg);
500
+ font-weight: var(--fy-typography-fontWeight-bold);
501
+ }
502
+
503
+ .fy-table__subtitle {
504
+ margin: 4px 0 0;
505
+ font-size: var(--fy-typography-fontSize-sm);
506
+ color: var(--fy-colors-secondary);
507
+ }
508
+
509
+ .fy-table__header-tools {
510
+ display: flex;
511
+ gap: 12px;
512
+ align-items: center;
513
+ flex: 1;
514
+ justify-content: flex-end;
515
+ }
516
+
517
+ .fy-table__search {
518
+ max-width: 300px;
519
+ width: 100%;
520
+ }
521
+
522
+ .fy-table__content {
523
+ width: 100%;
524
+ overflow-x: auto;
525
+ }
526
+
527
+ .fy-table {
528
+ width: 100%;
529
+ border-collapse: collapse;
530
+ text-align: left;
531
+ font-size: var(--fy-typography-fontSize-md);
532
+ }
533
+
534
+ .fy-table th {
535
+ padding: var(--fy-spacing-md);
536
+ background: var(--fy-effects-table-headerBackground, rgba(0,0,0,0.02));
537
+ color: var(--fy-colors-text);
538
+ font-weight: var(--fy-typography-fontWeight-bold);
539
+ border-bottom: 1px solid var(--fy-effects-table-borderColor);
540
+ white-space: nowrap;
541
+ }
542
+
543
+ .fy-table td {
544
+ padding: var(--fy-spacing-md);
545
+ border-bottom: 1px solid var(--fy-effects-table-borderColor);
546
+ color: var(--fy-colors-text);
547
+ }
548
+
549
+ .fy-table__row:last-child td {
550
+ border-bottom: none;
551
+ }
552
+
553
+ .fy-table__row:hover {
554
+ background: var(--fy-effects-table-rowHoverBackground, rgba(0,0,0,0.01));
555
+ }
556
+
557
+ .fy-table__row--clickable {
558
+ cursor: pointer;
559
+ }
560
+
561
+ .fy-table--striped tbody tr:nth-child(even) {
562
+ background: var(--fy-effects-table-stripedBackground, rgba(0,0,0,0.005));
563
+ }
564
+
565
+ .fy-table--bordered td,
566
+ .fy-table--bordered th {
567
+ border: 1px solid var(--fy-effects-table-borderColor);
568
+ }
569
+
570
+ .fy-table--compact td,
571
+ .fy-table--compact th {
572
+ padding: var(--fy-spacing-sm);
573
+ }
574
+
575
+ .fy-table__th-content {
576
+ display: flex;
577
+ align-items: center;
578
+ gap: 8px;
579
+ }
580
+
581
+ .fy-table__th--sortable {
582
+ cursor: pointer;
583
+ user-select: none;
584
+ }
585
+
586
+ .fy-table__th--sortable:hover {
587
+ background: rgba(0,0,0,0.04);
588
+ }
589
+
590
+ .fy-table__footer {
591
+ padding: var(--fy-spacing-md);
592
+ display: flex;
593
+ justify-content: space-between;
594
+ align-items: center;
595
+ border-top: 1px solid var(--fy-effects-table-borderColor);
596
+ background: var(--fy-effects-table-headerBackground);
597
+ }
598
+
599
+ .fy-table__pagination {
600
+ display: flex;
601
+ align-items: center;
602
+ gap: 12px;
603
+ }
604
+
605
+ .fy-table__page-info {
606
+ font-size: var(--fy-typography-fontSize-sm);
607
+ font-weight: var(--fy-typography-fontWeight-bold);
608
+ }
609
+
610
+ .fy-table__loader {
611
+ width: 24px;
612
+ height: 24px;
613
+ border: 3px solid var(--fy-colors-primary);
614
+ border-bottom-color: transparent;
615
+ border-radius: 50%;
616
+ margin: 24px auto;
617
+ animation: fy-spin 0.8s linear infinite;
618
+ }
619
+
620
+ @keyframes fy-spin {
621
+ from { transform: rotate(0deg); }
622
+ to { transform: rotate(360deg); }
623
+ }
624
+
625
+ @media (max-width: 640px) {
626
+ .fy-table__header {
627
+ flex-direction: column;
628
+ align-items: stretch;
629
+ }
630
+ .fy-table__search {
631
+ max-width: 100%;
632
+ }
633
+ .fy-table__footer {
634
+ flex-direction: column;
635
+ gap: 16px;
636
+ }
637
+ }
638
638
  `],
639
639
  encapsulation: ViewEncapsulation.None
640
640
  }),