@mintplayer/ng-bootstrap 21.12.11 → 21.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs +3 -2
- package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs +90 -38
- package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs +235 -0
- package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs +48 -31
- package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs.map +1 -1
- package/package.json +5 -1
- package/types/mintplayer-ng-bootstrap-datatable.d.ts +1 -0
- package/types/mintplayer-ng-bootstrap-pagination.d.ts +2 -6
- package/types/mintplayer-ng-bootstrap-priority-nav.d.ts +61 -0
- package/types/mintplayer-ng-bootstrap-resizable.d.ts +5 -1
|
@@ -8,6 +8,7 @@ import { BsPaginationComponent } from '@mintplayer/ng-bootstrap/pagination';
|
|
|
8
8
|
class DatatableSettings {
|
|
9
9
|
constructor(data) {
|
|
10
10
|
this.sortColumns = [];
|
|
11
|
+
this.pageNumberOfBoxes = 11;
|
|
11
12
|
Object.assign(this, data);
|
|
12
13
|
if (data && data.perPage) {
|
|
13
14
|
this.perPage = data.perPage;
|
|
@@ -139,11 +140,11 @@ class BsDatatableComponent extends DatatableSortBase {
|
|
|
139
140
|
}));
|
|
140
141
|
}
|
|
141
142
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsDatatableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
142
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsDatatableComponent, isStandalone: true, selector: "bs-datatable", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange" }, usesInheritance: true, ngImport: i0, template: "<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}tfoot>tr>td{border-bottom:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BsGridComponent, selector: "bs-grid", inputs: ["stopFullWidthAt"] }, { kind: "directive", type: BsGridRowDirective, selector: "[bsRow]" }, { kind: "directive", type: BsGridColumnDirective, selector: "[xxs],[xs],[sm],[md],[lg],[xl],[xxl]", inputs: ["xxs", "xs", "sm", "md", "lg", "xl", "xxl"] }, { kind: "component", type: BsTableComponent, selector: "bs-table", inputs: ["isResponsive", "striped", "hover", "border"] }, { kind: "component", type: BsPaginationComponent, selector: "bs-pagination", inputs: ["pageNumbers", "selectedPageNumber", "numberOfBoxes", "showArrows", "size"], outputs: ["selectedPageNumberChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
143
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsDatatableComponent, isStandalone: true, selector: "bs-datatable", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange" }, usesInheritance: true, ngImport: i0, template: "<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}tfoot>tr>td{border-bottom:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BsGridComponent, selector: "bs-grid", inputs: ["stopFullWidthAt"] }, { kind: "directive", type: BsGridRowDirective, selector: "[bsRow]" }, { kind: "directive", type: BsGridColumnDirective, selector: "[xxs],[xs],[sm],[md],[lg],[xl],[xxl]", inputs: ["xxs", "xs", "sm", "md", "lg", "xl", "xxl"] }, { kind: "component", type: BsTableComponent, selector: "bs-table", inputs: ["isResponsive", "striped", "hover", "border"] }, { kind: "component", type: BsPaginationComponent, selector: "bs-pagination", inputs: ["pageNumbers", "selectedPageNumber", "numberOfBoxes", "showArrows", "size"], outputs: ["selectedPageNumberChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
143
144
|
}
|
|
144
145
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsDatatableComponent, decorators: [{
|
|
145
146
|
type: Component,
|
|
146
|
-
args: [{ selector: 'bs-datatable', imports: [NgTemplateOutlet, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsTableComponent, BsPaginationComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}tfoot>tr>td{border-bottom:none}\n"] }]
|
|
147
|
+
args: [{ selector: 'bs-datatable', imports: [NgTemplateOutlet, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsTableComponent, BsPaginationComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}tfoot>tr>td{border-bottom:none}\n"] }]
|
|
147
148
|
}], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }, { type: i0.Output, args: ["dataChange"] }] } });
|
|
148
149
|
|
|
149
150
|
class BsRowTemplateDirective {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-bootstrap-datatable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-settings.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-column/datatable-column.directive.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-sort-base.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable/datatable.component.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable/datatable.component.html","../../../../libs/mintplayer-ng-bootstrap/datatable/src/row-template/row-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/mintplayer-ng-bootstrap-datatable.ts"],"sourcesContent":["import { PaginationRequest, SortColumn } from \"@mintplayer/pagination\";\n\nexport class DatatableSettings {\n constructor(data?: Partial<DatatableSettings>) {\n Object.assign(this, data);\n\n if (data && data.perPage) {\n this.perPage = data.perPage;\n } else {\n // Set default value\n this.perPage = {\n values: [10, 20, 50],\n selected: 20\n };\n }\n\n if (data && data.page) {\n this.page = data.page;\n } else {\n // Set default value\n this.page = {\n values: [1],\n selected: 1\n };\n }\n }\n\n public sortColumns: SortColumn[] = [];\n public perPage: { values: number[], selected: number };\n public page: { values: number[], selected: number };\n\n public toPagination() {\n const res = <PaginationRequest>{\n sortColumns: this.sortColumns,\n perPage: this.perPage.selected,\n page: this.page.selected\n };\n return res;\n }\n}","import { Directive, inject, Input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[bsDatatableColumn]',\n})\nexport class BsDatatableColumnDirective {\n templateRef = inject(TemplateRef);\n @Input('bsDatatableColumn') public name = '';\n @Input('bsDatatableColumnSortable') public sortable = true;\n\n}","import { contentChildren, Directive, model } from '@angular/core';\nimport { DatatableSettings } from './datatable-settings';\nimport { BsDatatableColumnDirective } from './datatable-column/datatable-column.directive';\n\n@Directive()\nexport abstract class DatatableSortBase {\n\n readonly columns = contentChildren(BsDatatableColumnDirective);\n\n get columnsArray() {\n return this.columns();\n }\n\n settings = model<DatatableSettings>(new DatatableSettings());\n\n getSortIndex(columnName: string): number {\n return this.settings().sortColumns.findIndex(c => c.property === columnName);\n }\n\n getSortDirection(columnName: string): 'ascending' | 'descending' | null {\n const col = this.settings().sortColumns.find(c => c.property === columnName);\n return col?.direction ?? null;\n }\n\n onHeaderMouseDown(event: MouseEvent) {\n if (event.shiftKey) {\n event.preventDefault();\n }\n }\n\n columnHeaderClicked(column: BsDatatableColumnDirective, event: MouseEvent) {\n if (!column.sortable) return;\n\n const currentSettings = this.settings();\n let sortColumns = currentSettings.sortColumns;\n\n if (event.shiftKey) {\n // Multi-column: add/toggle/remove\n const existingIndex = sortColumns.findIndex(c => c.property === column.name);\n if (existingIndex === -1) {\n sortColumns = [...sortColumns, { property: column.name, direction: 'ascending' as const }];\n } else if (sortColumns[existingIndex].direction === 'ascending') {\n sortColumns = sortColumns.map((c, i) =>\n i === existingIndex ? { ...c, direction: 'descending' as const } : c\n );\n } else {\n sortColumns = sortColumns.filter((_, i) => i !== existingIndex);\n }\n } else {\n // Single-column: replace all\n const existingSingle = sortColumns.length === 1 && sortColumns[0].property === column.name;\n sortColumns = [{\n property: column.name,\n direction: existingSingle && sortColumns[0].direction === 'ascending' ? 'descending' as const : 'ascending' as const\n }];\n }\n\n this.settings.set(new DatatableSettings({ ...currentSettings, sortColumns }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, model, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport { BsPaginationComponent } from '@mintplayer/ng-bootstrap/pagination';\nimport { DatatableSettings } from '../datatable-settings';\nimport { DatatableSortBase } from '../datatable-sort-base';\nimport { BsRowTemplateContext } from '../row-template/row-template.directive';\n\n\n@Component({\n selector: 'bs-datatable',\n templateUrl: './datatable.component.html',\n styleUrls: ['./datatable.component.scss'],\n imports: [NgTemplateOutlet, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsTableComponent, BsPaginationComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsDatatableComponent<TData> extends DatatableSortBase {\n\n numberOfColumns = computed(() => this.columns().length);\n\n data = model<PaginationResponse<TData> | undefined>(undefined);\n\n rowTemplate?: TemplateRef<BsRowTemplateContext<TData>>;\n\n onPerPageChange(perPage: number) {\n const currentSettings = this.settings();\n this.settings.set(new DatatableSettings({\n ...currentSettings,\n perPage: { ...currentSettings.perPage, selected: perPage },\n page: { ...currentSettings.page, selected: 1 },\n }));\n }\n\n onPageChange(page: number) {\n const currentSettings = this.settings();\n this.settings.set(new DatatableSettings({\n ...currentSettings,\n page: { ...currentSettings.page, selected: page },\n }));\n }\n\n}\n","<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n","import { Directive, effect, inject, input, TemplateRef } from '@angular/core';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { BsDatatableComponent } from '../datatable/datatable.component';\n\n@Directive({\n selector: '[bsRowTemplate]',\n})\nexport class BsRowTemplateDirective<TData> {\n\n private datatableComponent = inject<BsDatatableComponent<TData>>(BsDatatableComponent);\n private templateRef = inject<TemplateRef<BsRowTemplateContext<TData>>>(TemplateRef);\n\n constructor() {\n this.datatableComponent.rowTemplate = this.templateRef;\n\n effect(() => {\n const value = this.bsRowTemplateOf();\n this.datatableComponent.data.set(value);\n });\n }\n\n readonly bsRowTemplateOf = input<PaginationResponse<TData> | undefined>(undefined);\n\n public static ngTemplateContextGuard<TData>(\n dir: BsRowTemplateDirective<TData>,\n ctx: any\n ): ctx is BsRowTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>> {\n return true;\n }\n}\n\nexport class BsRowTemplateContext<TData = unknown> {\n public $implicit: TData = null!;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-datatable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-settings.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-column/datatable-column.directive.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-sort-base.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable/datatable.component.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable/datatable.component.html","../../../../libs/mintplayer-ng-bootstrap/datatable/src/row-template/row-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/mintplayer-ng-bootstrap-datatable.ts"],"sourcesContent":["import { PaginationRequest, SortColumn } from \"@mintplayer/pagination\";\n\nexport class DatatableSettings {\n constructor(data?: Partial<DatatableSettings>) {\n Object.assign(this, data);\n\n if (data && data.perPage) {\n this.perPage = data.perPage;\n } else {\n // Set default value\n this.perPage = {\n values: [10, 20, 50],\n selected: 20\n };\n }\n\n if (data && data.page) {\n this.page = data.page;\n } else {\n // Set default value\n this.page = {\n values: [1],\n selected: 1\n };\n }\n }\n\n public sortColumns: SortColumn[] = [];\n public perPage: { values: number[], selected: number };\n public page: { values: number[], selected: number };\n public pageNumberOfBoxes: number = 11;\n\n public toPagination() {\n const res = <PaginationRequest>{\n sortColumns: this.sortColumns,\n perPage: this.perPage.selected,\n page: this.page.selected\n };\n return res;\n }\n}","import { Directive, inject, Input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[bsDatatableColumn]',\n})\nexport class BsDatatableColumnDirective {\n templateRef = inject(TemplateRef);\n @Input('bsDatatableColumn') public name = '';\n @Input('bsDatatableColumnSortable') public sortable = true;\n\n}","import { contentChildren, Directive, model } from '@angular/core';\nimport { DatatableSettings } from './datatable-settings';\nimport { BsDatatableColumnDirective } from './datatable-column/datatable-column.directive';\n\n@Directive()\nexport abstract class DatatableSortBase {\n\n readonly columns = contentChildren(BsDatatableColumnDirective);\n\n get columnsArray() {\n return this.columns();\n }\n\n settings = model<DatatableSettings>(new DatatableSettings());\n\n getSortIndex(columnName: string): number {\n return this.settings().sortColumns.findIndex(c => c.property === columnName);\n }\n\n getSortDirection(columnName: string): 'ascending' | 'descending' | null {\n const col = this.settings().sortColumns.find(c => c.property === columnName);\n return col?.direction ?? null;\n }\n\n onHeaderMouseDown(event: MouseEvent) {\n if (event.shiftKey) {\n event.preventDefault();\n }\n }\n\n columnHeaderClicked(column: BsDatatableColumnDirective, event: MouseEvent) {\n if (!column.sortable) return;\n\n const currentSettings = this.settings();\n let sortColumns = currentSettings.sortColumns;\n\n if (event.shiftKey) {\n // Multi-column: add/toggle/remove\n const existingIndex = sortColumns.findIndex(c => c.property === column.name);\n if (existingIndex === -1) {\n sortColumns = [...sortColumns, { property: column.name, direction: 'ascending' as const }];\n } else if (sortColumns[existingIndex].direction === 'ascending') {\n sortColumns = sortColumns.map((c, i) =>\n i === existingIndex ? { ...c, direction: 'descending' as const } : c\n );\n } else {\n sortColumns = sortColumns.filter((_, i) => i !== existingIndex);\n }\n } else {\n // Single-column: replace all\n const existingSingle = sortColumns.length === 1 && sortColumns[0].property === column.name;\n sortColumns = [{\n property: column.name,\n direction: existingSingle && sortColumns[0].direction === 'ascending' ? 'descending' as const : 'ascending' as const\n }];\n }\n\n this.settings.set(new DatatableSettings({ ...currentSettings, sortColumns }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, model, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport { BsPaginationComponent } from '@mintplayer/ng-bootstrap/pagination';\nimport { DatatableSettings } from '../datatable-settings';\nimport { DatatableSortBase } from '../datatable-sort-base';\nimport { BsRowTemplateContext } from '../row-template/row-template.directive';\n\n\n@Component({\n selector: 'bs-datatable',\n templateUrl: './datatable.component.html',\n styleUrls: ['./datatable.component.scss'],\n imports: [NgTemplateOutlet, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsTableComponent, BsPaginationComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsDatatableComponent<TData> extends DatatableSortBase {\n\n numberOfColumns = computed(() => this.columns().length);\n\n data = model<PaginationResponse<TData> | undefined>(undefined);\n\n rowTemplate?: TemplateRef<BsRowTemplateContext<TData>>;\n\n onPerPageChange(perPage: number) {\n const currentSettings = this.settings();\n this.settings.set(new DatatableSettings({\n ...currentSettings,\n perPage: { ...currentSettings.perPage, selected: perPage },\n page: { ...currentSettings.page, selected: 1 },\n }));\n }\n\n onPageChange(page: number) {\n const currentSettings = this.settings();\n this.settings.set(new DatatableSettings({\n ...currentSettings,\n page: { ...currentSettings.page, selected: page },\n }));\n }\n\n}\n","<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n","import { Directive, effect, inject, input, TemplateRef } from '@angular/core';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { BsDatatableComponent } from '../datatable/datatable.component';\n\n@Directive({\n selector: '[bsRowTemplate]',\n})\nexport class BsRowTemplateDirective<TData> {\n\n private datatableComponent = inject<BsDatatableComponent<TData>>(BsDatatableComponent);\n private templateRef = inject<TemplateRef<BsRowTemplateContext<TData>>>(TemplateRef);\n\n constructor() {\n this.datatableComponent.rowTemplate = this.templateRef;\n\n effect(() => {\n const value = this.bsRowTemplateOf();\n this.datatableComponent.data.set(value);\n });\n }\n\n readonly bsRowTemplateOf = input<PaginationResponse<TData> | undefined>(undefined);\n\n public static ngTemplateContextGuard<TData>(\n dir: BsRowTemplateDirective<TData>,\n ctx: any\n ): ctx is BsRowTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>> {\n return true;\n }\n}\n\nexport class BsRowTemplateContext<TData = unknown> {\n public $implicit: TData = null!;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -31,47 +31,97 @@ class BsPaginationComponent {
|
|
|
31
31
|
return Math.min(numberOfBoxes - 2, pageNumbers.length);
|
|
32
32
|
}
|
|
33
33
|
}, ...(ngDevMode ? [{ debugName: "visibleNumberOfNumberBoxes" }] : []));
|
|
34
|
-
/**
|
|
35
|
-
this.isLeftOverflow = computed(() => {
|
|
36
|
-
const pageNumbers = this.pageNumbers();
|
|
37
|
-
const selectedPageNumber = this.selectedPageNumber();
|
|
38
|
-
const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();
|
|
39
|
-
const index = pageNumbers.indexOf(selectedPageNumber);
|
|
40
|
-
const middle = Math.floor(visibleNumberOfNumberBoxes / 2);
|
|
41
|
-
return index > middle;
|
|
42
|
-
}, ...(ngDevMode ? [{ debugName: "isLeftOverflow" }] : []));
|
|
43
|
-
/** Indicates whether there are too many numbers to the right-hand side of the current page. */
|
|
44
|
-
this.isRightOverflow = computed(() => {
|
|
45
|
-
const pageNumbers = this.pageNumbers();
|
|
46
|
-
const selectedPageNumber = this.selectedPageNumber();
|
|
47
|
-
const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();
|
|
48
|
-
const index = pageNumbers.indexOf(selectedPageNumber);
|
|
49
|
-
const middle = Math.floor(visibleNumberOfNumberBoxes / 2);
|
|
50
|
-
return (pageNumbers.length - index) < middle;
|
|
51
|
-
}, ...(ngDevMode ? [{ debugName: "isRightOverflow" }] : []));
|
|
52
|
-
/** Page numbers to be displayed to the user. */
|
|
34
|
+
/** Page numbers to be displayed to the user, with ellipsis entries where pages are omitted. */
|
|
53
35
|
this.shownPageNumbers = computed(() => {
|
|
54
36
|
const pageNumbers = this.pageNumbers();
|
|
55
37
|
const selectedPageNumber = this.selectedPageNumber();
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
38
|
+
const budget = this.visibleNumberOfNumberBoxes();
|
|
39
|
+
// No truncation needed
|
|
40
|
+
if (budget <= 0 || budget >= pageNumbers.length) {
|
|
41
|
+
return pageNumbers.map((p) => ({
|
|
42
|
+
page: p,
|
|
43
|
+
selected: p === selectedPageNumber,
|
|
44
|
+
}));
|
|
61
45
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
46
|
+
const selectedIndex = Math.max(0, Math.min(pageNumbers.indexOf(selectedPageNumber), pageNumbers.length - 1));
|
|
47
|
+
const lastIndex = pageNumbers.length - 1;
|
|
48
|
+
// Centers a window of the given size on selectedIndex, clamped to valid range
|
|
49
|
+
const calcWindow = (size) => {
|
|
50
|
+
const half = Math.floor((size - 1) / 2);
|
|
51
|
+
let ws = selectedIndex - half;
|
|
52
|
+
let we = ws + size - 1;
|
|
53
|
+
if (ws < 0) {
|
|
54
|
+
we = Math.min(lastIndex, we - ws);
|
|
55
|
+
ws = 0;
|
|
56
|
+
}
|
|
57
|
+
if (we > lastIndex) {
|
|
58
|
+
ws = Math.max(0, ws - (we - lastIndex));
|
|
59
|
+
we = lastIndex;
|
|
60
|
+
}
|
|
61
|
+
return [ws, we];
|
|
62
|
+
};
|
|
63
|
+
// For small budgets (< 5), just show a centered window — not enough room for anchors + ellipsis
|
|
64
|
+
if (budget < 5) {
|
|
65
|
+
const [ws, we] = calcWindow(budget);
|
|
66
|
+
return Array.from({ length: we - ws + 1 }, (_, i) => ({
|
|
67
|
+
page: pageNumbers[ws + i],
|
|
68
|
+
selected: pageNumbers[ws + i] === selectedPageNumber,
|
|
69
|
+
}));
|
|
65
70
|
}
|
|
66
|
-
|
|
67
|
-
|
|
71
|
+
// For budget >= 5: reserve slots for first/last anchors and ellipsis, then fill the inner window.
|
|
72
|
+
// Overhead per side: 0 (window reaches edge), 1 (window is 1 away from edge), or 2 (anchor + ellipsis/bridge).
|
|
73
|
+
// Iterate until stable — converges in 2–4 iterations.
|
|
74
|
+
let leftOverhead = 2;
|
|
75
|
+
let rightOverhead = 2;
|
|
76
|
+
let windowStart = 0;
|
|
77
|
+
let windowEnd = 0;
|
|
78
|
+
for (let iteration = 0; iteration < 4; iteration++) {
|
|
79
|
+
const innerBudget = Math.max(1, budget - leftOverhead - rightOverhead);
|
|
80
|
+
[windowStart, windowEnd] = calcWindow(innerBudget);
|
|
81
|
+
const newLeftOverhead = windowStart === 0 ? 0 : windowStart === 1 ? 1 : 2;
|
|
82
|
+
const newRightOverhead = windowEnd === lastIndex ? 0 : windowEnd === lastIndex - 1 ? 1 : 2;
|
|
83
|
+
if (newLeftOverhead === leftOverhead && newRightOverhead === rightOverhead)
|
|
84
|
+
break;
|
|
85
|
+
leftOverhead = newLeftOverhead;
|
|
86
|
+
rightOverhead = newRightOverhead;
|
|
87
|
+
}
|
|
88
|
+
// Build result
|
|
89
|
+
const result = [];
|
|
90
|
+
const pushPage = (index) => {
|
|
91
|
+
result.push({
|
|
92
|
+
page: pageNumbers[index],
|
|
93
|
+
selected: pageNumbers[index] === selectedPageNumber,
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
// Left anchor or bridge
|
|
97
|
+
if (windowStart >= 3) {
|
|
98
|
+
pushPage(0);
|
|
99
|
+
result.push({ page: '...', selected: false });
|
|
100
|
+
}
|
|
101
|
+
else if (windowStart === 2) {
|
|
102
|
+
pushPage(0);
|
|
103
|
+
pushPage(1);
|
|
68
104
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
105
|
+
else if (windowStart === 1) {
|
|
106
|
+
pushPage(0);
|
|
107
|
+
}
|
|
108
|
+
// Inner window
|
|
109
|
+
for (let i = windowStart; i <= windowEnd; i++) {
|
|
110
|
+
pushPage(i);
|
|
111
|
+
}
|
|
112
|
+
// Right bridge or anchor
|
|
113
|
+
if (windowEnd <= lastIndex - 3) {
|
|
114
|
+
result.push({ page: '...', selected: false });
|
|
115
|
+
pushPage(lastIndex);
|
|
116
|
+
}
|
|
117
|
+
else if (windowEnd === lastIndex - 2) {
|
|
118
|
+
pushPage(lastIndex - 1);
|
|
119
|
+
pushPage(lastIndex);
|
|
120
|
+
}
|
|
121
|
+
else if (windowEnd === lastIndex - 1) {
|
|
122
|
+
pushPage(lastIndex);
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
75
125
|
}, ...(ngDevMode ? [{ debugName: "shownPageNumbers" }] : []));
|
|
76
126
|
/** Indicates if first value is selected. */
|
|
77
127
|
this.isFirstPage = computed(() => {
|
|
@@ -87,7 +137,9 @@ class BsPaginationComponent {
|
|
|
87
137
|
}, ...(ngDevMode ? [{ debugName: "isLastPage" }] : []));
|
|
88
138
|
}
|
|
89
139
|
onSelectPage(event, page) {
|
|
90
|
-
|
|
140
|
+
if (typeof page === 'number') {
|
|
141
|
+
this.selectedPageNumber.set(page);
|
|
142
|
+
}
|
|
91
143
|
return false;
|
|
92
144
|
}
|
|
93
145
|
onPrevious() {
|
|
@@ -119,11 +171,11 @@ class BsPaginationComponent {
|
|
|
119
171
|
return false;
|
|
120
172
|
}
|
|
121
173
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
122
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsPaginationComponent, isStandalone: true, selector: "bs-pagination", inputs: { pageNumbers: { classPropertyName: "pageNumbers", publicName: "pageNumbers", isSignal: true, isRequired: false, transformFunction: null }, selectedPageNumber: { classPropertyName: "selectedPageNumber", publicName: "selectedPageNumber", isSignal: true, isRequired: false, transformFunction: null }, numberOfBoxes: { classPropertyName: "numberOfBoxes", publicName: "numberOfBoxes", isSignal: true, isRequired: false, transformFunction: null }, showArrows: { classPropertyName: "showArrows", publicName: "showArrows", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedPageNumber: "selectedPageNumberChange" }, ngImport: i0, template: "<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">«</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track
|
|
174
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsPaginationComponent, isStandalone: true, selector: "bs-pagination", inputs: { pageNumbers: { classPropertyName: "pageNumbers", publicName: "pageNumbers", isSignal: true, isRequired: false, transformFunction: null }, selectedPageNumber: { classPropertyName: "selectedPageNumber", publicName: "selectedPageNumber", isSignal: true, isRequired: false, transformFunction: null }, numberOfBoxes: { classPropertyName: "numberOfBoxes", publicName: "numberOfBoxes", isSignal: true, isRequired: false, transformFunction: null }, showArrows: { classPropertyName: "showArrows", publicName: "showArrows", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedPageNumber: "selectedPageNumberChange" }, ngImport: i0, template: "<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">«</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track $index) {\n <li class=\"page-item\">\n @if (pageNumber.page === '...') {\n <a class=\"page-link disabled\" aria-disabled=\"true\">\n <span aria-hidden=\"true\">…</span>\n <span class=\"visually-hidden\">More pages</span>\n </a>\n } @else {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">»</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n", styles: [":host ::ng-deep .pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size: 1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}:host ::ng-deep .page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){:host ::ng-deep .page-link{transition:none}}:host ::ng-deep .page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}:host ::ng-deep .page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}:host ::ng-deep .page-link.active,.active>:host ::ng-deep .page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}:host ::ng-deep .page-link.disabled,.disabled>:host ::ng-deep .page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}:host ::ng-deep .page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}:host ::ng-deep .page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size: 1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}:host ::ng-deep .pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size: .875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}:host{display:inline-block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
123
175
|
}
|
|
124
176
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsPaginationComponent, decorators: [{
|
|
125
177
|
type: Component,
|
|
126
|
-
args: [{ selector: 'bs-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">«</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track
|
|
178
|
+
args: [{ selector: 'bs-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">«</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track $index) {\n <li class=\"page-item\">\n @if (pageNumber.page === '...') {\n <a class=\"page-link disabled\" aria-disabled=\"true\">\n <span aria-hidden=\"true\">…</span>\n <span class=\"visually-hidden\">More pages</span>\n </a>\n } @else {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">»</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n", styles: [":host ::ng-deep .pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size: 1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}:host ::ng-deep .page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){:host ::ng-deep .page-link{transition:none}}:host ::ng-deep .page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}:host ::ng-deep .page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}:host ::ng-deep .page-link.active,.active>:host ::ng-deep .page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}:host ::ng-deep .page-link.disabled,.disabled>:host ::ng-deep .page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}:host ::ng-deep .page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}:host ::ng-deep .page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size: 1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}:host ::ng-deep .pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size: .875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}:host{display:inline-block}\n"] }]
|
|
127
179
|
}], propDecorators: { pageNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageNumbers", required: false }] }], selectedPageNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedPageNumber", required: false }] }, { type: i0.Output, args: ["selectedPageNumberChange"] }], numberOfBoxes: [{ type: i0.Input, args: [{ isSignal: true, alias: "numberOfBoxes", required: false }] }], showArrows: [{ type: i0.Input, args: [{ isSignal: true, alias: "showArrows", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
|
|
128
180
|
|
|
129
181
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-bootstrap-pagination.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/pagination/src/component/pagination/pagination.component.ts","../../../../libs/mintplayer-ng-bootstrap/pagination/src/component/pagination/pagination.component.html","../../../../libs/mintplayer-ng-bootstrap/pagination/mintplayer-ng-bootstrap-pagination.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, model } from '@angular/core';\nimport { Size } from '@mintplayer/ng-bootstrap';\nimport { PageWithSelection } from '../../interfaces/page-with-selection';\n\n@Component({\n selector: 'bs-pagination',\n templateUrl: './pagination.component.html',\n styleUrls: ['./pagination.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsPaginationComponent {\n /** All page numbers. */\n pageNumbers = input<number[]>([]);\n /** Selected number. */\n selectedPageNumber = model<number>(1);\n /** Number of boxes. */\n numberOfBoxes = input<number>(0);\n /** Display previous/next arrows. */\n showArrows = input<boolean>(true);\n /** Page number size. */\n size = input<Size>('medium');\n\n /** The number of boxes (excluding arrows) that's being shown on the pagination component. */\n visibleNumberOfNumberBoxes = computed(() => {\n const numberOfBoxes = this.numberOfBoxes();\n const pageNumbers = this.pageNumbers();\n const showArrows = this.showArrows();\n if (numberOfBoxes <= 0) {\n return pageNumbers.length;\n } else if (!showArrows) {\n return Math.min(numberOfBoxes, pageNumbers.length);\n } else if (numberOfBoxes <= 2) {\n return Math.min(1, pageNumbers.length);\n } else {\n return Math.min(numberOfBoxes - 2, pageNumbers.length);\n }\n });\n\n /** Indicates whether there are too many numbers to the left-hand side of the current page. */\n isLeftOverflow = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();\n const index = pageNumbers.indexOf(selectedPageNumber);\n const middle = Math.floor(visibleNumberOfNumberBoxes / 2);\n return index > middle;\n });\n\n /** Indicates whether there are too many numbers to the right-hand side of the current page. */\n isRightOverflow = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();\n const index = pageNumbers.indexOf(selectedPageNumber);\n const middle = Math.floor(visibleNumberOfNumberBoxes / 2);\n return (pageNumbers.length - index) < middle;\n });\n\n /** Page numbers to be displayed to the user. */\n shownPageNumbers = computed<PageWithSelection[]>(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();\n\n let startIndex = 0;\n const half = Math.round((visibleNumberOfNumberBoxes - 1) / 2);\n if (pageNumbers.indexOf(selectedPageNumber) < half) {\n startIndex = 0;\n } else if (\n pageNumbers.indexOf(selectedPageNumber) >=\n pageNumbers.length - half\n ) {\n startIndex = pageNumbers.length - visibleNumberOfNumberBoxes;\n } else {\n startIndex = pageNumbers.indexOf(selectedPageNumber) - half;\n }\n\n return [...Array(visibleNumberOfNumberBoxes).keys()]\n .map((p) => p + startIndex)\n .map((p) => <PageWithSelection>{\n page: pageNumbers[p],\n selected: pageNumbers[p] === selectedPageNumber,\n });\n });\n\n /** Indicates if first value is selected. */\n isFirstPage = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n return pageNumbers.indexOf(selectedPageNumber) === 0;\n });\n\n /** Indicates if last value is selected. */\n isLastPage = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n return pageNumbers.indexOf(selectedPageNumber) === pageNumbers.length - 1;\n });\n\n onSelectPage(event: MouseEvent, page: number) {\n this.selectedPageNumber.set(page);\n return false;\n }\n\n onPrevious() {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const index = pageNumbers.indexOf(selectedPageNumber);\n if (index > 0) {\n const newValue = pageNumbers[index - 1];\n this.selectedPageNumber.set(newValue);\n } else {\n this.selectedPageNumber.set(pageNumbers[0]);\n }\n return false;\n }\n\n onNext() {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const index = pageNumbers.indexOf(selectedPageNumber);\n if (index < 0) {\n this.selectedPageNumber.set(pageNumbers[pageNumbers.length - 1]);\n } else if (index < pageNumbers.length - 1) {\n this.selectedPageNumber.set(pageNumbers[index + 1]);\n } else {\n this.selectedPageNumber.set(pageNumbers[pageNumbers.length - 1]);\n }\n return false;\n }\n}\n","<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">«</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track pageNumber.page) {\n <li class=\"page-item\">\n @if (pageNumber.page != '...') {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">»</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-pagination.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/pagination/src/component/pagination/pagination.component.ts","../../../../libs/mintplayer-ng-bootstrap/pagination/src/component/pagination/pagination.component.html","../../../../libs/mintplayer-ng-bootstrap/pagination/mintplayer-ng-bootstrap-pagination.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, model } from '@angular/core';\nimport { Size } from '@mintplayer/ng-bootstrap';\nimport { PageWithSelection } from '../../interfaces/page-with-selection';\nimport { PageNumberType } from '../../types/page-number.type';\n\n@Component({\n selector: 'bs-pagination',\n templateUrl: './pagination.component.html',\n styleUrls: ['./pagination.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsPaginationComponent {\n /** All page numbers. */\n pageNumbers = input<number[]>([]);\n /** Selected number. */\n selectedPageNumber = model<number>(1);\n /** Number of boxes. */\n numberOfBoxes = input<number>(0);\n /** Display previous/next arrows. */\n showArrows = input<boolean>(true);\n /** Page number size. */\n size = input<Size>('medium');\n\n /** The number of boxes (excluding arrows) that's being shown on the pagination component. */\n visibleNumberOfNumberBoxes = computed(() => {\n const numberOfBoxes = this.numberOfBoxes();\n const pageNumbers = this.pageNumbers();\n const showArrows = this.showArrows();\n if (numberOfBoxes <= 0) {\n return pageNumbers.length;\n } else if (!showArrows) {\n return Math.min(numberOfBoxes, pageNumbers.length);\n } else if (numberOfBoxes <= 2) {\n return Math.min(1, pageNumbers.length);\n } else {\n return Math.min(numberOfBoxes - 2, pageNumbers.length);\n }\n });\n\n /** Page numbers to be displayed to the user, with ellipsis entries where pages are omitted. */\n shownPageNumbers = computed<PageWithSelection[]>(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const budget = this.visibleNumberOfNumberBoxes();\n\n // No truncation needed\n if (budget <= 0 || budget >= pageNumbers.length) {\n return pageNumbers.map((p) => <PageWithSelection>{\n page: p,\n selected: p === selectedPageNumber,\n });\n }\n\n const selectedIndex = Math.max(0, Math.min(\n pageNumbers.indexOf(selectedPageNumber),\n pageNumbers.length - 1\n ));\n const lastIndex = pageNumbers.length - 1;\n\n // Centers a window of the given size on selectedIndex, clamped to valid range\n const calcWindow = (size: number): [number, number] => {\n const half = Math.floor((size - 1) / 2);\n let ws = selectedIndex - half;\n let we = ws + size - 1;\n if (ws < 0) { we = Math.min(lastIndex, we - ws); ws = 0; }\n if (we > lastIndex) { ws = Math.max(0, ws - (we - lastIndex)); we = lastIndex; }\n return [ws, we];\n };\n\n // For small budgets (< 5), just show a centered window — not enough room for anchors + ellipsis\n if (budget < 5) {\n const [ws, we] = calcWindow(budget);\n return Array.from({ length: we - ws + 1 }, (_, i) => <PageWithSelection>{\n page: pageNumbers[ws + i],\n selected: pageNumbers[ws + i] === selectedPageNumber,\n });\n }\n\n // For budget >= 5: reserve slots for first/last anchors and ellipsis, then fill the inner window.\n // Overhead per side: 0 (window reaches edge), 1 (window is 1 away from edge), or 2 (anchor + ellipsis/bridge).\n // Iterate until stable — converges in 2–4 iterations.\n let leftOverhead = 2;\n let rightOverhead = 2;\n let windowStart = 0;\n let windowEnd = 0;\n\n for (let iteration = 0; iteration < 4; iteration++) {\n const innerBudget = Math.max(1, budget - leftOverhead - rightOverhead);\n [windowStart, windowEnd] = calcWindow(innerBudget);\n\n const newLeftOverhead = windowStart === 0 ? 0 : windowStart === 1 ? 1 : 2;\n const newRightOverhead = windowEnd === lastIndex ? 0 : windowEnd === lastIndex - 1 ? 1 : 2;\n\n if (newLeftOverhead === leftOverhead && newRightOverhead === rightOverhead) break;\n leftOverhead = newLeftOverhead;\n rightOverhead = newRightOverhead;\n }\n\n // Build result\n const result: PageWithSelection[] = [];\n const pushPage = (index: number) => {\n result.push(<PageWithSelection>{\n page: pageNumbers[index],\n selected: pageNumbers[index] === selectedPageNumber,\n });\n };\n\n // Left anchor or bridge\n if (windowStart >= 3) {\n pushPage(0);\n result.push({ page: '...', selected: false });\n } else if (windowStart === 2) {\n pushPage(0);\n pushPage(1);\n } else if (windowStart === 1) {\n pushPage(0);\n }\n\n // Inner window\n for (let i = windowStart; i <= windowEnd; i++) {\n pushPage(i);\n }\n\n // Right bridge or anchor\n if (windowEnd <= lastIndex - 3) {\n result.push({ page: '...', selected: false });\n pushPage(lastIndex);\n } else if (windowEnd === lastIndex - 2) {\n pushPage(lastIndex - 1);\n pushPage(lastIndex);\n } else if (windowEnd === lastIndex - 1) {\n pushPage(lastIndex);\n }\n\n return result;\n });\n\n /** Indicates if first value is selected. */\n isFirstPage = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n return pageNumbers.indexOf(selectedPageNumber) === 0;\n });\n\n /** Indicates if last value is selected. */\n isLastPage = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n return pageNumbers.indexOf(selectedPageNumber) === pageNumbers.length - 1;\n });\n\n onSelectPage(event: MouseEvent, page: PageNumberType) {\n if (typeof page === 'number') {\n this.selectedPageNumber.set(page);\n }\n return false;\n }\n\n onPrevious() {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const index = pageNumbers.indexOf(selectedPageNumber);\n if (index > 0) {\n const newValue = pageNumbers[index - 1];\n this.selectedPageNumber.set(newValue);\n } else {\n this.selectedPageNumber.set(pageNumbers[0]);\n }\n return false;\n }\n\n onNext() {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const index = pageNumbers.indexOf(selectedPageNumber);\n if (index < 0) {\n this.selectedPageNumber.set(pageNumbers[pageNumbers.length - 1]);\n } else if (index < pageNumbers.length - 1) {\n this.selectedPageNumber.set(pageNumbers[index + 1]);\n } else {\n this.selectedPageNumber.set(pageNumbers[pageNumbers.length - 1]);\n }\n return false;\n }\n}\n","<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">«</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track $index) {\n <li class=\"page-item\">\n @if (pageNumber.page === '...') {\n <a class=\"page-link disabled\" aria-disabled=\"true\">\n <span aria-hidden=\"true\">…</span>\n <span class=\"visually-hidden\">More pages</span>\n </a>\n } @else {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">»</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { isPlatformServer, NgClass, NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, TemplateRef, input, Directive, PLATFORM_ID, ElementRef, output, contentChildren, viewChildren, viewChild, signal, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';
|
|
5
|
+
import { BsObserveSizeDirective } from '@mintplayer/ng-swiper/observe-size';
|
|
6
|
+
|
|
7
|
+
class BsPriorityNavItemDirective {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.templateRef = inject(TemplateRef);
|
|
10
|
+
this.priority = input(null, { ...(ngDevMode ? { debugName: "priority" } : {}), alias: 'bsPriorityNavItem' });
|
|
11
|
+
this.hideBelow = input(null, { ...(ngDevMode ? { debugName: "hideBelow" } : {}), alias: 'bsPriorityNavItemHideBelow' });
|
|
12
|
+
this.id = ++BsPriorityNavItemDirective.idCounter;
|
|
13
|
+
}
|
|
14
|
+
static { this.idCounter = 0; }
|
|
15
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsPriorityNavItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
16
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.6", type: BsPriorityNavItemDirective, isStandalone: true, selector: "[bsPriorityNavItem]", inputs: { priority: { classPropertyName: "priority", publicName: "bsPriorityNavItem", isSignal: true, isRequired: false, transformFunction: null }, hideBelow: { classPropertyName: "hideBelow", publicName: "bsPriorityNavItemHideBelow", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
17
|
+
}
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsPriorityNavItemDirective, decorators: [{
|
|
19
|
+
type: Directive,
|
|
20
|
+
args: [{
|
|
21
|
+
selector: '[bsPriorityNavItem]',
|
|
22
|
+
}]
|
|
23
|
+
}], propDecorators: { priority: [{ type: i0.Input, args: [{ isSignal: true, alias: "bsPriorityNavItem", required: false }] }], hideBelow: [{ type: i0.Input, args: [{ isSignal: true, alias: "bsPriorityNavItemHideBelow", required: false }] }] } });
|
|
24
|
+
|
|
25
|
+
class BsPriorityNavComponent {
|
|
26
|
+
static { this.counter = 0; }
|
|
27
|
+
constructor() {
|
|
28
|
+
this.platformId = inject(PLATFORM_ID);
|
|
29
|
+
this.element = inject(ElementRef);
|
|
30
|
+
this.isServerSide = isPlatformServer(this.platformId);
|
|
31
|
+
this.uid = `pn-${++BsPriorityNavComponent.counter}`;
|
|
32
|
+
// Inputs
|
|
33
|
+
this.moreLabel = input('More', ...(ngDevMode ? [{ debugName: "moreLabel" }] : []));
|
|
34
|
+
this.moreLabelTemplate = input(null, ...(ngDevMode ? [{ debugName: "moreLabelTemplate" }] : []));
|
|
35
|
+
this.collapseAt = input(null, ...(ngDevMode ? [{ debugName: "collapseAt" }] : []));
|
|
36
|
+
this.overflowFrom = input('end', ...(ngDevMode ? [{ debugName: "overflowFrom" }] : []));
|
|
37
|
+
this.hideEmptyMore = input(true, ...(ngDevMode ? [{ debugName: "hideEmptyMore" }] : []));
|
|
38
|
+
// Outputs
|
|
39
|
+
this.overflowChange = output();
|
|
40
|
+
// Children
|
|
41
|
+
this.items = contentChildren(BsPriorityNavItemDirective, ...(ngDevMode ? [{ debugName: "items" }] : []));
|
|
42
|
+
// Per-item width measurements (from the off-screen measure strip)
|
|
43
|
+
this.measureSizers = viewChildren('measureItem', ...(ngDevMode ? [{ debugName: "measureSizers" }] : []));
|
|
44
|
+
// Visible strip width and its element (for reading computed `column-gap`)
|
|
45
|
+
this.stripSizer = viewChild('stripSize', ...(ngDevMode ? [{ debugName: "stripSizer" }] : []));
|
|
46
|
+
this.stripElement = viewChild('stripSize', { ...(ngDevMode ? { debugName: "stripElement" } : {}), read: ElementRef });
|
|
47
|
+
// More button width
|
|
48
|
+
this.moreSizer = viewChild('moreSize', ...(ngDevMode ? [{ debugName: "moreSizer" }] : []));
|
|
49
|
+
// Open/closed state for the More menu (JS path)
|
|
50
|
+
this.isMoreOpen = signal(false, ...(ngDevMode ? [{ debugName: "isMoreOpen" }] : []));
|
|
51
|
+
this.windowWidth = signal(0, ...(ngDevMode ? [{ debugName: "windowWidth" }] : []));
|
|
52
|
+
this.collapseAtPx = computed(() => {
|
|
53
|
+
switch (this.collapseAt()) {
|
|
54
|
+
case 'xxl': return 1400;
|
|
55
|
+
case 'xl': return 1200;
|
|
56
|
+
case 'lg': return 992;
|
|
57
|
+
case 'md': return 768;
|
|
58
|
+
case 'sm': return 576;
|
|
59
|
+
case 'xs': return 0;
|
|
60
|
+
default: return null;
|
|
61
|
+
}
|
|
62
|
+
}, ...(ngDevMode ? [{ debugName: "collapseAtPx" }] : []));
|
|
63
|
+
this.forceCollapse = computed(() => {
|
|
64
|
+
const bp = this.collapseAtPx();
|
|
65
|
+
if (bp === null)
|
|
66
|
+
return false;
|
|
67
|
+
const w = this.windowWidth();
|
|
68
|
+
return w > 0 && w < bp;
|
|
69
|
+
}, ...(ngDevMode ? [{ debugName: "forceCollapse" }] : []));
|
|
70
|
+
// Items in overflow order. Convention: a LOWER priority number means MORE
|
|
71
|
+
// important (priority: 1 stays visible longest). Items without a priority
|
|
72
|
+
// are treated as least important and overflow before any prioritized item.
|
|
73
|
+
// Tiebreaker uses declaration order (last-declared overflows first when
|
|
74
|
+
// overflowFrom='end').
|
|
75
|
+
this.overflowOrder = computed(() => {
|
|
76
|
+
const items = this.items();
|
|
77
|
+
const fromEnd = this.overflowFrom() === 'end';
|
|
78
|
+
return [...items]
|
|
79
|
+
.map((item, index) => ({ item, index, priority: item.priority() }))
|
|
80
|
+
.sort((a, b) => {
|
|
81
|
+
// Unprioritized items overflow first
|
|
82
|
+
if (a.priority === null && b.priority !== null)
|
|
83
|
+
return -1;
|
|
84
|
+
if (a.priority !== null && b.priority === null)
|
|
85
|
+
return 1;
|
|
86
|
+
// Both prioritized: higher number overflows first (less important)
|
|
87
|
+
if (a.priority !== null && b.priority !== null && a.priority !== b.priority) {
|
|
88
|
+
return b.priority - a.priority;
|
|
89
|
+
}
|
|
90
|
+
// Tiebreaker by declaration order
|
|
91
|
+
return fromEnd ? b.index - a.index : a.index - b.index;
|
|
92
|
+
})
|
|
93
|
+
.map(x => x.item);
|
|
94
|
+
}, ...(ngDevMode ? [{ debugName: "overflowOrder" }] : []));
|
|
95
|
+
// Per-item width map (from measure strip, indexed by item id, in items() order)
|
|
96
|
+
this.itemWidths = computed(() => {
|
|
97
|
+
if (this.isServerSide)
|
|
98
|
+
return new Map();
|
|
99
|
+
const sizers = this.measureSizers();
|
|
100
|
+
const items = this.items();
|
|
101
|
+
const map = new Map();
|
|
102
|
+
items.forEach((item, i) => {
|
|
103
|
+
const sizer = sizers[i];
|
|
104
|
+
if (!sizer)
|
|
105
|
+
return;
|
|
106
|
+
const w = sizer.width();
|
|
107
|
+
if (w !== undefined)
|
|
108
|
+
map.set(item.id, w);
|
|
109
|
+
});
|
|
110
|
+
return map;
|
|
111
|
+
}, ...(ngDevMode ? [{ debugName: "itemWidths" }] : []));
|
|
112
|
+
// The strip's `column-gap` (or `gap`) value in pixels. Read from computed
|
|
113
|
+
// style so consumers' `gap` declarations get factored into the overflow math
|
|
114
|
+
// — without this, items overflow late or layout-shift when a gap is set.
|
|
115
|
+
// Re-read whenever the strip width changes (covers media-query gap changes
|
|
116
|
+
// that piggy-back on the same breakpoint).
|
|
117
|
+
this.itemGap = computed(() => {
|
|
118
|
+
if (this.isServerSide)
|
|
119
|
+
return 0;
|
|
120
|
+
this.stripSizer()?.width();
|
|
121
|
+
const el = this.stripElement()?.nativeElement;
|
|
122
|
+
if (!el)
|
|
123
|
+
return 0;
|
|
124
|
+
const cs = getComputedStyle(el);
|
|
125
|
+
const raw = parseFloat(cs.columnGap || cs.gap || '0');
|
|
126
|
+
return Number.isFinite(raw) ? raw : 0;
|
|
127
|
+
}, ...(ngDevMode ? [{ debugName: "itemGap" }] : []));
|
|
128
|
+
this.overflowingIds = computed(() => {
|
|
129
|
+
if (this.isServerSide)
|
|
130
|
+
return new Set();
|
|
131
|
+
if (this.forceCollapse()) {
|
|
132
|
+
return new Set(this.items().map(i => i.id));
|
|
133
|
+
}
|
|
134
|
+
const stripWidth = this.stripSizer()?.width() ?? 0;
|
|
135
|
+
const moreWidth = this.moreSizer()?.width() ?? 0;
|
|
136
|
+
const widths = this.itemWidths();
|
|
137
|
+
const gap = this.itemGap();
|
|
138
|
+
if (stripWidth === 0 || widths.size === 0)
|
|
139
|
+
return new Set();
|
|
140
|
+
// Layout when all items fit (no More toggle): N items separated by N-1 gaps
|
|
141
|
+
const sumWidths = Array.from(widths.values()).reduce((a, b) => a + b, 0);
|
|
142
|
+
const allVisibleWidth = sumWidths + gap * Math.max(0, widths.size - 1);
|
|
143
|
+
if (allVisibleWidth <= stripWidth)
|
|
144
|
+
return new Set();
|
|
145
|
+
// Need overflow → More toggle is shown. Layout when K items are kicked:
|
|
146
|
+
// (N - K) items + 1 More toggle = (N - K + 1) elements with (N - K) gaps
|
|
147
|
+
const overflowing = new Set();
|
|
148
|
+
let visibleSum = sumWidths;
|
|
149
|
+
let visibleCount = widths.size;
|
|
150
|
+
for (const item of this.overflowOrder()) {
|
|
151
|
+
const totalWithMore = visibleSum + moreWidth + gap * visibleCount;
|
|
152
|
+
if (totalWithMore <= stripWidth)
|
|
153
|
+
break;
|
|
154
|
+
visibleSum -= widths.get(item.id) ?? 0;
|
|
155
|
+
visibleCount -= 1;
|
|
156
|
+
overflowing.add(item.id);
|
|
157
|
+
}
|
|
158
|
+
return overflowing;
|
|
159
|
+
}, ...(ngDevMode ? [{ debugName: "overflowingIds" }] : []));
|
|
160
|
+
this.hasAnyOverflow = computed(() => this.overflowingIds().size > 0, ...(ngDevMode ? [{ debugName: "hasAnyOverflow" }] : []));
|
|
161
|
+
this.showMoreButton = computed(() => !this.hideEmptyMore() || this.hasAnyOverflow(), ...(ngDevMode ? [{ debugName: "showMoreButton" }] : []));
|
|
162
|
+
// When every item is overflowing the toggle ends up at the start edge of
|
|
163
|
+
// the strip (no inline items push it). Anchor the dropdown to that side
|
|
164
|
+
// so it stays visually attached to the toggle.
|
|
165
|
+
this.fullyCollapsed = computed(() => {
|
|
166
|
+
const items = this.items();
|
|
167
|
+
return items.length > 0 && this.overflowingIds().size === items.length;
|
|
168
|
+
}, ...(ngDevMode ? [{ debugName: "fullyCollapsed" }] : []));
|
|
169
|
+
// Derived per-item view used by all three rendering passes (measure strip,
|
|
170
|
+
// inline strip, overflow menu). Pre-computes the breakpoint class string and
|
|
171
|
+
// the JS-mode-only hide flags so the template can stay purely declarative —
|
|
172
|
+
// no method calls, no inline `!isServerSide` guards. The SSR/noscript path
|
|
173
|
+
// relies on CSS media queries instead of these flags, so both `hideInline`
|
|
174
|
+
// and `hideInOverflow` are forced to false on the server.
|
|
175
|
+
this.itemsWithMeta = computed(() => {
|
|
176
|
+
const items = this.items();
|
|
177
|
+
const overflowing = this.overflowingIds();
|
|
178
|
+
const ssr = this.isServerSide;
|
|
179
|
+
return items.map(item => {
|
|
180
|
+
const bp = item.hideBelow();
|
|
181
|
+
const isOverflowing = overflowing.has(item.id);
|
|
182
|
+
return {
|
|
183
|
+
item,
|
|
184
|
+
hideBelowClass: bp ? `priority-nav-item-hide-below-${bp}` : '',
|
|
185
|
+
hideInline: !ssr && isOverflowing,
|
|
186
|
+
hideInOverflow: !ssr && !isOverflowing,
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
}, ...(ngDevMode ? [{ debugName: "itemsWithMeta" }] : []));
|
|
190
|
+
if (!this.isServerSide) {
|
|
191
|
+
this.windowWidth.set(window.innerWidth);
|
|
192
|
+
}
|
|
193
|
+
effect(() => {
|
|
194
|
+
const overflowing = this.overflowingIds();
|
|
195
|
+
const overflowingItems = this.items().filter(i => overflowing.has(i.id));
|
|
196
|
+
this.overflowChange.emit(overflowingItems);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
onWindowResize() {
|
|
200
|
+
if (!this.isServerSide) {
|
|
201
|
+
this.windowWidth.set(window.innerWidth);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
toggleMore() {
|
|
205
|
+
this.isMoreOpen.update(v => !v);
|
|
206
|
+
}
|
|
207
|
+
onEscape() {
|
|
208
|
+
if (this.isMoreOpen())
|
|
209
|
+
this.isMoreOpen.set(false);
|
|
210
|
+
}
|
|
211
|
+
onDocumentClick(event) {
|
|
212
|
+
if (event.button !== 0 || !this.isMoreOpen())
|
|
213
|
+
return;
|
|
214
|
+
if (!this.element.nativeElement.contains(event.target)) {
|
|
215
|
+
this.isMoreOpen.set(false);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsPriorityNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
219
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsPriorityNavComponent, isStandalone: true, selector: "bs-priority-nav", inputs: { moreLabel: { classPropertyName: "moreLabel", publicName: "moreLabel", isSignal: true, isRequired: false, transformFunction: null }, moreLabelTemplate: { classPropertyName: "moreLabelTemplate", publicName: "moreLabelTemplate", isSignal: true, isRequired: false, transformFunction: null }, collapseAt: { classPropertyName: "collapseAt", publicName: "collapseAt", isSignal: true, isRequired: false, transformFunction: null }, overflowFrom: { classPropertyName: "overflowFrom", publicName: "overflowFrom", isSignal: true, isRequired: false, transformFunction: null }, hideEmptyMore: { classPropertyName: "hideEmptyMore", publicName: "hideEmptyMore", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { overflowChange: "overflowChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()", "window:resize": "onWindowResize()" } }, queries: [{ propertyName: "items", predicate: BsPriorityNavItemDirective, isSignal: true }], viewQueries: [{ propertyName: "measureSizers", predicate: ["measureItem"], descendants: true, isSignal: true }, { propertyName: "stripSizer", first: true, predicate: ["stripSize"], descendants: true, isSignal: true }, { propertyName: "stripElement", first: true, predicate: ["stripSize"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "moreSizer", first: true, predicate: ["moreSize"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"priority-nav\" [class.noscript]=\"isServerSide\" bsNoNoscript>\n @if (isServerSide) {\n <input type=\"checkbox\" [id]=\"uid + '-more'\" class=\"priority-nav-more-checkbox d-none\" bsNoNoscript>\n }\n\n @if (!isServerSide) {\n <div class=\"priority-nav-measure-wrapper\" aria-hidden=\"true\">\n <div class=\"priority-nav-measure\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span #measureItem=\"bsObserveSize\" bsObserveSize class=\"priority-nav-measure-item\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n </div>\n </div>\n }\n\n <div bsObserveSize #stripSize=\"bsObserveSize\" class=\"priority-nav-strip\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span class=\"priority-nav-item\"\n [class.priority-nav-hidden]=\"entry.hideInline\"\n [ngClass]=\"entry.hideBelowClass\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n\n @if (isServerSide) {\n <label [for]=\"uid + '-more'\" class=\"priority-nav-more-toggle priority-nav-more-toggle-noscript\"\n role=\"button\" tabindex=\"0\"\n aria-haspopup=\"true\"\n [attr.aria-controls]=\"uid + '-overflow'\">\n <ng-container *ngTemplateOutlet=\"moreLabelTemplate() ?? defaultMoreLabel; context: { $implicit: false }\"></ng-container>\n </label>\n } @else {\n <button bsObserveSize #moreSize=\"bsObserveSize\" type=\"button\"\n class=\"priority-nav-more-toggle\"\n [class.priority-nav-hidden]=\"!showMoreButton()\"\n (click)=\"toggleMore()\"\n aria-haspopup=\"true\"\n [attr.aria-controls]=\"uid + '-overflow'\"\n [attr.aria-expanded]=\"isMoreOpen()\">\n <ng-container *ngTemplateOutlet=\"moreLabelTemplate() ?? defaultMoreLabel; context: { $implicit: isMoreOpen() }\"></ng-container>\n </button>\n }\n </div>\n\n <div [id]=\"uid + '-overflow'\"\n class=\"priority-nav-overflow\"\n role=\"menu\"\n [class.priority-nav-overflow-open]=\"!isServerSide && isMoreOpen()\"\n [class.priority-nav-overflow-align-start]=\"!isServerSide && fullyCollapsed()\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span class=\"priority-nav-overflow-item\"\n role=\"menuitem\"\n [class.priority-nav-overflow-hidden]=\"entry.hideInOverflow\"\n [ngClass]=\"entry.hideBelowClass\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n </div>\n</div>\n\n<ng-template #defaultMoreLabel let-isOpen>\n <span class=\"priority-nav-more-label\">{{ moreLabel() }}</span>\n <span class=\"priority-nav-caret\" aria-hidden=\"true\">▾</span>\n</ng-template>\n", styles: [":host{display:block}.priority-nav{position:relative}.priority-nav-measure-wrapper{position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;pointer-events:none}.priority-nav-measure{visibility:hidden;display:flex;flex-wrap:nowrap;align-items:center}.priority-nav-measure .priority-nav-measure-item{display:inline-flex;align-items:center;flex-shrink:0}.priority-nav-strip{display:flex;flex-wrap:nowrap;align-items:center;overflow:hidden}.priority-nav-strip .priority-nav-item{display:inline-flex;align-items:center;flex-shrink:0}.priority-nav-hidden,.priority-nav-overflow-hidden{display:none!important}.priority-nav-more-toggle{flex-shrink:0;display:inline-flex;align-items:center;gap:.25rem;padding:.5rem .75rem;border:none;background:transparent;cursor:pointer;color:inherit;font:inherit}.priority-nav-more-toggle:focus-visible{outline:2px solid var(--bs-primary, #0d6efd);outline-offset:2px}.priority-nav-more-toggle .priority-nav-caret{font-size:.75em;line-height:1}.priority-nav-overflow{display:none;position:absolute;top:100%;right:0;z-index:1000;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;background-color:var(--bs-body-bg, #fff);border:var(--bs-border-width, 1px) solid var(--bs-border-color, rgba(0, 0, 0, .175));border-radius:var(--bs-border-radius, .375rem);box-shadow:0 .5rem 1rem #00000026}.priority-nav-overflow .priority-nav-overflow-item{display:block;padding:.25rem 1rem}.priority-nav-overflow-open{display:block}.priority-nav-overflow-align-start{left:0;right:auto}@media(max-width:575.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-sm{display:none}}@media(max-width:767.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-md{display:none}}@media(max-width:991.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-lg{display:none}}@media(max-width:1199.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-xl{display:none}}@media(max-width:1399.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-xxl{display:none}}.priority-nav.noscript .priority-nav-overflow .priority-nav-overflow-item{display:none}@media(max-width:575.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-sm{display:block}}@media(max-width:767.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-md{display:block}}@media(max-width:991.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-lg{display:block}}@media(max-width:1199.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-xl{display:block}}@media(max-width:1399.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-xxl{display:block}}.priority-nav.noscript>input.priority-nav-more-checkbox.noscript:checked~.priority-nav-overflow{display:block}.priority-nav.noscript .priority-nav-more-toggle-noscript{cursor:pointer;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: BsNoNoscriptDirective, selector: "[bsNoNoscript]" }, { kind: "directive", type: BsObserveSizeDirective, selector: "[bsObserveSize]", exportAs: ["bsObserveSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
220
|
+
}
|
|
221
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsPriorityNavComponent, decorators: [{
|
|
222
|
+
type: Component,
|
|
223
|
+
args: [{ selector: 'bs-priority-nav', imports: [NgClass, NgTemplateOutlet, BsNoNoscriptDirective, BsObserveSizeDirective], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
224
|
+
'(document:click)': 'onDocumentClick($event)',
|
|
225
|
+
'(document:keydown.escape)': 'onEscape()',
|
|
226
|
+
'(window:resize)': 'onWindowResize()',
|
|
227
|
+
}, template: "<div class=\"priority-nav\" [class.noscript]=\"isServerSide\" bsNoNoscript>\n @if (isServerSide) {\n <input type=\"checkbox\" [id]=\"uid + '-more'\" class=\"priority-nav-more-checkbox d-none\" bsNoNoscript>\n }\n\n @if (!isServerSide) {\n <div class=\"priority-nav-measure-wrapper\" aria-hidden=\"true\">\n <div class=\"priority-nav-measure\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span #measureItem=\"bsObserveSize\" bsObserveSize class=\"priority-nav-measure-item\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n </div>\n </div>\n }\n\n <div bsObserveSize #stripSize=\"bsObserveSize\" class=\"priority-nav-strip\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span class=\"priority-nav-item\"\n [class.priority-nav-hidden]=\"entry.hideInline\"\n [ngClass]=\"entry.hideBelowClass\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n\n @if (isServerSide) {\n <label [for]=\"uid + '-more'\" class=\"priority-nav-more-toggle priority-nav-more-toggle-noscript\"\n role=\"button\" tabindex=\"0\"\n aria-haspopup=\"true\"\n [attr.aria-controls]=\"uid + '-overflow'\">\n <ng-container *ngTemplateOutlet=\"moreLabelTemplate() ?? defaultMoreLabel; context: { $implicit: false }\"></ng-container>\n </label>\n } @else {\n <button bsObserveSize #moreSize=\"bsObserveSize\" type=\"button\"\n class=\"priority-nav-more-toggle\"\n [class.priority-nav-hidden]=\"!showMoreButton()\"\n (click)=\"toggleMore()\"\n aria-haspopup=\"true\"\n [attr.aria-controls]=\"uid + '-overflow'\"\n [attr.aria-expanded]=\"isMoreOpen()\">\n <ng-container *ngTemplateOutlet=\"moreLabelTemplate() ?? defaultMoreLabel; context: { $implicit: isMoreOpen() }\"></ng-container>\n </button>\n }\n </div>\n\n <div [id]=\"uid + '-overflow'\"\n class=\"priority-nav-overflow\"\n role=\"menu\"\n [class.priority-nav-overflow-open]=\"!isServerSide && isMoreOpen()\"\n [class.priority-nav-overflow-align-start]=\"!isServerSide && fullyCollapsed()\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span class=\"priority-nav-overflow-item\"\n role=\"menuitem\"\n [class.priority-nav-overflow-hidden]=\"entry.hideInOverflow\"\n [ngClass]=\"entry.hideBelowClass\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n </div>\n</div>\n\n<ng-template #defaultMoreLabel let-isOpen>\n <span class=\"priority-nav-more-label\">{{ moreLabel() }}</span>\n <span class=\"priority-nav-caret\" aria-hidden=\"true\">▾</span>\n</ng-template>\n", styles: [":host{display:block}.priority-nav{position:relative}.priority-nav-measure-wrapper{position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;pointer-events:none}.priority-nav-measure{visibility:hidden;display:flex;flex-wrap:nowrap;align-items:center}.priority-nav-measure .priority-nav-measure-item{display:inline-flex;align-items:center;flex-shrink:0}.priority-nav-strip{display:flex;flex-wrap:nowrap;align-items:center;overflow:hidden}.priority-nav-strip .priority-nav-item{display:inline-flex;align-items:center;flex-shrink:0}.priority-nav-hidden,.priority-nav-overflow-hidden{display:none!important}.priority-nav-more-toggle{flex-shrink:0;display:inline-flex;align-items:center;gap:.25rem;padding:.5rem .75rem;border:none;background:transparent;cursor:pointer;color:inherit;font:inherit}.priority-nav-more-toggle:focus-visible{outline:2px solid var(--bs-primary, #0d6efd);outline-offset:2px}.priority-nav-more-toggle .priority-nav-caret{font-size:.75em;line-height:1}.priority-nav-overflow{display:none;position:absolute;top:100%;right:0;z-index:1000;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;background-color:var(--bs-body-bg, #fff);border:var(--bs-border-width, 1px) solid var(--bs-border-color, rgba(0, 0, 0, .175));border-radius:var(--bs-border-radius, .375rem);box-shadow:0 .5rem 1rem #00000026}.priority-nav-overflow .priority-nav-overflow-item{display:block;padding:.25rem 1rem}.priority-nav-overflow-open{display:block}.priority-nav-overflow-align-start{left:0;right:auto}@media(max-width:575.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-sm{display:none}}@media(max-width:767.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-md{display:none}}@media(max-width:991.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-lg{display:none}}@media(max-width:1199.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-xl{display:none}}@media(max-width:1399.98px){.priority-nav.noscript .priority-nav-strip .priority-nav-item-hide-below-xxl{display:none}}.priority-nav.noscript .priority-nav-overflow .priority-nav-overflow-item{display:none}@media(max-width:575.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-sm{display:block}}@media(max-width:767.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-md{display:block}}@media(max-width:991.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-lg{display:block}}@media(max-width:1199.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-xl{display:block}}@media(max-width:1399.98px){.priority-nav.noscript .priority-nav-overflow .priority-nav-item-hide-below-xxl{display:block}}.priority-nav.noscript>input.priority-nav-more-checkbox.noscript:checked~.priority-nav-overflow{display:block}.priority-nav.noscript .priority-nav-more-toggle-noscript{cursor:pointer;-webkit-user-select:none;user-select:none}\n"] }]
|
|
228
|
+
}], ctorParameters: () => [], propDecorators: { moreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreLabel", required: false }] }], moreLabelTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreLabelTemplate", required: false }] }], collapseAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseAt", required: false }] }], overflowFrom: [{ type: i0.Input, args: [{ isSignal: true, alias: "overflowFrom", required: false }] }], hideEmptyMore: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideEmptyMore", required: false }] }], overflowChange: [{ type: i0.Output, args: ["overflowChange"] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => BsPriorityNavItemDirective), { isSignal: true }] }], measureSizers: [{ type: i0.ViewChildren, args: ['measureItem', { isSignal: true }] }], stripSizer: [{ type: i0.ViewChild, args: ['stripSize', { isSignal: true }] }], stripElement: [{ type: i0.ViewChild, args: ['stripSize', { ...{ read: ElementRef }, isSignal: true }] }], moreSizer: [{ type: i0.ViewChild, args: ['moreSize', { isSignal: true }] }] } });
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Generated bundle index. Do not edit.
|
|
232
|
+
*/
|
|
233
|
+
|
|
234
|
+
export { BsPriorityNavComponent, BsPriorityNavItemDirective };
|
|
235
|
+
//# sourceMappingURL=mintplayer-ng-bootstrap-priority-nav.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-priority-nav.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/priority-nav/src/priority-nav-item/priority-nav-item.directive.ts","../../../../libs/mintplayer-ng-bootstrap/priority-nav/src/priority-nav/priority-nav.component.ts","../../../../libs/mintplayer-ng-bootstrap/priority-nav/src/priority-nav/priority-nav.component.html","../../../../libs/mintplayer-ng-bootstrap/priority-nav/mintplayer-ng-bootstrap-priority-nav.ts"],"sourcesContent":["import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { Breakpoint } from '@mintplayer/ng-bootstrap';\n\n@Directive({\n selector: '[bsPriorityNavItem]',\n})\nexport class BsPriorityNavItemDirective {\n templateRef = inject(TemplateRef);\n\n priority = input<number | null>(null, { alias: 'bsPriorityNavItem' });\n hideBelow = input<Breakpoint | null>(null, { alias: 'bsPriorityNavItemHideBelow' });\n\n readonly id: number = ++BsPriorityNavItemDirective.idCounter;\n private static idCounter = 0;\n}\n","import { isPlatformServer, NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy, Component, computed, contentChildren, effect, ElementRef,\n inject, input, output, PLATFORM_ID, signal, TemplateRef, viewChild, viewChildren\n} from '@angular/core';\nimport { Breakpoint } from '@mintplayer/ng-bootstrap';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { BsObserveSizeDirective } from '@mintplayer/ng-swiper/observe-size';\nimport { BsPriorityNavItemDirective } from '../priority-nav-item/priority-nav-item.directive';\n\n@Component({\n selector: 'bs-priority-nav',\n templateUrl: './priority-nav.component.html',\n styleUrls: ['./priority-nav.component.scss'],\n imports: [NgClass, NgTemplateOutlet, BsNoNoscriptDirective, BsObserveSizeDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:click)': 'onDocumentClick($event)',\n '(document:keydown.escape)': 'onEscape()',\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsPriorityNavComponent {\n private platformId = inject(PLATFORM_ID);\n private element = inject(ElementRef);\n\n isServerSide = isPlatformServer(this.platformId);\n\n private static counter = 0;\n uid = `pn-${++BsPriorityNavComponent.counter}`;\n\n // Inputs\n moreLabel = input('More');\n moreLabelTemplate = input<TemplateRef<{ $implicit: boolean }> | null>(null);\n collapseAt = input<Breakpoint | null>(null);\n overflowFrom = input<'start' | 'end'>('end');\n hideEmptyMore = input(true);\n\n // Outputs\n overflowChange = output<BsPriorityNavItemDirective[]>();\n\n // Children\n readonly items = contentChildren(BsPriorityNavItemDirective);\n\n // Per-item width measurements (from the off-screen measure strip)\n private measureSizers = viewChildren<BsObserveSizeDirective>('measureItem');\n // Visible strip width and its element (for reading computed `column-gap`)\n stripSizer = viewChild<BsObserveSizeDirective>('stripSize');\n private stripElement = viewChild('stripSize', { read: ElementRef });\n // More button width\n moreSizer = viewChild<BsObserveSizeDirective>('moreSize');\n\n // Open/closed state for the More menu (JS path)\n isMoreOpen = signal(false);\n windowWidth = signal<number>(0);\n\n collapseAtPx = computed(() => {\n switch (this.collapseAt()) {\n case 'xxl': return 1400;\n case 'xl': return 1200;\n case 'lg': return 992;\n case 'md': return 768;\n case 'sm': return 576;\n case 'xs': return 0;\n default: return null;\n }\n });\n\n forceCollapse = computed(() => {\n const bp = this.collapseAtPx();\n if (bp === null) return false;\n const w = this.windowWidth();\n return w > 0 && w < bp;\n });\n\n // Items in overflow order. Convention: a LOWER priority number means MORE\n // important (priority: 1 stays visible longest). Items without a priority\n // are treated as least important and overflow before any prioritized item.\n // Tiebreaker uses declaration order (last-declared overflows first when\n // overflowFrom='end').\n overflowOrder = computed(() => {\n const items = this.items();\n const fromEnd = this.overflowFrom() === 'end';\n return [...items]\n .map((item, index) => ({ item, index, priority: item.priority() }))\n .sort((a, b) => {\n // Unprioritized items overflow first\n if (a.priority === null && b.priority !== null) return -1;\n if (a.priority !== null && b.priority === null) return 1;\n // Both prioritized: higher number overflows first (less important)\n if (a.priority !== null && b.priority !== null && a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n // Tiebreaker by declaration order\n return fromEnd ? b.index - a.index : a.index - b.index;\n })\n .map(x => x.item);\n });\n\n // Per-item width map (from measure strip, indexed by item id, in items() order)\n itemWidths = computed<Map<number, number>>(() => {\n if (this.isServerSide) return new Map();\n const sizers = this.measureSizers();\n const items = this.items();\n const map = new Map<number, number>();\n items.forEach((item, i) => {\n const sizer = sizers[i];\n if (!sizer) return;\n const w = sizer.width();\n if (w !== undefined) map.set(item.id, w);\n });\n return map;\n });\n\n // The strip's `column-gap` (or `gap`) value in pixels. Read from computed\n // style so consumers' `gap` declarations get factored into the overflow math\n // — without this, items overflow late or layout-shift when a gap is set.\n // Re-read whenever the strip width changes (covers media-query gap changes\n // that piggy-back on the same breakpoint).\n itemGap = computed(() => {\n if (this.isServerSide) return 0;\n this.stripSizer()?.width();\n const el = this.stripElement()?.nativeElement as HTMLElement | undefined;\n if (!el) return 0;\n const cs = getComputedStyle(el);\n const raw = parseFloat(cs.columnGap || cs.gap || '0');\n return Number.isFinite(raw) ? raw : 0;\n });\n\n overflowingIds = computed<Set<number>>(() => {\n if (this.isServerSide) return new Set();\n if (this.forceCollapse()) {\n return new Set(this.items().map(i => i.id));\n }\n\n const stripWidth = this.stripSizer()?.width() ?? 0;\n const moreWidth = this.moreSizer()?.width() ?? 0;\n const widths = this.itemWidths();\n const gap = this.itemGap();\n\n if (stripWidth === 0 || widths.size === 0) return new Set();\n\n // Layout when all items fit (no More toggle): N items separated by N-1 gaps\n const sumWidths = Array.from(widths.values()).reduce((a, b) => a + b, 0);\n const allVisibleWidth = sumWidths + gap * Math.max(0, widths.size - 1);\n if (allVisibleWidth <= stripWidth) return new Set();\n\n // Need overflow → More toggle is shown. Layout when K items are kicked:\n // (N - K) items + 1 More toggle = (N - K + 1) elements with (N - K) gaps\n const overflowing = new Set<number>();\n let visibleSum = sumWidths;\n let visibleCount = widths.size;\n\n for (const item of this.overflowOrder()) {\n const totalWithMore = visibleSum + moreWidth + gap * visibleCount;\n if (totalWithMore <= stripWidth) break;\n visibleSum -= widths.get(item.id) ?? 0;\n visibleCount -= 1;\n overflowing.add(item.id);\n }\n return overflowing;\n });\n\n hasAnyOverflow = computed(() => this.overflowingIds().size > 0);\n showMoreButton = computed(() => !this.hideEmptyMore() || this.hasAnyOverflow());\n\n // When every item is overflowing the toggle ends up at the start edge of\n // the strip (no inline items push it). Anchor the dropdown to that side\n // so it stays visually attached to the toggle.\n fullyCollapsed = computed(() => {\n const items = this.items();\n return items.length > 0 && this.overflowingIds().size === items.length;\n });\n\n // Derived per-item view used by all three rendering passes (measure strip,\n // inline strip, overflow menu). Pre-computes the breakpoint class string and\n // the JS-mode-only hide flags so the template can stay purely declarative —\n // no method calls, no inline `!isServerSide` guards. The SSR/noscript path\n // relies on CSS media queries instead of these flags, so both `hideInline`\n // and `hideInOverflow` are forced to false on the server.\n itemsWithMeta = computed(() => {\n const items = this.items();\n const overflowing = this.overflowingIds();\n const ssr = this.isServerSide;\n return items.map(item => {\n const bp = item.hideBelow();\n const isOverflowing = overflowing.has(item.id);\n return {\n item,\n hideBelowClass: bp ? `priority-nav-item-hide-below-${bp}` : '',\n hideInline: !ssr && isOverflowing,\n hideInOverflow: !ssr && !isOverflowing,\n };\n });\n });\n\n constructor() {\n if (!this.isServerSide) {\n this.windowWidth.set(window.innerWidth);\n }\n\n effect(() => {\n const overflowing = this.overflowingIds();\n const overflowingItems = this.items().filter(i => overflowing.has(i.id));\n this.overflowChange.emit(overflowingItems);\n });\n }\n\n onWindowResize() {\n if (!this.isServerSide) {\n this.windowWidth.set(window.innerWidth);\n }\n }\n\n toggleMore() {\n this.isMoreOpen.update(v => !v);\n }\n\n onEscape() {\n if (this.isMoreOpen()) this.isMoreOpen.set(false);\n }\n\n onDocumentClick(event: MouseEvent) {\n if (event.button !== 0 || !this.isMoreOpen()) return;\n if (!this.element.nativeElement.contains(event.target as Node)) {\n this.isMoreOpen.set(false);\n }\n }\n\n}\n","<div class=\"priority-nav\" [class.noscript]=\"isServerSide\" bsNoNoscript>\n @if (isServerSide) {\n <input type=\"checkbox\" [id]=\"uid + '-more'\" class=\"priority-nav-more-checkbox d-none\" bsNoNoscript>\n }\n\n @if (!isServerSide) {\n <div class=\"priority-nav-measure-wrapper\" aria-hidden=\"true\">\n <div class=\"priority-nav-measure\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span #measureItem=\"bsObserveSize\" bsObserveSize class=\"priority-nav-measure-item\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n </div>\n </div>\n }\n\n <div bsObserveSize #stripSize=\"bsObserveSize\" class=\"priority-nav-strip\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span class=\"priority-nav-item\"\n [class.priority-nav-hidden]=\"entry.hideInline\"\n [ngClass]=\"entry.hideBelowClass\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n\n @if (isServerSide) {\n <label [for]=\"uid + '-more'\" class=\"priority-nav-more-toggle priority-nav-more-toggle-noscript\"\n role=\"button\" tabindex=\"0\"\n aria-haspopup=\"true\"\n [attr.aria-controls]=\"uid + '-overflow'\">\n <ng-container *ngTemplateOutlet=\"moreLabelTemplate() ?? defaultMoreLabel; context: { $implicit: false }\"></ng-container>\n </label>\n } @else {\n <button bsObserveSize #moreSize=\"bsObserveSize\" type=\"button\"\n class=\"priority-nav-more-toggle\"\n [class.priority-nav-hidden]=\"!showMoreButton()\"\n (click)=\"toggleMore()\"\n aria-haspopup=\"true\"\n [attr.aria-controls]=\"uid + '-overflow'\"\n [attr.aria-expanded]=\"isMoreOpen()\">\n <ng-container *ngTemplateOutlet=\"moreLabelTemplate() ?? defaultMoreLabel; context: { $implicit: isMoreOpen() }\"></ng-container>\n </button>\n }\n </div>\n\n <div [id]=\"uid + '-overflow'\"\n class=\"priority-nav-overflow\"\n role=\"menu\"\n [class.priority-nav-overflow-open]=\"!isServerSide && isMoreOpen()\"\n [class.priority-nav-overflow-align-start]=\"!isServerSide && fullyCollapsed()\">\n @for (entry of itemsWithMeta(); track entry.item.id) {\n <span class=\"priority-nav-overflow-item\"\n role=\"menuitem\"\n [class.priority-nav-overflow-hidden]=\"entry.hideInOverflow\"\n [ngClass]=\"entry.hideBelowClass\">\n <ng-container *ngTemplateOutlet=\"entry.item.templateRef\"></ng-container>\n </span>\n }\n </div>\n</div>\n\n<ng-template #defaultMoreLabel let-isOpen>\n <span class=\"priority-nav-more-label\">{{ moreLabel() }}</span>\n <span class=\"priority-nav-caret\" aria-hidden=\"true\">▾</span>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -104,75 +104,88 @@ class BsResizeGlyphDirective {
|
|
|
104
104
|
if (this.resizable.resizeAction && !this.isBusy) {
|
|
105
105
|
ev.preventDefault();
|
|
106
106
|
this.isBusy = true;
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
107
|
+
const action = this.resizable.resizeAction;
|
|
108
|
+
// Note: the live bounding rect must NOT be used in the size/margin math.
|
|
109
|
+
// Reading it per-frame creates a feedback loop when content inside the
|
|
110
|
+
// host changes layout during the drag (e.g. a child component that
|
|
111
|
+
// shows/hides items in response to width). Use the captured `action`
|
|
112
|
+
// values from pointer-down — they're stable for the duration of the drag.
|
|
113
|
+
if (action.start && this.positions()?.includes('end')) {
|
|
114
|
+
// Right glyph — fixed left edge
|
|
115
|
+
const initialLeft = action.start.edge;
|
|
116
|
+
const initialRight = action.start.edge + action.start.size;
|
|
117
|
+
const x = (ev.clientX < initialLeft + 10) ? initialLeft + 10 : ev.clientX;
|
|
111
118
|
switch (this.resizable.positioning()) {
|
|
112
119
|
case 'inline':
|
|
113
120
|
{
|
|
114
|
-
const
|
|
115
|
-
this.resizable.marginRight.set(
|
|
121
|
+
const initialMargin = action.start.dragMargin ?? 0;
|
|
122
|
+
this.resizable.marginRight.set(initialMargin + (initialRight - x));
|
|
116
123
|
}
|
|
117
124
|
break;
|
|
118
125
|
case 'absolute':
|
|
119
126
|
{
|
|
120
|
-
this.resizable.width.set(x -
|
|
127
|
+
this.resizable.width.set(x - initialLeft);
|
|
121
128
|
}
|
|
122
129
|
break;
|
|
123
130
|
}
|
|
124
131
|
}
|
|
125
|
-
else if (
|
|
126
|
-
// Left glyph
|
|
127
|
-
const
|
|
132
|
+
else if (action.end && this.positions()?.includes('start')) {
|
|
133
|
+
// Left glyph — fixed right edge
|
|
134
|
+
const initialRight = action.end.edge;
|
|
135
|
+
const initialLeft = action.end.edge - action.end.size;
|
|
136
|
+
const x = (ev.clientX > initialRight - 10) ? initialRight - 10 : ev.clientX;
|
|
128
137
|
switch (this.resizable.positioning()) {
|
|
129
138
|
case 'inline':
|
|
130
139
|
{
|
|
131
|
-
const
|
|
132
|
-
this.resizable.marginLeft.set(
|
|
140
|
+
const initialMargin = action.end.dragMargin ?? 0;
|
|
141
|
+
this.resizable.marginLeft.set(initialMargin + (x - initialLeft));
|
|
133
142
|
}
|
|
134
143
|
break;
|
|
135
144
|
case 'absolute':
|
|
136
145
|
{
|
|
137
146
|
this.resizable.left.set(x);
|
|
138
|
-
this.resizable.width.set(
|
|
147
|
+
this.resizable.width.set(initialRight - x);
|
|
139
148
|
}
|
|
140
149
|
break;
|
|
141
150
|
}
|
|
142
151
|
}
|
|
143
|
-
if (
|
|
144
|
-
// Bottom glyph
|
|
145
|
-
const
|
|
152
|
+
if (action.top && this.positions()?.includes('bottom')) {
|
|
153
|
+
// Bottom glyph — fixed top edge. action.top.edge = captured rect.top
|
|
154
|
+
const initialTop = action.top.edge;
|
|
155
|
+
const initialBottom = action.top.edge + action.top.size;
|
|
156
|
+
const y = (ev.clientY < initialTop + 10) ? initialTop + 10 : ev.clientY;
|
|
146
157
|
switch (this.resizable.positioning()) {
|
|
147
158
|
case 'inline':
|
|
148
159
|
{
|
|
149
|
-
const
|
|
150
|
-
this.resizable.height.set(y -
|
|
151
|
-
this.resizable.marginBottom.set(
|
|
160
|
+
const initialMargin = action.top.dragMargin ?? 0;
|
|
161
|
+
this.resizable.height.set(y - initialTop);
|
|
162
|
+
this.resizable.marginBottom.set(initialMargin + (initialBottom - y));
|
|
152
163
|
}
|
|
153
164
|
break;
|
|
154
165
|
case 'absolute':
|
|
155
166
|
{
|
|
156
|
-
this.resizable.height.set(y -
|
|
167
|
+
this.resizable.height.set(y - initialTop);
|
|
157
168
|
}
|
|
158
169
|
break;
|
|
159
170
|
}
|
|
160
171
|
}
|
|
161
|
-
else if (
|
|
162
|
-
// Top glyph
|
|
163
|
-
const
|
|
172
|
+
else if (action.bottom && this.positions()?.includes('top')) {
|
|
173
|
+
// Top glyph — fixed bottom edge. action.bottom.edge = captured rect.bottom
|
|
174
|
+
const initialBottom = action.bottom.edge;
|
|
175
|
+
const initialTop = action.bottom.edge - action.bottom.size;
|
|
176
|
+
const y = (ev.clientY > initialBottom - 10) ? initialBottom - 10 : ev.clientY;
|
|
164
177
|
switch (this.resizable.positioning()) {
|
|
165
178
|
case 'inline':
|
|
166
179
|
{
|
|
167
|
-
const
|
|
168
|
-
this.resizable.height.set(
|
|
169
|
-
this.resizable.marginTop.set(
|
|
180
|
+
const initialMargin = action.bottom.dragMargin ?? 0;
|
|
181
|
+
this.resizable.height.set(initialBottom - y);
|
|
182
|
+
this.resizable.marginTop.set(initialMargin + (y - initialTop));
|
|
170
183
|
}
|
|
171
184
|
break;
|
|
172
185
|
case 'absolute':
|
|
173
186
|
{
|
|
174
187
|
this.resizable.top.set(y);
|
|
175
|
-
this.resizable.height.set(
|
|
188
|
+
this.resizable.height.set(initialBottom - y);
|
|
176
189
|
}
|
|
177
190
|
break;
|
|
178
191
|
}
|
|
@@ -209,6 +222,10 @@ class BsResizableComponent {
|
|
|
209
222
|
constructor() {
|
|
210
223
|
this.element = inject((ElementRef));
|
|
211
224
|
this.positioning = input('inline', ...(ngDevMode ? [{ debugName: "positioning" }] : []));
|
|
225
|
+
this.horizontal = input(true, ...(ngDevMode ? [{ debugName: "horizontal" }] : []));
|
|
226
|
+
this.vertical = input(true, ...(ngDevMode ? [{ debugName: "vertical" }] : []));
|
|
227
|
+
this.corners = input(true, ...(ngDevMode ? [{ debugName: "corners" }] : []));
|
|
228
|
+
this.showCorners = computed(() => this.horizontal() && this.vertical() && this.corners(), ...(ngDevMode ? [{ debugName: "showCorners" }] : []));
|
|
212
229
|
this.hostPosition = computed(() => {
|
|
213
230
|
const positioning = this.positioning();
|
|
214
231
|
switch (positioning) {
|
|
@@ -250,9 +267,9 @@ class BsResizableComponent {
|
|
|
250
267
|
});
|
|
251
268
|
}
|
|
252
269
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsResizableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
253
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
270
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsResizableComponent, isStandalone: true, selector: "bs-resizable", inputs: { positioning: { classPropertyName: "positioning", publicName: "positioning", isSignal: true, isRequired: false, transformFunction: null }, horizontal: { classPropertyName: "horizontal", publicName: "horizontal", isSignal: true, isRequired: false, transformFunction: null }, vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null }, corners: { classPropertyName: "corners", publicName: "corners", isSignal: true, isRequired: false, transformFunction: null }, presetPosition: { classPropertyName: "presetPosition", publicName: "presetPosition", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.margin-left.px": "marginLeft()", "style.margin-right.px": "marginRight()", "style.margin-top.px": "marginTop()", "style.margin-bottom.px": "marginBottom()", "style.width.px": "width()", "style.height.px": "height()", "style.left.px": "left()", "style.top.px": "top()", "class.d-block": "true", "class.border": "true", "class": "hostPosition()" } }, providers: [
|
|
254
271
|
{ provide: RESIZABLE, useExisting: forwardRef(() => BsResizableComponent) }
|
|
255
|
-
], ngImport: i0, template: "<div [class]=\"wrapperPosition()\" class=\"h-100\">\n <div class=\"cursor-nw-resize\" [bsResizeGlyph]=\"['top', 'start']\"></div>\n
|
|
272
|
+
], ngImport: i0, template: "<div [class]=\"wrapperPosition()\" class=\"h-100\">\n @if (showCorners()) {\n <div class=\"cursor-nw-resize\" [bsResizeGlyph]=\"['top', 'start']\"></div>\n <div class=\"cursor-ne-resize\" [bsResizeGlyph]=\"['top', 'end']\"></div>\n <div class=\"cursor-se-resize\" [bsResizeGlyph]=\"['bottom', 'end']\"></div>\n <div class=\"cursor-sw-resize\" [bsResizeGlyph]=\"['bottom', 'start']\"></div>\n }\n @if (vertical()) {\n <div class=\"cursor-n-resize\" [bsResizeGlyph]=\"['top']\"></div>\n <div class=\"cursor-s-resize\" [bsResizeGlyph]=\"['bottom']\"></div>\n }\n @if (horizontal()) {\n <div class=\"cursor-e-resize\" [bsResizeGlyph]=\"['end']\"></div>\n <div class=\"cursor-w-resize\" [bsResizeGlyph]=\"['start']\"></div>\n }\n <ng-content></ng-content>\n</div>", styles: [".glyph:before{content:\"\";width:8px;height:8px;display:block;border-radius:4px;transition:background-color .2s ease-in-out}.glyph{position:absolute;width:14px;height:14px;z-index:20}.glyph.top{top:-7px}.glyph.start{left:-7px}.glyph.bottom{bottom:-7px}.glyph.end{right:-7px}.glyph.start:not(.top):not(.bottom),.glyph.end:not(.top):not(.bottom){top:4px;height:calc(100% - 8px)}.glyph.start:not(.top):not(.bottom):before,.glyph.end:not(.top):not(.bottom):before{display:block;height:100%}.glyph.start:before,.glyph.end:before{margin-left:3px;margin-right:3px}.glyph.top:not(.start):not(.end),.glyph.bottom:not(.start):not(.end){left:4px;width:calc(100% - 8px)}.glyph.top:not(.start):not(.end):before,.glyph.bottom:not(.start):not(.end):before{display:block;width:100%}.glyph.top:before,.glyph.bottom:before{margin-top:3px;margin-bottom:3px}.glyph:hover:before,.glyph.active:before{background-color:#1389fd}:host{min-width:2rem;min-height:2rem}\n"], dependencies: [{ kind: "directive", type: BsResizeGlyphDirective, selector: "[bsResizeGlyph]", inputs: ["bsResizeGlyph"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
256
273
|
}
|
|
257
274
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsResizableComponent, decorators: [{
|
|
258
275
|
type: Component,
|
|
@@ -270,8 +287,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
|
|
|
270
287
|
'[class.d-block]': 'true',
|
|
271
288
|
'[class.border]': 'true',
|
|
272
289
|
'[class]': 'hostPosition()',
|
|
273
|
-
}, template: "<div [class]=\"wrapperPosition()\" class=\"h-100\">\n <div class=\"cursor-nw-resize\" [bsResizeGlyph]=\"['top', 'start']\"></div>\n
|
|
274
|
-
}], ctorParameters: () => [], propDecorators: { positioning: [{ type: i0.Input, args: [{ isSignal: true, alias: "positioning", required: false }] }], presetPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "presetPosition", required: false }] }] } });
|
|
290
|
+
}, template: "<div [class]=\"wrapperPosition()\" class=\"h-100\">\n @if (showCorners()) {\n <div class=\"cursor-nw-resize\" [bsResizeGlyph]=\"['top', 'start']\"></div>\n <div class=\"cursor-ne-resize\" [bsResizeGlyph]=\"['top', 'end']\"></div>\n <div class=\"cursor-se-resize\" [bsResizeGlyph]=\"['bottom', 'end']\"></div>\n <div class=\"cursor-sw-resize\" [bsResizeGlyph]=\"['bottom', 'start']\"></div>\n }\n @if (vertical()) {\n <div class=\"cursor-n-resize\" [bsResizeGlyph]=\"['top']\"></div>\n <div class=\"cursor-s-resize\" [bsResizeGlyph]=\"['bottom']\"></div>\n }\n @if (horizontal()) {\n <div class=\"cursor-e-resize\" [bsResizeGlyph]=\"['end']\"></div>\n <div class=\"cursor-w-resize\" [bsResizeGlyph]=\"['start']\"></div>\n }\n <ng-content></ng-content>\n</div>", styles: [".glyph:before{content:\"\";width:8px;height:8px;display:block;border-radius:4px;transition:background-color .2s ease-in-out}.glyph{position:absolute;width:14px;height:14px;z-index:20}.glyph.top{top:-7px}.glyph.start{left:-7px}.glyph.bottom{bottom:-7px}.glyph.end{right:-7px}.glyph.start:not(.top):not(.bottom),.glyph.end:not(.top):not(.bottom){top:4px;height:calc(100% - 8px)}.glyph.start:not(.top):not(.bottom):before,.glyph.end:not(.top):not(.bottom):before{display:block;height:100%}.glyph.start:before,.glyph.end:before{margin-left:3px;margin-right:3px}.glyph.top:not(.start):not(.end),.glyph.bottom:not(.start):not(.end){left:4px;width:calc(100% - 8px)}.glyph.top:not(.start):not(.end):before,.glyph.bottom:not(.start):not(.end):before{display:block;width:100%}.glyph.top:before,.glyph.bottom:before{margin-top:3px;margin-bottom:3px}.glyph:hover:before,.glyph.active:before{background-color:#1389fd}:host{min-width:2rem;min-height:2rem}\n"] }]
|
|
291
|
+
}], ctorParameters: () => [], propDecorators: { positioning: [{ type: i0.Input, args: [{ isSignal: true, alias: "positioning", required: false }] }], horizontal: [{ type: i0.Input, args: [{ isSignal: true, alias: "horizontal", required: false }] }], vertical: [{ type: i0.Input, args: [{ isSignal: true, alias: "vertical", required: false }] }], corners: [{ type: i0.Input, args: [{ isSignal: true, alias: "corners", required: false }] }], presetPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "presetPosition", required: false }] }] } });
|
|
275
292
|
|
|
276
293
|
/**
|
|
277
294
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-bootstrap-resizable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/resizable/src/providers/resizable.provider.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resize-glyph/resize-glyph.directive.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resizable/resizable.component.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resizable/resizable.component.html","../../../../libs/mintplayer-ng-bootstrap/resizable/mintplayer-ng-bootstrap-resizable.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport type { BsResizableComponent } from \"../resizable/resizable.component\";\n\nexport const RESIZABLE = new InjectionToken<BsResizableComponent>('Resizable');","import { Directive, effect, inject, input, signal, forwardRef } from '@angular/core';\nimport { Position } from '@mintplayer/ng-bootstrap';\nimport type { BsResizableComponent } from '../resizable/resizable.component';\nimport { ResizeAction } from '../interfaces/resize-action';\nimport { PointerData } from '../interfaces/pointer-data';\nimport { RESIZABLE } from '../providers/resizable.provider';\n\n@Directive({\n selector: '[bsResizeGlyph]',\n host: {\n '[class]': 'positions()',\n '[class.glyph]': 'true',\n '[class.active]': 'activeClass()',\n '(mousedown)': 'onMouseDown($event)',\n '(touchstart)': 'onTouchStart($event)',\n '(document:mousemove)': 'onMouseMove($event)',\n '(touchmove)': 'onTouchMove($event)',\n '(document:mouseup)': 'onMouseUp($event)',\n '(touchend)': 'onTouchEnd($event)',\n },\n})\nexport class BsResizeGlyphDirective {\n\n // Can't use typed DI because of the `import type`\n private readonly resizable: BsResizableComponent = inject(RESIZABLE);\n\n constructor() {\n effect(() => {\n const value = this.bsResizeGlyph();\n this.positions.set(value.join(' '));\n });\n }\n\n positions = signal('');\n activeClass = signal(false);\n\n readonly bsResizeGlyph = input<Position[]>([]);\n\n onMouseDown(ev: MouseEvent) {\n ev.preventDefault();\n this.onPointerDown()\n }\n\n onTouchStart(ev: TouchEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerDown();\n }\n\n onMouseMove(ev: MouseEvent) {\n this.onPointerMove({ clientX: ev.clientX, clientY: ev.clientY, preventDefault: () => ev.preventDefault() });\n }\n\n onTouchMove(ev: TouchEvent) {\n if (ev.touches.length === 1) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerMove({ clientX: ev.touches[0].clientX, clientY: ev.touches[0].clientY, preventDefault: () => ev.preventDefault() });\n }\n }\n\n onMouseUp(ev: Event) {\n this.onPointerUp();\n }\n\n onTouchEnd(ev: TouchEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerUp();\n }\n\n onPointerDown() {\n let action: ResizeAction = {\n positioning: this.resizable.positioning()\n };\n const rect = this.resizable.element.nativeElement.getBoundingClientRect();\n const styles = window.getComputedStyle(this.resizable.element.nativeElement);\n\n const marginLeft = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginLeft.slice(0, -2));\n const marginRight = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginRight.slice(0, -2));\n const marginTop = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginTop.slice(0, -2));\n const marginBottom = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginBottom.slice(0, -2));\n\n\n if (this.positions()?.includes('start')) {\n action = {\n ...action,\n end: {\n edge: rect.right,\n size: rect.width,\n margin: marginRight,\n dragMargin: marginLeft\n },\n };\n }\n if (this.positions()?.includes('end')) {\n action = {\n ...action,\n start: {\n edge: rect.left,\n size: rect.width,\n margin: marginLeft,\n dragMargin: marginRight\n },\n };\n }\n if (this.positions()?.includes('top')) {\n action = {\n ...action,\n bottom: {\n edge: rect.bottom,\n size: rect.height,\n margin: marginBottom,\n dragMargin: marginTop\n },\n };\n }\n if (this.positions()?.includes('bottom')) {\n action = {\n ...action,\n top: {\n edge: rect.top,\n size: rect.height,\n margin: marginTop,\n dragMargin: marginBottom\n },\n };\n }\n\n this.resizable.resizeAction = action;\n this.activeClass.set(true);\n }\n\n private isBusy = false;\n onPointerMove(ev: PointerData) {\n if (this.resizable.resizeAction && !this.isBusy) {\n ev.preventDefault();\n this.isBusy = true;\n const rct = this.resizable.element.nativeElement.getBoundingClientRect();\n if (this.resizable.resizeAction.start && this.positions()?.includes('end')) {\n // Right glyph\n const x = (ev.clientX < rct.left + 10) ? rct.left + 10 : ev.clientX;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initalMargin = this.resizable.marginRight() ?? 0;\n this.resizable.marginRight.set(initalMargin - (x - rct.right));\n } break;\n case 'absolute': {\n this.resizable.width.set(x - rct.left);\n } break;\n }\n } else if (this.resizable.resizeAction.end && this.positions()?.includes('start')) {\n // Left glyph\n const x = (ev.clientX > rct.right - 10) ? rct.right - 10 : ev.clientX;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initalMargin = this.resizable.marginLeft() ?? 0;\n this.resizable.marginLeft.set(initalMargin + x - rct.left);\n } break;\n case 'absolute': {\n this.resizable.left.set(x);\n this.resizable.width.set(this.resizable.resizeAction.end.edge - x);\n } break;\n }\n }\n\n if (this.resizable.resizeAction.top && this.positions()?.includes('bottom')) {\n // Bottom glyph\n const y = (ev.clientY < rct.top + 10) ? rct.top + 10 : ev.clientY;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initalMargin = this.resizable.marginBottom() ?? 0;\n this.resizable.height.set(y - rct.top);\n this.resizable.marginBottom.set(initalMargin - (y - rct.bottom));\n } break;\n case 'absolute': {\n this.resizable.height.set(y - rct.top);\n } break;\n }\n } else if (this.resizable.resizeAction.bottom && this.positions()?.includes('top')) {\n // Top glyph\n const y = (ev.clientY > rct.bottom - 10) ? rct.bottom - 10 : ev.clientY;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initalMargin = this.resizable.marginTop() ?? 0;\n this.resizable.height.set(rct.bottom - y);\n this.resizable.marginTop.set(initalMargin + y - rct.top);\n } break;\n case 'absolute': {\n this.resizable.top.set(y);\n this.resizable.height.set(this.resizable.resizeAction.bottom.edge - y);\n } break;\n }\n }\n this.isBusy = false;\n }\n }\n \n onPointerUp() {\n this.resizable.resizeAction = undefined;\n this.activeClass.set(false);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, forwardRef, signal } from '@angular/core';\nimport { ResizeAction } from '../interfaces/resize-action';\nimport { RESIZABLE } from '../providers/resizable.provider';\nimport { ResizablePositioning } from '../types/positioning';\nimport { PresetPosition } from '../interfaces/preset-position';\nimport { BsResizeGlyphDirective } from '../resize-glyph/resize-glyph.directive';\n\n@Component({\n selector: 'bs-resizable',\n templateUrl: './resizable.component.html',\n styleUrls: ['./resizable.component.scss'],\n imports: [BsResizeGlyphDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: RESIZABLE, useExisting: forwardRef(() => BsResizableComponent) }\n ],\n host: {\n '[style.margin-left.px]': 'marginLeft()',\n '[style.margin-right.px]': 'marginRight()',\n '[style.margin-top.px]': 'marginTop()',\n '[style.margin-bottom.px]': 'marginBottom()',\n '[style.width.px]': 'width()',\n '[style.height.px]': 'height()',\n '[style.left.px]': 'left()',\n '[style.top.px]': 'top()',\n '[class.d-block]': 'true',\n '[class.border]': 'true',\n '[class]': 'hostPosition()',\n },\n})\nexport class BsResizableComponent {\n element = inject(ElementRef<HTMLElement>);\n\n resizeAction?: ResizeAction;\n positioning = input<ResizablePositioning>('inline');\n\n hostPosition = computed(() => {\n const positioning = this.positioning();\n switch (positioning) {\n case 'absolute': return 'position-absolute';\n case 'inline': return 'position-relative';\n }\n });\n\n wrapperPosition = computed(() => {\n const positioning = this.positioning();\n switch (positioning) {\n case 'absolute': return ['position-relative', 'h-100'];\n case 'inline': return [];\n }\n });\n\n readonly presetPosition = input<PresetPosition | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const value = this.presetPosition();\n if (value) {\n if (this.positioning() === 'inline') {\n throw 'presetPosition currently only supported in absolute positioning';\n }\n this.width.set(value.width);\n this.height.set(value.height);\n this.left.set(value.left);\n this.top.set(value.top);\n this.marginTop.set(undefined);\n this.marginBottom.set(undefined);\n this.marginLeft.set(undefined);\n this.marginRight.set(undefined);\n }\n });\n }\n\n marginLeft = signal<number | undefined>(undefined);\n marginRight = signal<number | undefined>(undefined);\n marginTop = signal<number | undefined>(undefined);\n marginBottom = signal<number | undefined>(undefined);\n width = signal<number | undefined>(undefined);\n height = signal<number | undefined>(undefined);\n left = signal<number | undefined>(undefined);\n top = signal<number | undefined>(undefined);\n}\n","<div [class]=\"wrapperPosition()\" class=\"h-100\">\n <div class=\"cursor-nw-resize\" [bsResizeGlyph]=\"['top', 'start']\"></div>\n <div class=\"cursor-n-resize\" [bsResizeGlyph]=\"['top']\"></div>\n <div class=\"cursor-ne-resize\" [bsResizeGlyph]=\"['top', 'end']\"></div>\n <div class=\"cursor-e-resize\" [bsResizeGlyph]=\"['end']\"></div>\n <div class=\"cursor-se-resize\" [bsResizeGlyph]=\"['bottom', 'end']\"></div>\n <div class=\"cursor-s-resize\" [bsResizeGlyph]=\"['bottom']\"></div>\n <div class=\"cursor-sw-resize\" [bsResizeGlyph]=\"['bottom', 'start']\"></div>\n <div class=\"cursor-w-resize\" [bsResizeGlyph]=\"['start']\"></div>\n <ng-content></ng-content>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-bootstrap-resizable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/resizable/src/providers/resizable.provider.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resize-glyph/resize-glyph.directive.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resizable/resizable.component.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resizable/resizable.component.html","../../../../libs/mintplayer-ng-bootstrap/resizable/mintplayer-ng-bootstrap-resizable.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport type { BsResizableComponent } from \"../resizable/resizable.component\";\n\nexport const RESIZABLE = new InjectionToken<BsResizableComponent>('Resizable');","import { Directive, effect, inject, input, signal, forwardRef } from '@angular/core';\nimport { Position } from '@mintplayer/ng-bootstrap';\nimport type { BsResizableComponent } from '../resizable/resizable.component';\nimport { ResizeAction } from '../interfaces/resize-action';\nimport { PointerData } from '../interfaces/pointer-data';\nimport { RESIZABLE } from '../providers/resizable.provider';\n\n@Directive({\n selector: '[bsResizeGlyph]',\n host: {\n '[class]': 'positions()',\n '[class.glyph]': 'true',\n '[class.active]': 'activeClass()',\n '(mousedown)': 'onMouseDown($event)',\n '(touchstart)': 'onTouchStart($event)',\n '(document:mousemove)': 'onMouseMove($event)',\n '(touchmove)': 'onTouchMove($event)',\n '(document:mouseup)': 'onMouseUp($event)',\n '(touchend)': 'onTouchEnd($event)',\n },\n})\nexport class BsResizeGlyphDirective {\n\n // Can't use typed DI because of the `import type`\n private readonly resizable: BsResizableComponent = inject(RESIZABLE);\n\n constructor() {\n effect(() => {\n const value = this.bsResizeGlyph();\n this.positions.set(value.join(' '));\n });\n }\n\n positions = signal('');\n activeClass = signal(false);\n\n readonly bsResizeGlyph = input<Position[]>([]);\n\n onMouseDown(ev: MouseEvent) {\n ev.preventDefault();\n this.onPointerDown()\n }\n\n onTouchStart(ev: TouchEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerDown();\n }\n\n onMouseMove(ev: MouseEvent) {\n this.onPointerMove({ clientX: ev.clientX, clientY: ev.clientY, preventDefault: () => ev.preventDefault() });\n }\n\n onTouchMove(ev: TouchEvent) {\n if (ev.touches.length === 1) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerMove({ clientX: ev.touches[0].clientX, clientY: ev.touches[0].clientY, preventDefault: () => ev.preventDefault() });\n }\n }\n\n onMouseUp(ev: Event) {\n this.onPointerUp();\n }\n\n onTouchEnd(ev: TouchEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerUp();\n }\n\n onPointerDown() {\n let action: ResizeAction = {\n positioning: this.resizable.positioning()\n };\n const rect = this.resizable.element.nativeElement.getBoundingClientRect();\n const styles = window.getComputedStyle(this.resizable.element.nativeElement);\n\n const marginLeft = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginLeft.slice(0, -2));\n const marginRight = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginRight.slice(0, -2));\n const marginTop = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginTop.slice(0, -2));\n const marginBottom = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginBottom.slice(0, -2));\n\n\n if (this.positions()?.includes('start')) {\n action = {\n ...action,\n end: {\n edge: rect.right,\n size: rect.width,\n margin: marginRight,\n dragMargin: marginLeft\n },\n };\n }\n if (this.positions()?.includes('end')) {\n action = {\n ...action,\n start: {\n edge: rect.left,\n size: rect.width,\n margin: marginLeft,\n dragMargin: marginRight\n },\n };\n }\n if (this.positions()?.includes('top')) {\n action = {\n ...action,\n bottom: {\n edge: rect.bottom,\n size: rect.height,\n margin: marginBottom,\n dragMargin: marginTop\n },\n };\n }\n if (this.positions()?.includes('bottom')) {\n action = {\n ...action,\n top: {\n edge: rect.top,\n size: rect.height,\n margin: marginTop,\n dragMargin: marginBottom\n },\n };\n }\n\n this.resizable.resizeAction = action;\n this.activeClass.set(true);\n }\n\n private isBusy = false;\n onPointerMove(ev: PointerData) {\n if (this.resizable.resizeAction && !this.isBusy) {\n ev.preventDefault();\n this.isBusy = true;\n const action = this.resizable.resizeAction;\n // Note: the live bounding rect must NOT be used in the size/margin math.\n // Reading it per-frame creates a feedback loop when content inside the\n // host changes layout during the drag (e.g. a child component that\n // shows/hides items in response to width). Use the captured `action`\n // values from pointer-down — they're stable for the duration of the drag.\n\n if (action.start && this.positions()?.includes('end')) {\n // Right glyph — fixed left edge\n const initialLeft = action.start.edge;\n const initialRight = action.start.edge + action.start.size;\n const x = (ev.clientX < initialLeft + 10) ? initialLeft + 10 : ev.clientX;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.start.dragMargin ?? 0;\n this.resizable.marginRight.set(initialMargin + (initialRight - x));\n } break;\n case 'absolute': {\n this.resizable.width.set(x - initialLeft);\n } break;\n }\n } else if (action.end && this.positions()?.includes('start')) {\n // Left glyph — fixed right edge\n const initialRight = action.end.edge;\n const initialLeft = action.end.edge - action.end.size;\n const x = (ev.clientX > initialRight - 10) ? initialRight - 10 : ev.clientX;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.end.dragMargin ?? 0;\n this.resizable.marginLeft.set(initialMargin + (x - initialLeft));\n } break;\n case 'absolute': {\n this.resizable.left.set(x);\n this.resizable.width.set(initialRight - x);\n } break;\n }\n }\n\n if (action.top && this.positions()?.includes('bottom')) {\n // Bottom glyph — fixed top edge. action.top.edge = captured rect.top\n const initialTop = action.top.edge;\n const initialBottom = action.top.edge + action.top.size;\n const y = (ev.clientY < initialTop + 10) ? initialTop + 10 : ev.clientY;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.top.dragMargin ?? 0;\n this.resizable.height.set(y - initialTop);\n this.resizable.marginBottom.set(initialMargin + (initialBottom - y));\n } break;\n case 'absolute': {\n this.resizable.height.set(y - initialTop);\n } break;\n }\n } else if (action.bottom && this.positions()?.includes('top')) {\n // Top glyph — fixed bottom edge. action.bottom.edge = captured rect.bottom\n const initialBottom = action.bottom.edge;\n const initialTop = action.bottom.edge - action.bottom.size;\n const y = (ev.clientY > initialBottom - 10) ? initialBottom - 10 : ev.clientY;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.bottom.dragMargin ?? 0;\n this.resizable.height.set(initialBottom - y);\n this.resizable.marginTop.set(initialMargin + (y - initialTop));\n } break;\n case 'absolute': {\n this.resizable.top.set(y);\n this.resizable.height.set(initialBottom - y);\n } break;\n }\n }\n this.isBusy = false;\n }\n }\n \n onPointerUp() {\n this.resizable.resizeAction = undefined;\n this.activeClass.set(false);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, forwardRef, signal } from '@angular/core';\nimport { ResizeAction } from '../interfaces/resize-action';\nimport { RESIZABLE } from '../providers/resizable.provider';\nimport { ResizablePositioning } from '../types/positioning';\nimport { PresetPosition } from '../interfaces/preset-position';\nimport { BsResizeGlyphDirective } from '../resize-glyph/resize-glyph.directive';\n\n@Component({\n selector: 'bs-resizable',\n templateUrl: './resizable.component.html',\n styleUrls: ['./resizable.component.scss'],\n imports: [BsResizeGlyphDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: RESIZABLE, useExisting: forwardRef(() => BsResizableComponent) }\n ],\n host: {\n '[style.margin-left.px]': 'marginLeft()',\n '[style.margin-right.px]': 'marginRight()',\n '[style.margin-top.px]': 'marginTop()',\n '[style.margin-bottom.px]': 'marginBottom()',\n '[style.width.px]': 'width()',\n '[style.height.px]': 'height()',\n '[style.left.px]': 'left()',\n '[style.top.px]': 'top()',\n '[class.d-block]': 'true',\n '[class.border]': 'true',\n '[class]': 'hostPosition()',\n },\n})\nexport class BsResizableComponent {\n element = inject(ElementRef<HTMLElement>);\n\n resizeAction?: ResizeAction;\n positioning = input<ResizablePositioning>('inline');\n horizontal = input(true);\n vertical = input(true);\n corners = input(true);\n\n showCorners = computed(() => this.horizontal() && this.vertical() && this.corners());\n\n hostPosition = computed(() => {\n const positioning = this.positioning();\n switch (positioning) {\n case 'absolute': return 'position-absolute';\n case 'inline': return 'position-relative';\n }\n });\n\n wrapperPosition = computed(() => {\n const positioning = this.positioning();\n switch (positioning) {\n case 'absolute': return ['position-relative', 'h-100'];\n case 'inline': return [];\n }\n });\n\n readonly presetPosition = input<PresetPosition | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const value = this.presetPosition();\n if (value) {\n if (this.positioning() === 'inline') {\n throw 'presetPosition currently only supported in absolute positioning';\n }\n this.width.set(value.width);\n this.height.set(value.height);\n this.left.set(value.left);\n this.top.set(value.top);\n this.marginTop.set(undefined);\n this.marginBottom.set(undefined);\n this.marginLeft.set(undefined);\n this.marginRight.set(undefined);\n }\n });\n }\n\n marginLeft = signal<number | undefined>(undefined);\n marginRight = signal<number | undefined>(undefined);\n marginTop = signal<number | undefined>(undefined);\n marginBottom = signal<number | undefined>(undefined);\n width = signal<number | undefined>(undefined);\n height = signal<number | undefined>(undefined);\n left = signal<number | undefined>(undefined);\n top = signal<number | undefined>(undefined);\n}\n","<div [class]=\"wrapperPosition()\" class=\"h-100\">\n @if (showCorners()) {\n <div class=\"cursor-nw-resize\" [bsResizeGlyph]=\"['top', 'start']\"></div>\n <div class=\"cursor-ne-resize\" [bsResizeGlyph]=\"['top', 'end']\"></div>\n <div class=\"cursor-se-resize\" [bsResizeGlyph]=\"['bottom', 'end']\"></div>\n <div class=\"cursor-sw-resize\" [bsResizeGlyph]=\"['bottom', 'start']\"></div>\n }\n @if (vertical()) {\n <div class=\"cursor-n-resize\" [bsResizeGlyph]=\"['top']\"></div>\n <div class=\"cursor-s-resize\" [bsResizeGlyph]=\"['bottom']\"></div>\n }\n @if (horizontal()) {\n <div class=\"cursor-e-resize\" [bsResizeGlyph]=\"['end']\"></div>\n <div class=\"cursor-w-resize\" [bsResizeGlyph]=\"['start']\"></div>\n }\n <ng-content></ng-content>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mintplayer/ng-bootstrap",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "21.
|
|
4
|
+
"version": "21.13.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
|
|
@@ -236,6 +236,10 @@
|
|
|
236
236
|
"types": "./types/mintplayer-ng-bootstrap-popover.d.ts",
|
|
237
237
|
"default": "./fesm2022/mintplayer-ng-bootstrap-popover.mjs"
|
|
238
238
|
},
|
|
239
|
+
"./priority-nav": {
|
|
240
|
+
"types": "./types/mintplayer-ng-bootstrap-priority-nav.d.ts",
|
|
241
|
+
"default": "./fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs"
|
|
242
|
+
},
|
|
239
243
|
"./progress-bar": {
|
|
240
244
|
"types": "./types/mintplayer-ng-bootstrap-progress-bar.d.ts",
|
|
241
245
|
"default": "./fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs"
|
|
@@ -21,17 +21,13 @@ declare class BsPaginationComponent {
|
|
|
21
21
|
size: _angular_core.InputSignal<Size>;
|
|
22
22
|
/** The number of boxes (excluding arrows) that's being shown on the pagination component. */
|
|
23
23
|
visibleNumberOfNumberBoxes: _angular_core.Signal<number>;
|
|
24
|
-
/**
|
|
25
|
-
isLeftOverflow: _angular_core.Signal<boolean>;
|
|
26
|
-
/** Indicates whether there are too many numbers to the right-hand side of the current page. */
|
|
27
|
-
isRightOverflow: _angular_core.Signal<boolean>;
|
|
28
|
-
/** Page numbers to be displayed to the user. */
|
|
24
|
+
/** Page numbers to be displayed to the user, with ellipsis entries where pages are omitted. */
|
|
29
25
|
shownPageNumbers: _angular_core.Signal<PageWithSelection[]>;
|
|
30
26
|
/** Indicates if first value is selected. */
|
|
31
27
|
isFirstPage: _angular_core.Signal<boolean>;
|
|
32
28
|
/** Indicates if last value is selected. */
|
|
33
29
|
isLastPage: _angular_core.Signal<boolean>;
|
|
34
|
-
onSelectPage(event: MouseEvent, page:
|
|
30
|
+
onSelectPage(event: MouseEvent, page: PageNumberType): boolean;
|
|
35
31
|
onPrevious(): boolean;
|
|
36
32
|
onNext(): boolean;
|
|
37
33
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsPaginationComponent, never>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { TemplateRef } from '@angular/core';
|
|
3
|
+
import { Breakpoint } from '@mintplayer/ng-bootstrap';
|
|
4
|
+
import { BsObserveSizeDirective } from '@mintplayer/ng-swiper/observe-size';
|
|
5
|
+
|
|
6
|
+
declare class BsPriorityNavItemDirective {
|
|
7
|
+
templateRef: TemplateRef<any>;
|
|
8
|
+
priority: _angular_core.InputSignal<number | null>;
|
|
9
|
+
hideBelow: _angular_core.InputSignal<Breakpoint | null>;
|
|
10
|
+
readonly id: number;
|
|
11
|
+
private static idCounter;
|
|
12
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsPriorityNavItemDirective, never>;
|
|
13
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsPriorityNavItemDirective, "[bsPriorityNavItem]", never, { "priority": { "alias": "bsPriorityNavItem"; "required": false; "isSignal": true; }; "hideBelow": { "alias": "bsPriorityNavItemHideBelow"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
declare class BsPriorityNavComponent {
|
|
17
|
+
private platformId;
|
|
18
|
+
private element;
|
|
19
|
+
isServerSide: boolean;
|
|
20
|
+
private static counter;
|
|
21
|
+
uid: string;
|
|
22
|
+
moreLabel: _angular_core.InputSignal<string>;
|
|
23
|
+
moreLabelTemplate: _angular_core.InputSignal<TemplateRef<{
|
|
24
|
+
$implicit: boolean;
|
|
25
|
+
}> | null>;
|
|
26
|
+
collapseAt: _angular_core.InputSignal<Breakpoint | null>;
|
|
27
|
+
overflowFrom: _angular_core.InputSignal<"start" | "end">;
|
|
28
|
+
hideEmptyMore: _angular_core.InputSignal<boolean>;
|
|
29
|
+
overflowChange: _angular_core.OutputEmitterRef<BsPriorityNavItemDirective[]>;
|
|
30
|
+
readonly items: _angular_core.Signal<readonly BsPriorityNavItemDirective[]>;
|
|
31
|
+
private measureSizers;
|
|
32
|
+
stripSizer: _angular_core.Signal<BsObserveSizeDirective | undefined>;
|
|
33
|
+
private stripElement;
|
|
34
|
+
moreSizer: _angular_core.Signal<BsObserveSizeDirective | undefined>;
|
|
35
|
+
isMoreOpen: _angular_core.WritableSignal<boolean>;
|
|
36
|
+
windowWidth: _angular_core.WritableSignal<number>;
|
|
37
|
+
collapseAtPx: _angular_core.Signal<0 | 1400 | 1200 | 992 | 768 | 576 | null>;
|
|
38
|
+
forceCollapse: _angular_core.Signal<boolean>;
|
|
39
|
+
overflowOrder: _angular_core.Signal<BsPriorityNavItemDirective[]>;
|
|
40
|
+
itemWidths: _angular_core.Signal<Map<number, number>>;
|
|
41
|
+
itemGap: _angular_core.Signal<number>;
|
|
42
|
+
overflowingIds: _angular_core.Signal<Set<number>>;
|
|
43
|
+
hasAnyOverflow: _angular_core.Signal<boolean>;
|
|
44
|
+
showMoreButton: _angular_core.Signal<boolean>;
|
|
45
|
+
fullyCollapsed: _angular_core.Signal<boolean>;
|
|
46
|
+
itemsWithMeta: _angular_core.Signal<{
|
|
47
|
+
item: BsPriorityNavItemDirective;
|
|
48
|
+
hideBelowClass: string;
|
|
49
|
+
hideInline: boolean;
|
|
50
|
+
hideInOverflow: boolean;
|
|
51
|
+
}[]>;
|
|
52
|
+
constructor();
|
|
53
|
+
onWindowResize(): void;
|
|
54
|
+
toggleMore(): void;
|
|
55
|
+
onEscape(): void;
|
|
56
|
+
onDocumentClick(event: MouseEvent): void;
|
|
57
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsPriorityNavComponent, never>;
|
|
58
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsPriorityNavComponent, "bs-priority-nav", never, { "moreLabel": { "alias": "moreLabel"; "required": false; "isSignal": true; }; "moreLabelTemplate": { "alias": "moreLabelTemplate"; "required": false; "isSignal": true; }; "collapseAt": { "alias": "collapseAt"; "required": false; "isSignal": true; }; "overflowFrom": { "alias": "overflowFrom"; "required": false; "isSignal": true; }; "hideEmptyMore": { "alias": "hideEmptyMore"; "required": false; "isSignal": true; }; }, { "overflowChange": "overflowChange"; }, ["items"], never, true, never>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { BsPriorityNavComponent, BsPriorityNavItemDirective };
|
|
@@ -33,6 +33,10 @@ declare class BsResizableComponent {
|
|
|
33
33
|
element: ElementRef<any>;
|
|
34
34
|
resizeAction?: ResizeAction;
|
|
35
35
|
positioning: _angular_core.InputSignal<ResizablePositioning>;
|
|
36
|
+
horizontal: _angular_core.InputSignal<boolean>;
|
|
37
|
+
vertical: _angular_core.InputSignal<boolean>;
|
|
38
|
+
corners: _angular_core.InputSignal<boolean>;
|
|
39
|
+
showCorners: _angular_core.Signal<boolean>;
|
|
36
40
|
hostPosition: _angular_core.Signal<"position-absolute" | "position-relative">;
|
|
37
41
|
wrapperPosition: _angular_core.Signal<string[]>;
|
|
38
42
|
readonly presetPosition: _angular_core.InputSignal<PresetPosition | undefined>;
|
|
@@ -46,7 +50,7 @@ declare class BsResizableComponent {
|
|
|
46
50
|
left: _angular_core.WritableSignal<number | undefined>;
|
|
47
51
|
top: _angular_core.WritableSignal<number | undefined>;
|
|
48
52
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsResizableComponent, never>;
|
|
49
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsResizableComponent, "bs-resizable", never, { "positioning": { "alias": "positioning"; "required": false; "isSignal": true; }; "presetPosition": { "alias": "presetPosition"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
53
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsResizableComponent, "bs-resizable", never, { "positioning": { "alias": "positioning"; "required": false; "isSignal": true; }; "horizontal": { "alias": "horizontal"; "required": false; "isSignal": true; }; "vertical": { "alias": "vertical"; "required": false; "isSignal": true; }; "corners": { "alias": "corners"; "required": false; "isSignal": true; }; "presetPosition": { "alias": "presetPosition"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
50
54
|
}
|
|
51
55
|
|
|
52
56
|
interface PointerData {
|