@yoozsoft/yoozsoft-ng 6.2.0 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +206 -94
  2. package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs +70 -38
  3. package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs.map +1 -1
  4. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs +194 -109
  5. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs.map +1 -1
  6. package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs +70 -55
  7. package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs.map +1 -1
  8. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs +55 -33
  9. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs.map +1 -1
  10. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs +13 -11
  11. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs.map +1 -1
  12. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs +17 -11
  13. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs.map +1 -1
  14. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs +37 -28
  15. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs.map +1 -1
  16. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs +7 -6
  17. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs.map +1 -1
  18. package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs +39 -28
  19. package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs.map +1 -1
  20. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs +65 -39
  21. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs.map +1 -1
  22. package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs +3 -3
  23. package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs.map +1 -1
  24. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs +26 -17
  25. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs.map +1 -1
  26. package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs +155 -0
  27. package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs.map +1 -0
  28. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs +47 -33
  29. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs.map +1 -1
  30. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs +30 -29
  31. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs.map +1 -1
  32. package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs +93 -84
  33. package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs.map +1 -1
  34. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs +41 -27
  35. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs.map +1 -1
  36. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs +20 -18
  37. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs.map +1 -1
  38. package/package.json +12 -4
  39. package/rating/package.json +4 -0
  40. package/types/yoozsoft-yoozsoft-ng-rating.d.ts +56 -0
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-dropdown.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/dropdown/src/ys-dropdown/ys-dropdown.ts","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/src/ys-dropdown/ys-dropdown.html","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/yoozsoft-yoozsoft-ng-dropdown.ts"],"sourcesContent":["import { isPlatformBrowser, NgClass, NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, effect, ElementRef, forwardRef, HostListener, inject, input, output, PLATFORM_ID, signal, TemplateRef } from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\n\ninterface ItemTemplate {\n raw: unknown;\n label: string;\n value: unknown;\n disabled: boolean;\n}\n\n@Component({\n selector: 'ys-dropdown',\n imports: [\n NgTemplateOutlet,\n FormsModule,\n NgClass\n ],\n templateUrl: './ys-dropdown.html',\n styleUrl: './ys-dropdown.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => YsDropdown),\n multi: true,\n },\n ],\n})\nexport class YsDropdown implements ControlValueAccessor {\n\n private elRef = inject(ElementRef)\n private platformId = inject(PLATFORM_ID);\n\n /** List of options */\n options = input<any[]>([]);\n /** Field of object that display as label */\n optionLabel = input<string>('label');\n placeholder = input<string>('');\n searchPlaceholder = input<string>('');\n selectedMaxLength = input<number>(3);\n selectedMaxLengthTemplate = input<string>('{length} items selected');\n selectionSeparator = input<string>(\", \");\n dropDownToggleIconClass = input<string>(\"fa fa-chevron-down\");\n clearIconClass = input<string>(\"fa fa-times\");\n multipleCheckIconClass = input<string>(\"fa fa-check\");\n\n /** Multiple choice mode */\n multiple = input<boolean>(false);\n showClear = input<boolean>(false);\n\n /** Search capability */\n searchable = input<boolean>(false);\n\n disabled = input<boolean>(false);\n\n /** Custom template for items */\n itemTemplate = input<TemplateRef<any>>();\n\n\n /** Output event when selection changes */\n selectionChange = output<unknown | unknown[] | null>();\n\n searchTerm = signal<string>('');\n isOpen = signal<boolean>(false);\n highlightedIndex = signal<number>(-1);\n /** Selected value */\n selected = signal<any[] | any>(null);\n\n private disabledState = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this.disabledState());\n\n readonly filteredOptions = computed<ItemTemplate[]>(() => {\n\n if (!this.searchable() || !this.searchTerm().trim()) {\n return this.normalizedOptions();\n }\n\n const term = this.searchTerm().toLowerCase();\n\n return this.normalizedOptions().filter(opt =>\n opt.label.toLowerCase().includes(term)\n );\n\n });\n\n readonly normalizedOptions = computed(() =>\n this.normalizeOptions(this.options())\n );\n\n readonly hasSelection = computed(() =>\n this.multiple()\n ? Array.isArray(this.selected()) && this.selected().length > 0\n : !!this.selected()\n );\n\n readonly selectedLabels = computed(() => {\n\n if (this.multiple()) {\n if (!Array.isArray(this.selected())) return '';\n\n // لیست object های انتخابی را پیدا می‌کنیم\n const selectedItems = this.normalizedOptions().filter(o =>\n this.selected().includes(o.value)\n );\n\n const count = selectedItems.length;\n\n // اگر بیشتر از حد مجاز باشد → متن سفارشی\n if (count > this.selectedMaxLength()) {\n return this.selectedMaxLengthTemplate().replace('{length}', count + '');\n }\n\n // در غیر این‌صورت لیبل‌ها را نمایش بده\n return selectedItems.map(o => o.label).join(this.selectionSeparator());\n }\n\n const item = this.normalizedOptions().find(o => o.value === this.selected());\n return item?.label ?? '';\n\n });\n\n private _onChange = (_: unknown) => { };\n private _onTouched: () => void = () => { };\n\n constructor() {\n effect(() =>\n this.selected.set(this.multiple() ? [] : null)\n );\n }\n\n writeValue(obj: any): void {\n this.selected.set(this.multiple()\n ? Array.isArray(obj) ? obj : []\n : obj);\n }\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n setDisabledState?(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n private normalizeOptions(list: any[]): ItemTemplate[] {\n if (!Array.isArray(list)) return [];\n\n return list.map(item => {\n\n // 1. اگر primitive بود\n if (['string', 'number', 'boolean'].includes(typeof item)) {\n return <ItemTemplate>{\n raw: item,\n label: String(item),\n value: item,\n disabled: false\n };\n }\n\n // 2. اگر OptionItem<T> بود\n if (item && typeof item === 'object' && 'value' in item) {\n return <ItemTemplate>{\n raw: item,\n label: item.label ?? String(item.value),\n value: item.value,\n disabled: item.disabled,\n ...item\n };\n }\n\n // 3. object معمولی\n return <ItemTemplate>{\n raw: item,\n label: item[this.optionLabel()] ?? JSON.stringify(item),\n value: item,\n disabled: false\n };\n });\n }\n\n toggleDropdown() {\n this.isOpen.update(v => !v);\n this.highlightedIndex.set(-1);\n }\n\n selectOption(option: ItemTemplate) {\n if (option.disabled) return;\n\n const value = option.value;\n\n if (this.multiple()) {\n this.selected.update((list: any[]) =>\n list?.includes(value)\n ? list.filter(x => x !== value)\n : [...(list || []), value]\n );\n } else {\n this.selected.set(value);\n this.isOpen.set(false);\n }\n\n this._onChange(this.selected());\n this.selectionChange.emit(this.selected());\n this._onTouched();\n }\n\n isSelected(option: any): boolean {\n if (this.multiple()) {\n return Array.isArray(this.selected())\n ? this.selected().includes(option.value)\n : false;\n }\n\n return this.selected() === option.value;\n }\n\n clearSelection() {\n this.selected.set(this.multiple() ? [] : null);\n this._onChange(this.selected());\n this.selectionChange.emit(this.selected());\n this._onTouched();\n }\n\n onKeyDown(event: KeyboardEvent) {\n const list = this.filteredOptions();\n if (!list.length) return;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.highlightedIndex.update(i => (i + 1) % list.length);\n this.scrollToHighlighted();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.highlightedIndex.update(i =>\n i > 0 ? i - 1 : list.length - 1\n );\n this.scrollToHighlighted();\n break;\n\n case 'Enter':\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.isOpen.set(true);\n return;\n }\n\n const idx = this.highlightedIndex();\n if (idx >= 0) this.selectOption(list[idx]);\n break;\n\n case 'Tab':\n this.isOpen.set(false);\n break;\n\n case 'Escape':\n this.isOpen.set(false);\n break;\n }\n }\n\n scrollToHighlighted() {\n if (!isPlatformBrowser(this.platformId)) return;\n\n queueMicrotask(() => {\n const dropdown = this.elRef.nativeElement.querySelector('.dropdown-menu');\n const items = dropdown?.querySelectorAll('.dropdown-item');\n const activeItem = items?.[this.highlightedIndex()] as HTMLElement;\n\n if (!activeItem || !dropdown) return;\n\n const itemTop = activeItem.offsetTop;\n const itemBottom = itemTop + activeItem.offsetHeight;\n const dropdownScrollTop = dropdown.scrollTop;\n const dropdownHeight = dropdown.clientHeight;\n\n if (itemBottom > dropdownScrollTop + dropdownHeight) {\n dropdown.scrollTop = itemBottom - dropdownHeight;\n } else if (itemTop < dropdownScrollTop) {\n dropdown.scrollTop = itemTop;\n }\n });\n }\n\n /** Close by clicking outside */\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent) {\n if (!isPlatformBrowser(this.platformId)) return;\n\n if (!this.isOpen()) return;\n\n const clickedInside = this.elRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.isOpen.set(false);\n }\n }\n\n}\n","<div class=\"dropdown ys-dropdown\">\n <div class=\"input-group w-100\">\n <input #inputRef type=\"text\" class=\"form-control\" [value]=\"selectedLabels()\" [placeholder]=\"placeholder()\"\n readonly (click)=\"isOpen.set(true)\" (keydown)=\"onKeyDown($event)\" [disabled]=\"isDisabled()\" />\n <!-- (focus)=\"isOpen.set(true)\" replace with (click)=\"isOpen.set(true)\" (keydown.enter)=\"isOpen.set(true)\" -->\n\n @if(showClear() && hasSelection()){\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"clearSelection()\" [disabled]=\"isDisabled()\">\n <i [ngClass]=\"clearIconClass()\"></i>\n </button>\n }\n\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" (click)=\"toggleDropdown()\"\n [disabled]=\"isDisabled()\">\n <i [ngClass]=\"dropDownToggleIconClass()\"></i>\n </button>\n </div>\n <div class=\"dropdown-menu w-100 overflow-auto\" [class.show]=\"isOpen()\">\n\n @if(searchable()){\n <div class=\"px-2\">\n <input type=\"text\" class=\"form-control mb-2\" [placeholder]=\"searchPlaceholder()\" [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\" (keydown)=\"onKeyDown($event)\">\n </div>\n }\n\n @for (option of filteredOptions(); track option.value) {\n <div class=\"dropdown-item\" (click)=\"selectOption(option)\" [class.active]=\"isSelected(option)\"\n [class.highlighted]=\"$index === highlightedIndex()\">\n\n @if(itemTemplate()){\n <ng-container [ngTemplateOutlet]=\"itemTemplate()\" [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-container>\n } @else {\n @if(multiple()){\n <i class=\"{{multipleCheckIconClass()}} text-success me-1\" [class.invisible]=\"!isSelected(option)\"></i>\n }\n <!-- <span>{{option[optionLabel]}}</span> -->\n <span>{{option.label}}</span>\n }\n </div>\n }\n </div>\n</div>","/*\r\n * Public API Surface of ys-dropdown\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-dropdown/ys-dropdown';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-dropdown.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/dropdown/src/ys-dropdown/ys-dropdown.ts","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/src/ys-dropdown/ys-dropdown.html","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/dropdown/yoozsoft-yoozsoft-ng-dropdown.ts"],"sourcesContent":["import { isPlatformBrowser, NgClass, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n HostListener,\r\n inject,\r\n input,\r\n output,\r\n PLATFORM_ID,\r\n signal,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\ninterface ItemTemplate {\r\n raw: unknown;\r\n label: string;\r\n value: unknown;\r\n disabled: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ys-dropdown',\r\n imports: [NgTemplateOutlet, FormsModule, NgClass],\r\n templateUrl: './ys-dropdown.html',\r\n styleUrl: './ys-dropdown.scss',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => YsDropdown),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class YsDropdown implements ControlValueAccessor {\r\n private elRef = inject(ElementRef);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n /** List of options */\r\n options = input<any[]>([]);\r\n /** Field of object that display as label */\r\n optionLabel = input<string>('label');\r\n placeholder = input<string>('');\r\n searchPlaceholder = input<string>('');\r\n selectedMaxLength = input<number>(3);\r\n selectedMaxLengthTemplate = input<string>('{length} items selected');\r\n selectionSeparator = input<string>(', ');\r\n dropDownToggleIconClass = input<string>('fa fa-chevron-down');\r\n clearIconClass = input<string>('fa fa-times');\r\n multipleCheckIconClass = input<string>('fa fa-check');\r\n\r\n /** Multiple choice mode */\r\n multiple = input<boolean>(false);\r\n showClear = input<boolean>(false);\r\n\r\n /** Search capability */\r\n searchable = input<boolean>(false);\r\n\r\n disabled = input<boolean>(false);\r\n\r\n /** Custom template for items */\r\n itemTemplate = input<TemplateRef<any>>();\r\n\r\n /** Output event when selection changes */\r\n selectionChange = output<unknown | unknown[] | null>();\r\n\r\n searchTerm = signal<string>('');\r\n isOpen = signal<boolean>(false);\r\n highlightedIndex = signal<number>(-1);\r\n /** Selected value */\r\n selected = signal<any[] | any>(null);\r\n\r\n private disabledState = signal(false);\r\n readonly isDisabled = computed(() => this.disabled() || this.disabledState());\r\n\r\n readonly filteredOptions = computed<ItemTemplate[]>(() => {\r\n if (!this.searchable() || !this.searchTerm().trim()) {\r\n return this.normalizedOptions();\r\n }\r\n\r\n const term = this.searchTerm().toLowerCase();\r\n\r\n return this.normalizedOptions().filter((opt) => opt.label.toLowerCase().includes(term));\r\n });\r\n\r\n readonly normalizedOptions = computed(() => this.normalizeOptions(this.options()));\r\n\r\n readonly hasSelection = computed(() =>\r\n this.multiple()\r\n ? Array.isArray(this.selected()) && this.selected().length > 0\r\n : !!this.selected(),\r\n );\r\n\r\n readonly selectedLabels = computed(() => {\r\n if (this.multiple()) {\r\n if (!Array.isArray(this.selected())) return '';\r\n\r\n // لیست object های انتخابی را پیدا می‌کنیم\r\n const selectedItems = this.normalizedOptions().filter((o) =>\r\n this.selected().includes(o.value),\r\n );\r\n\r\n const count = selectedItems.length;\r\n\r\n // اگر بیشتر از حد مجاز باشد → متن سفارشی\r\n if (count > this.selectedMaxLength()) {\r\n return this.selectedMaxLengthTemplate().replace('{length}', count + '');\r\n }\r\n\r\n // در غیر این‌صورت لیبل‌ها را نمایش بده\r\n return selectedItems.map((o) => o.label).join(this.selectionSeparator());\r\n }\r\n\r\n const item = this.normalizedOptions().find((o) => o.value === this.selected());\r\n return item?.label ?? '';\r\n });\r\n\r\n private _onChange = (_: unknown) => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n constructor() {\r\n effect(() => this.selected.set(this.multiple() ? [] : null));\r\n }\r\n\r\n writeValue(obj: any): void {\r\n this.selected.set(this.multiple() ? (Array.isArray(obj) ? obj : []) : obj);\r\n }\r\n registerOnChange(fn: any): void {\r\n this._onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabledState.set(isDisabled);\r\n }\r\n\r\n private normalizeOptions(list: any[]): ItemTemplate[] {\r\n if (!Array.isArray(list)) return [];\r\n\r\n return list.map((item) => {\r\n // 1. اگر primitive بود\r\n if (['string', 'number', 'boolean'].includes(typeof item)) {\r\n return <ItemTemplate>{\r\n raw: item,\r\n label: String(item),\r\n value: item,\r\n disabled: false,\r\n };\r\n }\r\n\r\n // 2. اگر OptionItem<T> بود\r\n if (item && typeof item === 'object' && 'value' in item) {\r\n return <ItemTemplate>{\r\n raw: item,\r\n label: item.label ?? String(item.value),\r\n value: item.value,\r\n disabled: item.disabled,\r\n ...item,\r\n };\r\n }\r\n\r\n // 3. object معمولی\r\n return <ItemTemplate>{\r\n raw: item,\r\n label: item[this.optionLabel()] ?? JSON.stringify(item),\r\n value: item,\r\n disabled: false,\r\n };\r\n });\r\n }\r\n\r\n toggleDropdown() {\r\n this.isOpen.update((v) => !v);\r\n this.highlightedIndex.set(-1);\r\n }\r\n\r\n selectOption(option: ItemTemplate) {\r\n if (option.disabled) return;\r\n\r\n const value = option.value;\r\n\r\n if (this.multiple()) {\r\n this.selected.update((list: any[]) =>\r\n list?.includes(value) ? list.filter((x) => x !== value) : [...(list || []), value],\r\n );\r\n } else {\r\n this.selected.set(value);\r\n this.isOpen.set(false);\r\n }\r\n\r\n this._onChange(this.selected());\r\n this.selectionChange.emit(this.selected());\r\n this._onTouched();\r\n }\r\n\r\n isSelected(option: any): boolean {\r\n if (this.multiple()) {\r\n return Array.isArray(this.selected()) ? this.selected().includes(option.value) : false;\r\n }\r\n\r\n return this.selected() === option.value;\r\n }\r\n\r\n clearSelection() {\r\n this.selected.set(this.multiple() ? [] : null);\r\n this._onChange(this.selected());\r\n this.selectionChange.emit(this.selected());\r\n this._onTouched();\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n const list = this.filteredOptions();\r\n if (!list.length) return;\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.highlightedIndex.update((i) => (i + 1) % list.length);\r\n this.scrollToHighlighted();\r\n break;\r\n\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.highlightedIndex.update((i) => (i > 0 ? i - 1 : list.length - 1));\r\n this.scrollToHighlighted();\r\n break;\r\n\r\n case 'Enter':\r\n event.preventDefault();\r\n\r\n if (!this.isOpen()) {\r\n this.isOpen.set(true);\r\n return;\r\n }\r\n\r\n const idx = this.highlightedIndex();\r\n if (idx >= 0) this.selectOption(list[idx]);\r\n break;\r\n\r\n case 'Tab':\r\n this.isOpen.set(false);\r\n break;\r\n\r\n case 'Escape':\r\n this.isOpen.set(false);\r\n break;\r\n }\r\n }\r\n\r\n scrollToHighlighted() {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n queueMicrotask(() => {\r\n const dropdown = this.elRef.nativeElement.querySelector('.dropdown-menu');\r\n const items = dropdown?.querySelectorAll('.dropdown-item');\r\n const activeItem = items?.[this.highlightedIndex()] as HTMLElement;\r\n\r\n if (!activeItem || !dropdown) return;\r\n\r\n const itemTop = activeItem.offsetTop;\r\n const itemBottom = itemTop + activeItem.offsetHeight;\r\n const dropdownScrollTop = dropdown.scrollTop;\r\n const dropdownHeight = dropdown.clientHeight;\r\n\r\n if (itemBottom > dropdownScrollTop + dropdownHeight) {\r\n dropdown.scrollTop = itemBottom - dropdownHeight;\r\n } else if (itemTop < dropdownScrollTop) {\r\n dropdown.scrollTop = itemTop;\r\n }\r\n });\r\n }\r\n\r\n /** Close by clicking outside */\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: MouseEvent) {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n if (!this.isOpen()) return;\r\n\r\n const clickedInside = this.elRef.nativeElement.contains(event.target);\r\n if (!clickedInside) {\r\n this.isOpen.set(false);\r\n }\r\n }\r\n}\r\n","<div class=\"dropdown ys-dropdown\">\n <div class=\"input-group w-100\">\n <input #inputRef type=\"text\" class=\"form-control\" [value]=\"selectedLabels()\" [placeholder]=\"placeholder()\"\n readonly (click)=\"isOpen.set(true)\" (keydown)=\"onKeyDown($event)\" [disabled]=\"isDisabled()\" />\n <!-- (focus)=\"isOpen.set(true)\" replace with (click)=\"isOpen.set(true)\" (keydown.enter)=\"isOpen.set(true)\" -->\n\n @if(showClear() && hasSelection()){\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"clearSelection()\" [disabled]=\"isDisabled()\">\n <i [ngClass]=\"clearIconClass()\"></i>\n </button>\n }\n\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" (click)=\"toggleDropdown()\"\n [disabled]=\"isDisabled()\">\n <i [ngClass]=\"dropDownToggleIconClass()\"></i>\n </button>\n </div>\n <div class=\"dropdown-menu w-100 overflow-auto\" [class.show]=\"isOpen()\">\n\n @if(searchable()){\n <div class=\"px-2\">\n <input type=\"text\" class=\"form-control mb-2\" [placeholder]=\"searchPlaceholder()\" [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"searchTerm.set($event)\" (keydown)=\"onKeyDown($event)\">\n </div>\n }\n\n @for (option of filteredOptions(); track option.value) {\n <div class=\"dropdown-item\" (click)=\"selectOption(option)\" [class.active]=\"isSelected(option)\"\n [class.highlighted]=\"$index === highlightedIndex()\">\n\n @if(itemTemplate()){\n <ng-container [ngTemplateOutlet]=\"itemTemplate()\" [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-container>\n } @else {\n @if(multiple()){\n <i class=\"{{multipleCheckIconClass()}} text-success me-1\" [class.invisible]=\"!isSelected(option)\"></i>\n }\n <!-- <span>{{option[optionLabel]}}</span> -->\n <span>{{option.label}}</span>\n }\n </div>\n }\n </div>\n</div>","/*\r\n * Public API Surface of ys-dropdown\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-dropdown/ys-dropdown';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,49 +1,65 @@
1
1
  import { NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { input, output, signal, computed, forwardRef, Component } from '@angular/core';
3
+ import { input, output, signal, computed, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
4
4
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
5
 
6
6
  class YsFileUpload {
7
- id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
8
- styleClass = input(...(ngDevMode ? [undefined, { debugName: "styleClass" }] : /* istanbul ignore next */ []));
7
+ id = input(/* @ts-ignore */
8
+ ...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
9
+ styleClass = input(/* @ts-ignore */
10
+ ...(ngDevMode ? [undefined, { debugName: "styleClass" }] : /* istanbul ignore next */ []));
9
11
  /**
10
12
  * Allowing upload multiple files
11
13
  * Default is false
12
14
  */
13
- multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
15
+ multiple = input(false, /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
14
17
  /**
15
18
  * Acceptable type of files
16
19
  * Default is all file type
17
20
  */
18
- accept = input('*/*', ...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
21
+ accept = input('*/*', /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
19
23
  /**
20
24
  * Upload button label
21
25
  * Default is Choose File
22
26
  */
23
- uploadLabel = input('Choose File', ...(ngDevMode ? [{ debugName: "uploadLabel" }] : /* istanbul ignore next */ []));
27
+ uploadLabel = input('Choose File', /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "uploadLabel" }] : /* istanbul ignore next */ []));
24
29
  /**Style class of upload button */
25
- uploadStyleClass = input('btn-primary', ...(ngDevMode ? [{ debugName: "uploadStyleClass" }] : /* istanbul ignore next */ []));
30
+ uploadStyleClass = input('btn-primary', /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "uploadStyleClass" }] : /* istanbul ignore next */ []));
26
32
  /**Icon class of upload button */
27
- uploadIconClass = input('fa fa-paperclip', ...(ngDevMode ? [{ debugName: "uploadIconClass" }] : /* istanbul ignore next */ []));
33
+ uploadIconClass = input('fa fa-paperclip', /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "uploadIconClass" }] : /* istanbul ignore next */ []));
28
35
  /**Display choosed file remove button */
29
- showRemove = input(true, ...(ngDevMode ? [{ debugName: "showRemove" }] : /* istanbul ignore next */ []));
36
+ showRemove = input(true, /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "showRemove" }] : /* istanbul ignore next */ []));
30
38
  /**Icon of remove item button */
31
- removeIconClass = input('fa fa-times', ...(ngDevMode ? [{ debugName: "removeIconClass" }] : /* istanbul ignore next */ []));
32
- cancelIconClass = input('fa fa-times', ...(ngDevMode ? [{ debugName: "cancelIconClass" }] : /* istanbul ignore next */ []));
39
+ removeIconClass = input('fa fa-times', /* @ts-ignore */
40
+ ...(ngDevMode ? [{ debugName: "removeIconClass" }] : /* istanbul ignore next */ []));
41
+ cancelIconClass = input('fa fa-times', /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "cancelIconClass" }] : /* istanbul ignore next */ []));
33
43
  /**
34
44
  * Files list display direction
35
45
  * Default is vertical (false)
36
46
  */
37
- horizontal = input(false, ...(ngDevMode ? [{ debugName: "horizontal" }] : /* istanbul ignore next */ []));
47
+ horizontal = input(false, /* @ts-ignore */
48
+ ...(ngDevMode ? [{ debugName: "horizontal" }] : /* istanbul ignore next */ []));
38
49
  /**Message displayed before choosing file */
39
- noFileMessage = input("No file chosen", ...(ngDevMode ? [{ debugName: "noFileMessage" }] : /* istanbul ignore next */ []));
40
- progressStyleClass = input(...(ngDevMode ? [undefined, { debugName: "progressStyleClass" }] : /* istanbul ignore next */ []));
50
+ noFileMessage = input('No file chosen', /* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "noFileMessage" }] : /* istanbul ignore next */ []));
52
+ progressStyleClass = input(/* @ts-ignore */
53
+ ...(ngDevMode ? [undefined, { debugName: "progressStyleClass" }] : /* istanbul ignore next */ []));
41
54
  /**Value of progress element */
42
- progressValue = input(null, ...(ngDevMode ? [{ debugName: "progressValue" }] : /* istanbul ignore next */ []));
55
+ progressValue = input(null, /* @ts-ignore */
56
+ ...(ngDevMode ? [{ debugName: "progressValue" }] : /* istanbul ignore next */ []));
43
57
  /**Max value of progress element */
44
- progressValueMax = input(100, ...(ngDevMode ? [{ debugName: "progressValueMax" }] : /* istanbul ignore next */ []));
58
+ progressValueMax = input(100, /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "progressValueMax" }] : /* istanbul ignore next */ []));
45
60
  /**Display cancel upload button */
46
- showCancel = input(false, ...(ngDevMode ? [{ debugName: "showCancel" }] : /* istanbul ignore next */ []));
61
+ showCancel = input(false, /* @ts-ignore */
62
+ ...(ngDevMode ? [{ debugName: "showCancel" }] : /* istanbul ignore next */ []));
47
63
  /**Event to get selected files */
48
64
  filesSelected = output();
49
65
  /**Event of selected file in the list of choosed file*/
@@ -53,12 +69,18 @@ class YsFileUpload {
53
69
  /**Event of cancel upload button */
54
70
  cancel = output();
55
71
  /**Disable elements */
56
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
57
- files = signal([], ...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
58
- selectedFile = signal(null, ...(ngDevMode ? [{ debugName: "selectedFile" }] : /* istanbul ignore next */ []));
59
- disabledState = signal(false, ...(ngDevMode ? [{ debugName: "disabledState" }] : /* istanbul ignore next */ []));
60
- isDisabled = computed(() => this.disabled() || this.disabledState(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
61
- inputId = computed(() => this.id() ?? `ys-file-upload-${crypto.randomUUID()}`, ...(ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []));
72
+ disabled = input(false, /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
74
+ files = signal([], /* @ts-ignore */
75
+ ...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
76
+ selectedFile = signal(null, /* @ts-ignore */
77
+ ...(ngDevMode ? [{ debugName: "selectedFile" }] : /* istanbul ignore next */ []));
78
+ disabledState = signal(false, /* @ts-ignore */
79
+ ...(ngDevMode ? [{ debugName: "disabledState" }] : /* istanbul ignore next */ []));
80
+ isDisabled = computed(() => this.disabled() || this.disabledState(), /* @ts-ignore */
81
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
82
+ inputId = computed(() => this.id() ?? `ys-file-upload-${crypto.randomUUID()}`, /* @ts-ignore */
83
+ ...(ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []));
62
84
  onChange = () => { };
63
85
  onTouched = () => { };
64
86
  constructor() { }
@@ -106,7 +128,7 @@ class YsFileUpload {
106
128
  input.value = '';
107
129
  }
108
130
  removeFile(file) {
109
- this.files.set(this.files().filter(f => f !== file));
131
+ this.files.set(this.files().filter((f) => f !== file));
110
132
  // this.onChange(this.multiple ? this.files : this.files[0]);
111
133
  this.onChange(this.files());
112
134
  this.onTouched();
@@ -124,23 +146,23 @@ class YsFileUpload {
124
146
  cancelUpload() {
125
147
  this.cancel.emit();
126
148
  }
127
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsFileUpload, deps: [], target: i0.ɵɵFactoryTarget.Component });
128
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: YsFileUpload, isStandalone: true, selector: "ys-file-upload", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, uploadLabel: { classPropertyName: "uploadLabel", publicName: "uploadLabel", isSignal: true, isRequired: false, transformFunction: null }, uploadStyleClass: { classPropertyName: "uploadStyleClass", publicName: "uploadStyleClass", isSignal: true, isRequired: false, transformFunction: null }, uploadIconClass: { classPropertyName: "uploadIconClass", publicName: "uploadIconClass", isSignal: true, isRequired: false, transformFunction: null }, showRemove: { classPropertyName: "showRemove", publicName: "showRemove", isSignal: true, isRequired: false, transformFunction: null }, removeIconClass: { classPropertyName: "removeIconClass", publicName: "removeIconClass", isSignal: true, isRequired: false, transformFunction: null }, cancelIconClass: { classPropertyName: "cancelIconClass", publicName: "cancelIconClass", isSignal: true, isRequired: false, transformFunction: null }, horizontal: { classPropertyName: "horizontal", publicName: "horizontal", isSignal: true, isRequired: false, transformFunction: null }, noFileMessage: { classPropertyName: "noFileMessage", publicName: "noFileMessage", isSignal: true, isRequired: false, transformFunction: null }, progressStyleClass: { classPropertyName: "progressStyleClass", publicName: "progressStyleClass", isSignal: true, isRequired: false, transformFunction: null }, progressValue: { classPropertyName: "progressValue", publicName: "progressValue", isSignal: true, isRequired: false, transformFunction: null }, progressValueMax: { classPropertyName: "progressValueMax", publicName: "progressValueMax", isSignal: true, isRequired: false, transformFunction: null }, showCancel: { classPropertyName: "showCancel", publicName: "showCancel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesSelected: "filesSelected", select: "select", removed: "removed", cancel: "cancel" }, providers: [
149
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsFileUpload, deps: [], target: i0.ɵɵFactoryTarget.Component });
150
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsFileUpload, isStandalone: true, selector: "ys-file-upload", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, uploadLabel: { classPropertyName: "uploadLabel", publicName: "uploadLabel", isSignal: true, isRequired: false, transformFunction: null }, uploadStyleClass: { classPropertyName: "uploadStyleClass", publicName: "uploadStyleClass", isSignal: true, isRequired: false, transformFunction: null }, uploadIconClass: { classPropertyName: "uploadIconClass", publicName: "uploadIconClass", isSignal: true, isRequired: false, transformFunction: null }, showRemove: { classPropertyName: "showRemove", publicName: "showRemove", isSignal: true, isRequired: false, transformFunction: null }, removeIconClass: { classPropertyName: "removeIconClass", publicName: "removeIconClass", isSignal: true, isRequired: false, transformFunction: null }, cancelIconClass: { classPropertyName: "cancelIconClass", publicName: "cancelIconClass", isSignal: true, isRequired: false, transformFunction: null }, horizontal: { classPropertyName: "horizontal", publicName: "horizontal", isSignal: true, isRequired: false, transformFunction: null }, noFileMessage: { classPropertyName: "noFileMessage", publicName: "noFileMessage", isSignal: true, isRequired: false, transformFunction: null }, progressStyleClass: { classPropertyName: "progressStyleClass", publicName: "progressStyleClass", isSignal: true, isRequired: false, transformFunction: null }, progressValue: { classPropertyName: "progressValue", publicName: "progressValue", isSignal: true, isRequired: false, transformFunction: null }, progressValueMax: { classPropertyName: "progressValueMax", publicName: "progressValueMax", isSignal: true, isRequired: false, transformFunction: null }, showCancel: { classPropertyName: "showCancel", publicName: "showCancel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesSelected: "filesSelected", select: "select", removed: "removed", cancel: "cancel" }, providers: [
129
151
  {
130
152
  provide: NG_VALUE_ACCESSOR,
131
153
  useExisting: forwardRef(() => YsFileUpload),
132
- multi: true
133
- }
134
- ], ngImport: i0, template: "<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}", styles: [".progress{height:20px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
154
+ multi: true,
155
+ },
156
+ ], ngImport: i0, template: "<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}", styles: [".progress{height:20px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
135
157
  }
136
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsFileUpload, decorators: [{
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsFileUpload, decorators: [{
137
159
  type: Component,
138
- args: [{ selector: 'ys-file-upload', imports: [NgClass], providers: [
160
+ args: [{ selector: 'ys-file-upload', imports: [NgClass], changeDetection: ChangeDetectionStrategy.Eager, providers: [
139
161
  {
140
162
  provide: NG_VALUE_ACCESSOR,
141
163
  useExisting: forwardRef(() => YsFileUpload),
142
- multi: true
143
- }
164
+ multi: true,
165
+ },
144
166
  ], template: "<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}", styles: [".progress{height:20px}\n"] }]
145
167
  }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], uploadLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadLabel", required: false }] }], uploadStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadStyleClass", required: false }] }], uploadIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadIconClass", required: false }] }], showRemove: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRemove", required: false }] }], removeIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeIconClass", required: false }] }], cancelIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelIconClass", required: false }] }], horizontal: [{ type: i0.Input, args: [{ isSignal: true, alias: "horizontal", required: false }] }], noFileMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noFileMessage", required: false }] }], progressStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressStyleClass", required: false }] }], progressValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressValue", required: false }] }], progressValueMax: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressValueMax", required: false }] }], showCancel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCancel", required: false }] }], filesSelected: [{ type: i0.Output, args: ["filesSelected"] }], select: [{ type: i0.Output, args: ["select"] }], removed: [{ type: i0.Output, args: ["removed"] }], cancel: [{ type: i0.Output, args: ["cancel"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
146
168
 
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-file-upload.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/file-upload/src/ys-file-upload/ys-file-upload.ts","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/src/ys-file-upload/ys-file-upload.html","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/yoozsoft-yoozsoft-ng-file-upload.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\nimport { Component, computed, forwardRef, input, output, signal } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'ys-file-upload',\n imports: [NgClass],\n templateUrl: './ys-file-upload.html',\n styleUrl: './ys-file-upload.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => YsFileUpload),\n multi: true\n }\n ]\n})\nexport class YsFileUpload implements ControlValueAccessor {\n\n id = input<string>();\n\n styleClass = input<string>();\n /**\n * Allowing upload multiple files\n * Default is false\n */\n multiple = input<boolean>(false);\n /**\n * Acceptable type of files\n * Default is all file type\n */\n accept = input<string>('*/*');\n /**\n * Upload button label\n * Default is Choose File\n */\n uploadLabel = input<string>('Choose File');\n /**Style class of upload button */\n uploadStyleClass = input<string>('btn-primary');\n /**Icon class of upload button */\n uploadIconClass = input<string>('fa fa-paperclip');\n\n /**Display choosed file remove button */\n showRemove = input<boolean>(true);\n /**Icon of remove item button */\n removeIconClass = input<string>('fa fa-times');\n cancelIconClass = input<string>('fa fa-times');\n\n /**\n * Files list display direction\n * Default is vertical (false)\n */\n horizontal = input<boolean>(false);\n\n /**Message displayed before choosing file */\n noFileMessage = input<string>(\"No file chosen\");\n\n progressStyleClass = input<string>();\n /**Value of progress element */\n progressValue = input<number | null>(null);\n /**Max value of progress element */\n progressValueMax = input<number>(100);\n /**Display cancel upload button */\n showCancel = input<boolean>(false);\n\n /**Event to get selected files */\n filesSelected = output<File[]>();\n /**Event of selected file in the list of choosed file*/\n select = output<File | null>();\n /**Event of removed file in the list of choosed file*/\n removed = output<File>();\n /**Event of cancel upload button */\n cancel = output<void>();\n\n /**Disable elements */\n disabled = input<boolean>(false);\n\n files = signal<File[]>([]);\n selectedFile = signal<File | null>(null);\n\n private disabledState = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this.disabledState());\n readonly inputId = computed(() => this.id() ?? `ys-file-upload-${crypto.randomUUID()}`);\n\n private onChange: (files: File[]) => void = () => { };\n private onTouched: () => void = () => { };\n\n constructor() { }\n\n writeValue(obj: File | File[] | null): void {\n if (!obj) {\n this.files.set([]);\n return;\n }\n\n if (!Array.isArray(obj)) {\n this.files.set([obj]);\n return;\n }\n\n this.files.set(obj);\n }\n registerOnChange(fn: (files: File[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState?(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n onChangeFiles(event: Event) {\n const input = (event.target as HTMLInputElement);\n const files = input.files;\n\n if (files?.length) {\n\n if (!this.multiple()) {\n this.files.set([]);\n }\n\n for (let i = 0; i < files.length; i++) {\n const file: File = files.item(i)!;\n const currentFiles = [...this.files()];\n\n currentFiles.push(file);\n\n this.files.set(currentFiles);\n }\n\n this.files().sort((a, b) => b.name.localeCompare(a.name));\n\n } else {\n this.files.set([]);\n }\n\n this.onChange(this.files());\n this.onTouched();\n\n this.filesSelected.emit(this.files());\n\n input.value = '';\n\n }\n\n removeFile(file: File) {\n this.files.set(\n this.files().filter(f => f !== file)\n );\n\n // this.onChange(this.multiple ? this.files : this.files[0]);\n this.onChange(this.files());\n this.onTouched();\n\n // this.choosed.emit(this.files);\n\n if (this.selectedFile() == file) {\n this.selectedFile.set(null);\n this.select.emit(null);\n }\n\n this.removed.emit(file);\n }\n\n onSelectFile(file: File) {\n this.selectedFile.set(file);\n this.select.emit(this.selectedFile());\n }\n\n cancelUpload() {\n this.cancel.emit();\n }\n\n}\n","<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}","/*\r\n * Public API Surface of ys-file-upload\r\n */\r\n\r\nexport * from './src/ys-file-upload/ys-file-upload';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-file-upload.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/file-upload/src/ys-file-upload/ys-file-upload.ts","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/src/ys-file-upload/ys-file-upload.html","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/file-upload/yoozsoft-yoozsoft-ng-file-upload.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'ys-file-upload',\r\n imports: [NgClass],\r\n templateUrl: './ys-file-upload.html',\r\n styleUrl: './ys-file-upload.scss',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => YsFileUpload),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class YsFileUpload implements ControlValueAccessor {\r\n id = input<string>();\r\n\r\n styleClass = input<string>();\r\n /**\r\n * Allowing upload multiple files\r\n * Default is false\r\n */\r\n multiple = input<boolean>(false);\r\n /**\r\n * Acceptable type of files\r\n * Default is all file type\r\n */\r\n accept = input<string>('*/*');\r\n /**\r\n * Upload button label\r\n * Default is Choose File\r\n */\r\n uploadLabel = input<string>('Choose File');\r\n /**Style class of upload button */\r\n uploadStyleClass = input<string>('btn-primary');\r\n /**Icon class of upload button */\r\n uploadIconClass = input<string>('fa fa-paperclip');\r\n\r\n /**Display choosed file remove button */\r\n showRemove = input<boolean>(true);\r\n /**Icon of remove item button */\r\n removeIconClass = input<string>('fa fa-times');\r\n cancelIconClass = input<string>('fa fa-times');\r\n\r\n /**\r\n * Files list display direction\r\n * Default is vertical (false)\r\n */\r\n horizontal = input<boolean>(false);\r\n\r\n /**Message displayed before choosing file */\r\n noFileMessage = input<string>('No file chosen');\r\n\r\n progressStyleClass = input<string>();\r\n /**Value of progress element */\r\n progressValue = input<number | null>(null);\r\n /**Max value of progress element */\r\n progressValueMax = input<number>(100);\r\n /**Display cancel upload button */\r\n showCancel = input<boolean>(false);\r\n\r\n /**Event to get selected files */\r\n filesSelected = output<File[]>();\r\n /**Event of selected file in the list of choosed file*/\r\n select = output<File | null>();\r\n /**Event of removed file in the list of choosed file*/\r\n removed = output<File>();\r\n /**Event of cancel upload button */\r\n cancel = output<void>();\r\n\r\n /**Disable elements */\r\n disabled = input<boolean>(false);\r\n\r\n files = signal<File[]>([]);\r\n selectedFile = signal<File | null>(null);\r\n\r\n private disabledState = signal(false);\r\n readonly isDisabled = computed(() => this.disabled() || this.disabledState());\r\n readonly inputId = computed(() => this.id() ?? `ys-file-upload-${crypto.randomUUID()}`);\r\n\r\n private onChange: (files: File[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor() {}\r\n\r\n writeValue(obj: File | File[] | null): void {\r\n if (!obj) {\r\n this.files.set([]);\r\n return;\r\n }\r\n\r\n if (!Array.isArray(obj)) {\r\n this.files.set([obj]);\r\n return;\r\n }\r\n\r\n this.files.set(obj);\r\n }\r\n registerOnChange(fn: (files: File[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabledState.set(isDisabled);\r\n }\r\n\r\n onChangeFiles(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n const files = input.files;\r\n\r\n if (files?.length) {\r\n if (!this.multiple()) {\r\n this.files.set([]);\r\n }\r\n\r\n for (let i = 0; i < files.length; i++) {\r\n const file: File = files.item(i)!;\r\n const currentFiles = [...this.files()];\r\n\r\n currentFiles.push(file);\r\n\r\n this.files.set(currentFiles);\r\n }\r\n\r\n this.files().sort((a, b) => b.name.localeCompare(a.name));\r\n } else {\r\n this.files.set([]);\r\n }\r\n\r\n this.onChange(this.files());\r\n this.onTouched();\r\n\r\n this.filesSelected.emit(this.files());\r\n\r\n input.value = '';\r\n }\r\n\r\n removeFile(file: File) {\r\n this.files.set(this.files().filter((f) => f !== file));\r\n\r\n // this.onChange(this.multiple ? this.files : this.files[0]);\r\n this.onChange(this.files());\r\n this.onTouched();\r\n\r\n // this.choosed.emit(this.files);\r\n\r\n if (this.selectedFile() == file) {\r\n this.selectedFile.set(null);\r\n this.select.emit(null);\r\n }\r\n\r\n this.removed.emit(file);\r\n }\r\n\r\n onSelectFile(file: File) {\r\n this.selectedFile.set(file);\r\n this.select.emit(this.selectedFile());\r\n }\r\n\r\n cancelUpload() {\r\n this.cancel.emit();\r\n }\r\n}\r\n","<input class=\"form-control d-none file-upload\" type=\"file\" [id]=\"inputId()\" #ysFileUpload [multiple]=\"multiple()\"\n [accept]=\"accept()\" [disabled]=\"isDisabled()\" (change)=\"onChangeFiles($event)\">\n\n<div class=\"file-upload\" [class]=\"styleClass()\">\n <div class=\"row\">\n <div class=\"col\">\n <button class=\"btn btn-upload\" [class]=\"uploadStyleClass()\" (click)=\"ysFileUpload.click()\"\n [disabled]=\"isDisabled()\">\n <i [class]=\"uploadIconClass()\"></i>\n @if (uploadLabel()) {\n <span class=\"ms-2\">{{uploadLabel()}}</span>\n }\n </button>\n\n @if (noFileMessage()) {\n <span class=\"ms-2\">{{files().length ? '' : noFileMessage()}}</span>\n }\n\n @if (files().length) {\n <ul class=\"file-upload-list list-group mt-2\" [ngClass]=\"{'list-group-horizontal overflow-auto': horizontal()}\">\n @for (file of files(); track file) {\n <a class=\"file-upload-item list-group-item d-flex align-items-center text-wrap text-break\" role=\"button\"\n (click)=\"onSelectFile(file)\" [ngClass]=\"{'active': file == selectedFile(), 'disabled': isDisabled()}\">\n <span class=\"me-2\">{{file.name}}</span>\n @if (showRemove()) {\n <button class=\"btn btn-outline-danger btn-sm ms-auto\" type=\"button\" id=\"removeFileButton\"\n (click)=\"removeFile(file); $event.stopPropagation();\" [disabled]=\"isDisabled()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n }\n </a>\n }\n </ul>\n }\n\n </div>\n </div>\n</div>\n\n@if (progressValue() != null) {\n<div class=\"progress mt-2\" [class]=\"progressStyleClass()\">\n <div class=\"progress-bar\" role=\"progressbar\" [style.width.%]=\"progressValue()\" [attr.aria-valuenow]=\"progressValue()\"\n aria-valuemin=\"0\" [attr.aria-valuemax]=\"progressValueMax()\"></div>\n\n @if (showCancel() && (progressValue()! < progressValueMax())) { <button\n class=\"btn btn-danger btn-sm btn-upload-cancel d-flex\" (click)=\"cancelUpload()\">\n <i [ngClass]=\"cancelIconClass()\"></i>\n </button>\n }\n\n</div>\n}","/*\r\n * Public API Surface of ys-file-upload\r\n */\r\n\r\nexport * from './src/ys-file-upload/ys-file-upload';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,20 +1,22 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, Component } from '@angular/core';
2
+ import { input, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
4
4
 
5
5
  class YsFooter {
6
- styleClass = input(...(ngDevMode ? [undefined, { debugName: "styleClass" }] : /* istanbul ignore next */ []));
7
- brand = input(...(ngDevMode ? [undefined, { debugName: "brand" }] : /* istanbul ignore next */ []));
8
- copyright = input('', ...(ngDevMode ? [{ debugName: "copyright" }] : /* istanbul ignore next */ []));
9
- socialNetworks = input([], ...(ngDevMode ? [{ debugName: "socialNetworks" }] : /* istanbul ignore next */ []));
10
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
11
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: YsFooter, isStandalone: true, selector: "ys-footer", inputs: { styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: false, transformFunction: null }, copyright: { classPropertyName: "copyright", publicName: "copyright", isSignal: true, isRequired: false, transformFunction: null }, socialNetworks: { classPropertyName: "socialNetworks", publicName: "socialNetworks", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\n<footer [class]=\"styleClass()\">\n <!-- <div class=\"row\">\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\n <h2 class=\"footer-heading d-flex\">\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\n About\n </h2>\n <div class=\"block-23 mb-3\">\n <ul>\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\n Francisco, California, USA</span></li>\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\n </li>\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\n class=\"text\">support&#64;yourdomain.com</span></a></li>\n </ul>\n </div>\n\n <form action=\"#\" class=\"subscribe-form\">\n <div class=\"input-group d-flex\">\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\n <button type=\"submit\" class=\"btn btn-info\">\n <span class=\"sr-only\">Submit</span>\n <i class=\"fa fa-paper-plane\"></i></button>\n </div>\n </form>\n </div>\n\n </div> -->\n <div class=\"row\">\n <div class=\"col\">\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\n\n @if (brand() || copyright()) {\n <div class=\"d-flex align-items-center\">\n\n @if (brand()?.href) {\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\n class=\"brand-logo d-inline-block align-text-top\">\n </a>\n }@else {\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\n class=\"brand-logo d-inline-block align-text-top\">\n }\n\n @if (copyright()) {\n <span class=\"text-muted\">{{copyright()}}</span>\n }\n\n </div>\n\n }\n\n @if (socialNetworks().length) {\n <ul class=\"nav\">\n @for (social of socialNetworks(); track social.href) {\n <li class=\"px-2\">\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\"\n target=\"_blank\" rel=\"noopener noreferrer\">\n <em [class]=\"social.iconClass\"></em>\n </a>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </div>\n</footer>", styles: [".social-icon:hover{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, 1))!important}.brand-logo{width:30px;height:30px}\n"], dependencies: [{ kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
6
+ styleClass = input(/* @ts-ignore */
7
+ ...(ngDevMode ? [undefined, { debugName: "styleClass" }] : /* istanbul ignore next */ []));
8
+ brand = input(/* @ts-ignore */
9
+ ...(ngDevMode ? [undefined, { debugName: "brand" }] : /* istanbul ignore next */ []));
10
+ copyright = input('', /* @ts-ignore */
11
+ ...(ngDevMode ? [{ debugName: "copyright" }] : /* istanbul ignore next */ []));
12
+ socialNetworks = input([], /* @ts-ignore */
13
+ ...(ngDevMode ? [{ debugName: "socialNetworks" }] : /* istanbul ignore next */ []));
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
15
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsFooter, isStandalone: true, selector: "ys-footer", inputs: { styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: false, transformFunction: null }, copyright: { classPropertyName: "copyright", publicName: "copyright", isSignal: true, isRequired: false, transformFunction: null }, socialNetworks: { classPropertyName: "socialNetworks", publicName: "socialNetworks", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\r\n<footer [class]=\"styleClass()\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\r\n <h2 class=\"footer-heading d-flex\">\r\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\r\n About\r\n </h2>\r\n <div class=\"block-23 mb-3\">\r\n <ul>\r\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\r\n Francisco, California, USA</span></li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\r\n </li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\r\n class=\"text\">support&#64;yourdomain.com</span></a></li>\r\n </ul>\r\n </div>\r\n\r\n <form action=\"#\" class=\"subscribe-form\">\r\n <div class=\"input-group d-flex\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\r\n <button type=\"submit\" class=\"btn btn-info\">\r\n <span class=\"sr-only\">Submit</span>\r\n <i class=\"fa fa-paper-plane\"></i></button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div> -->\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\r\n @if (brand() || copyright()) {\r\n <div class=\"d-flex align-items-center\">\r\n @if (brand()?.href) {\r\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n </a>\r\n } @else {\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n }\r\n\r\n @if (copyright()) {\r\n <span class=\"text-muted\">{{ copyright() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (socialNetworks().length) {\r\n <ul class=\"nav\">\r\n @for (social of socialNetworks(); track social.href) {\r\n <li class=\"px-2\">\r\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\" target=\"_blank\"\r\n rel=\"noopener noreferrer\">\r\n <em [class]=\"social.iconClass\"></em>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</footer>", styles: [".social-icon:hover{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, 1))!important}.brand-logo{width:30px;height:30px}\n"], dependencies: [{ kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
12
16
  }
13
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsFooter, decorators: [{
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsFooter, decorators: [{
14
18
  type: Component,
15
- args: [{ selector: 'ys-footer', imports: [
16
- NgbTooltip
17
- ], template: "<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\n<footer [class]=\"styleClass()\">\n <!-- <div class=\"row\">\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\n <h2 class=\"footer-heading d-flex\">\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\n About\n </h2>\n <div class=\"block-23 mb-3\">\n <ul>\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\n Francisco, California, USA</span></li>\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\n </li>\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\n class=\"text\">support&#64;yourdomain.com</span></a></li>\n </ul>\n </div>\n\n <form action=\"#\" class=\"subscribe-form\">\n <div class=\"input-group d-flex\">\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\n <button type=\"submit\" class=\"btn btn-info\">\n <span class=\"sr-only\">Submit</span>\n <i class=\"fa fa-paper-plane\"></i></button>\n </div>\n </form>\n </div>\n\n </div> -->\n <div class=\"row\">\n <div class=\"col\">\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\n\n @if (brand() || copyright()) {\n <div class=\"d-flex align-items-center\">\n\n @if (brand()?.href) {\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\n class=\"brand-logo d-inline-block align-text-top\">\n </a>\n }@else {\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\n class=\"brand-logo d-inline-block align-text-top\">\n }\n\n @if (copyright()) {\n <span class=\"text-muted\">{{copyright()}}</span>\n }\n\n </div>\n\n }\n\n @if (socialNetworks().length) {\n <ul class=\"nav\">\n @for (social of socialNetworks(); track social.href) {\n <li class=\"px-2\">\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\"\n target=\"_blank\" rel=\"noopener noreferrer\">\n <em [class]=\"social.iconClass\"></em>\n </a>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </div>\n</footer>", styles: [".social-icon:hover{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, 1))!important}.brand-logo{width:30px;height:30px}\n"] }]
19
+ args: [{ selector: 'ys-footer', imports: [NgbTooltip], changeDetection: ChangeDetectionStrategy.Eager, template: "<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\r\n<footer [class]=\"styleClass()\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\r\n <h2 class=\"footer-heading d-flex\">\r\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\r\n About\r\n </h2>\r\n <div class=\"block-23 mb-3\">\r\n <ul>\r\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\r\n Francisco, California, USA</span></li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\r\n </li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\r\n class=\"text\">support&#64;yourdomain.com</span></a></li>\r\n </ul>\r\n </div>\r\n\r\n <form action=\"#\" class=\"subscribe-form\">\r\n <div class=\"input-group d-flex\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\r\n <button type=\"submit\" class=\"btn btn-info\">\r\n <span class=\"sr-only\">Submit</span>\r\n <i class=\"fa fa-paper-plane\"></i></button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div> -->\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\r\n @if (brand() || copyright()) {\r\n <div class=\"d-flex align-items-center\">\r\n @if (brand()?.href) {\r\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n </a>\r\n } @else {\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n }\r\n\r\n @if (copyright()) {\r\n <span class=\"text-muted\">{{ copyright() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (socialNetworks().length) {\r\n <ul class=\"nav\">\r\n @for (social of socialNetworks(); track social.href) {\r\n <li class=\"px-2\">\r\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\" target=\"_blank\"\r\n rel=\"noopener noreferrer\">\r\n <em [class]=\"social.iconClass\"></em>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</footer>", styles: [".social-icon:hover{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity, 1))!important}.brand-logo{width:30px;height:30px}\n"] }]
18
20
  }], propDecorators: { styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: false }] }], copyright: [{ type: i0.Input, args: [{ isSignal: true, alias: "copyright", required: false }] }], socialNetworks: [{ type: i0.Input, args: [{ isSignal: true, alias: "socialNetworks", required: false }] }] } });
19
21
 
20
22
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-footer.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/footer/src/ys-footer/ys-footer.ts","../../../../projects/yoozsoft/yoozsoft-ng/footer/src/ys-footer/ys-footer.html","../../../../projects/yoozsoft/yoozsoft-ng/footer/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/footer/yoozsoft-yoozsoft-ng-footer.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\nimport { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\nimport { FooterBrand, SocialNetwork } from '../models';\n\n@Component({\n selector: 'ys-footer',\n imports: [\n NgbTooltip\n ],\n templateUrl: './ys-footer.html',\n styleUrl: './ys-footer.scss',\n})\nexport class YsFooter {\n\n styleClass = input<string>();\n brand = input<FooterBrand>();\n copyright = input('');\n socialNetworks = input<readonly SocialNetwork[]>([]);\n\n}","<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\n<footer [class]=\"styleClass()\">\n <!-- <div class=\"row\">\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\n <h2 class=\"footer-heading d-flex\">\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\n About\n </h2>\n <div class=\"block-23 mb-3\">\n <ul>\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\n Francisco, California, USA</span></li>\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\n </li>\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\n class=\"text\">support&#64;yourdomain.com</span></a></li>\n </ul>\n </div>\n\n <form action=\"#\" class=\"subscribe-form\">\n <div class=\"input-group d-flex\">\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\n <button type=\"submit\" class=\"btn btn-info\">\n <span class=\"sr-only\">Submit</span>\n <i class=\"fa fa-paper-plane\"></i></button>\n </div>\n </form>\n </div>\n\n </div> -->\n <div class=\"row\">\n <div class=\"col\">\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\n\n @if (brand() || copyright()) {\n <div class=\"d-flex align-items-center\">\n\n @if (brand()?.href) {\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\n class=\"brand-logo d-inline-block align-text-top\">\n </a>\n }@else {\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\n class=\"brand-logo d-inline-block align-text-top\">\n }\n\n @if (copyright()) {\n <span class=\"text-muted\">{{copyright()}}</span>\n }\n\n </div>\n\n }\n\n @if (socialNetworks().length) {\n <ul class=\"nav\">\n @for (social of socialNetworks(); track social.href) {\n <li class=\"px-2\">\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\"\n target=\"_blank\" rel=\"noopener noreferrer\">\n <em [class]=\"social.iconClass\"></em>\n </a>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </div>\n</footer>","/*\r\n * Public API Surface of ys-footer\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-footer/ys-footer';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAYa,QAAQ,CAAA;IAEnB,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC5B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAe;AAC5B,IAAA,SAAS,GAAG,KAAK,CAAC,EAAE,gFAAC;AACrB,IAAA,cAAc,GAAG,KAAK,CAA2B,EAAE,qFAAC;wGALzC,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZrB,48FAsES,EAAA,MAAA,EAAA,CAAA,mIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/DL,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKD,QAAQ,EAAA,UAAA,EAAA,CAAA;kBARpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,OAAA,EACZ;wBACP;AACD,qBAAA,EAAA,QAAA,EAAA,48FAAA,EAAA,MAAA,EAAA,CAAA,mIAAA,CAAA,EAAA;;;AERH;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-footer.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/footer/src/ys-footer/ys-footer.ts","../../../../projects/yoozsoft/yoozsoft-ng/footer/src/ys-footer/ys-footer.html","../../../../projects/yoozsoft/yoozsoft-ng/footer/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/footer/yoozsoft-yoozsoft-ng-footer.ts"],"sourcesContent":["import { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\r\nimport { FooterBrand, SocialNetwork } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-footer',\r\n imports: [NgbTooltip],\r\n templateUrl: './ys-footer.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './ys-footer.scss',\r\n})\r\nexport class YsFooter {\r\n styleClass = input<string>();\r\n brand = input<FooterBrand>();\r\n copyright = input('');\r\n socialNetworks = input<readonly SocialNetwork[]>([]);\r\n}\r\n","<!-- https://colorlib.com/wp/template/bootstrap-footer-19/ -->\r\n<footer [class]=\"styleClass()\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-md-6 col-lg-3 mb-md-0 mb-4\">\r\n <h2 class=\"footer-heading d-flex\">\r\n <span class=\"icon d-flex align-items-center justify-content-center\"><i class=\"ion-logo-ionic\"></i></span>\r\n About\r\n </h2>\r\n <div class=\"block-23 mb-3\">\r\n <ul>\r\n <li><span class=\"icon ion-ios-pin\"></span><span class=\"text\">203 Fake St. Mountain View, San\r\n Francisco, California, USA</span></li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-call\"></span><span class=\"text\">+2 392 3929 210</span></a>\r\n </li>\r\n <li><a href=\"#\"><span class=\"icon ion-ios-send\"></span><span\r\n class=\"text\">support&#64;yourdomain.com</span></a></li>\r\n </ul>\r\n </div>\r\n\r\n <form action=\"#\" class=\"subscribe-form\">\r\n <div class=\"input-group d-flex\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Enter email address\">\r\n <button type=\"submit\" class=\"btn btn-info\">\r\n <span class=\"sr-only\">Submit</span>\r\n <i class=\"fa fa-paper-plane\"></i></button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div> -->\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <div class=\"d-flex justify-content-between align-items-center py-3 my-4 border-top\">\r\n @if (brand() || copyright()) {\r\n <div class=\"d-flex align-items-center\">\r\n @if (brand()?.href) {\r\n <a [href]=\"brand()?.href\" class=\"px-2 text-muted text-decoration-none\">\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n </a>\r\n } @else {\r\n <img [src]=\"brand()?.src\" [alt]=\"brand()?.alt || 'logo'\" [class]=\"brand()?.styleClass\"\r\n class=\"brand-logo d-inline-block align-text-top\" />\r\n }\r\n\r\n @if (copyright()) {\r\n <span class=\"text-muted\">{{ copyright() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (socialNetworks().length) {\r\n <ul class=\"nav\">\r\n @for (social of socialNetworks(); track social.href) {\r\n <li class=\"px-2\">\r\n <a class=\"text-muted social-icon\" [href]=\"social.href\" [ngbTooltip]=\"social.tooltip\" target=\"_blank\"\r\n rel=\"noopener noreferrer\">\r\n <em [class]=\"social.iconClass\"></em>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</footer>","/*\r\n * Public API Surface of ys-footer\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-footer/ys-footer';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAWa,QAAQ,CAAA;AACnB,IAAA,UAAU,GAAG,KAAK;8FAAU;AAC5B,IAAA,KAAK,GAAG,KAAK;yFAAe;IAC5B,SAAS,GAAG,KAAK,CAAC,EAAE;kFAAC;IACrB,cAAc,GAAG,KAAK,CAA2B,EAAE;uFAAC;uGAJzC,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXrB,yxFAkES,EAAA,MAAA,EAAA,CAAA,mIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5DG,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA;;2FAKT,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,WACZ,CAAC,UAAU,CAAC,EAAA,eAAA,EAEJ,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,yxFAAA,EAAA,MAAA,EAAA,CAAA,mIAAA,CAAA,EAAA;;;AERhD;;AAEG;;ACFH;;AAEG;;;;"}
@@ -1,19 +1,25 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, Component } from '@angular/core';
2
+ import { input, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
 
4
4
  class YsLoadingMask {
5
- loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
6
- message = input('Loading ...', ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
7
- backgroundStyleClass = input(...(ngDevMode ? [undefined, { debugName: "backgroundStyleClass" }] : /* istanbul ignore next */ []));
8
- spinnerStyleClass = input(...(ngDevMode ? [undefined, { debugName: "spinnerStyleClass" }] : /* istanbul ignore next */ []));
9
- messageStyleClass = input(...(ngDevMode ? [undefined, { debugName: "messageStyleClass" }] : /* istanbul ignore next */ []));
10
- fullScreen = input(false, ...(ngDevMode ? [{ debugName: "fullScreen" }] : /* istanbul ignore next */ []));
11
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsLoadingMask, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: YsLoadingMask, isStandalone: true, selector: "ys-loading-mask", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, backgroundStyleClass: { classPropertyName: "backgroundStyleClass", publicName: "backgroundStyleClass", isSignal: true, isRequired: false, transformFunction: null }, spinnerStyleClass: { classPropertyName: "spinnerStyleClass", publicName: "spinnerStyleClass", isSignal: true, isRequired: false, transformFunction: null }, messageStyleClass: { classPropertyName: "messageStyleClass", publicName: "messageStyleClass", isSignal: true, isRequired: false, transformFunction: null }, fullScreen: { classPropertyName: "fullScreen", publicName: "fullScreen", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}", styles: ["@keyframes fade-in{0%{opacity:0}to{opacity:1}}.ys-loading-wrapper{inset:0;z-index:1001;animation:fade-in .15s ease}.ys-loading-wrapper .ys-loading-mask{inset:0;opacity:.3}.ys-loading-wrapper .ys-loading-content .loading-spinner{width:3rem;height:3rem}\n"] });
5
+ loading = input(false, /* @ts-ignore */
6
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
7
+ message = input('Loading ...', /* @ts-ignore */
8
+ ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
9
+ backgroundStyleClass = input(/* @ts-ignore */
10
+ ...(ngDevMode ? [undefined, { debugName: "backgroundStyleClass" }] : /* istanbul ignore next */ []));
11
+ spinnerStyleClass = input(/* @ts-ignore */
12
+ ...(ngDevMode ? [undefined, { debugName: "spinnerStyleClass" }] : /* istanbul ignore next */ []));
13
+ messageStyleClass = input(/* @ts-ignore */
14
+ ...(ngDevMode ? [undefined, { debugName: "messageStyleClass" }] : /* istanbul ignore next */ []));
15
+ fullScreen = input(false, /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "fullScreen" }] : /* istanbul ignore next */ []));
17
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsLoadingMask, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsLoadingMask, isStandalone: true, selector: "ys-loading-mask", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, backgroundStyleClass: { classPropertyName: "backgroundStyleClass", publicName: "backgroundStyleClass", isSignal: true, isRequired: false, transformFunction: null }, spinnerStyleClass: { classPropertyName: "spinnerStyleClass", publicName: "spinnerStyleClass", isSignal: true, isRequired: false, transformFunction: null }, messageStyleClass: { classPropertyName: "messageStyleClass", publicName: "messageStyleClass", isSignal: true, isRequired: false, transformFunction: null }, fullScreen: { classPropertyName: "fullScreen", publicName: "fullScreen", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}", styles: ["@keyframes fade-in{0%{opacity:0}to{opacity:1}}.ys-loading-wrapper{inset:0;z-index:1001;animation:fade-in .15s ease}.ys-loading-wrapper .ys-loading-mask{inset:0;opacity:.3}.ys-loading-wrapper .ys-loading-content .loading-spinner{width:3rem;height:3rem}\n"], changeDetection: i0.ChangeDetectionStrategy.Eager });
13
19
  }
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: YsLoadingMask, decorators: [{
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsLoadingMask, decorators: [{
15
21
  type: Component,
16
- args: [{ selector: 'ys-loading-mask', imports: [], template: "@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}", styles: ["@keyframes fade-in{0%{opacity:0}to{opacity:1}}.ys-loading-wrapper{inset:0;z-index:1001;animation:fade-in .15s ease}.ys-loading-wrapper .ys-loading-mask{inset:0;opacity:.3}.ys-loading-wrapper .ys-loading-content .loading-spinner{width:3rem;height:3rem}\n"] }]
22
+ args: [{ selector: 'ys-loading-mask', imports: [], changeDetection: ChangeDetectionStrategy.Eager, template: "@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}", styles: ["@keyframes fade-in{0%{opacity:0}to{opacity:1}}.ys-loading-wrapper{inset:0;z-index:1001;animation:fade-in .15s ease}.ys-loading-wrapper .ys-loading-mask{inset:0;opacity:.3}.ys-loading-wrapper .ys-loading-content .loading-spinner{width:3rem;height:3rem}\n"] }]
17
23
  }], propDecorators: { loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], backgroundStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundStyleClass", required: false }] }], spinnerStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "spinnerStyleClass", required: false }] }], messageStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "messageStyleClass", required: false }] }], fullScreen: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullScreen", required: false }] }] } });
18
24
 
19
25
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-loading.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/loading/src/ys-loading-mask/ys-loading-mask.ts","../../../../projects/yoozsoft/yoozsoft-ng/loading/src/ys-loading-mask/ys-loading-mask.html","../../../../projects/yoozsoft/yoozsoft-ng/loading/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/loading/yoozsoft-yoozsoft-ng-loading.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\n\n@Component({\n selector: 'ys-loading-mask',\n imports: [],\n templateUrl: './ys-loading-mask.html',\n styleUrl: './ys-loading-mask.scss',\n})\nexport class YsLoadingMask {\n\n loading = input<boolean>(false);\n message = input<string>('Loading ...');\n backgroundStyleClass = input<string>();\n spinnerStyleClass = input<string>();\n messageStyleClass = input<string>();\n fullScreen = input(false);\n\n}\n","@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}","/*\r\n * Public API Surface of ys-loading-mask\r\n */\r\n\r\nexport * from './src/ys-loading-mask/ys-loading-mask';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAQa,aAAa,CAAA;AAExB,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,OAAO,GAAG,KAAK,CAAS,aAAa,8EAAC;IACtC,oBAAoB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACtC,iBAAiB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACnC,iBAAiB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACnC,IAAA,UAAU,GAAG,KAAK,CAAC,KAAK,iFAAC;wGAPd,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,u7BCR1B,uuBAgBC,EAAA,MAAA,EAAA,CAAA,+PAAA,CAAA,EAAA,CAAA;;4FDRY,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,WAClB,EAAE,EAAA,QAAA,EAAA,uuBAAA,EAAA,MAAA,EAAA,CAAA,+PAAA,CAAA,EAAA;;;AEJb;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-loading.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/loading/src/ys-loading-mask/ys-loading-mask.ts","../../../../projects/yoozsoft/yoozsoft-ng/loading/src/ys-loading-mask/ys-loading-mask.html","../../../../projects/yoozsoft/yoozsoft-ng/loading/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/loading/yoozsoft-yoozsoft-ng-loading.ts"],"sourcesContent":["import { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ys-loading-mask',\r\n imports: [],\r\n templateUrl: './ys-loading-mask.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './ys-loading-mask.scss',\r\n})\r\nexport class YsLoadingMask {\r\n loading = input<boolean>(false);\r\n message = input<string>('Loading ...');\r\n backgroundStyleClass = input<string>();\r\n spinnerStyleClass = input<string>();\r\n messageStyleClass = input<string>();\r\n fullScreen = input(false);\r\n}\r\n","@if (loading()) {\n<div class=\"ys-loading-wrapper d-flex flex-column align-items-center justify-content-center\"\n [class.position-fixed]=\"fullScreen()\" [class.position-absolute]=\"!fullScreen()\">\n <div class=\"ys-loading-mask bg-secondary position-absolute\" [class]=\"backgroundStyleClass()\">\n </div>\n <div class=\"ys-loading-content d-flex flex-column align-items-center justify-content-center\">\n <div class=\"loading-spinner spinner-border text-primary\" [class]=\"spinnerStyleClass()\" role=\"status\"></div>\n\n @if (message()) {\n <strong class=\"badge text-primary mt-4 p-3\" [class]=\"messageStyleClass()\">\n {{message()}}\n </strong>\n }\n\n </div>\n</div>\n}","/*\r\n * Public API Surface of ys-loading-mask\r\n */\r\n\r\nexport * from './src/ys-loading-mask/ys-loading-mask';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MASa,aAAa,CAAA;IACxB,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;IAC/B,OAAO,GAAG,KAAK,CAAS,aAAa;gFAAC;AACtC,IAAA,oBAAoB,GAAG,KAAK;wGAAU;AACtC,IAAA,iBAAiB,GAAG,KAAK;qGAAU;AACnC,IAAA,iBAAiB,GAAG,KAAK;qGAAU;IACnC,UAAU,GAAG,KAAK,CAAC,KAAK;mFAAC;uGANd,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,u7BCT1B,uuBAgBC,EAAA,MAAA,EAAA,CAAA,+PAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA;;2FDPY,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAClB,EAAE,EAAA,eAAA,EAEM,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,uuBAAA,EAAA,MAAA,EAAA,CAAA,+PAAA,CAAA,EAAA;;;AENhD;;AAEG;;ACFH;;AAEG;;;;"}