@tolle_/tolle-ui 18.2.21 → 18.2.22
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.
- package/esm2022/lib/modal.component.mjs +2 -2
- package/esm2022/lib/modal.mjs +2 -1
- package/esm2022/lib/select.component.mjs +50 -20
- package/esm2022/lib/tag-input.component.mjs +337 -0
- package/esm2022/lib/toaster.component.mjs +3 -3
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/tolle-ui.mjs +383 -23
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/modal.d.ts +2 -1
- package/lib/select.component.d.ts +7 -2
- package/lib/tag-input.component.d.ts +46 -0
- package/lib/toaster.component.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
package/fesm2022/tolle-ui.mjs
CHANGED
|
@@ -676,6 +676,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
676
676
|
|
|
677
677
|
class SelectComponent {
|
|
678
678
|
selectService;
|
|
679
|
+
cdr;
|
|
679
680
|
placeholder = 'Select an option';
|
|
680
681
|
class = '';
|
|
681
682
|
disabled = false;
|
|
@@ -687,6 +688,8 @@ class SelectComponent {
|
|
|
687
688
|
container;
|
|
688
689
|
items;
|
|
689
690
|
sub = new Subscription();
|
|
691
|
+
itemsChangeSub;
|
|
692
|
+
pendingValue = undefined;
|
|
690
693
|
searchQuery = '';
|
|
691
694
|
noResults = false;
|
|
692
695
|
isOpen = false;
|
|
@@ -696,8 +699,9 @@ class SelectComponent {
|
|
|
696
699
|
onChange = () => { };
|
|
697
700
|
onTouched = () => { };
|
|
698
701
|
cn = cn;
|
|
699
|
-
constructor(selectService) {
|
|
702
|
+
constructor(selectService, cdr) {
|
|
700
703
|
this.selectService = selectService;
|
|
704
|
+
this.cdr = cdr;
|
|
701
705
|
this.sub.add(this.selectService.selectedValue$.subscribe(val => {
|
|
702
706
|
this.value = val;
|
|
703
707
|
this.onChange(val);
|
|
@@ -729,8 +733,24 @@ class SelectComponent {
|
|
|
729
733
|
return cn('ri-arrow-down-s-line text-muted-foreground ml-2 transition-transform duration-200', this.isOpen ? 'rotate-180' : '', (this.size === 'xs' || this.size === 'sm') ? 'text-[14px]' : 'text-[18px]', (this.disabled || this.readonly) && 'opacity-30');
|
|
730
734
|
}
|
|
731
735
|
ngAfterContentInit() {
|
|
736
|
+
// Subscribe to items changes to handle dynamic content
|
|
737
|
+
this.itemsChangeSub = this.items.changes.subscribe(() => {
|
|
738
|
+
this.updateItemSelection();
|
|
739
|
+
this.applyPendingValue();
|
|
740
|
+
});
|
|
741
|
+
// Apply initial selection if items are already available
|
|
732
742
|
this.updateItemSelection();
|
|
733
|
-
this.
|
|
743
|
+
this.applyPendingValue();
|
|
744
|
+
}
|
|
745
|
+
applyPendingValue() {
|
|
746
|
+
if (this.pendingValue !== undefined && this.items && this.items.length > 0) {
|
|
747
|
+
const found = this.items.find(i => i.value === this.pendingValue);
|
|
748
|
+
if (found) {
|
|
749
|
+
this.selectedLabel = found.getLabel();
|
|
750
|
+
this.cdr.markForCheck();
|
|
751
|
+
}
|
|
752
|
+
this.pendingValue = undefined;
|
|
753
|
+
}
|
|
734
754
|
}
|
|
735
755
|
updateItemSelection() {
|
|
736
756
|
if (this.items) {
|
|
@@ -739,6 +759,15 @@ class SelectComponent {
|
|
|
739
759
|
});
|
|
740
760
|
}
|
|
741
761
|
}
|
|
762
|
+
syncSelectedLabel() {
|
|
763
|
+
if (this.items) {
|
|
764
|
+
const found = this.items.find(i => i.value === this.value);
|
|
765
|
+
if (found) {
|
|
766
|
+
this.selectedLabel = found.getLabel();
|
|
767
|
+
this.cdr.markForCheck();
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
742
771
|
_outsideClickHandler = (event) => {
|
|
743
772
|
if (!this.trigger.nativeElement.contains(event.target) && !this.popover?.nativeElement.contains(event.target)) {
|
|
744
773
|
this.close();
|
|
@@ -752,7 +781,7 @@ class SelectComponent {
|
|
|
752
781
|
open() {
|
|
753
782
|
this.isOpen = true;
|
|
754
783
|
this.trigger.nativeElement.focus();
|
|
755
|
-
|
|
784
|
+
requestAnimationFrame(() => {
|
|
756
785
|
this.updatePosition();
|
|
757
786
|
document.addEventListener('mousedown', this._outsideClickHandler);
|
|
758
787
|
});
|
|
@@ -811,10 +840,16 @@ class SelectComponent {
|
|
|
811
840
|
writeValue(value) {
|
|
812
841
|
this.value = value;
|
|
813
842
|
this.updateItemSelection();
|
|
814
|
-
if (this.items) {
|
|
843
|
+
if (this.items && this.items.length > 0) {
|
|
815
844
|
const found = this.items.find(i => i.value === value);
|
|
816
|
-
if (found)
|
|
845
|
+
if (found) {
|
|
817
846
|
this.selectedLabel = found.getLabel();
|
|
847
|
+
this.cdr.markForCheck();
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
else {
|
|
851
|
+
// Queue the value for when items become available
|
|
852
|
+
this.pendingValue = value;
|
|
818
853
|
}
|
|
819
854
|
}
|
|
820
855
|
registerOnChange(fn) { this.onChange = fn; }
|
|
@@ -822,11 +857,12 @@ class SelectComponent {
|
|
|
822
857
|
setDisabledState(isDisabled) { this.disabled = isDisabled; }
|
|
823
858
|
ngOnDestroy() {
|
|
824
859
|
this.sub.unsubscribe();
|
|
860
|
+
this.itemsChangeSub?.unsubscribe();
|
|
825
861
|
if (this.cleanupAutoUpdate)
|
|
826
862
|
this.cleanupAutoUpdate();
|
|
827
863
|
document.removeEventListener('mousedown', this._outsideClickHandler);
|
|
828
864
|
}
|
|
829
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectComponent, deps: [{ token: SelectService }], target: i0.ɵɵFactoryTarget.Component });
|
|
865
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectComponent, deps: [{ token: SelectService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
830
866
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: SelectComponent, isStandalone: true, selector: "tolle-select", inputs: { placeholder: "placeholder", class: "class", disabled: "disabled", searchable: "searchable", size: "size", readonly: "readonly" }, providers: [
|
|
831
867
|
SelectService,
|
|
832
868
|
{
|
|
@@ -851,7 +887,7 @@ class SelectComponent {
|
|
|
851
887
|
|
|
852
888
|
<div
|
|
853
889
|
#popover
|
|
854
|
-
|
|
890
|
+
[class.hidden-dropdown]="!isOpen"
|
|
855
891
|
class="fixed bg-popover z-[999] overflow-auto flex flex-col rounded-md border border-border text-popover-foreground shadow-md"
|
|
856
892
|
style="visibility: hidden; top: 0; left: 0;">
|
|
857
893
|
<div *ngIf="searchable" class="p-2 border-b border-border bg-popover h-auto">
|
|
@@ -873,23 +909,18 @@ class SelectComponent {
|
|
|
873
909
|
</div>
|
|
874
910
|
</div>
|
|
875
911
|
</div>
|
|
876
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputComponent, selector: "tolle-input", inputs: ["id", "label", "hint", "errorMessage", "type", "placeholder", "size", "containerClass", "class", "disabled", "readonly", "error", "hideHintOnFocus"] }] });
|
|
912
|
+
`, isInline: true, styles: [".hidden-dropdown{display:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputComponent, selector: "tolle-input", inputs: ["id", "label", "hint", "errorMessage", "type", "placeholder", "size", "containerClass", "class", "disabled", "readonly", "error", "hideHintOnFocus"] }] });
|
|
877
913
|
}
|
|
878
914
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectComponent, decorators: [{
|
|
879
915
|
type: Component,
|
|
880
|
-
args: [{
|
|
881
|
-
selector: 'tolle-select',
|
|
882
|
-
standalone: true,
|
|
883
|
-
imports: [CommonModule, FormsModule, InputComponent],
|
|
884
|
-
providers: [
|
|
916
|
+
args: [{ selector: 'tolle-select', standalone: true, imports: [CommonModule, FormsModule, InputComponent], providers: [
|
|
885
917
|
SelectService,
|
|
886
918
|
{
|
|
887
919
|
provide: NG_VALUE_ACCESSOR,
|
|
888
920
|
useExisting: forwardRef(() => SelectComponent),
|
|
889
921
|
multi: true
|
|
890
922
|
}
|
|
891
|
-
],
|
|
892
|
-
template: `
|
|
923
|
+
], template: `
|
|
893
924
|
<div [class]="cn('relative w-full', 'size-' + size)" #container>
|
|
894
925
|
<button
|
|
895
926
|
type="button"
|
|
@@ -906,7 +937,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
906
937
|
|
|
907
938
|
<div
|
|
908
939
|
#popover
|
|
909
|
-
|
|
940
|
+
[class.hidden-dropdown]="!isOpen"
|
|
910
941
|
class="fixed bg-popover z-[999] overflow-auto flex flex-col rounded-md border border-border text-popover-foreground shadow-md"
|
|
911
942
|
style="visibility: hidden; top: 0; left: 0;">
|
|
912
943
|
<div *ngIf="searchable" class="p-2 border-b border-border bg-popover h-auto">
|
|
@@ -928,9 +959,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
928
959
|
</div>
|
|
929
960
|
</div>
|
|
930
961
|
</div>
|
|
931
|
-
`,
|
|
932
|
-
|
|
933
|
-
}], ctorParameters: () => [{ type: SelectService }], propDecorators: { placeholder: [{
|
|
962
|
+
`, styles: [".hidden-dropdown{display:none!important}\n"] }]
|
|
963
|
+
}], ctorParameters: () => [{ type: SelectService }, { type: i0.ChangeDetectorRef }], propDecorators: { placeholder: [{
|
|
934
964
|
type: Input
|
|
935
965
|
}], class: [{
|
|
936
966
|
type: Input
|
|
@@ -1323,6 +1353,335 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1323
1353
|
type: Input
|
|
1324
1354
|
}] } });
|
|
1325
1355
|
|
|
1356
|
+
class TagInputComponent {
|
|
1357
|
+
cdr;
|
|
1358
|
+
tagInputElement;
|
|
1359
|
+
id = `tag-input-${Math.random().toString(36).substr(2, 9)}`;
|
|
1360
|
+
label = '';
|
|
1361
|
+
hint = '';
|
|
1362
|
+
errorMessage = '';
|
|
1363
|
+
placeholder = 'Type and press Enter...';
|
|
1364
|
+
size = 'default';
|
|
1365
|
+
class = '';
|
|
1366
|
+
// State inputs
|
|
1367
|
+
disabled = false;
|
|
1368
|
+
readonly = false;
|
|
1369
|
+
error = false;
|
|
1370
|
+
// Tag-specific inputs
|
|
1371
|
+
delimiter = ',';
|
|
1372
|
+
maxTags = null;
|
|
1373
|
+
allowDuplicates = false;
|
|
1374
|
+
tagPrefix = '';
|
|
1375
|
+
tagSuffix = '';
|
|
1376
|
+
tags = [];
|
|
1377
|
+
inputValue = '';
|
|
1378
|
+
isFocused = false;
|
|
1379
|
+
onChange = () => { };
|
|
1380
|
+
onTouched = () => { };
|
|
1381
|
+
constructor(cdr) {
|
|
1382
|
+
this.cdr = cdr;
|
|
1383
|
+
}
|
|
1384
|
+
writeValue(values) {
|
|
1385
|
+
this.tags = Array.isArray(values) ? [...values] : [];
|
|
1386
|
+
this.cdr.markForCheck();
|
|
1387
|
+
}
|
|
1388
|
+
registerOnChange(fn) { this.onChange = fn; }
|
|
1389
|
+
registerOnTouched(fn) { this.onTouched = fn; }
|
|
1390
|
+
setDisabledState(isDisabled) {
|
|
1391
|
+
this.disabled = isDisabled;
|
|
1392
|
+
this.cdr.markForCheck();
|
|
1393
|
+
}
|
|
1394
|
+
onKeydown(event) {
|
|
1395
|
+
if (this.disabled || this.readonly)
|
|
1396
|
+
return;
|
|
1397
|
+
const key = event.key;
|
|
1398
|
+
// Enter creates a tag
|
|
1399
|
+
if (key === 'Enter') {
|
|
1400
|
+
event.preventDefault();
|
|
1401
|
+
this.commitInput();
|
|
1402
|
+
return;
|
|
1403
|
+
}
|
|
1404
|
+
// Delimiter creates a tag (strip the delimiter)
|
|
1405
|
+
if (key === this.delimiter) {
|
|
1406
|
+
event.preventDefault();
|
|
1407
|
+
this.commitInput();
|
|
1408
|
+
return;
|
|
1409
|
+
}
|
|
1410
|
+
// Backspace on empty input removes the last tag
|
|
1411
|
+
if (key === 'Backspace' && this.inputValue === '') {
|
|
1412
|
+
if (this.tags.length > 0) {
|
|
1413
|
+
this.removeTag(this.tags.length - 1);
|
|
1414
|
+
}
|
|
1415
|
+
return;
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
onBlur() {
|
|
1419
|
+
this.isFocused = false;
|
|
1420
|
+
this.onTouched();
|
|
1421
|
+
this.commitInput();
|
|
1422
|
+
}
|
|
1423
|
+
onFocus() {
|
|
1424
|
+
this.isFocused = true;
|
|
1425
|
+
}
|
|
1426
|
+
removeTag(index, event) {
|
|
1427
|
+
if (this.disabled || this.readonly)
|
|
1428
|
+
return;
|
|
1429
|
+
if (event) {
|
|
1430
|
+
event.stopPropagation();
|
|
1431
|
+
}
|
|
1432
|
+
this.tags.splice(index, 1);
|
|
1433
|
+
this.emitChange();
|
|
1434
|
+
this.focusInput();
|
|
1435
|
+
}
|
|
1436
|
+
focusInput() {
|
|
1437
|
+
if (!this.disabled && this.tagInputElement) {
|
|
1438
|
+
this.tagInputElement.nativeElement.focus();
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
commitInput() {
|
|
1442
|
+
const value = this.inputValue.trim();
|
|
1443
|
+
if (value === '') {
|
|
1444
|
+
return;
|
|
1445
|
+
}
|
|
1446
|
+
// Check max tags
|
|
1447
|
+
if (this.maxTags != null && this.tags.length >= this.maxTags) {
|
|
1448
|
+
this.inputValue = '';
|
|
1449
|
+
return;
|
|
1450
|
+
}
|
|
1451
|
+
// Check duplicates (case-insensitive)
|
|
1452
|
+
if (!this.allowDuplicates) {
|
|
1453
|
+
const exists = this.tags.some(t => t.toLowerCase() === value.toLowerCase());
|
|
1454
|
+
if (exists) {
|
|
1455
|
+
this.inputValue = '';
|
|
1456
|
+
return;
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
this.tags.push(value);
|
|
1460
|
+
this.inputValue = '';
|
|
1461
|
+
this.emitChange();
|
|
1462
|
+
}
|
|
1463
|
+
emitChange() {
|
|
1464
|
+
this.onChange([...this.tags]);
|
|
1465
|
+
this.cdr.markForCheck();
|
|
1466
|
+
}
|
|
1467
|
+
cn = cn;
|
|
1468
|
+
get computedLabelClass() {
|
|
1469
|
+
return cn("text-sm font-medium text-foreground leading-none transition-opacity duration-200", this.disabled && "opacity-50");
|
|
1470
|
+
}
|
|
1471
|
+
get computedContainerClass() {
|
|
1472
|
+
return cn(
|
|
1473
|
+
// Base styles — flex-wrap so tags flow onto multiple lines
|
|
1474
|
+
"group relative flex flex-wrap items-center w-full rounded-md border transition-all duration-200", "bg-background",
|
|
1475
|
+
// Border and shadow
|
|
1476
|
+
"border-input shadow-sm",
|
|
1477
|
+
// Sizing — min-h instead of fixed h so tags can wrap
|
|
1478
|
+
this.size === 'xs' && "min-h-8 px-2 py-1 gap-1 text-xs", this.size === 'sm' && "min-h-9 px-3 py-1 gap-1.5 text-sm", this.size === 'default' && "min-h-10 px-3 py-1.5 gap-2 text-sm", this.size === 'lg' && "min-h-11 px-4 py-2 gap-3 text-base",
|
|
1479
|
+
// Focus state
|
|
1480
|
+
!(this.readonly || this.disabled) && [
|
|
1481
|
+
"focus-within:border-primary/80",
|
|
1482
|
+
"focus-within:ring-4",
|
|
1483
|
+
"focus-within:ring-ring/30",
|
|
1484
|
+
"focus-within:ring-offset-0",
|
|
1485
|
+
"focus-within:shadow-none",
|
|
1486
|
+
],
|
|
1487
|
+
// Error state
|
|
1488
|
+
this.error && [
|
|
1489
|
+
"border-destructive",
|
|
1490
|
+
!(this.readonly || this.disabled) && [
|
|
1491
|
+
"focus-within:border-destructive/80",
|
|
1492
|
+
"focus-within:ring-destructive/30"
|
|
1493
|
+
]
|
|
1494
|
+
],
|
|
1495
|
+
// Disabled state
|
|
1496
|
+
this.disabled && [
|
|
1497
|
+
"cursor-not-allowed opacity-50",
|
|
1498
|
+
"border-opacity-50"
|
|
1499
|
+
],
|
|
1500
|
+
// Readonly state
|
|
1501
|
+
this.readonly && [
|
|
1502
|
+
"cursor-default",
|
|
1503
|
+
"border-dashed",
|
|
1504
|
+
!this.disabled && "focus-within:ring-0 focus-within:border-opacity-100"
|
|
1505
|
+
], this.class);
|
|
1506
|
+
}
|
|
1507
|
+
get computedInputClass() {
|
|
1508
|
+
return cn(
|
|
1509
|
+
// Base styles — inline within the flex-wrap container
|
|
1510
|
+
"flex-1 bg-transparent border-none p-0 min-w-[80px]", "placeholder:text-muted-foreground",
|
|
1511
|
+
// Remove all default focus styles
|
|
1512
|
+
"focus:outline-none focus:ring-0 focus:shadow-none",
|
|
1513
|
+
// Text sizing
|
|
1514
|
+
this.size === 'xs' && "text-xs", this.size === 'sm' && "text-sm", this.size === 'default' && "text-sm", this.size === 'lg' && "text-base",
|
|
1515
|
+
// Cursor states
|
|
1516
|
+
this.disabled && "cursor-not-allowed", this.readonly && "cursor-default",
|
|
1517
|
+
// Text color
|
|
1518
|
+
"text-foreground",
|
|
1519
|
+
// Selection color
|
|
1520
|
+
"selection:bg-primary/20 selection:text-foreground", this.class);
|
|
1521
|
+
}
|
|
1522
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TagInputComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1523
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TagInputComponent, isStandalone: true, selector: "tolle-tag-input", inputs: { id: "id", label: "label", hint: "hint", errorMessage: "errorMessage", placeholder: "placeholder", size: "size", class: "class", disabled: "disabled", readonly: "readonly", error: "error", delimiter: "delimiter", maxTags: "maxTags", allowDuplicates: "allowDuplicates", tagPrefix: "tagPrefix", tagSuffix: "tagSuffix" }, providers: [
|
|
1524
|
+
{
|
|
1525
|
+
provide: NG_VALUE_ACCESSOR,
|
|
1526
|
+
useExisting: forwardRef(() => TagInputComponent),
|
|
1527
|
+
multi: true
|
|
1528
|
+
}
|
|
1529
|
+
], viewQueries: [{ propertyName: "tagInputElement", first: true, predicate: ["tagInput"], descendants: true }], ngImport: i0, template: `
|
|
1530
|
+
<div class="flex flex-col gap-1.5 w-full">
|
|
1531
|
+
<label
|
|
1532
|
+
*ngIf="label"
|
|
1533
|
+
[for]="id"
|
|
1534
|
+
[class]="computedLabelClass">
|
|
1535
|
+
{{ label }}
|
|
1536
|
+
</label>
|
|
1537
|
+
|
|
1538
|
+
<div
|
|
1539
|
+
[class]="computedContainerClass"
|
|
1540
|
+
(click)="focusInput()"
|
|
1541
|
+
>
|
|
1542
|
+
<tolle-badge
|
|
1543
|
+
*ngFor="let tag of tags; let i = index"
|
|
1544
|
+
size="xs"
|
|
1545
|
+
variant="secondary"
|
|
1546
|
+
[removable]="!disabled && !readonly"
|
|
1547
|
+
(onRemove)="removeTag(i, $event)">
|
|
1548
|
+
{{ tagPrefix }}{{ tag }}{{ tagSuffix }}
|
|
1549
|
+
</tolle-badge>
|
|
1550
|
+
|
|
1551
|
+
<input
|
|
1552
|
+
#tagInput
|
|
1553
|
+
[id]="id"
|
|
1554
|
+
type="text"
|
|
1555
|
+
[placeholder]="tags.length === 0 ? placeholder : ''"
|
|
1556
|
+
[disabled]="disabled"
|
|
1557
|
+
[readOnly]="readonly || (maxTags != null && tags.length >= maxTags)"
|
|
1558
|
+
[(ngModel)]="inputValue"
|
|
1559
|
+
(keydown)="onKeydown($event)"
|
|
1560
|
+
(blur)="onBlur()"
|
|
1561
|
+
(focus)="onFocus()"
|
|
1562
|
+
[class]="computedInputClass"
|
|
1563
|
+
/>
|
|
1564
|
+
</div>
|
|
1565
|
+
|
|
1566
|
+
<ng-container *ngIf="!disabled">
|
|
1567
|
+
<p
|
|
1568
|
+
*ngIf="hint && !error"
|
|
1569
|
+
class="text-xs text-muted-foreground px-1 transition-opacity duration-200"
|
|
1570
|
+
>
|
|
1571
|
+
{{ hint }}
|
|
1572
|
+
</p>
|
|
1573
|
+
<p
|
|
1574
|
+
*ngIf="error && errorMessage"
|
|
1575
|
+
class="text-xs text-destructive px-1"
|
|
1576
|
+
>
|
|
1577
|
+
{{ errorMessage }}
|
|
1578
|
+
</p>
|
|
1579
|
+
</ng-container>
|
|
1580
|
+
</div>
|
|
1581
|
+
`, isInline: true, 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: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BadgeComponent, selector: "tolle-badge", inputs: ["variant", "size", "removable", "class"], outputs: ["onRemove"] }] });
|
|
1582
|
+
}
|
|
1583
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TagInputComponent, decorators: [{
|
|
1584
|
+
type: Component,
|
|
1585
|
+
args: [{
|
|
1586
|
+
selector: 'tolle-tag-input',
|
|
1587
|
+
standalone: true,
|
|
1588
|
+
imports: [CommonModule, FormsModule, BadgeComponent],
|
|
1589
|
+
providers: [
|
|
1590
|
+
{
|
|
1591
|
+
provide: NG_VALUE_ACCESSOR,
|
|
1592
|
+
useExisting: forwardRef(() => TagInputComponent),
|
|
1593
|
+
multi: true
|
|
1594
|
+
}
|
|
1595
|
+
],
|
|
1596
|
+
template: `
|
|
1597
|
+
<div class="flex flex-col gap-1.5 w-full">
|
|
1598
|
+
<label
|
|
1599
|
+
*ngIf="label"
|
|
1600
|
+
[for]="id"
|
|
1601
|
+
[class]="computedLabelClass">
|
|
1602
|
+
{{ label }}
|
|
1603
|
+
</label>
|
|
1604
|
+
|
|
1605
|
+
<div
|
|
1606
|
+
[class]="computedContainerClass"
|
|
1607
|
+
(click)="focusInput()"
|
|
1608
|
+
>
|
|
1609
|
+
<tolle-badge
|
|
1610
|
+
*ngFor="let tag of tags; let i = index"
|
|
1611
|
+
size="xs"
|
|
1612
|
+
variant="secondary"
|
|
1613
|
+
[removable]="!disabled && !readonly"
|
|
1614
|
+
(onRemove)="removeTag(i, $event)">
|
|
1615
|
+
{{ tagPrefix }}{{ tag }}{{ tagSuffix }}
|
|
1616
|
+
</tolle-badge>
|
|
1617
|
+
|
|
1618
|
+
<input
|
|
1619
|
+
#tagInput
|
|
1620
|
+
[id]="id"
|
|
1621
|
+
type="text"
|
|
1622
|
+
[placeholder]="tags.length === 0 ? placeholder : ''"
|
|
1623
|
+
[disabled]="disabled"
|
|
1624
|
+
[readOnly]="readonly || (maxTags != null && tags.length >= maxTags)"
|
|
1625
|
+
[(ngModel)]="inputValue"
|
|
1626
|
+
(keydown)="onKeydown($event)"
|
|
1627
|
+
(blur)="onBlur()"
|
|
1628
|
+
(focus)="onFocus()"
|
|
1629
|
+
[class]="computedInputClass"
|
|
1630
|
+
/>
|
|
1631
|
+
</div>
|
|
1632
|
+
|
|
1633
|
+
<ng-container *ngIf="!disabled">
|
|
1634
|
+
<p
|
|
1635
|
+
*ngIf="hint && !error"
|
|
1636
|
+
class="text-xs text-muted-foreground px-1 transition-opacity duration-200"
|
|
1637
|
+
>
|
|
1638
|
+
{{ hint }}
|
|
1639
|
+
</p>
|
|
1640
|
+
<p
|
|
1641
|
+
*ngIf="error && errorMessage"
|
|
1642
|
+
class="text-xs text-destructive px-1"
|
|
1643
|
+
>
|
|
1644
|
+
{{ errorMessage }}
|
|
1645
|
+
</p>
|
|
1646
|
+
</ng-container>
|
|
1647
|
+
</div>
|
|
1648
|
+
`,
|
|
1649
|
+
}]
|
|
1650
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { tagInputElement: [{
|
|
1651
|
+
type: ViewChild,
|
|
1652
|
+
args: ['tagInput']
|
|
1653
|
+
}], id: [{
|
|
1654
|
+
type: Input
|
|
1655
|
+
}], label: [{
|
|
1656
|
+
type: Input
|
|
1657
|
+
}], hint: [{
|
|
1658
|
+
type: Input
|
|
1659
|
+
}], errorMessage: [{
|
|
1660
|
+
type: Input
|
|
1661
|
+
}], placeholder: [{
|
|
1662
|
+
type: Input
|
|
1663
|
+
}], size: [{
|
|
1664
|
+
type: Input
|
|
1665
|
+
}], class: [{
|
|
1666
|
+
type: Input
|
|
1667
|
+
}], disabled: [{
|
|
1668
|
+
type: Input
|
|
1669
|
+
}], readonly: [{
|
|
1670
|
+
type: Input
|
|
1671
|
+
}], error: [{
|
|
1672
|
+
type: Input
|
|
1673
|
+
}], delimiter: [{
|
|
1674
|
+
type: Input
|
|
1675
|
+
}], maxTags: [{
|
|
1676
|
+
type: Input
|
|
1677
|
+
}], allowDuplicates: [{
|
|
1678
|
+
type: Input
|
|
1679
|
+
}], tagPrefix: [{
|
|
1680
|
+
type: Input
|
|
1681
|
+
}], tagSuffix: [{
|
|
1682
|
+
type: Input
|
|
1683
|
+
}] } });
|
|
1684
|
+
|
|
1326
1685
|
class TooltipDirective {
|
|
1327
1686
|
el;
|
|
1328
1687
|
content = '';
|
|
@@ -1459,9 +1818,9 @@ class ToastContainerComponent {
|
|
|
1459
1818
|
getVariantClasses(variant = 'default') {
|
|
1460
1819
|
switch (variant) {
|
|
1461
1820
|
case 'destructive':
|
|
1462
|
-
return 'border-destructive/50 bg-destructive/5 dark:bg-
|
|
1821
|
+
return 'border-destructive/50 bg-destructive/5 dark:bg-red-950 text-destructive dark:text-red-400';
|
|
1463
1822
|
case 'success':
|
|
1464
|
-
return 'border-emerald-500/50 bg-emerald-50 dark:bg-emerald-
|
|
1823
|
+
return 'border-emerald-500/50 bg-emerald-50 dark:bg-emerald-950 text-emerald-700 dark:text-emerald-400';
|
|
1465
1824
|
default:
|
|
1466
1825
|
return 'bg-background text-foreground border-border';
|
|
1467
1826
|
}
|
|
@@ -4652,7 +5011,7 @@ class ModalComponent {
|
|
|
4652
5011
|
// Base classes: Added 'w-full' and 'mx-auto'
|
|
4653
5012
|
'bg-background border border-border shadow-lg relative flex flex-col w-full mx-auto ', size === 'fullscreen' ? 'h-screen w-screen rounded-none' : 'rounded-md',
|
|
4654
5013
|
// Sizing scale with explicit max-widths
|
|
4655
|
-
size === 'xs' && 'max-w-[320px]', size === 'sm' && 'max-w-[425px]', size === 'default' && 'max-w-[544px]', size === 'lg' && 'max-w-[1024px]');
|
|
5014
|
+
size === 'xs' && 'max-w-[320px]', size === 'sm' && 'max-w-[425px]', size === 'default' && 'max-w-[544px]', size === 'lg' && 'max-w-[1024px]', size === 'xl' && 'max-w-[1280px]');
|
|
4656
5015
|
}
|
|
4657
5016
|
determineContentType() {
|
|
4658
5017
|
if (typeof this.content === 'string')
|
|
@@ -4816,6 +5175,7 @@ class Modal {
|
|
|
4816
5175
|
* - sm: 425px (Standard dialogs)
|
|
4817
5176
|
* - default: 544px (Forms)
|
|
4818
5177
|
* - lg: 90% / 1024px (Data tables)
|
|
5178
|
+
* - xl: 1280px (Large forms, dashboards)
|
|
4819
5179
|
* - fullscreen: 100vw/100vh (Complex workflows)
|
|
4820
5180
|
*/
|
|
4821
5181
|
size = 'default';
|
|
@@ -13641,5 +14001,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
13641
14001
|
* Generated bundle index. Do not edit.
|
|
13642
14002
|
*/
|
|
13643
14003
|
|
|
13644
|
-
export { AccordionComponent, AccordionItemComponent, AlertComponent, AlertDialogActionComponent, AlertDialogCancelComponent, AlertDialogComponent, AlertDialogContentComponent, AlertDialogDescriptionComponent, AlertDialogDynamicComponent, AlertDialogFooterComponent, AlertDialogHeaderComponent, AlertDialogPortalComponent, AlertDialogRef, AlertDialogService, AlertDialogTitleComponent, AlertDialogTriggerComponent, AvatarComponent, AvatarFallbackComponent, BadgeComponent, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbLinkComponent, BreadcrumbSeparatorComponent, ButtonComponent, ButtonGroupComponent, CalendarComponent, CardComponent, CardContentComponent, CardFooterComponent, CardHeaderComponent, CardTitleComponent, CarouselComponent, CarouselContainerDirective, CarouselContentDirective, CarouselContext, CarouselItemDirective, CarouselNextDirective, CarouselPreviousDirective, CheckboxComponent, CollapsibleComponent, CollapsibleContentComponent, CollapsibleTriggerComponent, CountryCodesService, CountrySelectorComponent, DataTableComponent, DatePickerComponent, DateRangePickerComponent, DropdownItemComponent, DropdownLabelComponent, DropdownMenuComponent, DropdownSeparatorComponent, DropdownTriggerDirective, EmptyStateComponent, HoverCardComponent, HoverCardContentComponent, HoverCardTriggerComponent, InputComponent, LabelComponent, MaskedInputComponent, Modal, ModalComponent, ModalRef, ModalService, ModalStackService, MultiSelectComponent, OtpComponent, OtpGroupComponent, OtpSlotComponent, PaginationComponent, PhoneNumberInputComponent, PhoneNumberService, PopoverComponent, PopoverContentComponent, ProgressComponent, RadioGroupComponent, RadioItemComponent, RangeCalendarComponent, ScrollAreaComponent, SegmentedComponent, SelectComponent, SelectGroupComponent, SelectItemComponent, SelectSeparatorComponent, SeparatorComponent, SheetComponent, SheetContentComponent, SheetDescriptionComponent, SheetFooterComponent, SheetHeaderComponent, SheetRef, SheetService, SheetTitleComponent, SheetTriggerComponent, SheetWrapperComponent, SidebarComponent, SkeletonComponent, SliderComponent, SwitchComponent, TOLLE_CONFIG, TabsComponent, TabsContentComponent, TabsListComponent, TabsTriggerComponent, TextareaComponent, ThemeService, ToastContainerComponent, ToastService, ToggleComponent, ToggleGroupComponent, ToggleGroupItemComponent, TolleCellDirective, TooltipDirective, cn, provideTolleConfig };
|
|
14004
|
+
export { AccordionComponent, AccordionItemComponent, AlertComponent, AlertDialogActionComponent, AlertDialogCancelComponent, AlertDialogComponent, AlertDialogContentComponent, AlertDialogDescriptionComponent, AlertDialogDynamicComponent, AlertDialogFooterComponent, AlertDialogHeaderComponent, AlertDialogPortalComponent, AlertDialogRef, AlertDialogService, AlertDialogTitleComponent, AlertDialogTriggerComponent, AvatarComponent, AvatarFallbackComponent, BadgeComponent, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbLinkComponent, BreadcrumbSeparatorComponent, ButtonComponent, ButtonGroupComponent, CalendarComponent, CardComponent, CardContentComponent, CardFooterComponent, CardHeaderComponent, CardTitleComponent, CarouselComponent, CarouselContainerDirective, CarouselContentDirective, CarouselContext, CarouselItemDirective, CarouselNextDirective, CarouselPreviousDirective, CheckboxComponent, CollapsibleComponent, CollapsibleContentComponent, CollapsibleTriggerComponent, CountryCodesService, CountrySelectorComponent, DataTableComponent, DatePickerComponent, DateRangePickerComponent, DropdownItemComponent, DropdownLabelComponent, DropdownMenuComponent, DropdownSeparatorComponent, DropdownTriggerDirective, EmptyStateComponent, HoverCardComponent, HoverCardContentComponent, HoverCardTriggerComponent, InputComponent, LabelComponent, MaskedInputComponent, Modal, ModalComponent, ModalRef, ModalService, ModalStackService, MultiSelectComponent, OtpComponent, OtpGroupComponent, OtpSlotComponent, PaginationComponent, PhoneNumberInputComponent, PhoneNumberService, PopoverComponent, PopoverContentComponent, ProgressComponent, RadioGroupComponent, RadioItemComponent, RangeCalendarComponent, ScrollAreaComponent, SegmentedComponent, SelectComponent, SelectGroupComponent, SelectItemComponent, SelectSeparatorComponent, SeparatorComponent, SheetComponent, SheetContentComponent, SheetDescriptionComponent, SheetFooterComponent, SheetHeaderComponent, SheetRef, SheetService, SheetTitleComponent, SheetTriggerComponent, SheetWrapperComponent, SidebarComponent, SkeletonComponent, SliderComponent, SwitchComponent, TOLLE_CONFIG, TabsComponent, TabsContentComponent, TabsListComponent, TabsTriggerComponent, TagInputComponent, TextareaComponent, ThemeService, ToastContainerComponent, ToastService, ToggleComponent, ToggleGroupComponent, ToggleGroupItemComponent, TolleCellDirective, TooltipDirective, cn, provideTolleConfig };
|
|
13645
14005
|
//# sourceMappingURL=tolle-ui.mjs.map
|