@lesterarte/sefin-ui 0.0.20 → 0.0.23
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,7 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Input, ChangeDetectionStrategy, Component, EventEmitter, Output, forwardRef, ViewChild, HostListener } from '@angular/core';
|
|
2
|
+
import { Input, ChangeDetectionStrategy, Component, EventEmitter, Output, forwardRef, ViewChild, HostListener, signal, computed } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
5
|
+
import * as i1$1 from '@angular/platform-browser';
|
|
5
6
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
6
7
|
import * as LucideIcons from 'lucide';
|
|
7
8
|
import * as i2 from '@angular/forms';
|
|
@@ -938,6 +939,8 @@ class ButtonComponent {
|
|
|
938
939
|
size = 'md';
|
|
939
940
|
/** Whether the button is disabled */
|
|
940
941
|
disabled = false;
|
|
942
|
+
/** Whether the button should take full width of the container */
|
|
943
|
+
fullWidth = false;
|
|
941
944
|
/** Button type. Options: 'button' | 'submit' | 'reset' */
|
|
942
945
|
type = 'button';
|
|
943
946
|
/** Additional CSS classes */
|
|
@@ -953,6 +956,7 @@ class ButtonComponent {
|
|
|
953
956
|
'sefin-button',
|
|
954
957
|
`sefin-button--${this.variant}`,
|
|
955
958
|
`sefin-button--${this.size}`,
|
|
959
|
+
this.fullWidth ? 'sefin-button--full-width' : '',
|
|
956
960
|
this.disabled ? 'sefin-button--disabled' : '',
|
|
957
961
|
this.class,
|
|
958
962
|
]
|
|
@@ -960,17 +964,19 @@ class ButtonComponent {
|
|
|
960
964
|
.join(' ');
|
|
961
965
|
}
|
|
962
966
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
963
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: ButtonComponent, isStandalone: true, selector: "sefin-button", inputs: { variant: "variant", size: "size", disabled: "disabled", type: "type", class: "class" }, outputs: { clicked: "clicked" }, ngImport: i0, template: "<button [type]=\"type\" [disabled]=\"disabled\" [class]=\"buttonClasses\" (click)=\"onClick($event)\">\n <ng-content></ng-content>\n</button>\n", styles: [".sefin-button{display:inline-flex;align-items:center;justify-content:center;font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);border-radius:var(--sefin-radius-md);transition:all .2s ease-in-out;cursor:pointer;outline:none;border:1px solid transparent}.sefin-button:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px}.sefin-button--sm{padding:var(--sefin-spacing-sm) var(--sefin-spacing-md);font-size:var(--sefin-font-size-sm);line-height:var(--sefin-line-height-normal);min-height:32px}.sefin-button--md{padding:var(--sefin-spacing-md) var(--sefin-spacing-lg);font-size:var(--sefin-font-size-base);line-height:var(--sefin-line-height-normal);min-height:40px}.sefin-button--lg{padding:var(--sefin-spacing-lg) var(--sefin-spacing-xl);font-size:var(--sefin-font-size-lg);line-height:var(--sefin-line-height-normal);min-height:48px}.sefin-button--primary{background-color:var(--sefin-color-primary);color:#fff}.sefin-button--primary:hover:not(:disabled){background-color:var(--sefin-color-primary-dark)}.sefin-button--primary:active:not(:disabled){transform:translateY(1px)}.sefin-button--secondary{background-color:var(--sefin-color-secondary);color:#fff}.sefin-button--secondary:hover:not(:disabled){background-color:var(--sefin-color-secondary-dark)}.sefin-button--secondary:active:not(:disabled){transform:translateY(1px)}.sefin-button--outline{background-color:transparent;color:var(--sefin-color-primary);border-color:var(--sefin-color-primary)}.sefin-button--outline:hover:not(:disabled){background-color:var(--sefin-color-primary);color:#fff}.sefin-button--ghost{background-color:transparent;color:var(--sefin-color-primary)}.sefin-button--ghost:hover:not(:disabled){background-color:var(--sefin-color-surface-hover)}.sefin-button--danger{background-color:var(--sefin-color-error);color:#fff}.sefin-button--danger:hover:not(:disabled){background-color:var(--sefin-color-error);opacity:.9}.sefin-button--disabled{opacity:.6;cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
967
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: ButtonComponent, isStandalone: true, selector: "sefin-button", inputs: { variant: "variant", size: "size", disabled: "disabled", fullWidth: "fullWidth", type: "type", class: "class" }, outputs: { clicked: "clicked" }, ngImport: i0, template: "<button [type]=\"type\" [disabled]=\"disabled\" [class]=\"buttonClasses\" (click)=\"onClick($event)\">\n <ng-content></ng-content>\n</button>\n", styles: [".sefin-button{display:inline-flex;align-items:center;justify-content:center;font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);border-radius:var(--sefin-radius-md);transition:all .2s ease-in-out;cursor:pointer;outline:none;border:1px solid transparent}.sefin-button--full-width{display:flex;width:100%}.sefin-button:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px}.sefin-button--sm{padding:var(--sefin-spacing-sm) var(--sefin-spacing-md);font-size:var(--sefin-font-size-sm);line-height:var(--sefin-line-height-normal);min-height:32px}.sefin-button--md{padding:var(--sefin-spacing-md) var(--sefin-spacing-lg);font-size:var(--sefin-font-size-base);line-height:var(--sefin-line-height-normal);min-height:40px}.sefin-button--lg{padding:var(--sefin-spacing-lg) var(--sefin-spacing-xl);font-size:var(--sefin-font-size-lg);line-height:var(--sefin-line-height-normal);min-height:48px}.sefin-button--primary{background-color:var(--sefin-color-primary);color:#fff}.sefin-button--primary:hover:not(:disabled){background-color:var(--sefin-color-primary-dark)}.sefin-button--primary:active:not(:disabled){transform:translateY(1px)}.sefin-button--secondary{background-color:var(--sefin-color-secondary);color:#fff}.sefin-button--secondary:hover:not(:disabled){background-color:var(--sefin-color-secondary-dark)}.sefin-button--secondary:active:not(:disabled){transform:translateY(1px)}.sefin-button--outline{background-color:transparent;color:var(--sefin-color-primary);border-color:var(--sefin-color-primary)}.sefin-button--outline:hover:not(:disabled){background-color:var(--sefin-color-primary);color:#fff}.sefin-button--ghost{background-color:transparent;color:var(--sefin-color-primary)}.sefin-button--ghost:hover:not(:disabled){background-color:var(--sefin-color-surface-hover)}.sefin-button--danger{background-color:var(--sefin-color-error);color:#fff}.sefin-button--danger:hover:not(:disabled){background-color:var(--sefin-color-error);opacity:.9}.sefin-button--disabled{opacity:.6;cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
964
968
|
}
|
|
965
969
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ButtonComponent, decorators: [{
|
|
966
970
|
type: Component,
|
|
967
|
-
args: [{ selector: 'sefin-button', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<button [type]=\"type\" [disabled]=\"disabled\" [class]=\"buttonClasses\" (click)=\"onClick($event)\">\n <ng-content></ng-content>\n</button>\n", styles: [".sefin-button{display:inline-flex;align-items:center;justify-content:center;font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);border-radius:var(--sefin-radius-md);transition:all .2s ease-in-out;cursor:pointer;outline:none;border:1px solid transparent}.sefin-button:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px}.sefin-button--sm{padding:var(--sefin-spacing-sm) var(--sefin-spacing-md);font-size:var(--sefin-font-size-sm);line-height:var(--sefin-line-height-normal);min-height:32px}.sefin-button--md{padding:var(--sefin-spacing-md) var(--sefin-spacing-lg);font-size:var(--sefin-font-size-base);line-height:var(--sefin-line-height-normal);min-height:40px}.sefin-button--lg{padding:var(--sefin-spacing-lg) var(--sefin-spacing-xl);font-size:var(--sefin-font-size-lg);line-height:var(--sefin-line-height-normal);min-height:48px}.sefin-button--primary{background-color:var(--sefin-color-primary);color:#fff}.sefin-button--primary:hover:not(:disabled){background-color:var(--sefin-color-primary-dark)}.sefin-button--primary:active:not(:disabled){transform:translateY(1px)}.sefin-button--secondary{background-color:var(--sefin-color-secondary);color:#fff}.sefin-button--secondary:hover:not(:disabled){background-color:var(--sefin-color-secondary-dark)}.sefin-button--secondary:active:not(:disabled){transform:translateY(1px)}.sefin-button--outline{background-color:transparent;color:var(--sefin-color-primary);border-color:var(--sefin-color-primary)}.sefin-button--outline:hover:not(:disabled){background-color:var(--sefin-color-primary);color:#fff}.sefin-button--ghost{background-color:transparent;color:var(--sefin-color-primary)}.sefin-button--ghost:hover:not(:disabled){background-color:var(--sefin-color-surface-hover)}.sefin-button--danger{background-color:var(--sefin-color-error);color:#fff}.sefin-button--danger:hover:not(:disabled){background-color:var(--sefin-color-error);opacity:.9}.sefin-button--disabled{opacity:.6;cursor:not-allowed;pointer-events:none}\n"] }]
|
|
971
|
+
args: [{ selector: 'sefin-button', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<button [type]=\"type\" [disabled]=\"disabled\" [class]=\"buttonClasses\" (click)=\"onClick($event)\">\n <ng-content></ng-content>\n</button>\n", styles: [".sefin-button{display:inline-flex;align-items:center;justify-content:center;font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);border-radius:var(--sefin-radius-md);transition:all .2s ease-in-out;cursor:pointer;outline:none;border:1px solid transparent}.sefin-button--full-width{display:flex;width:100%}.sefin-button:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px}.sefin-button--sm{padding:var(--sefin-spacing-sm) var(--sefin-spacing-md);font-size:var(--sefin-font-size-sm);line-height:var(--sefin-line-height-normal);min-height:32px}.sefin-button--md{padding:var(--sefin-spacing-md) var(--sefin-spacing-lg);font-size:var(--sefin-font-size-base);line-height:var(--sefin-line-height-normal);min-height:40px}.sefin-button--lg{padding:var(--sefin-spacing-lg) var(--sefin-spacing-xl);font-size:var(--sefin-font-size-lg);line-height:var(--sefin-line-height-normal);min-height:48px}.sefin-button--primary{background-color:var(--sefin-color-primary);color:#fff}.sefin-button--primary:hover:not(:disabled){background-color:var(--sefin-color-primary-dark)}.sefin-button--primary:active:not(:disabled){transform:translateY(1px)}.sefin-button--secondary{background-color:var(--sefin-color-secondary);color:#fff}.sefin-button--secondary:hover:not(:disabled){background-color:var(--sefin-color-secondary-dark)}.sefin-button--secondary:active:not(:disabled){transform:translateY(1px)}.sefin-button--outline{background-color:transparent;color:var(--sefin-color-primary);border-color:var(--sefin-color-primary)}.sefin-button--outline:hover:not(:disabled){background-color:var(--sefin-color-primary);color:#fff}.sefin-button--ghost{background-color:transparent;color:var(--sefin-color-primary)}.sefin-button--ghost:hover:not(:disabled){background-color:var(--sefin-color-surface-hover)}.sefin-button--danger{background-color:var(--sefin-color-error);color:#fff}.sefin-button--danger:hover:not(:disabled){background-color:var(--sefin-color-error);opacity:.9}.sefin-button--disabled{opacity:.6;cursor:not-allowed;pointer-events:none}\n"] }]
|
|
968
972
|
}], propDecorators: { variant: [{
|
|
969
973
|
type: Input
|
|
970
974
|
}], size: [{
|
|
971
975
|
type: Input
|
|
972
976
|
}], disabled: [{
|
|
973
977
|
type: Input
|
|
978
|
+
}], fullWidth: [{
|
|
979
|
+
type: Input
|
|
974
980
|
}], type: [{
|
|
975
981
|
type: Input
|
|
976
982
|
}], class: [{
|
|
@@ -2976,6 +2982,205 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
2976
2982
|
type: Input
|
|
2977
2983
|
}] } });
|
|
2978
2984
|
|
|
2985
|
+
class TabComponent {
|
|
2986
|
+
/** Tab variant style. Options: 'default' | 'primary' | 'secondary' | 'underline' */
|
|
2987
|
+
variant = 'default';
|
|
2988
|
+
/** Tab size. Options: 'sm' | 'md' | 'lg' */
|
|
2989
|
+
size = 'md';
|
|
2990
|
+
/** Whether the tab is disabled */
|
|
2991
|
+
disabled = false;
|
|
2992
|
+
/** Whether the tab is active */
|
|
2993
|
+
active = false;
|
|
2994
|
+
/** Additional CSS classes */
|
|
2995
|
+
class = '';
|
|
2996
|
+
clicked = new EventEmitter();
|
|
2997
|
+
onClick(event) {
|
|
2998
|
+
if (!this.disabled) {
|
|
2999
|
+
this.clicked.emit(event);
|
|
3000
|
+
}
|
|
3001
|
+
}
|
|
3002
|
+
get tabClasses() {
|
|
3003
|
+
return [
|
|
3004
|
+
'sefin-tab',
|
|
3005
|
+
`sefin-tab--${this.variant}`,
|
|
3006
|
+
`sefin-tab--${this.size}`,
|
|
3007
|
+
this.disabled ? 'sefin-tab--disabled' : '',
|
|
3008
|
+
this.active ? 'sefin-tab--active' : '',
|
|
3009
|
+
this.class,
|
|
3010
|
+
]
|
|
3011
|
+
.filter(Boolean)
|
|
3012
|
+
.join(' ');
|
|
3013
|
+
}
|
|
3014
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3015
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: TabComponent, isStandalone: true, selector: "sefin-tab", inputs: { variant: "variant", size: "size", disabled: "disabled", active: "active", class: "class" }, outputs: { clicked: "clicked" }, ngImport: i0, template: "<button\n type=\"button\"\n [class]=\"tabClasses\"\n (click)=\"onClick($event)\"\n [disabled]=\"disabled\"\n [attr.aria-selected]=\"active\"\n role=\"tab\"\n [attr.tabindex]=\"disabled ? '-1' : '0'\"\n>\n <span class=\"sefin-tab__content\">\n <ng-content></ng-content>\n </span>\n <span *ngIf=\"active && variant === 'underline'\" class=\"sefin-tab__indicator\"></span>\n</button>\n\n", styles: [".sefin-tab{display:inline-flex;align-items:center;justify-content:center;position:relative;gap:var(--sefin-spacing-xs, 4px);font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);border:none;background:transparent;cursor:pointer;outline:none;white-space:nowrap;-webkit-user-select:none;user-select:none;transition:all .2s ease-in-out;text-align:center}.sefin-tab:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px;border-radius:var(--sefin-radius-sm)}.sefin-tab--sm{padding:var(--sefin-spacing-sm, 8px) var(--sefin-spacing-md, 16px);font-size:var(--sefin-font-size-sm, 14px);min-height:32px}.sefin-tab--md{padding:var(--sefin-spacing-md, 16px) var(--sefin-spacing-lg, 24px);font-size:var(--sefin-font-size-base, 16px);min-height:40px}.sefin-tab--lg{padding:var(--sefin-spacing-lg, 24px) var(--sefin-spacing-xl, 32px);font-size:var(--sefin-font-size-lg, 18px);min-height:48px}.sefin-tab--default{color:var(--sefin-color-text-secondary);border-bottom:2px solid transparent}.sefin-tab--default:hover:not(:disabled){color:var(--sefin-color-text);background-color:var(--sefin-color-surface-hover);border-radius:var(--sefin-radius-md) var(--sefin-radius-md) 0 0}.sefin-tab--default.sefin-tab--active{color:var(--sefin-color-primary);border-bottom-color:var(--sefin-color-primary);font-weight:var(--sefin-font-weight-semibold)}.sefin-tab--primary{color:var(--sefin-color-text-secondary);background-color:transparent;border-radius:var(--sefin-radius-md) var(--sefin-radius-md) 0 0}.sefin-tab--primary:hover:not(:disabled){color:var(--sefin-color-primary);background-color:var(--sefin-color-surface-hover)}.sefin-tab--primary.sefin-tab--active{color:var(--sefin-color-primary);background-color:var(--sefin-color-surface);font-weight:var(--sefin-font-weight-semibold);border-bottom:2px solid var(--sefin-color-primary)}.sefin-tab--secondary{color:var(--sefin-color-text-secondary);background-color:var(--sefin-color-surface-hover);border-radius:var(--sefin-radius-md)}.sefin-tab--secondary:hover:not(:disabled){color:var(--sefin-color-text);background-color:var(--sefin-color-border)}.sefin-tab--secondary.sefin-tab--active{color:#fff;background-color:var(--sefin-color-secondary);font-weight:var(--sefin-font-weight-semibold)}.sefin-tab--underline{color:var(--sefin-color-text-secondary);border-bottom:2px solid transparent}.sefin-tab--underline:hover:not(:disabled){color:var(--sefin-color-text)}.sefin-tab--underline.sefin-tab--active{color:var(--sefin-color-primary);font-weight:var(--sefin-font-weight-semibold)}.sefin-tab--disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.sefin-tab__content{display:inline-flex;align-items:center;gap:var(--sefin-spacing-xs, 4px);position:relative;z-index:1}.sefin-tab__indicator{position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--sefin-color-primary);border-radius:var(--sefin-radius-sm) var(--sefin-radius-sm) 0 0}.sefin-tab ::ng-deep svg,.sefin-tab ::ng-deep sefin-icon{flex-shrink:0}.sefin-tab--sm ::ng-deep svg{width:14px;height:14px}.sefin-tab--md ::ng-deep svg{width:16px;height:16px}.sefin-tab--lg ::ng-deep svg{width:18px;height:18px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3016
|
+
}
|
|
3017
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabComponent, decorators: [{
|
|
3018
|
+
type: Component,
|
|
3019
|
+
args: [{ selector: 'sefin-tab', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n type=\"button\"\n [class]=\"tabClasses\"\n (click)=\"onClick($event)\"\n [disabled]=\"disabled\"\n [attr.aria-selected]=\"active\"\n role=\"tab\"\n [attr.tabindex]=\"disabled ? '-1' : '0'\"\n>\n <span class=\"sefin-tab__content\">\n <ng-content></ng-content>\n </span>\n <span *ngIf=\"active && variant === 'underline'\" class=\"sefin-tab__indicator\"></span>\n</button>\n\n", styles: [".sefin-tab{display:inline-flex;align-items:center;justify-content:center;position:relative;gap:var(--sefin-spacing-xs, 4px);font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);border:none;background:transparent;cursor:pointer;outline:none;white-space:nowrap;-webkit-user-select:none;user-select:none;transition:all .2s ease-in-out;text-align:center}.sefin-tab:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px;border-radius:var(--sefin-radius-sm)}.sefin-tab--sm{padding:var(--sefin-spacing-sm, 8px) var(--sefin-spacing-md, 16px);font-size:var(--sefin-font-size-sm, 14px);min-height:32px}.sefin-tab--md{padding:var(--sefin-spacing-md, 16px) var(--sefin-spacing-lg, 24px);font-size:var(--sefin-font-size-base, 16px);min-height:40px}.sefin-tab--lg{padding:var(--sefin-spacing-lg, 24px) var(--sefin-spacing-xl, 32px);font-size:var(--sefin-font-size-lg, 18px);min-height:48px}.sefin-tab--default{color:var(--sefin-color-text-secondary);border-bottom:2px solid transparent}.sefin-tab--default:hover:not(:disabled){color:var(--sefin-color-text);background-color:var(--sefin-color-surface-hover);border-radius:var(--sefin-radius-md) var(--sefin-radius-md) 0 0}.sefin-tab--default.sefin-tab--active{color:var(--sefin-color-primary);border-bottom-color:var(--sefin-color-primary);font-weight:var(--sefin-font-weight-semibold)}.sefin-tab--primary{color:var(--sefin-color-text-secondary);background-color:transparent;border-radius:var(--sefin-radius-md) var(--sefin-radius-md) 0 0}.sefin-tab--primary:hover:not(:disabled){color:var(--sefin-color-primary);background-color:var(--sefin-color-surface-hover)}.sefin-tab--primary.sefin-tab--active{color:var(--sefin-color-primary);background-color:var(--sefin-color-surface);font-weight:var(--sefin-font-weight-semibold);border-bottom:2px solid var(--sefin-color-primary)}.sefin-tab--secondary{color:var(--sefin-color-text-secondary);background-color:var(--sefin-color-surface-hover);border-radius:var(--sefin-radius-md)}.sefin-tab--secondary:hover:not(:disabled){color:var(--sefin-color-text);background-color:var(--sefin-color-border)}.sefin-tab--secondary.sefin-tab--active{color:#fff;background-color:var(--sefin-color-secondary);font-weight:var(--sefin-font-weight-semibold)}.sefin-tab--underline{color:var(--sefin-color-text-secondary);border-bottom:2px solid transparent}.sefin-tab--underline:hover:not(:disabled){color:var(--sefin-color-text)}.sefin-tab--underline.sefin-tab--active{color:var(--sefin-color-primary);font-weight:var(--sefin-font-weight-semibold)}.sefin-tab--disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.sefin-tab__content{display:inline-flex;align-items:center;gap:var(--sefin-spacing-xs, 4px);position:relative;z-index:1}.sefin-tab__indicator{position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--sefin-color-primary);border-radius:var(--sefin-radius-sm) var(--sefin-radius-sm) 0 0}.sefin-tab ::ng-deep svg,.sefin-tab ::ng-deep sefin-icon{flex-shrink:0}.sefin-tab--sm ::ng-deep svg{width:14px;height:14px}.sefin-tab--md ::ng-deep svg{width:16px;height:16px}.sefin-tab--lg ::ng-deep svg{width:18px;height:18px}\n"] }]
|
|
3020
|
+
}], propDecorators: { variant: [{
|
|
3021
|
+
type: Input
|
|
3022
|
+
}], size: [{
|
|
3023
|
+
type: Input
|
|
3024
|
+
}], disabled: [{
|
|
3025
|
+
type: Input
|
|
3026
|
+
}], active: [{
|
|
3027
|
+
type: Input
|
|
3028
|
+
}], class: [{
|
|
3029
|
+
type: Input
|
|
3030
|
+
}], clicked: [{
|
|
3031
|
+
type: Output
|
|
3032
|
+
}] } });
|
|
3033
|
+
|
|
3034
|
+
class RateComponent {
|
|
3035
|
+
/** Current rating value (0 to max) */
|
|
3036
|
+
set value(value) {
|
|
3037
|
+
this._value.set(Math.max(0, Math.min(value, this.max)));
|
|
3038
|
+
}
|
|
3039
|
+
get value() {
|
|
3040
|
+
return this._value();
|
|
3041
|
+
}
|
|
3042
|
+
_value = signal(0, ...(ngDevMode ? [{ debugName: "_value" }] : []));
|
|
3043
|
+
/** Maximum rating value */
|
|
3044
|
+
max = 5;
|
|
3045
|
+
/** Whether the rating is disabled */
|
|
3046
|
+
disabled = false;
|
|
3047
|
+
/** Whether the rating is readonly */
|
|
3048
|
+
readonly = false;
|
|
3049
|
+
/** Whether to allow half stars */
|
|
3050
|
+
allowHalf = false;
|
|
3051
|
+
/** Icon type. Options: 'star' | 'heart' | 'thumb' */
|
|
3052
|
+
icon = 'star';
|
|
3053
|
+
/** Rate size. Options: 'sm' | 'md' | 'lg' */
|
|
3054
|
+
size = 'md';
|
|
3055
|
+
/** Whether to show text with rating */
|
|
3056
|
+
showText = false;
|
|
3057
|
+
/** Additional CSS classes */
|
|
3058
|
+
class = '';
|
|
3059
|
+
/** Event emitted when rating changes */
|
|
3060
|
+
valueChange = new EventEmitter();
|
|
3061
|
+
/** Event emitted when rating is hovered */
|
|
3062
|
+
hoverChange = new EventEmitter();
|
|
3063
|
+
/** Internal hover value */
|
|
3064
|
+
_hoverValue = signal(null, ...(ngDevMode ? [{ debugName: "_hoverValue" }] : []));
|
|
3065
|
+
items = computed(() => {
|
|
3066
|
+
return Array.from({ length: this.max }, (_, i) => i + 1);
|
|
3067
|
+
}, ...(ngDevMode ? [{ debugName: "items" }] : []));
|
|
3068
|
+
get rateClasses() {
|
|
3069
|
+
return [
|
|
3070
|
+
'sefin-rate',
|
|
3071
|
+
`sefin-rate--${this.size}`,
|
|
3072
|
+
`sefin-rate--${this.icon}`,
|
|
3073
|
+
this.disabled ? 'sefin-rate--disabled' : '',
|
|
3074
|
+
this.readonly ? 'sefin-rate--readonly' : '',
|
|
3075
|
+
this.class,
|
|
3076
|
+
]
|
|
3077
|
+
.filter(Boolean)
|
|
3078
|
+
.join(' ');
|
|
3079
|
+
}
|
|
3080
|
+
isInteractive() {
|
|
3081
|
+
return !this.disabled && !this.readonly;
|
|
3082
|
+
}
|
|
3083
|
+
getDisplayValue() {
|
|
3084
|
+
return this._hoverValue() ?? this.value;
|
|
3085
|
+
}
|
|
3086
|
+
getIconState(index) {
|
|
3087
|
+
const displayValue = this.getDisplayValue();
|
|
3088
|
+
if (displayValue >= index) {
|
|
3089
|
+
return 'full';
|
|
3090
|
+
}
|
|
3091
|
+
if (this.allowHalf && displayValue >= index - 0.5) {
|
|
3092
|
+
return 'half';
|
|
3093
|
+
}
|
|
3094
|
+
return 'empty';
|
|
3095
|
+
}
|
|
3096
|
+
onItemClick(index) {
|
|
3097
|
+
if (!this.isInteractive()) {
|
|
3098
|
+
return;
|
|
3099
|
+
}
|
|
3100
|
+
const newValue = index;
|
|
3101
|
+
if (newValue !== this.value) {
|
|
3102
|
+
this._value.set(newValue);
|
|
3103
|
+
this.valueChange.emit(newValue);
|
|
3104
|
+
}
|
|
3105
|
+
}
|
|
3106
|
+
onItemHover(index) {
|
|
3107
|
+
if (!this.isInteractive()) {
|
|
3108
|
+
return;
|
|
3109
|
+
}
|
|
3110
|
+
this._hoverValue.set(index);
|
|
3111
|
+
this.hoverChange.emit(index);
|
|
3112
|
+
}
|
|
3113
|
+
onHalfClick(index, isLeftHalf) {
|
|
3114
|
+
if (!this.isInteractive() || !this.allowHalf) {
|
|
3115
|
+
return;
|
|
3116
|
+
}
|
|
3117
|
+
const newValue = isLeftHalf ? index - 0.5 : index;
|
|
3118
|
+
if (newValue !== this.value) {
|
|
3119
|
+
this._value.set(newValue);
|
|
3120
|
+
this.valueChange.emit(newValue);
|
|
3121
|
+
}
|
|
3122
|
+
}
|
|
3123
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: RateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3124
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: RateComponent, isStandalone: true, selector: "sefin-rate", inputs: { value: "value", max: "max", disabled: "disabled", readonly: "readonly", allowHalf: "allowHalf", icon: "icon", size: "size", showText: "showText", class: "class" }, outputs: { valueChange: "valueChange", hoverChange: "hoverChange" }, ngImport: i0, template: "<div [class]=\"rateClasses\">\n <div class=\"sefin-rate__container\">\n <div\n *ngFor=\"let item of items(); let i = index\"\n class=\"sefin-rate__item\"\n (mouseenter)=\"onItemHover(item)\"\n (mouseleave)=\"onItemHover(null)\"\n [class.sefin-rate__item--interactive]=\"isInteractive()\"\n >\n <ng-container [ngSwitch]=\"icon\">\n <!-- Star icon -->\n <div *ngSwitchCase=\"'star'\" class=\"sefin-rate__icon-wrapper\">\n <ng-container *ngIf=\"allowHalf && isInteractive(); else fullStar\">\n <div class=\"sefin-rate__icon-half\" (click)=\"onHalfClick(item, true)\">\n <svg\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--half]=\"getIconState(item) === 'half'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <div class=\"sefin-rate__icon-half sefin-rate__icon-half--right\" (click)=\"onHalfClick(item, false)\">\n <svg\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--half]=\"getIconState(item) === 'half'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </ng-container>\n <ng-template #fullStar>\n <svg\n class=\"sefin-rate__icon\"\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--half]=\"getIconState(item) === 'half'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n (click)=\"onItemClick(item)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </ng-template>\n </div>\n\n <!-- Heart icon -->\n <svg\n *ngSwitchCase=\"'heart'\"\n class=\"sefin-rate__icon\"\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n (click)=\"onItemClick(item)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M20.84 4.61C20.3292 4.099 19.7228 3.69364 19.0554 3.41708C18.3879 3.14052 17.6725 2.99817 16.95 2.99817C16.2275 2.99817 15.5121 3.14052 14.8446 3.41708C14.1772 3.69364 13.5708 4.099 13.06 4.61L12 5.67L10.94 4.61C9.9083 3.57831 8.50903 2.99871 7.05 2.99871C5.59096 2.99871 4.19169 3.57831 3.16 4.61C2.1283 5.64169 1.54871 7.04097 1.54871 8.5C1.54871 9.95903 2.1283 11.3583 3.16 12.39L4.22 13.45L12 21.23L19.78 13.45L20.84 12.39C21.351 11.8792 21.7564 11.2728 22.0329 10.6054C22.3095 9.93789 22.4518 9.22248 22.4518 8.5C22.4518 7.77752 22.3095 7.0621 22.0329 6.39464C21.7564 5.72718 21.351 5.12075 20.84 4.61Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n\n <!-- Thumb icon -->\n <svg\n *ngSwitchCase=\"'thumb'\"\n class=\"sefin-rate__icon\"\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n (click)=\"onItemClick(item)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 22V11M2 13V20C2 21.1046 2.89543 22 4 22H16.4262C17.907 22 19.1662 20.9197 19.3914 19.4562L20.4683 12.4562C20.7479 10.6388 19.3411 9 17.5032 9H14C13.4477 9 13 8.55228 13 8V4.46584C13 3.10399 11.896 2 10.5342 2C10.2093 2 9.91498 2.1913 9.78306 2.48812L7.26394 8.57899C7.09882 8.95673 6.74568 9.2 6.35471 9.2H4C2.89543 9.2 2 10.0954 2 11.2V13Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </ng-container>\n </div>\n </div>\n \n <span *ngIf=\"showText\" class=\"sefin-rate__text\">\n {{ value }} / {{ max }}\n </span>\n</div>\n\n", styles: [".sefin-rate{display:inline-flex;align-items:center;gap:var(--sefin-spacing-sm, 8px);font-family:var(--sefin-font-family-base)}.sefin-rate__container{display:inline-flex;align-items:center;gap:var(--sefin-spacing-xs, 4px)}.sefin-rate__item{display:inline-flex;align-items:center;justify-content:center;position:relative;line-height:0}.sefin-rate__item--interactive{cursor:pointer}.sefin-rate__icon-wrapper{display:flex;position:relative;width:100%;height:100%}.sefin-rate__icon-half{position:absolute;width:50%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:flex-start;cursor:pointer}.sefin-rate__icon-half--right{right:0;justify-content:flex-end}.sefin-rate__icon-half svg{width:200%;height:100%}.sefin-rate__icon-half--right svg{transform:translate(-50%)}.sefin-rate__icon{display:block;transition:all .2s ease-in-out;stroke:var(--sefin-color-border);fill:none}.sefin-rate__icon--full{stroke:var(--sefin-color-primary);fill:var(--sefin-color-primary)}.sefin-rate__icon--half{stroke:var(--sefin-color-primary)}.sefin-rate__icon--empty{stroke:var(--sefin-color-border);fill:none}.sefin-rate__item--interactive .sefin-rate__icon{cursor:pointer}.sefin-rate__item--interactive .sefin-rate__icon:hover{stroke:var(--sefin-color-primary);transform:scale(1.1)}.sefin-rate__text{font-size:var(--sefin-font-size-base);color:var(--sefin-color-text-secondary);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal)}.sefin-rate--sm .sefin-rate__icon,.sefin-rate--sm .sefin-rate__icon-wrapper{width:16px;height:16px}.sefin-rate--sm .sefin-rate__text{font-size:var(--sefin-font-size-sm, 14px)}.sefin-rate--md .sefin-rate__icon,.sefin-rate--md .sefin-rate__icon-wrapper{width:20px;height:20px}.sefin-rate--md .sefin-rate__text{font-size:var(--sefin-font-size-base, 16px)}.sefin-rate--lg .sefin-rate__icon,.sefin-rate--lg .sefin-rate__icon-wrapper{width:24px;height:24px}.sefin-rate--lg .sefin-rate__text{font-size:var(--sefin-font-size-lg, 18px)}.sefin-rate--star .sefin-rate__icon--full{color:var(--sefin-color-warning);stroke:var(--sefin-color-warning);fill:var(--sefin-color-warning)}.sefin-rate--star .sefin-rate__icon--half,.sefin-rate--star .sefin-rate__item--interactive .sefin-rate__icon:hover{color:var(--sefin-color-warning);stroke:var(--sefin-color-warning)}.sefin-rate--heart .sefin-rate__icon--full{color:var(--sefin-color-error);stroke:var(--sefin-color-error);fill:var(--sefin-color-error)}.sefin-rate--heart .sefin-rate__icon--half,.sefin-rate--heart .sefin-rate__item--interactive .sefin-rate__icon:hover{color:var(--sefin-color-error);stroke:var(--sefin-color-error)}.sefin-rate--thumb .sefin-rate__icon--full{color:var(--sefin-color-success);stroke:var(--sefin-color-success);fill:var(--sefin-color-success)}.sefin-rate--thumb .sefin-rate__icon--half,.sefin-rate--thumb .sefin-rate__item--interactive .sefin-rate__icon:hover{color:var(--sefin-color-success);stroke:var(--sefin-color-success)}.sefin-rate--disabled .sefin-rate__item,.sefin-rate--readonly .sefin-rate__item{cursor:default;pointer-events:none}.sefin-rate--disabled .sefin-rate__icon,.sefin-rate--readonly .sefin-rate__icon{opacity:.6}.sefin-rate .sefin-rate__icon-half .sefin-rate__icon--half{fill:var(--sefin-color-primary)}.sefin-rate--star .sefin-rate__icon-half .sefin-rate__icon--half{fill:var(--sefin-color-warning)}.sefin-rate--heart .sefin-rate__icon-half .sefin-rate__icon--half{fill:var(--sefin-color-error)}.sefin-rate--thumb .sefin-rate__icon-half .sefin-rate__icon--half{fill:var(--sefin-color-success)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3125
|
+
}
|
|
3126
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: RateComponent, decorators: [{
|
|
3127
|
+
type: Component,
|
|
3128
|
+
args: [{ selector: 'sefin-rate', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"rateClasses\">\n <div class=\"sefin-rate__container\">\n <div\n *ngFor=\"let item of items(); let i = index\"\n class=\"sefin-rate__item\"\n (mouseenter)=\"onItemHover(item)\"\n (mouseleave)=\"onItemHover(null)\"\n [class.sefin-rate__item--interactive]=\"isInteractive()\"\n >\n <ng-container [ngSwitch]=\"icon\">\n <!-- Star icon -->\n <div *ngSwitchCase=\"'star'\" class=\"sefin-rate__icon-wrapper\">\n <ng-container *ngIf=\"allowHalf && isInteractive(); else fullStar\">\n <div class=\"sefin-rate__icon-half\" (click)=\"onHalfClick(item, true)\">\n <svg\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--half]=\"getIconState(item) === 'half'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <div class=\"sefin-rate__icon-half sefin-rate__icon-half--right\" (click)=\"onHalfClick(item, false)\">\n <svg\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--half]=\"getIconState(item) === 'half'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </ng-container>\n <ng-template #fullStar>\n <svg\n class=\"sefin-rate__icon\"\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--half]=\"getIconState(item) === 'half'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n (click)=\"onItemClick(item)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </ng-template>\n </div>\n\n <!-- Heart icon -->\n <svg\n *ngSwitchCase=\"'heart'\"\n class=\"sefin-rate__icon\"\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n (click)=\"onItemClick(item)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M20.84 4.61C20.3292 4.099 19.7228 3.69364 19.0554 3.41708C18.3879 3.14052 17.6725 2.99817 16.95 2.99817C16.2275 2.99817 15.5121 3.14052 14.8446 3.41708C14.1772 3.69364 13.5708 4.099 13.06 4.61L12 5.67L10.94 4.61C9.9083 3.57831 8.50903 2.99871 7.05 2.99871C5.59096 2.99871 4.19169 3.57831 3.16 4.61C2.1283 5.64169 1.54871 7.04097 1.54871 8.5C1.54871 9.95903 2.1283 11.3583 3.16 12.39L4.22 13.45L12 21.23L19.78 13.45L20.84 12.39C21.351 11.8792 21.7564 11.2728 22.0329 10.6054C22.3095 9.93789 22.4518 9.22248 22.4518 8.5C22.4518 7.77752 22.3095 7.0621 22.0329 6.39464C21.7564 5.72718 21.351 5.12075 20.84 4.61Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n\n <!-- Thumb icon -->\n <svg\n *ngSwitchCase=\"'thumb'\"\n class=\"sefin-rate__icon\"\n [class.sefin-rate__icon--full]=\"getIconState(item) === 'full'\"\n [class.sefin-rate__icon--empty]=\"getIconState(item) === 'empty'\"\n (click)=\"onItemClick(item)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 22V11M2 13V20C2 21.1046 2.89543 22 4 22H16.4262C17.907 22 19.1662 20.9197 19.3914 19.4562L20.4683 12.4562C20.7479 10.6388 19.3411 9 17.5032 9H14C13.4477 9 13 8.55228 13 8V4.46584C13 3.10399 11.896 2 10.5342 2C10.2093 2 9.91498 2.1913 9.78306 2.48812L7.26394 8.57899C7.09882 8.95673 6.74568 9.2 6.35471 9.2H4C2.89543 9.2 2 10.0954 2 11.2V13Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </ng-container>\n </div>\n </div>\n \n <span *ngIf=\"showText\" class=\"sefin-rate__text\">\n {{ value }} / {{ max }}\n </span>\n</div>\n\n", styles: [".sefin-rate{display:inline-flex;align-items:center;gap:var(--sefin-spacing-sm, 8px);font-family:var(--sefin-font-family-base)}.sefin-rate__container{display:inline-flex;align-items:center;gap:var(--sefin-spacing-xs, 4px)}.sefin-rate__item{display:inline-flex;align-items:center;justify-content:center;position:relative;line-height:0}.sefin-rate__item--interactive{cursor:pointer}.sefin-rate__icon-wrapper{display:flex;position:relative;width:100%;height:100%}.sefin-rate__icon-half{position:absolute;width:50%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:flex-start;cursor:pointer}.sefin-rate__icon-half--right{right:0;justify-content:flex-end}.sefin-rate__icon-half svg{width:200%;height:100%}.sefin-rate__icon-half--right svg{transform:translate(-50%)}.sefin-rate__icon{display:block;transition:all .2s ease-in-out;stroke:var(--sefin-color-border);fill:none}.sefin-rate__icon--full{stroke:var(--sefin-color-primary);fill:var(--sefin-color-primary)}.sefin-rate__icon--half{stroke:var(--sefin-color-primary)}.sefin-rate__icon--empty{stroke:var(--sefin-color-border);fill:none}.sefin-rate__item--interactive .sefin-rate__icon{cursor:pointer}.sefin-rate__item--interactive .sefin-rate__icon:hover{stroke:var(--sefin-color-primary);transform:scale(1.1)}.sefin-rate__text{font-size:var(--sefin-font-size-base);color:var(--sefin-color-text-secondary);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal)}.sefin-rate--sm .sefin-rate__icon,.sefin-rate--sm .sefin-rate__icon-wrapper{width:16px;height:16px}.sefin-rate--sm .sefin-rate__text{font-size:var(--sefin-font-size-sm, 14px)}.sefin-rate--md .sefin-rate__icon,.sefin-rate--md .sefin-rate__icon-wrapper{width:20px;height:20px}.sefin-rate--md .sefin-rate__text{font-size:var(--sefin-font-size-base, 16px)}.sefin-rate--lg .sefin-rate__icon,.sefin-rate--lg .sefin-rate__icon-wrapper{width:24px;height:24px}.sefin-rate--lg .sefin-rate__text{font-size:var(--sefin-font-size-lg, 18px)}.sefin-rate--star .sefin-rate__icon--full{color:var(--sefin-color-warning);stroke:var(--sefin-color-warning);fill:var(--sefin-color-warning)}.sefin-rate--star .sefin-rate__icon--half,.sefin-rate--star .sefin-rate__item--interactive .sefin-rate__icon:hover{color:var(--sefin-color-warning);stroke:var(--sefin-color-warning)}.sefin-rate--heart .sefin-rate__icon--full{color:var(--sefin-color-error);stroke:var(--sefin-color-error);fill:var(--sefin-color-error)}.sefin-rate--heart .sefin-rate__icon--half,.sefin-rate--heart .sefin-rate__item--interactive .sefin-rate__icon:hover{color:var(--sefin-color-error);stroke:var(--sefin-color-error)}.sefin-rate--thumb .sefin-rate__icon--full{color:var(--sefin-color-success);stroke:var(--sefin-color-success);fill:var(--sefin-color-success)}.sefin-rate--thumb .sefin-rate__icon--half,.sefin-rate--thumb .sefin-rate__item--interactive .sefin-rate__icon:hover{color:var(--sefin-color-success);stroke:var(--sefin-color-success)}.sefin-rate--disabled .sefin-rate__item,.sefin-rate--readonly .sefin-rate__item{cursor:default;pointer-events:none}.sefin-rate--disabled .sefin-rate__icon,.sefin-rate--readonly .sefin-rate__icon{opacity:.6}.sefin-rate .sefin-rate__icon-half .sefin-rate__icon--half{fill:var(--sefin-color-primary)}.sefin-rate--star .sefin-rate__icon-half .sefin-rate__icon--half{fill:var(--sefin-color-warning)}.sefin-rate--heart .sefin-rate__icon-half .sefin-rate__icon--half{fill:var(--sefin-color-error)}.sefin-rate--thumb .sefin-rate__icon-half .sefin-rate__icon--half{fill:var(--sefin-color-success)}\n"] }]
|
|
3129
|
+
}], propDecorators: { value: [{
|
|
3130
|
+
type: Input
|
|
3131
|
+
}], max: [{
|
|
3132
|
+
type: Input
|
|
3133
|
+
}], disabled: [{
|
|
3134
|
+
type: Input
|
|
3135
|
+
}], readonly: [{
|
|
3136
|
+
type: Input
|
|
3137
|
+
}], allowHalf: [{
|
|
3138
|
+
type: Input
|
|
3139
|
+
}], icon: [{
|
|
3140
|
+
type: Input
|
|
3141
|
+
}], size: [{
|
|
3142
|
+
type: Input
|
|
3143
|
+
}], showText: [{
|
|
3144
|
+
type: Input
|
|
3145
|
+
}], class: [{
|
|
3146
|
+
type: Input
|
|
3147
|
+
}], valueChange: [{
|
|
3148
|
+
type: Output
|
|
3149
|
+
}], hoverChange: [{
|
|
3150
|
+
type: Output
|
|
3151
|
+
}] } });
|
|
3152
|
+
|
|
3153
|
+
class SpacerComponent {
|
|
3154
|
+
/** Size of the spacer. Options: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' */
|
|
3155
|
+
size = 'md';
|
|
3156
|
+
/** Orientation of the spacer. Options: 'vertical' | 'horizontal' */
|
|
3157
|
+
orientation = 'vertical';
|
|
3158
|
+
/** Additional CSS classes */
|
|
3159
|
+
class = '';
|
|
3160
|
+
get spacerClasses() {
|
|
3161
|
+
return [
|
|
3162
|
+
'sefin-spacer',
|
|
3163
|
+
`sefin-spacer--${this.orientation}`,
|
|
3164
|
+
`sefin-spacer--${this.size}`,
|
|
3165
|
+
this.class,
|
|
3166
|
+
]
|
|
3167
|
+
.filter(Boolean)
|
|
3168
|
+
.join(' ');
|
|
3169
|
+
}
|
|
3170
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SpacerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3171
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: SpacerComponent, isStandalone: true, selector: "sefin-spacer", inputs: { size: "size", orientation: "orientation", class: "class" }, ngImport: i0, template: "<div [class]=\"spacerClasses\" aria-hidden=\"true\"></div>\n\n", styles: [".sefin-spacer{flex-shrink:0}.sefin-spacer--vertical{display:block;width:100%;height:0}.sefin-spacer--horizontal{display:inline-block;width:0;height:100%;vertical-align:middle}.sefin-spacer--xs.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-xs)}.sefin-spacer--xs.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-xs)}.sefin-spacer--sm.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-sm)}.sefin-spacer--sm.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-sm)}.sefin-spacer--md.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-md)}.sefin-spacer--md.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-md)}.sefin-spacer--lg.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-lg)}.sefin-spacer--lg.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-lg)}.sefin-spacer--xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-xl)}.sefin-spacer--xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-xl)}.sefin-spacer--2xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-2xl)}.sefin-spacer--2xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-2xl)}.sefin-spacer--3xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-3xl)}.sefin-spacer--3xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-3xl)}.sefin-spacer--4xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-4xl)}.sefin-spacer--4xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-4xl)}.sefin-spacer--5xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-5xl)}.sefin-spacer--5xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-5xl)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3172
|
+
}
|
|
3173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SpacerComponent, decorators: [{
|
|
3174
|
+
type: Component,
|
|
3175
|
+
args: [{ selector: 'sefin-spacer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"spacerClasses\" aria-hidden=\"true\"></div>\n\n", styles: [".sefin-spacer{flex-shrink:0}.sefin-spacer--vertical{display:block;width:100%;height:0}.sefin-spacer--horizontal{display:inline-block;width:0;height:100%;vertical-align:middle}.sefin-spacer--xs.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-xs)}.sefin-spacer--xs.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-xs)}.sefin-spacer--sm.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-sm)}.sefin-spacer--sm.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-sm)}.sefin-spacer--md.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-md)}.sefin-spacer--md.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-md)}.sefin-spacer--lg.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-lg)}.sefin-spacer--lg.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-lg)}.sefin-spacer--xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-xl)}.sefin-spacer--xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-xl)}.sefin-spacer--2xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-2xl)}.sefin-spacer--2xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-2xl)}.sefin-spacer--3xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-3xl)}.sefin-spacer--3xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-3xl)}.sefin-spacer--4xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-4xl)}.sefin-spacer--4xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-4xl)}.sefin-spacer--5xl.sefin-spacer--vertical{margin-bottom:var(--sefin-spacing-5xl)}.sefin-spacer--5xl.sefin-spacer--horizontal{margin-right:var(--sefin-spacing-5xl)}\n"] }]
|
|
3176
|
+
}], propDecorators: { size: [{
|
|
3177
|
+
type: Input
|
|
3178
|
+
}], orientation: [{
|
|
3179
|
+
type: Input
|
|
3180
|
+
}], class: [{
|
|
3181
|
+
type: Input
|
|
3182
|
+
}] } });
|
|
3183
|
+
|
|
2979
3184
|
/**
|
|
2980
3185
|
* Atoms index
|
|
2981
3186
|
*/
|
|
@@ -3017,11 +3222,11 @@ class AccordionItemComponent {
|
|
|
3017
3222
|
.join(' ');
|
|
3018
3223
|
}
|
|
3019
3224
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AccordionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3020
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: AccordionItemComponent, isStandalone: true, selector: "sefin-accordion-item", inputs: { title: "title", expanded: "expanded", disabled: "disabled", class: "class" }, outputs: { toggle: "toggle" }, ngImport: i0, template: "<div [class]=\"accordionClasses\">\n <button\n type=\"button\"\n [class]=\"headerClasses\"\n [disabled]=\"disabled\"\n (click)=\"onHeaderClick()\"\n [attr.aria-expanded]=\"expanded\"\n [attr.aria-disabled]=\"disabled\"\n >\n <span class=\"sefin-accordion-item__title\">{{ title }}</span>\n <sefin-icon\n name=\"chevron-down\"\n size=\"sm\"\n [class]=\"'sefin-accordion-item__icon'\"\n [ngClass]=\"{'sefin-accordion-item__icon--expanded': expanded}\"\n ></sefin-icon>\n </button>\n <div\n class=\"sefin-accordion-item__content\"\n [class.sefin-accordion-item__content--expanded]=\"expanded\"\n [attr.aria-hidden]=\"!expanded\"\n >\n <div class=\"sefin-accordion-item__content-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n", styles: [".sefin-accordion-item{display:flex;flex-direction:column;width:100%;font-family:var(--sefin-font-family-base);border:1px solid var(--sefin-color-border, #
|
|
3225
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: AccordionItemComponent, isStandalone: true, selector: "sefin-accordion-item", inputs: { title: "title", expanded: "expanded", disabled: "disabled", class: "class" }, outputs: { toggle: "toggle" }, ngImport: i0, template: "<div [class]=\"accordionClasses\">\n <button\n type=\"button\"\n [class]=\"headerClasses\"\n [disabled]=\"disabled\"\n (click)=\"onHeaderClick()\"\n [attr.aria-expanded]=\"expanded\"\n [attr.aria-disabled]=\"disabled\"\n >\n <span class=\"sefin-accordion-item__title\">{{ title }}</span>\n <sefin-icon\n name=\"chevron-down\"\n size=\"sm\"\n [class]=\"'sefin-accordion-item__icon'\"\n [ngClass]=\"{'sefin-accordion-item__icon--expanded': expanded}\"\n ></sefin-icon>\n </button>\n <div\n class=\"sefin-accordion-item__content\"\n [class.sefin-accordion-item__content--expanded]=\"expanded\"\n [attr.aria-hidden]=\"!expanded\"\n >\n <div class=\"sefin-accordion-item__content-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n", styles: [".sefin-accordion-item{display:flex;flex-direction:column;width:100%;font-family:var(--sefin-font-family-base);background-color:var(--sefin-color-surface, #ffffff);border:1px solid var(--sefin-color-border, #cecece);border-radius:var(--sefin-radius-md, 8px);box-shadow:var(--sefin-shadow-sm, 0 1px 2px 0 rgba(0, 0, 0, .05));overflow:hidden;transition:box-shadow .2s cubic-bezier(.4,0,.2,1) 0ms,border-color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item:hover:not(.sefin-accordion-item--disabled){border-color:var(--sefin-color-primary, #55C3D8);box-shadow:var(--sefin-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06))}.sefin-accordion-item--expanded{border-color:var(--sefin-color-primary, #55C3D8);box-shadow:var(--sefin-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06))}.sefin-accordion-item--disabled{opacity:.6;cursor:not-allowed;box-shadow:none}.sefin-accordion-item__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--sefin-spacing-lg, 24px);background-color:var(--sefin-color-surface, #ffffff);border:none;cursor:pointer;outline:none;font-family:var(--sefin-font-family-base);font-size:var(--sefin-font-size-base, 16px);font-weight:var(--sefin-font-weight-medium, 500);text-align:left;position:relative;transition:background-color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__header:before{content:\"\";position:absolute;left:0;top:0;bottom:0;width:3px;background-color:transparent;transition:background-color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__header:hover:not(:disabled){background-color:var(--sefin-color-surface-hover, #f5f5f5)}.sefin-accordion-item__header:focus-visible{outline:2px solid var(--sefin-color-border-focus, #55C3D8);outline-offset:-2px}.sefin-accordion-item__header:active:not(:disabled){background-color:var(--sefin-color-surface-hover, #f5f5f5)}.sefin-accordion-item__header--expanded{background-color:var(--sefin-color-surface-hover, #f5f5f5)}.sefin-accordion-item__header--expanded:before{background-color:var(--sefin-color-primary, #55C3D8)}.sefin-accordion-item__header--expanded:hover:not(:disabled){background-color:var(--sefin-color-surface-hover, #f5f5f5)}.sefin-accordion-item__header--disabled{cursor:not-allowed;opacity:.6}.sefin-accordion-item__title{flex:1;font-family:var(--sefin-font-family-base);font-size:var(--sefin-font-size-base, 16px);font-weight:var(--sefin-font-weight-medium, 500);color:var(--sefin-color-text, #383838);line-height:var(--sefin-line-height-normal, 1.5);transition:color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__header--disabled .sefin-accordion-item__title{color:var(--sefin-color-text-disabled, #9b9b9b)}.sefin-accordion-item__icon{flex-shrink:0;margin-left:var(--sefin-spacing-md, 16px);color:var(--sefin-color-text-secondary, #686868);transition:transform .3s cubic-bezier(.4,0,.2,1) 0ms,color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__icon--expanded{transform:rotate(180deg);color:var(--sefin-color-primary, #55C3D8)}.sefin-accordion-item__header:hover:not(:disabled) .sefin-accordion-item__icon{color:var(--sefin-color-primary, #55C3D8)}.sefin-accordion-item__header--expanded .sefin-accordion-item__icon{color:var(--sefin-color-primary, #55C3D8)}.sefin-accordion-item__content{max-height:0;overflow:hidden;background-color:var(--sefin-color-surface, #ffffff);padding:0 var(--sefin-spacing-lg, 24px);transition:max-height .4s cubic-bezier(.4,0,.2,1) 0ms,opacity .35s cubic-bezier(.4,0,.2,1) 0ms,padding-bottom .4s cubic-bezier(.4,0,.2,1) 0ms;opacity:0;padding-bottom:0}.sefin-accordion-item__content--expanded{max-height:2000px;padding-bottom:var(--sefin-spacing-lg, 24px);opacity:1;transition:max-height .4s cubic-bezier(.4,0,.2,1) 0ms,opacity .3s cubic-bezier(.4,0,.2,1) .1s,padding-bottom .4s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__content-inner{padding-top:var(--sefin-spacing-md, 16px);font-family:var(--sefin-font-family-base);font-size:var(--sefin-font-size-base, 16px);font-weight:var(--sefin-font-weight-normal, 400);color:var(--sefin-color-text-secondary, #686868);line-height:var(--sefin-line-height-relaxed, 1.75)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconComponent, selector: "sefin-icon", inputs: ["name", "size", "color", "rotate", "flipH", "flipV", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3021
3226
|
}
|
|
3022
3227
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AccordionItemComponent, decorators: [{
|
|
3023
3228
|
type: Component,
|
|
3024
|
-
args: [{ selector: 'sefin-accordion-item', standalone: true, imports: [CommonModule, IconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"accordionClasses\">\n <button\n type=\"button\"\n [class]=\"headerClasses\"\n [disabled]=\"disabled\"\n (click)=\"onHeaderClick()\"\n [attr.aria-expanded]=\"expanded\"\n [attr.aria-disabled]=\"disabled\"\n >\n <span class=\"sefin-accordion-item__title\">{{ title }}</span>\n <sefin-icon\n name=\"chevron-down\"\n size=\"sm\"\n [class]=\"'sefin-accordion-item__icon'\"\n [ngClass]=\"{'sefin-accordion-item__icon--expanded': expanded}\"\n ></sefin-icon>\n </button>\n <div\n class=\"sefin-accordion-item__content\"\n [class.sefin-accordion-item__content--expanded]=\"expanded\"\n [attr.aria-hidden]=\"!expanded\"\n >\n <div class=\"sefin-accordion-item__content-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n", styles: [".sefin-accordion-item{display:flex;flex-direction:column;width:100%;font-family:var(--sefin-font-family-base);border:1px solid var(--sefin-color-border, #
|
|
3229
|
+
args: [{ selector: 'sefin-accordion-item', standalone: true, imports: [CommonModule, IconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"accordionClasses\">\n <button\n type=\"button\"\n [class]=\"headerClasses\"\n [disabled]=\"disabled\"\n (click)=\"onHeaderClick()\"\n [attr.aria-expanded]=\"expanded\"\n [attr.aria-disabled]=\"disabled\"\n >\n <span class=\"sefin-accordion-item__title\">{{ title }}</span>\n <sefin-icon\n name=\"chevron-down\"\n size=\"sm\"\n [class]=\"'sefin-accordion-item__icon'\"\n [ngClass]=\"{'sefin-accordion-item__icon--expanded': expanded}\"\n ></sefin-icon>\n </button>\n <div\n class=\"sefin-accordion-item__content\"\n [class.sefin-accordion-item__content--expanded]=\"expanded\"\n [attr.aria-hidden]=\"!expanded\"\n >\n <div class=\"sefin-accordion-item__content-inner\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n", styles: [".sefin-accordion-item{display:flex;flex-direction:column;width:100%;font-family:var(--sefin-font-family-base);background-color:var(--sefin-color-surface, #ffffff);border:1px solid var(--sefin-color-border, #cecece);border-radius:var(--sefin-radius-md, 8px);box-shadow:var(--sefin-shadow-sm, 0 1px 2px 0 rgba(0, 0, 0, .05));overflow:hidden;transition:box-shadow .2s cubic-bezier(.4,0,.2,1) 0ms,border-color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item:hover:not(.sefin-accordion-item--disabled){border-color:var(--sefin-color-primary, #55C3D8);box-shadow:var(--sefin-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06))}.sefin-accordion-item--expanded{border-color:var(--sefin-color-primary, #55C3D8);box-shadow:var(--sefin-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06))}.sefin-accordion-item--disabled{opacity:.6;cursor:not-allowed;box-shadow:none}.sefin-accordion-item__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--sefin-spacing-lg, 24px);background-color:var(--sefin-color-surface, #ffffff);border:none;cursor:pointer;outline:none;font-family:var(--sefin-font-family-base);font-size:var(--sefin-font-size-base, 16px);font-weight:var(--sefin-font-weight-medium, 500);text-align:left;position:relative;transition:background-color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__header:before{content:\"\";position:absolute;left:0;top:0;bottom:0;width:3px;background-color:transparent;transition:background-color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__header:hover:not(:disabled){background-color:var(--sefin-color-surface-hover, #f5f5f5)}.sefin-accordion-item__header:focus-visible{outline:2px solid var(--sefin-color-border-focus, #55C3D8);outline-offset:-2px}.sefin-accordion-item__header:active:not(:disabled){background-color:var(--sefin-color-surface-hover, #f5f5f5)}.sefin-accordion-item__header--expanded{background-color:var(--sefin-color-surface-hover, #f5f5f5)}.sefin-accordion-item__header--expanded:before{background-color:var(--sefin-color-primary, #55C3D8)}.sefin-accordion-item__header--expanded:hover:not(:disabled){background-color:var(--sefin-color-surface-hover, #f5f5f5)}.sefin-accordion-item__header--disabled{cursor:not-allowed;opacity:.6}.sefin-accordion-item__title{flex:1;font-family:var(--sefin-font-family-base);font-size:var(--sefin-font-size-base, 16px);font-weight:var(--sefin-font-weight-medium, 500);color:var(--sefin-color-text, #383838);line-height:var(--sefin-line-height-normal, 1.5);transition:color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__header--disabled .sefin-accordion-item__title{color:var(--sefin-color-text-disabled, #9b9b9b)}.sefin-accordion-item__icon{flex-shrink:0;margin-left:var(--sefin-spacing-md, 16px);color:var(--sefin-color-text-secondary, #686868);transition:transform .3s cubic-bezier(.4,0,.2,1) 0ms,color .2s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__icon--expanded{transform:rotate(180deg);color:var(--sefin-color-primary, #55C3D8)}.sefin-accordion-item__header:hover:not(:disabled) .sefin-accordion-item__icon{color:var(--sefin-color-primary, #55C3D8)}.sefin-accordion-item__header--expanded .sefin-accordion-item__icon{color:var(--sefin-color-primary, #55C3D8)}.sefin-accordion-item__content{max-height:0;overflow:hidden;background-color:var(--sefin-color-surface, #ffffff);padding:0 var(--sefin-spacing-lg, 24px);transition:max-height .4s cubic-bezier(.4,0,.2,1) 0ms,opacity .35s cubic-bezier(.4,0,.2,1) 0ms,padding-bottom .4s cubic-bezier(.4,0,.2,1) 0ms;opacity:0;padding-bottom:0}.sefin-accordion-item__content--expanded{max-height:2000px;padding-bottom:var(--sefin-spacing-lg, 24px);opacity:1;transition:max-height .4s cubic-bezier(.4,0,.2,1) 0ms,opacity .3s cubic-bezier(.4,0,.2,1) .1s,padding-bottom .4s cubic-bezier(.4,0,.2,1) 0ms}.sefin-accordion-item__content-inner{padding-top:var(--sefin-spacing-md, 16px);font-family:var(--sefin-font-family-base);font-size:var(--sefin-font-size-base, 16px);font-weight:var(--sefin-font-weight-normal, 400);color:var(--sefin-color-text-secondary, #686868);line-height:var(--sefin-line-height-relaxed, 1.75)}\n"] }]
|
|
3025
3230
|
}], propDecorators: { title: [{
|
|
3026
3231
|
type: Input
|
|
3027
3232
|
}], expanded: [{
|
|
@@ -3311,6 +3516,234 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
3311
3516
|
args: ['document:click', ['$event']]
|
|
3312
3517
|
}] } });
|
|
3313
3518
|
|
|
3519
|
+
class BreadcrumbsComponent {
|
|
3520
|
+
sanitizer;
|
|
3521
|
+
/** Array of breadcrumb items */
|
|
3522
|
+
items = [];
|
|
3523
|
+
/** Separator style. Options: 'slash' | 'chevron' | 'arrow' */
|
|
3524
|
+
separator = 'slash';
|
|
3525
|
+
/** Breadcrumb size. Options: 'sm' | 'md' | 'lg' */
|
|
3526
|
+
size = 'md';
|
|
3527
|
+
/** Additional CSS classes */
|
|
3528
|
+
class = '';
|
|
3529
|
+
constructor(sanitizer) {
|
|
3530
|
+
this.sanitizer = sanitizer;
|
|
3531
|
+
}
|
|
3532
|
+
get breadcrumbsClasses() {
|
|
3533
|
+
return [
|
|
3534
|
+
'sefin-breadcrumbs',
|
|
3535
|
+
`sefin-breadcrumbs--${this.size}`,
|
|
3536
|
+
this.class,
|
|
3537
|
+
]
|
|
3538
|
+
.filter(Boolean)
|
|
3539
|
+
.join(' ');
|
|
3540
|
+
}
|
|
3541
|
+
isLastItem(index) {
|
|
3542
|
+
return index === this.items.length - 1;
|
|
3543
|
+
}
|
|
3544
|
+
getSeparatorIcon() {
|
|
3545
|
+
switch (this.separator) {
|
|
3546
|
+
case 'chevron':
|
|
3547
|
+
return '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 18L15 12L9 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
|
|
3548
|
+
case 'arrow':
|
|
3549
|
+
return '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5 12H19M19 12L12 5M19 12L12 19" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
|
|
3550
|
+
case 'slash':
|
|
3551
|
+
default:
|
|
3552
|
+
return '/';
|
|
3553
|
+
}
|
|
3554
|
+
}
|
|
3555
|
+
sanitizeHtml(html) {
|
|
3556
|
+
if (!html)
|
|
3557
|
+
return '';
|
|
3558
|
+
// For simple text like '/', return as is
|
|
3559
|
+
if (html.length <= 2 && !html.includes('<')) {
|
|
3560
|
+
return html;
|
|
3561
|
+
}
|
|
3562
|
+
// Use sanitize for user-provided HTML (icons from items)
|
|
3563
|
+
// This sanitizes but allows safe SVG elements
|
|
3564
|
+
return this.sanitizer.sanitize(1, html) || '';
|
|
3565
|
+
}
|
|
3566
|
+
getSeparatorIconSafe() {
|
|
3567
|
+
// For separators generated internally, we can trust the HTML
|
|
3568
|
+
const icon = this.getSeparatorIcon();
|
|
3569
|
+
if (icon.length <= 2 && !icon.includes('<')) {
|
|
3570
|
+
return icon;
|
|
3571
|
+
}
|
|
3572
|
+
return this.sanitizer.bypassSecurityTrustHtml(icon);
|
|
3573
|
+
}
|
|
3574
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: BreadcrumbsComponent, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
3575
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: BreadcrumbsComponent, isStandalone: true, selector: "sefin-breadcrumbs", inputs: { items: "items", separator: "separator", size: "size", class: "class" }, ngImport: i0, template: "<nav [class]=\"breadcrumbsClasses\" aria-label=\"Breadcrumb\">\n <ol class=\"sefin-breadcrumbs__list\">\n <li\n *ngFor=\"let item of items; let i = index; let isLast = last\"\n class=\"sefin-breadcrumbs__item\"\n >\n <ng-container *ngIf=\"isLastItem(i); else linkTemplate\">\n <span class=\"sefin-breadcrumbs__current\" [attr.aria-current]=\"'page'\">\n <span *ngIf=\"item.icon\" class=\"sefin-breadcrumbs__icon\" [innerHTML]=\"sanitizeHtml(item.icon)\"></span>\n {{ item.label }}\n </span>\n </ng-container>\n <ng-template #linkTemplate>\n <sefin-link\n [href]=\"item.href || '#'\"\n variant=\"default\"\n [size]=\"size\"\n class=\"sefin-breadcrumbs__link\"\n >\n <span *ngIf=\"item.icon\" class=\"sefin-breadcrumbs__icon\" [innerHTML]=\"sanitizeHtml(item.icon)\"></span>\n {{ item.label }}\n </sefin-link>\n </ng-template>\n <span\n *ngIf=\"!isLast\"\n class=\"sefin-breadcrumbs__separator\"\n [attr.aria-hidden]=\"true\"\n [innerHTML]=\"getSeparatorIconSafe()\"\n ></span>\n </li>\n </ol>\n</nav>\n\n", styles: [".sefin-breadcrumbs{display:flex;align-items:center;font-family:var(--sefin-font-family-base)}.sefin-breadcrumbs__list{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0;gap:var(--sefin-spacing-xs, 4px)}.sefin-breadcrumbs__item{display:inline-flex;align-items:center;gap:var(--sefin-spacing-xs, 4px)}.sefin-breadcrumbs__link{color:var(--sefin-color-text-secondary);text-decoration:none;transition:color .2s ease-in-out}.sefin-breadcrumbs__link:hover{color:var(--sefin-color-primary)}.sefin-breadcrumbs__link:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px;border-radius:var(--sefin-radius-sm)}.sefin-breadcrumbs__current{color:var(--sefin-color-text);font-weight:var(--sefin-font-weight-medium);display:inline-flex;align-items:center;gap:var(--sefin-spacing-xs, 4px)}.sefin-breadcrumbs__separator{display:inline-flex;align-items:center;justify-content:center;color:var(--sefin-color-text-disabled);margin:0 var(--sefin-spacing-xs, 4px);-webkit-user-select:none;user-select:none;flex-shrink:0}.sefin-breadcrumbs__separator svg{display:block;width:12px;height:12px}.sefin-breadcrumbs__icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.sefin-breadcrumbs__icon svg{display:block;width:14px;height:14px}.sefin-breadcrumbs--sm{font-size:var(--sefin-font-size-sm, 14px)}.sefin-breadcrumbs--sm .sefin-breadcrumbs__separator{margin:0 var(--sefin-spacing-xs, 4px)}.sefin-breadcrumbs--sm .sefin-breadcrumbs__separator svg{width:10px;height:10px}.sefin-breadcrumbs--sm .sefin-breadcrumbs__icon svg{width:12px;height:12px}.sefin-breadcrumbs--md{font-size:var(--sefin-font-size-base, 16px)}.sefin-breadcrumbs--md .sefin-breadcrumbs__separator{margin:0 var(--sefin-spacing-sm, 8px)}.sefin-breadcrumbs--md .sefin-breadcrumbs__separator svg{width:12px;height:12px}.sefin-breadcrumbs--md .sefin-breadcrumbs__icon svg{width:14px;height:14px}.sefin-breadcrumbs--lg{font-size:var(--sefin-font-size-lg, 18px)}.sefin-breadcrumbs--lg .sefin-breadcrumbs__separator{margin:0 var(--sefin-spacing-sm, 8px)}.sefin-breadcrumbs--lg .sefin-breadcrumbs__separator svg{width:14px;height:14px}.sefin-breadcrumbs--lg .sefin-breadcrumbs__icon svg{width:16px;height:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LinkComponent, selector: "sefin-link", inputs: ["variant", "size", "disabled", "href", "target", "rel", "class", "underline"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3576
|
+
}
|
|
3577
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: BreadcrumbsComponent, decorators: [{
|
|
3578
|
+
type: Component,
|
|
3579
|
+
args: [{ selector: 'sefin-breadcrumbs', standalone: true, imports: [CommonModule, LinkComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav [class]=\"breadcrumbsClasses\" aria-label=\"Breadcrumb\">\n <ol class=\"sefin-breadcrumbs__list\">\n <li\n *ngFor=\"let item of items; let i = index; let isLast = last\"\n class=\"sefin-breadcrumbs__item\"\n >\n <ng-container *ngIf=\"isLastItem(i); else linkTemplate\">\n <span class=\"sefin-breadcrumbs__current\" [attr.aria-current]=\"'page'\">\n <span *ngIf=\"item.icon\" class=\"sefin-breadcrumbs__icon\" [innerHTML]=\"sanitizeHtml(item.icon)\"></span>\n {{ item.label }}\n </span>\n </ng-container>\n <ng-template #linkTemplate>\n <sefin-link\n [href]=\"item.href || '#'\"\n variant=\"default\"\n [size]=\"size\"\n class=\"sefin-breadcrumbs__link\"\n >\n <span *ngIf=\"item.icon\" class=\"sefin-breadcrumbs__icon\" [innerHTML]=\"sanitizeHtml(item.icon)\"></span>\n {{ item.label }}\n </sefin-link>\n </ng-template>\n <span\n *ngIf=\"!isLast\"\n class=\"sefin-breadcrumbs__separator\"\n [attr.aria-hidden]=\"true\"\n [innerHTML]=\"getSeparatorIconSafe()\"\n ></span>\n </li>\n </ol>\n</nav>\n\n", styles: [".sefin-breadcrumbs{display:flex;align-items:center;font-family:var(--sefin-font-family-base)}.sefin-breadcrumbs__list{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0;gap:var(--sefin-spacing-xs, 4px)}.sefin-breadcrumbs__item{display:inline-flex;align-items:center;gap:var(--sefin-spacing-xs, 4px)}.sefin-breadcrumbs__link{color:var(--sefin-color-text-secondary);text-decoration:none;transition:color .2s ease-in-out}.sefin-breadcrumbs__link:hover{color:var(--sefin-color-primary)}.sefin-breadcrumbs__link:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px;border-radius:var(--sefin-radius-sm)}.sefin-breadcrumbs__current{color:var(--sefin-color-text);font-weight:var(--sefin-font-weight-medium);display:inline-flex;align-items:center;gap:var(--sefin-spacing-xs, 4px)}.sefin-breadcrumbs__separator{display:inline-flex;align-items:center;justify-content:center;color:var(--sefin-color-text-disabled);margin:0 var(--sefin-spacing-xs, 4px);-webkit-user-select:none;user-select:none;flex-shrink:0}.sefin-breadcrumbs__separator svg{display:block;width:12px;height:12px}.sefin-breadcrumbs__icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.sefin-breadcrumbs__icon svg{display:block;width:14px;height:14px}.sefin-breadcrumbs--sm{font-size:var(--sefin-font-size-sm, 14px)}.sefin-breadcrumbs--sm .sefin-breadcrumbs__separator{margin:0 var(--sefin-spacing-xs, 4px)}.sefin-breadcrumbs--sm .sefin-breadcrumbs__separator svg{width:10px;height:10px}.sefin-breadcrumbs--sm .sefin-breadcrumbs__icon svg{width:12px;height:12px}.sefin-breadcrumbs--md{font-size:var(--sefin-font-size-base, 16px)}.sefin-breadcrumbs--md .sefin-breadcrumbs__separator{margin:0 var(--sefin-spacing-sm, 8px)}.sefin-breadcrumbs--md .sefin-breadcrumbs__separator svg{width:12px;height:12px}.sefin-breadcrumbs--md .sefin-breadcrumbs__icon svg{width:14px;height:14px}.sefin-breadcrumbs--lg{font-size:var(--sefin-font-size-lg, 18px)}.sefin-breadcrumbs--lg .sefin-breadcrumbs__separator{margin:0 var(--sefin-spacing-sm, 8px)}.sefin-breadcrumbs--lg .sefin-breadcrumbs__separator svg{width:14px;height:14px}.sefin-breadcrumbs--lg .sefin-breadcrumbs__icon svg{width:16px;height:16px}\n"] }]
|
|
3580
|
+
}], ctorParameters: () => [{ type: i1$1.DomSanitizer }], propDecorators: { items: [{
|
|
3581
|
+
type: Input
|
|
3582
|
+
}], separator: [{
|
|
3583
|
+
type: Input
|
|
3584
|
+
}], size: [{
|
|
3585
|
+
type: Input
|
|
3586
|
+
}], class: [{
|
|
3587
|
+
type: Input
|
|
3588
|
+
}] } });
|
|
3589
|
+
|
|
3590
|
+
class ButtonGroupComponent {
|
|
3591
|
+
sanitizer;
|
|
3592
|
+
constructor(sanitizer) {
|
|
3593
|
+
this.sanitizer = sanitizer;
|
|
3594
|
+
}
|
|
3595
|
+
/** Array of button options */
|
|
3596
|
+
options = [];
|
|
3597
|
+
/** Selected value (for segmented variant) */
|
|
3598
|
+
value = null;
|
|
3599
|
+
/** Whether multiple selection is allowed (for default variant) */
|
|
3600
|
+
multiple = false;
|
|
3601
|
+
/** Selected values (for multiple selection) */
|
|
3602
|
+
selectedValues = [];
|
|
3603
|
+
/** Button variant style. Options: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' */
|
|
3604
|
+
variant = 'primary';
|
|
3605
|
+
/** Button size. Options: 'sm' | 'md' | 'lg' */
|
|
3606
|
+
size = 'md';
|
|
3607
|
+
/** Button group variant. Options: 'default' | 'segmented' */
|
|
3608
|
+
groupVariant = 'default';
|
|
3609
|
+
/** Whether the button group is disabled */
|
|
3610
|
+
disabled = false;
|
|
3611
|
+
/** Whether buttons should take full width of the container */
|
|
3612
|
+
fullWidth = false;
|
|
3613
|
+
/** Additional CSS classes */
|
|
3614
|
+
class = '';
|
|
3615
|
+
/** Event emitted when value changes (for segmented variant) */
|
|
3616
|
+
valueChange = new EventEmitter();
|
|
3617
|
+
/** Event emitted when selected values change (for multiple selection) */
|
|
3618
|
+
selectedValuesChange = new EventEmitter();
|
|
3619
|
+
/** Event emitted when a button is clicked */
|
|
3620
|
+
buttonClick = new EventEmitter();
|
|
3621
|
+
get buttonGroupClasses() {
|
|
3622
|
+
return [
|
|
3623
|
+
'sefin-button-group',
|
|
3624
|
+
`sefin-button-group--${this.groupVariant}`,
|
|
3625
|
+
`sefin-button-group--${this.size}`,
|
|
3626
|
+
this.groupVariant === 'default' ? `sefin-button-group--${this.variant}` : '',
|
|
3627
|
+
this.fullWidth ? 'sefin-button-group--full-width' : '',
|
|
3628
|
+
this.disabled ? 'sefin-button-group--disabled' : '',
|
|
3629
|
+
this.class,
|
|
3630
|
+
]
|
|
3631
|
+
.filter(Boolean)
|
|
3632
|
+
.join(' ');
|
|
3633
|
+
}
|
|
3634
|
+
isSelected(option) {
|
|
3635
|
+
if (this.groupVariant === 'segmented') {
|
|
3636
|
+
return this.value === option.value;
|
|
3637
|
+
}
|
|
3638
|
+
return this.selectedValues.includes(option.value);
|
|
3639
|
+
}
|
|
3640
|
+
onButtonClick(option) {
|
|
3641
|
+
if (this.disabled || option.disabled) {
|
|
3642
|
+
return;
|
|
3643
|
+
}
|
|
3644
|
+
this.buttonClick.emit(option);
|
|
3645
|
+
if (this.groupVariant === 'segmented') {
|
|
3646
|
+
// Toggle selection for segmented
|
|
3647
|
+
const newValue = this.value === option.value ? null : option.value;
|
|
3648
|
+
this.value = newValue;
|
|
3649
|
+
this.valueChange.emit(newValue);
|
|
3650
|
+
}
|
|
3651
|
+
else {
|
|
3652
|
+
// Multiple selection logic
|
|
3653
|
+
const index = this.selectedValues.indexOf(option.value);
|
|
3654
|
+
if (this.multiple) {
|
|
3655
|
+
if (index >= 0) {
|
|
3656
|
+
// Deselect
|
|
3657
|
+
this.selectedValues = this.selectedValues.filter((v) => v !== option.value);
|
|
3658
|
+
}
|
|
3659
|
+
else {
|
|
3660
|
+
// Select
|
|
3661
|
+
this.selectedValues = [...this.selectedValues, option.value];
|
|
3662
|
+
}
|
|
3663
|
+
this.selectedValuesChange.emit([...this.selectedValues]);
|
|
3664
|
+
}
|
|
3665
|
+
else {
|
|
3666
|
+
// Single selection (even in default variant)
|
|
3667
|
+
if (index >= 0) {
|
|
3668
|
+
// Deselect if already selected
|
|
3669
|
+
this.selectedValues = [];
|
|
3670
|
+
}
|
|
3671
|
+
else {
|
|
3672
|
+
// Select only this one
|
|
3673
|
+
this.selectedValues = [option.value];
|
|
3674
|
+
}
|
|
3675
|
+
this.selectedValuesChange.emit([...this.selectedValues]);
|
|
3676
|
+
}
|
|
3677
|
+
}
|
|
3678
|
+
}
|
|
3679
|
+
getButtonClasses(option) {
|
|
3680
|
+
const classes = ['sefin-button-group__button-item'];
|
|
3681
|
+
// Size class
|
|
3682
|
+
classes.push(`sefin-button-group__button-item--${this.size}`);
|
|
3683
|
+
// Selected state
|
|
3684
|
+
if (this.isSelected(option)) {
|
|
3685
|
+
classes.push('sefin-button-group__button-item--selected');
|
|
3686
|
+
}
|
|
3687
|
+
// Variant classes
|
|
3688
|
+
if (this.groupVariant === 'default') {
|
|
3689
|
+
classes.push('sefin-button-group__button-item--default');
|
|
3690
|
+
// In default variant, all buttons use the variant style
|
|
3691
|
+
classes.push(`sefin-button-group__button-item--${this.variant}`);
|
|
3692
|
+
}
|
|
3693
|
+
else {
|
|
3694
|
+
// Segmented variant
|
|
3695
|
+
classes.push('sefin-button-group__button-item--segmented');
|
|
3696
|
+
if (this.isSelected(option)) {
|
|
3697
|
+
// Selected buttons use the variant style
|
|
3698
|
+
classes.push(`sefin-button-group__button-item--${this.variant}`);
|
|
3699
|
+
}
|
|
3700
|
+
}
|
|
3701
|
+
return classes.join(' ');
|
|
3702
|
+
}
|
|
3703
|
+
sanitizeHtml(html) {
|
|
3704
|
+
if (!html)
|
|
3705
|
+
return '';
|
|
3706
|
+
// For simple text, return as is
|
|
3707
|
+
if (html.length <= 2 && !html.includes('<')) {
|
|
3708
|
+
return html;
|
|
3709
|
+
}
|
|
3710
|
+
// Use sanitize for user-provided HTML (icons)
|
|
3711
|
+
return this.sanitizer.sanitize(1, html) || '';
|
|
3712
|
+
}
|
|
3713
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ButtonGroupComponent, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
3714
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: ButtonGroupComponent, isStandalone: true, selector: "sefin-button-group", inputs: { options: "options", value: "value", multiple: "multiple", selectedValues: "selectedValues", variant: "variant", size: "size", groupVariant: "groupVariant", disabled: "disabled", fullWidth: "fullWidth", class: "class" }, outputs: { valueChange: "valueChange", selectedValuesChange: "selectedValuesChange", buttonClick: "buttonClick" }, ngImport: i0, template: "<div\n [class]=\"buttonGroupClasses\"\n role=\"group\"\n [attr.aria-label]=\"'Button group'\"\n>\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n [class]=\"getButtonClasses(option)\"\n [disabled]=\"disabled || option.disabled\"\n (click)=\"onButtonClick(option)\"\n [attr.aria-pressed]=\"isSelected(option)\"\n [attr.aria-label]=\"option.label\"\n >\n <span\n *ngIf=\"option.icon\"\n class=\"sefin-button-group__icon\"\n [innerHTML]=\"sanitizeHtml(option.icon)\"\n ></span>\n <span class=\"sefin-button-group__label\">{{ option.label }}</span>\n </button>\n</div>\n", styles: [".sefin-button-group{display:inline-flex;align-items:stretch;gap:0;font-family:var(--sefin-font-family-base);position:relative;border-radius:var(--sefin-radius-md);overflow:hidden;box-shadow:var(--sefin-shadow-sm);background-color:transparent;flex-wrap:nowrap}.sefin-button-group--full-width{display:flex;width:100%}.sefin-button-group--full-width .sefin-button-group__button-item{flex:1 1 0;min-width:0;width:0}.sefin-button-group__button-item{position:relative;border-radius:0;margin:0;flex:0 1 auto;min-width:fit-content;text-align:center;white-space:nowrap;border:none;cursor:pointer;outline:none;font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);transition:all .2s ease-in-out;display:flex;align-items:center;justify-content:center;box-shadow:none;-webkit-user-select:none;user-select:none}.sefin-button-group__button-item:first-child,.sefin-button-group__button-item:last-child{border-radius:0}.sefin-button-group__button-item:hover:not(:disabled){z-index:1}.sefin-button-group__button-item:focus-visible{z-index:2;outline:2px solid var(--sefin-color-border-focus);outline-offset:-2px}.sefin-button-group__button-item:active:not(:disabled){transform:translateY(1px)}.sefin-button-group__button-item:disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.sefin-button-group__button-item--sm{padding:var(--sefin-spacing-sm) var(--sefin-spacing-md);font-size:var(--sefin-font-size-sm);min-height:32px}.sefin-button-group__button-item--md{padding:var(--sefin-spacing-md) var(--sefin-spacing-lg);font-size:var(--sefin-font-size-base);min-height:40px}.sefin-button-group__button-item--lg{padding:var(--sefin-spacing-lg) var(--sefin-spacing-xl);font-size:var(--sefin-font-size-lg);min-height:48px}.sefin-button-group__label{display:inline-block;font-family:inherit}.sefin-button-group__icon{display:inline-flex;align-items:center;justify-content:center;margin-right:var(--sefin-spacing-xs);flex-shrink:0;font-family:inherit}.sefin-button-group__icon svg{display:block;width:16px;height:16px}.sefin-button-group--segmented{background-color:var(--sefin-color-surface);border:1px solid var(--sefin-color-border);padding:var(--sefin-spacing-xs);gap:var(--sefin-spacing-xs);overflow:visible;box-shadow:var(--sefin-shadow-sm);border-radius:var(--sefin-radius-md)}.sefin-button-group--segmented .sefin-button-group__button-item{border:1px solid var(--sefin-color-border);background-color:var(--sefin-color-surface);color:var(--sefin-color-text);border-radius:var(--sefin-radius-sm);margin:0;transition:all .2s ease-in-out}.sefin-button-group--segmented .sefin-button-group__button-item:first-child,.sefin-button-group--segmented .sefin-button-group__button-item:last-child{border-radius:var(--sefin-radius-sm)}.sefin-button-group--segmented .sefin-button-group__button-item--selected{background-color:var(--sefin-color-primary);color:#fff;border-color:var(--sefin-color-primary);box-shadow:var(--sefin-shadow-sm)}.sefin-button-group--segmented .sefin-button-group__button-item--selected.sefin-button-group__button-item--primary{background-color:var(--sefin-color-primary);color:#fff;border-color:var(--sefin-color-primary)}.sefin-button-group--segmented .sefin-button-group__button-item--selected.sefin-button-group__button-item--secondary{background-color:var(--sefin-color-secondary);color:#fff;border-color:var(--sefin-color-secondary)}.sefin-button-group--segmented .sefin-button-group__button-item--selected.sefin-button-group__button-item--outline{background-color:var(--sefin-color-primary);color:#fff;border-color:var(--sefin-color-primary)}.sefin-button-group--segmented .sefin-button-group__button-item:not(.sefin-button-group__button-item--selected){background-color:var(--sefin-color-surface);color:var(--sefin-color-text);border-color:var(--sefin-color-border)}.sefin-button-group--segmented .sefin-button-group__button-item:not(.sefin-button-group__button-item--selected):hover:not(:disabled){background-color:var(--sefin-color-surface-hover);border-color:var(--sefin-color-primary);color:var(--sefin-color-primary)}.sefin-button-group--segmented .sefin-button-group__button-item:hover:not(:disabled).sefin-button-group__button-item--selected.sefin-button-group__button-item--primary{background-color:var(--sefin-color-primary-dark);border-color:var(--sefin-color-primary-dark)}.sefin-button-group--segmented .sefin-button-group__button-item:hover:not(:disabled).sefin-button-group__button-item--selected.sefin-button-group__button-item--secondary{background-color:var(--sefin-color-secondary-dark);border-color:var(--sefin-color-secondary-dark)}.sefin-button-group--default{background-color:var(--sefin-color-primary);border:1px solid var(--sefin-color-primary);box-shadow:var(--sefin-shadow-sm);padding:0}.sefin-button-group--default .sefin-button-group__button-item{border:none;border-radius:0;background-color:transparent;color:#fff;margin:0;box-shadow:none}.sefin-button-group--default .sefin-button-group__button-item--selected,.sefin-button-group--default .sefin-button-group__button-item:not(.sefin-button-group__button-item--selected){background-color:transparent;color:#fff}.sefin-button-group--default .sefin-button-group__button-item:hover:not(:disabled){background-color:#ffffff26}.sefin-button-group--default .sefin-button-group__button-item:active:not(:disabled){background-color:#fff3;transform:translateY(0)}.sefin-button-group--default .sefin-button-group__button-item:not(:last-child):after{content:\"\";position:absolute;right:0;top:20%;bottom:20%;width:1px;background-color:#ffffff4d;pointer-events:none}.sefin-button-group--default .sefin-button-group__button-item--primary,.sefin-button-group--default .sefin-button-group__button-item--secondary,.sefin-button-group--default .sefin-button-group__button-item--outline{background-color:transparent}.sefin-button-group--default.sefin-button-group--secondary{background-color:var(--sefin-color-secondary);border-color:var(--sefin-color-secondary)}.sefin-button-group--sm .sefin-button-group__icon svg{width:14px;height:14px}.sefin-button-group--md .sefin-button-group__icon svg{width:16px;height:16px}.sefin-button-group--lg .sefin-button-group__icon svg{width:18px;height:18px}.sefin-button-group--disabled{opacity:.6;pointer-events:none;cursor:not-allowed}.sefin-button-group--disabled .sefin-button-group__button-item{cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
|
|
3715
|
+
}
|
|
3716
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ButtonGroupComponent, decorators: [{
|
|
3717
|
+
type: Component,
|
|
3718
|
+
args: [{ selector: 'sefin-button-group', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.Default, template: "<div\n [class]=\"buttonGroupClasses\"\n role=\"group\"\n [attr.aria-label]=\"'Button group'\"\n>\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n [class]=\"getButtonClasses(option)\"\n [disabled]=\"disabled || option.disabled\"\n (click)=\"onButtonClick(option)\"\n [attr.aria-pressed]=\"isSelected(option)\"\n [attr.aria-label]=\"option.label\"\n >\n <span\n *ngIf=\"option.icon\"\n class=\"sefin-button-group__icon\"\n [innerHTML]=\"sanitizeHtml(option.icon)\"\n ></span>\n <span class=\"sefin-button-group__label\">{{ option.label }}</span>\n </button>\n</div>\n", styles: [".sefin-button-group{display:inline-flex;align-items:stretch;gap:0;font-family:var(--sefin-font-family-base);position:relative;border-radius:var(--sefin-radius-md);overflow:hidden;box-shadow:var(--sefin-shadow-sm);background-color:transparent;flex-wrap:nowrap}.sefin-button-group--full-width{display:flex;width:100%}.sefin-button-group--full-width .sefin-button-group__button-item{flex:1 1 0;min-width:0;width:0}.sefin-button-group__button-item{position:relative;border-radius:0;margin:0;flex:0 1 auto;min-width:fit-content;text-align:center;white-space:nowrap;border:none;cursor:pointer;outline:none;font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);transition:all .2s ease-in-out;display:flex;align-items:center;justify-content:center;box-shadow:none;-webkit-user-select:none;user-select:none}.sefin-button-group__button-item:first-child,.sefin-button-group__button-item:last-child{border-radius:0}.sefin-button-group__button-item:hover:not(:disabled){z-index:1}.sefin-button-group__button-item:focus-visible{z-index:2;outline:2px solid var(--sefin-color-border-focus);outline-offset:-2px}.sefin-button-group__button-item:active:not(:disabled){transform:translateY(1px)}.sefin-button-group__button-item:disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.sefin-button-group__button-item--sm{padding:var(--sefin-spacing-sm) var(--sefin-spacing-md);font-size:var(--sefin-font-size-sm);min-height:32px}.sefin-button-group__button-item--md{padding:var(--sefin-spacing-md) var(--sefin-spacing-lg);font-size:var(--sefin-font-size-base);min-height:40px}.sefin-button-group__button-item--lg{padding:var(--sefin-spacing-lg) var(--sefin-spacing-xl);font-size:var(--sefin-font-size-lg);min-height:48px}.sefin-button-group__label{display:inline-block;font-family:inherit}.sefin-button-group__icon{display:inline-flex;align-items:center;justify-content:center;margin-right:var(--sefin-spacing-xs);flex-shrink:0;font-family:inherit}.sefin-button-group__icon svg{display:block;width:16px;height:16px}.sefin-button-group--segmented{background-color:var(--sefin-color-surface);border:1px solid var(--sefin-color-border);padding:var(--sefin-spacing-xs);gap:var(--sefin-spacing-xs);overflow:visible;box-shadow:var(--sefin-shadow-sm);border-radius:var(--sefin-radius-md)}.sefin-button-group--segmented .sefin-button-group__button-item{border:1px solid var(--sefin-color-border);background-color:var(--sefin-color-surface);color:var(--sefin-color-text);border-radius:var(--sefin-radius-sm);margin:0;transition:all .2s ease-in-out}.sefin-button-group--segmented .sefin-button-group__button-item:first-child,.sefin-button-group--segmented .sefin-button-group__button-item:last-child{border-radius:var(--sefin-radius-sm)}.sefin-button-group--segmented .sefin-button-group__button-item--selected{background-color:var(--sefin-color-primary);color:#fff;border-color:var(--sefin-color-primary);box-shadow:var(--sefin-shadow-sm)}.sefin-button-group--segmented .sefin-button-group__button-item--selected.sefin-button-group__button-item--primary{background-color:var(--sefin-color-primary);color:#fff;border-color:var(--sefin-color-primary)}.sefin-button-group--segmented .sefin-button-group__button-item--selected.sefin-button-group__button-item--secondary{background-color:var(--sefin-color-secondary);color:#fff;border-color:var(--sefin-color-secondary)}.sefin-button-group--segmented .sefin-button-group__button-item--selected.sefin-button-group__button-item--outline{background-color:var(--sefin-color-primary);color:#fff;border-color:var(--sefin-color-primary)}.sefin-button-group--segmented .sefin-button-group__button-item:not(.sefin-button-group__button-item--selected){background-color:var(--sefin-color-surface);color:var(--sefin-color-text);border-color:var(--sefin-color-border)}.sefin-button-group--segmented .sefin-button-group__button-item:not(.sefin-button-group__button-item--selected):hover:not(:disabled){background-color:var(--sefin-color-surface-hover);border-color:var(--sefin-color-primary);color:var(--sefin-color-primary)}.sefin-button-group--segmented .sefin-button-group__button-item:hover:not(:disabled).sefin-button-group__button-item--selected.sefin-button-group__button-item--primary{background-color:var(--sefin-color-primary-dark);border-color:var(--sefin-color-primary-dark)}.sefin-button-group--segmented .sefin-button-group__button-item:hover:not(:disabled).sefin-button-group__button-item--selected.sefin-button-group__button-item--secondary{background-color:var(--sefin-color-secondary-dark);border-color:var(--sefin-color-secondary-dark)}.sefin-button-group--default{background-color:var(--sefin-color-primary);border:1px solid var(--sefin-color-primary);box-shadow:var(--sefin-shadow-sm);padding:0}.sefin-button-group--default .sefin-button-group__button-item{border:none;border-radius:0;background-color:transparent;color:#fff;margin:0;box-shadow:none}.sefin-button-group--default .sefin-button-group__button-item--selected,.sefin-button-group--default .sefin-button-group__button-item:not(.sefin-button-group__button-item--selected){background-color:transparent;color:#fff}.sefin-button-group--default .sefin-button-group__button-item:hover:not(:disabled){background-color:#ffffff26}.sefin-button-group--default .sefin-button-group__button-item:active:not(:disabled){background-color:#fff3;transform:translateY(0)}.sefin-button-group--default .sefin-button-group__button-item:not(:last-child):after{content:\"\";position:absolute;right:0;top:20%;bottom:20%;width:1px;background-color:#ffffff4d;pointer-events:none}.sefin-button-group--default .sefin-button-group__button-item--primary,.sefin-button-group--default .sefin-button-group__button-item--secondary,.sefin-button-group--default .sefin-button-group__button-item--outline{background-color:transparent}.sefin-button-group--default.sefin-button-group--secondary{background-color:var(--sefin-color-secondary);border-color:var(--sefin-color-secondary)}.sefin-button-group--sm .sefin-button-group__icon svg{width:14px;height:14px}.sefin-button-group--md .sefin-button-group__icon svg{width:16px;height:16px}.sefin-button-group--lg .sefin-button-group__icon svg{width:18px;height:18px}.sefin-button-group--disabled{opacity:.6;pointer-events:none;cursor:not-allowed}.sefin-button-group--disabled .sefin-button-group__button-item{cursor:not-allowed}\n"] }]
|
|
3719
|
+
}], ctorParameters: () => [{ type: i1$1.DomSanitizer }], propDecorators: { options: [{
|
|
3720
|
+
type: Input
|
|
3721
|
+
}], value: [{
|
|
3722
|
+
type: Input
|
|
3723
|
+
}], multiple: [{
|
|
3724
|
+
type: Input
|
|
3725
|
+
}], selectedValues: [{
|
|
3726
|
+
type: Input
|
|
3727
|
+
}], variant: [{
|
|
3728
|
+
type: Input
|
|
3729
|
+
}], size: [{
|
|
3730
|
+
type: Input
|
|
3731
|
+
}], groupVariant: [{
|
|
3732
|
+
type: Input
|
|
3733
|
+
}], disabled: [{
|
|
3734
|
+
type: Input
|
|
3735
|
+
}], fullWidth: [{
|
|
3736
|
+
type: Input
|
|
3737
|
+
}], class: [{
|
|
3738
|
+
type: Input
|
|
3739
|
+
}], valueChange: [{
|
|
3740
|
+
type: Output
|
|
3741
|
+
}], selectedValuesChange: [{
|
|
3742
|
+
type: Output
|
|
3743
|
+
}], buttonClick: [{
|
|
3744
|
+
type: Output
|
|
3745
|
+
}] } });
|
|
3746
|
+
|
|
3314
3747
|
class CardComponent {
|
|
3315
3748
|
/** Card variant style. Options: 'default' | 'elevated' | 'outlined' */
|
|
3316
3749
|
variant = 'default';
|
|
@@ -3972,6 +4405,171 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
3972
4405
|
args: ['document:keydown', ['$event']]
|
|
3973
4406
|
}] } });
|
|
3974
4407
|
|
|
4408
|
+
class PaginationComponent {
|
|
4409
|
+
/** Current page (1-based) */
|
|
4410
|
+
set currentPage(value) {
|
|
4411
|
+
this._currentPage.set(Math.max(1, value));
|
|
4412
|
+
}
|
|
4413
|
+
get currentPage() {
|
|
4414
|
+
return this._currentPage();
|
|
4415
|
+
}
|
|
4416
|
+
_currentPage = signal(1, ...(ngDevMode ? [{ debugName: "_currentPage" }] : []));
|
|
4417
|
+
/** Total number of pages */
|
|
4418
|
+
set totalPages(value) {
|
|
4419
|
+
this._totalPages.set(Math.max(1, value));
|
|
4420
|
+
}
|
|
4421
|
+
get totalPages() {
|
|
4422
|
+
return this._totalPages();
|
|
4423
|
+
}
|
|
4424
|
+
_totalPages = signal(1, ...(ngDevMode ? [{ debugName: "_totalPages" }] : []));
|
|
4425
|
+
/** Total number of items (alternative to totalPages) */
|
|
4426
|
+
set totalItems(value) {
|
|
4427
|
+
if (value !== undefined) {
|
|
4428
|
+
this._totalItems.set(value);
|
|
4429
|
+
}
|
|
4430
|
+
}
|
|
4431
|
+
get totalItems() {
|
|
4432
|
+
return this._totalItems();
|
|
4433
|
+
}
|
|
4434
|
+
_totalItems = signal(undefined, ...(ngDevMode ? [{ debugName: "_totalItems" }] : []));
|
|
4435
|
+
/** Items per page (used when totalItems is provided) */
|
|
4436
|
+
itemsPerPage = 10;
|
|
4437
|
+
/** Number of page buttons to show on each side of current page */
|
|
4438
|
+
siblingCount = 1;
|
|
4439
|
+
/** Show first and last page buttons */
|
|
4440
|
+
showFirstLast = true;
|
|
4441
|
+
/** Show previous and next buttons */
|
|
4442
|
+
showPrevNext = true;
|
|
4443
|
+
/** Pagination size. Options: 'sm' | 'md' | 'lg' */
|
|
4444
|
+
size = 'md';
|
|
4445
|
+
/** Pagination variant. Options: 'default' | 'compact' */
|
|
4446
|
+
variant = 'default';
|
|
4447
|
+
/** Additional CSS classes */
|
|
4448
|
+
class = '';
|
|
4449
|
+
/** Event emitted when page changes */
|
|
4450
|
+
pageChange = new EventEmitter();
|
|
4451
|
+
/** Computed total pages (from totalItems or direct input) */
|
|
4452
|
+
computedTotalPages = computed(() => {
|
|
4453
|
+
const total = this._totalItems();
|
|
4454
|
+
if (total !== undefined) {
|
|
4455
|
+
return Math.max(1, Math.ceil(total / this.itemsPerPage));
|
|
4456
|
+
}
|
|
4457
|
+
return this._totalPages();
|
|
4458
|
+
}, ...(ngDevMode ? [{ debugName: "computedTotalPages" }] : []));
|
|
4459
|
+
/** Computed page numbers to display */
|
|
4460
|
+
pageNumbers = computed(() => {
|
|
4461
|
+
const current = this._currentPage();
|
|
4462
|
+
const total = this.computedTotalPages();
|
|
4463
|
+
const sibling = this.siblingCount;
|
|
4464
|
+
const pages = [];
|
|
4465
|
+
// Always show first page if not already included
|
|
4466
|
+
if (this.showFirstLast && current > sibling + 2) {
|
|
4467
|
+
pages.push(1);
|
|
4468
|
+
if (current > sibling + 3) {
|
|
4469
|
+
pages.push('ellipsis-start');
|
|
4470
|
+
}
|
|
4471
|
+
}
|
|
4472
|
+
// Calculate start and end of page range
|
|
4473
|
+
const start = Math.max(1, current - sibling);
|
|
4474
|
+
const end = Math.min(total, current + sibling);
|
|
4475
|
+
// Add page numbers in range
|
|
4476
|
+
for (let i = start; i <= end; i++) {
|
|
4477
|
+
pages.push(i);
|
|
4478
|
+
}
|
|
4479
|
+
// Always show last page if not already included
|
|
4480
|
+
if (this.showFirstLast && current < total - sibling - 1) {
|
|
4481
|
+
if (current < total - sibling - 2) {
|
|
4482
|
+
pages.push('ellipsis-end');
|
|
4483
|
+
}
|
|
4484
|
+
pages.push(total);
|
|
4485
|
+
}
|
|
4486
|
+
return pages;
|
|
4487
|
+
}, ...(ngDevMode ? [{ debugName: "pageNumbers" }] : []));
|
|
4488
|
+
get paginationClasses() {
|
|
4489
|
+
return [
|
|
4490
|
+
'sefin-pagination',
|
|
4491
|
+
`sefin-pagination--${this.size}`,
|
|
4492
|
+
`sefin-pagination--${this.variant}`,
|
|
4493
|
+
this.class,
|
|
4494
|
+
]
|
|
4495
|
+
.filter(Boolean)
|
|
4496
|
+
.join(' ');
|
|
4497
|
+
}
|
|
4498
|
+
isDisabled(direction) {
|
|
4499
|
+
if (direction === 'prev') {
|
|
4500
|
+
return this.currentPage <= 1;
|
|
4501
|
+
}
|
|
4502
|
+
return this.currentPage >= this.computedTotalPages();
|
|
4503
|
+
}
|
|
4504
|
+
goToPage(page) {
|
|
4505
|
+
if (typeof page === 'number') {
|
|
4506
|
+
const validPage = Math.max(1, Math.min(page, this.computedTotalPages()));
|
|
4507
|
+
if (validPage !== this.currentPage) {
|
|
4508
|
+
this._currentPage.set(validPage);
|
|
4509
|
+
this.pageChange.emit(validPage);
|
|
4510
|
+
}
|
|
4511
|
+
}
|
|
4512
|
+
}
|
|
4513
|
+
goToPrevious() {
|
|
4514
|
+
if (!this.isDisabled('prev')) {
|
|
4515
|
+
this.goToPage(this.currentPage - 1);
|
|
4516
|
+
}
|
|
4517
|
+
}
|
|
4518
|
+
goToNext() {
|
|
4519
|
+
if (!this.isDisabled('next')) {
|
|
4520
|
+
this.goToPage(this.currentPage + 1);
|
|
4521
|
+
}
|
|
4522
|
+
}
|
|
4523
|
+
goToFirst() {
|
|
4524
|
+
if (this.currentPage > 1) {
|
|
4525
|
+
this.goToPage(1);
|
|
4526
|
+
}
|
|
4527
|
+
}
|
|
4528
|
+
goToLast() {
|
|
4529
|
+
const lastPage = this.computedTotalPages();
|
|
4530
|
+
if (this.currentPage < lastPage) {
|
|
4531
|
+
this.goToPage(lastPage);
|
|
4532
|
+
}
|
|
4533
|
+
}
|
|
4534
|
+
isEllipsis(item) {
|
|
4535
|
+
return item === 'ellipsis-start' || item === 'ellipsis-end';
|
|
4536
|
+
}
|
|
4537
|
+
isCurrentPage(page) {
|
|
4538
|
+
return typeof page === 'number' && page === this.currentPage;
|
|
4539
|
+
}
|
|
4540
|
+
getAriaCurrent(page) {
|
|
4541
|
+
return this.isCurrentPage(page) ? 'page' : null;
|
|
4542
|
+
}
|
|
4543
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
4544
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: PaginationComponent, isStandalone: true, selector: "sefin-pagination", inputs: { currentPage: "currentPage", totalPages: "totalPages", totalItems: "totalItems", itemsPerPage: "itemsPerPage", siblingCount: "siblingCount", showFirstLast: "showFirstLast", showPrevNext: "showPrevNext", size: "size", variant: "variant", class: "class" }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: "<nav [class]=\"paginationClasses\" aria-label=\"Pagination Navigation\">\n <ul class=\"sefin-pagination__list\">\n <!-- First button -->\n <li *ngIf=\"showFirstLast\" class=\"sefin-pagination__item\">\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--nav\"\n [disabled]=\"currentPage <= 1\"\n (click)=\"goToFirst()\"\n aria-label=\"Go to first page\"\n [attr.aria-disabled]=\"currentPage <= 1\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11 17L6 12L11 7M18 17L13 12L18 7\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n\n <!-- Previous button -->\n <li *ngIf=\"showPrevNext\" class=\"sefin-pagination__item\">\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--nav\"\n [disabled]=\"isDisabled('prev')\"\n (click)=\"goToPrevious()\"\n aria-label=\"Go to previous page\"\n [attr.aria-disabled]=\"isDisabled('prev')\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n\n <!-- Page numbers -->\n <li\n *ngFor=\"let page of pageNumbers(); let i = index\"\n class=\"sefin-pagination__item\"\n >\n <ng-container *ngIf=\"isEllipsis(page); else pageButton\">\n <span class=\"sefin-pagination__ellipsis\" aria-hidden=\"true\">...</span>\n </ng-container>\n <ng-template #pageButton>\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--page\"\n [class.sefin-pagination__button--active]=\"isCurrentPage(page)\"\n (click)=\"goToPage(page)\"\n [attr.aria-label]=\"'Go to page ' + page\"\n [attr.aria-current]=\"getAriaCurrent(page)\"\n >\n {{ page }}\n </button>\n </ng-template>\n </li>\n\n <!-- Next button -->\n <li *ngIf=\"showPrevNext\" class=\"sefin-pagination__item\">\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--nav\"\n [disabled]=\"isDisabled('next')\"\n (click)=\"goToNext()\"\n aria-label=\"Go to next page\"\n [attr.aria-disabled]=\"isDisabled('next')\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n\n <!-- Last button -->\n <li *ngIf=\"showFirstLast\" class=\"sefin-pagination__item\">\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--nav\"\n [disabled]=\"currentPage >= computedTotalPages()\"\n (click)=\"goToLast()\"\n aria-label=\"Go to last page\"\n [attr.aria-disabled]=\"currentPage >= computedTotalPages()\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13 17L18 12L13 7M6 17L11 12L6 7\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n </ul>\n</nav>\n", styles: [".sefin-pagination{display:inline-flex;font-family:var(--sefin-font-family-base)}.sefin-pagination__list{display:flex;align-items:center;gap:var(--sefin-spacing-xs, 4px);list-style:none;margin:0;padding:0}.sefin-pagination__item{display:inline-flex;align-items:center}.sefin-pagination__button{display:inline-flex;align-items:center;justify-content:center;font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);border:1px solid var(--sefin-color-border);background-color:var(--sefin-color-surface);color:var(--sefin-color-text);cursor:pointer;outline:none;transition:all .2s ease-in-out;border-radius:var(--sefin-radius-md);-webkit-user-select:none;user-select:none}.sefin-pagination__button:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px}.sefin-pagination__button:hover:not(:disabled):not(.sefin-pagination__button--active){background-color:var(--sefin-color-surface-hover);border-color:var(--sefin-color-primary);color:var(--sefin-color-primary)}.sefin-pagination__button:active:not(:disabled){transform:translateY(1px)}.sefin-pagination__button:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.sefin-pagination__button--page{min-width:40px;text-align:center}.sefin-pagination__button--active{background-color:var(--sefin-color-primary);border-color:var(--sefin-color-primary);color:#fff;font-weight:var(--sefin-font-weight-semibold)}.sefin-pagination__button--active:hover{background-color:var(--sefin-color-primary-dark);border-color:var(--sefin-color-primary-dark);color:#fff}.sefin-pagination__button--nav{padding:0}.sefin-pagination__button svg{display:block;width:16px;height:16px;flex-shrink:0}.sefin-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;color:var(--sefin-color-text-secondary);padding:0 var(--sefin-spacing-sm, 8px);-webkit-user-select:none;user-select:none;min-width:40px}.sefin-pagination--sm .sefin-pagination__button{padding:var(--sefin-spacing-xs, 4px) var(--sefin-spacing-sm, 8px);font-size:var(--sefin-font-size-sm, 14px);min-height:32px}.sefin-pagination--sm .sefin-pagination__button--page{min-width:32px}.sefin-pagination--sm .sefin-pagination__button svg{width:14px;height:14px}.sefin-pagination--sm .sefin-pagination__ellipsis{font-size:var(--sefin-font-size-sm, 14px);min-width:32px}.sefin-pagination--md .sefin-pagination__button{padding:var(--sefin-spacing-sm, 8px) var(--sefin-spacing-md, 16px);font-size:var(--sefin-font-size-base, 16px);min-height:40px}.sefin-pagination--md .sefin-pagination__button--page{min-width:40px}.sefin-pagination--md .sefin-pagination__button svg{width:16px;height:16px}.sefin-pagination--md .sefin-pagination__ellipsis{font-size:var(--sefin-font-size-base, 16px);min-width:40px}.sefin-pagination--lg .sefin-pagination__button{padding:var(--sefin-spacing-md, 16px) var(--sefin-spacing-lg, 24px);font-size:var(--sefin-font-size-lg, 18px);min-height:48px}.sefin-pagination--lg .sefin-pagination__button--page{min-width:48px}.sefin-pagination--lg .sefin-pagination__button svg{width:18px;height:18px}.sefin-pagination--lg .sefin-pagination__ellipsis{font-size:var(--sefin-font-size-lg, 18px);min-width:48px}.sefin-pagination--compact .sefin-pagination__button--page{min-width:auto;padding-left:var(--sefin-spacing-sm, 8px);padding-right:var(--sefin-spacing-sm, 8px)}.sefin-pagination--compact .sefin-pagination__ellipsis{min-width:auto;padding:0 var(--sefin-spacing-xs, 4px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4545
|
+
}
|
|
4546
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: PaginationComponent, decorators: [{
|
|
4547
|
+
type: Component,
|
|
4548
|
+
args: [{ selector: 'sefin-pagination', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav [class]=\"paginationClasses\" aria-label=\"Pagination Navigation\">\n <ul class=\"sefin-pagination__list\">\n <!-- First button -->\n <li *ngIf=\"showFirstLast\" class=\"sefin-pagination__item\">\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--nav\"\n [disabled]=\"currentPage <= 1\"\n (click)=\"goToFirst()\"\n aria-label=\"Go to first page\"\n [attr.aria-disabled]=\"currentPage <= 1\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11 17L6 12L11 7M18 17L13 12L18 7\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n\n <!-- Previous button -->\n <li *ngIf=\"showPrevNext\" class=\"sefin-pagination__item\">\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--nav\"\n [disabled]=\"isDisabled('prev')\"\n (click)=\"goToPrevious()\"\n aria-label=\"Go to previous page\"\n [attr.aria-disabled]=\"isDisabled('prev')\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n\n <!-- Page numbers -->\n <li\n *ngFor=\"let page of pageNumbers(); let i = index\"\n class=\"sefin-pagination__item\"\n >\n <ng-container *ngIf=\"isEllipsis(page); else pageButton\">\n <span class=\"sefin-pagination__ellipsis\" aria-hidden=\"true\">...</span>\n </ng-container>\n <ng-template #pageButton>\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--page\"\n [class.sefin-pagination__button--active]=\"isCurrentPage(page)\"\n (click)=\"goToPage(page)\"\n [attr.aria-label]=\"'Go to page ' + page\"\n [attr.aria-current]=\"getAriaCurrent(page)\"\n >\n {{ page }}\n </button>\n </ng-template>\n </li>\n\n <!-- Next button -->\n <li *ngIf=\"showPrevNext\" class=\"sefin-pagination__item\">\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--nav\"\n [disabled]=\"isDisabled('next')\"\n (click)=\"goToNext()\"\n aria-label=\"Go to next page\"\n [attr.aria-disabled]=\"isDisabled('next')\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n\n <!-- Last button -->\n <li *ngIf=\"showFirstLast\" class=\"sefin-pagination__item\">\n <button\n type=\"button\"\n class=\"sefin-pagination__button sefin-pagination__button--nav\"\n [disabled]=\"currentPage >= computedTotalPages()\"\n (click)=\"goToLast()\"\n aria-label=\"Go to last page\"\n [attr.aria-disabled]=\"currentPage >= computedTotalPages()\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13 17L18 12L13 7M6 17L11 12L6 7\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n </ul>\n</nav>\n", styles: [".sefin-pagination{display:inline-flex;font-family:var(--sefin-font-family-base)}.sefin-pagination__list{display:flex;align-items:center;gap:var(--sefin-spacing-xs, 4px);list-style:none;margin:0;padding:0}.sefin-pagination__item{display:inline-flex;align-items:center}.sefin-pagination__button{display:inline-flex;align-items:center;justify-content:center;font-family:var(--sefin-font-family-base);font-weight:var(--sefin-font-weight-medium);line-height:var(--sefin-line-height-normal);border:1px solid var(--sefin-color-border);background-color:var(--sefin-color-surface);color:var(--sefin-color-text);cursor:pointer;outline:none;transition:all .2s ease-in-out;border-radius:var(--sefin-radius-md);-webkit-user-select:none;user-select:none}.sefin-pagination__button:focus-visible{outline:2px solid var(--sefin-color-border-focus);outline-offset:2px}.sefin-pagination__button:hover:not(:disabled):not(.sefin-pagination__button--active){background-color:var(--sefin-color-surface-hover);border-color:var(--sefin-color-primary);color:var(--sefin-color-primary)}.sefin-pagination__button:active:not(:disabled){transform:translateY(1px)}.sefin-pagination__button:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.sefin-pagination__button--page{min-width:40px;text-align:center}.sefin-pagination__button--active{background-color:var(--sefin-color-primary);border-color:var(--sefin-color-primary);color:#fff;font-weight:var(--sefin-font-weight-semibold)}.sefin-pagination__button--active:hover{background-color:var(--sefin-color-primary-dark);border-color:var(--sefin-color-primary-dark);color:#fff}.sefin-pagination__button--nav{padding:0}.sefin-pagination__button svg{display:block;width:16px;height:16px;flex-shrink:0}.sefin-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;color:var(--sefin-color-text-secondary);padding:0 var(--sefin-spacing-sm, 8px);-webkit-user-select:none;user-select:none;min-width:40px}.sefin-pagination--sm .sefin-pagination__button{padding:var(--sefin-spacing-xs, 4px) var(--sefin-spacing-sm, 8px);font-size:var(--sefin-font-size-sm, 14px);min-height:32px}.sefin-pagination--sm .sefin-pagination__button--page{min-width:32px}.sefin-pagination--sm .sefin-pagination__button svg{width:14px;height:14px}.sefin-pagination--sm .sefin-pagination__ellipsis{font-size:var(--sefin-font-size-sm, 14px);min-width:32px}.sefin-pagination--md .sefin-pagination__button{padding:var(--sefin-spacing-sm, 8px) var(--sefin-spacing-md, 16px);font-size:var(--sefin-font-size-base, 16px);min-height:40px}.sefin-pagination--md .sefin-pagination__button--page{min-width:40px}.sefin-pagination--md .sefin-pagination__button svg{width:16px;height:16px}.sefin-pagination--md .sefin-pagination__ellipsis{font-size:var(--sefin-font-size-base, 16px);min-width:40px}.sefin-pagination--lg .sefin-pagination__button{padding:var(--sefin-spacing-md, 16px) var(--sefin-spacing-lg, 24px);font-size:var(--sefin-font-size-lg, 18px);min-height:48px}.sefin-pagination--lg .sefin-pagination__button--page{min-width:48px}.sefin-pagination--lg .sefin-pagination__button svg{width:18px;height:18px}.sefin-pagination--lg .sefin-pagination__ellipsis{font-size:var(--sefin-font-size-lg, 18px);min-width:48px}.sefin-pagination--compact .sefin-pagination__button--page{min-width:auto;padding-left:var(--sefin-spacing-sm, 8px);padding-right:var(--sefin-spacing-sm, 8px)}.sefin-pagination--compact .sefin-pagination__ellipsis{min-width:auto;padding:0 var(--sefin-spacing-xs, 4px)}\n"] }]
|
|
4549
|
+
}], propDecorators: { currentPage: [{
|
|
4550
|
+
type: Input
|
|
4551
|
+
}], totalPages: [{
|
|
4552
|
+
type: Input
|
|
4553
|
+
}], totalItems: [{
|
|
4554
|
+
type: Input
|
|
4555
|
+
}], itemsPerPage: [{
|
|
4556
|
+
type: Input
|
|
4557
|
+
}], siblingCount: [{
|
|
4558
|
+
type: Input
|
|
4559
|
+
}], showFirstLast: [{
|
|
4560
|
+
type: Input
|
|
4561
|
+
}], showPrevNext: [{
|
|
4562
|
+
type: Input
|
|
4563
|
+
}], size: [{
|
|
4564
|
+
type: Input
|
|
4565
|
+
}], variant: [{
|
|
4566
|
+
type: Input
|
|
4567
|
+
}], class: [{
|
|
4568
|
+
type: Input
|
|
4569
|
+
}], pageChange: [{
|
|
4570
|
+
type: Output
|
|
4571
|
+
}] } });
|
|
4572
|
+
|
|
3975
4573
|
class TextareaComponent {
|
|
3976
4574
|
textareaRef;
|
|
3977
4575
|
/** Textarea variant style. Options: 'outlined' | 'filled' | 'standard' */
|
|
@@ -4361,5 +4959,5 @@ const STYLES_PATH = './styles/index.scss';
|
|
|
4361
4959
|
* Generated bundle index. Do not edit.
|
|
4362
4960
|
*/
|
|
4363
4961
|
|
|
4364
|
-
export { AccordionItemComponent, AlertComponent, AutocompleteComponent, AvatarComponent, BORDER_RADIUS_TOKENS, BRAND_THEME, BadgeComponent, ButtonComponent, COLOR_TOKENS, CardComponent, CheckboxComponent, ChipComponent, ContainerComponent, DARK_THEME, DESIGN_TOKENS, DatepickerComponent, DividerComponent, FabButtonComponent, IconButtonComponent, IconComponent, ImageComponent, LIGHT_THEME, LinkComponent, ProgressBarComponent, RadioComponent, SHADOW_TOKENS, SPACING_TOKENS, STYLES_PATH, SelectComponent, SpinnerComponent, StackComponent, SwitchComponent, TYPOGRAPHY_TOKENS, TagComponent, TextFieldComponent, TextareaComponent, ThemeLoader, ToastComponent, TooltipComponent, TypographyComponent };
|
|
4962
|
+
export { AccordionItemComponent, AlertComponent, AutocompleteComponent, AvatarComponent, BORDER_RADIUS_TOKENS, BRAND_THEME, BadgeComponent, BreadcrumbsComponent, ButtonComponent, ButtonGroupComponent, COLOR_TOKENS, CardComponent, CheckboxComponent, ChipComponent, ContainerComponent, DARK_THEME, DESIGN_TOKENS, DatepickerComponent, DividerComponent, FabButtonComponent, IconButtonComponent, IconComponent, ImageComponent, LIGHT_THEME, LinkComponent, PaginationComponent, ProgressBarComponent, RadioComponent, RateComponent, SHADOW_TOKENS, SPACING_TOKENS, STYLES_PATH, SelectComponent, SpacerComponent, SpinnerComponent, StackComponent, SwitchComponent, TYPOGRAPHY_TOKENS, TabComponent, TagComponent, TextFieldComponent, TextareaComponent, ThemeLoader, ToastComponent, TooltipComponent, TypographyComponent };
|
|
4365
4963
|
//# sourceMappingURL=lesterarte-sefin-ui.mjs.map
|