@ngneers/controls 0.0.1-next.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/ngneers-controls-accordion.mjs +234 -0
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api-ng.mjs +959 -0
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api-resize.mjs +712 -0
- package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api.mjs +347 -0
- package/fesm2022/ngneers-controls-api.mjs.map +1 -0
- package/fesm2022/ngneers-controls-avatar.mjs +77 -0
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-base.mjs +620 -0
- package/fesm2022/ngneers-controls-base.mjs.map +1 -0
- package/fesm2022/ngneers-controls-breadcrumb.mjs +100 -0
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
- package/fesm2022/ngneers-controls-button-group.mjs +110 -0
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
- package/fesm2022/ngneers-controls-button.mjs +83 -0
- package/fesm2022/ngneers-controls-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-calendar-time-CJT5AFlA.mjs +74 -0
- package/fesm2022/ngneers-controls-calendar-time-CJT5AFlA.mjs.map +1 -0
- package/fesm2022/ngneers-controls-calendar.mjs +801 -0
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-checkbox.mjs +63 -0
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
- package/fesm2022/ngneers-controls-chip.mjs +55 -0
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
- package/fesm2022/ngneers-controls-default-icons.mjs +82 -0
- package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
- package/fesm2022/ngneers-controls-defer.mjs +72 -0
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
- package/fesm2022/ngneers-controls-dialog.mjs +407 -0
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -0
- package/fesm2022/ngneers-controls-directives.mjs +498 -0
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
- package/fesm2022/ngneers-controls-drawer.mjs +271 -0
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
- package/fesm2022/ngneers-controls-edit-inplace.mjs +127 -0
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
- package/fesm2022/ngneers-controls-errors.mjs +329 -0
- package/fesm2022/ngneers-controls-errors.mjs.map +1 -0
- package/fesm2022/ngneers-controls-filter.mjs +708 -0
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
- package/fesm2022/ngneers-controls-hint.mjs +153 -0
- package/fesm2022/ngneers-controls-hint.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n-translations-de.mjs +170 -0
- package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n-translations-en.mjs +170 -0
- package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n.mjs +57 -0
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon.mjs +195 -0
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -0
- package/fesm2022/ngneers-controls-inplace.mjs +150 -0
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input-field.mjs +165 -0
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input.mjs +72 -0
- package/fesm2022/ngneers-controls-input.mjs.map +1 -0
- package/fesm2022/ngneers-controls-item-view.mjs +473 -0
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
- package/fesm2022/ngneers-controls-list-box.mjs +281 -0
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -0
- package/fesm2022/ngneers-controls-mask-input.mjs +888 -0
- package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -0
- package/fesm2022/ngneers-controls-menu.mjs +371 -0
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
- package/fesm2022/ngneers-controls-message.mjs +30 -0
- package/fesm2022/ngneers-controls-message.mjs.map +1 -0
- package/fesm2022/ngneers-controls-number-input.mjs +366 -0
- package/fesm2022/ngneers-controls-number-input.mjs.map +1 -0
- package/fesm2022/ngneers-controls-paginator.mjs +129 -0
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
- package/fesm2022/ngneers-controls-popover.mjs +215 -0
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -0
- package/fesm2022/ngneers-controls-progress.mjs +98 -0
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
- package/fesm2022/ngneers-controls-radio.mjs +152 -0
- package/fesm2022/ngneers-controls-radio.mjs.map +1 -0
- package/fesm2022/ngneers-controls-roving-focus.mjs +323 -0
- package/fesm2022/ngneers-controls-roving-focus.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs +65 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroller.mjs +308 -0
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -0
- package/fesm2022/ngneers-controls-select-button.mjs +58 -0
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-select.mjs +417 -0
- package/fesm2022/ngneers-controls-select.mjs.map +1 -0
- package/fesm2022/ngneers-controls-slider.mjs +167 -0
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
- package/fesm2022/ngneers-controls-snackbar.mjs +414 -0
- package/fesm2022/ngneers-controls-snackbar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-spin-buttons.mjs +126 -0
- package/fesm2022/ngneers-controls-spin-buttons.mjs.map +1 -0
- package/fesm2022/ngneers-controls-spinner.mjs +184 -0
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
- package/fesm2022/ngneers-controls-splitter.mjs +604 -0
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
- package/fesm2022/ngneers-controls-state.mjs +185 -0
- package/fesm2022/ngneers-controls-state.mjs.map +1 -0
- package/fesm2022/ngneers-controls-switch.mjs +39 -0
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
- package/fesm2022/ngneers-controls-table.mjs +2634 -0
- package/fesm2022/ngneers-controls-table.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tabs.mjs +336 -0
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tag.mjs +30 -0
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
- package/fesm2022/ngneers-controls-toast.mjs +350 -0
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
- package/fesm2022/ngneers-controls-toggle-button.mjs +70 -0
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tooltip.mjs +506 -0
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tree.mjs +599 -0
- package/fesm2022/ngneers-controls-tree.mjs.map +1 -0
- package/fesm2022/ngneers-controls-upload.mjs +377 -0
- package/fesm2022/ngneers-controls-upload.mjs.map +1 -0
- package/fesm2022/ngneers-controls-utils-ng.mjs +411 -0
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
- package/fesm2022/ngneers-controls-utils.mjs +261 -0
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -0
- package/fesm2022/ngneers-controls.mjs +6 -0
- package/fesm2022/ngneers-controls.mjs.map +1 -0
- package/package.json +302 -0
- package/types/ngneers-controls-accordion.d.ts +139 -0
- package/types/ngneers-controls-api-ng.d.ts +364 -0
- package/types/ngneers-controls-api-resize.d.ts +318 -0
- package/types/ngneers-controls-api.d.ts +145 -0
- package/types/ngneers-controls-avatar.d.ts +54 -0
- package/types/ngneers-controls-base.d.ts +277 -0
- package/types/ngneers-controls-breadcrumb.d.ts +272 -0
- package/types/ngneers-controls-button-group.d.ts +46 -0
- package/types/ngneers-controls-button.d.ts +48 -0
- package/types/ngneers-controls-calendar.d.ts +466 -0
- package/types/ngneers-controls-checkbox.d.ts +40 -0
- package/types/ngneers-controls-chip.d.ts +202 -0
- package/types/ngneers-controls-default-icons.d.ts +5 -0
- package/types/ngneers-controls-defer.d.ts +48 -0
- package/types/ngneers-controls-dialog.d.ts +399 -0
- package/types/ngneers-controls-directives.d.ts +171 -0
- package/types/ngneers-controls-drawer.d.ts +308 -0
- package/types/ngneers-controls-edit-inplace.d.ts +263 -0
- package/types/ngneers-controls-errors.d.ts +155 -0
- package/types/ngneers-controls-filter.d.ts +609 -0
- package/types/ngneers-controls-hint.d.ts +88 -0
- package/types/ngneers-controls-i18n-translations-de.d.ts +164 -0
- package/types/ngneers-controls-i18n-translations-en.d.ts +164 -0
- package/types/ngneers-controls-i18n.d.ts +186 -0
- package/types/ngneers-controls-icon.d.ts +68 -0
- package/types/ngneers-controls-inplace.d.ts +98 -0
- package/types/ngneers-controls-input-field.d.ts +248 -0
- package/types/ngneers-controls-input.d.ts +30 -0
- package/types/ngneers-controls-item-view.d.ts +215 -0
- package/types/ngneers-controls-list-box.d.ts +334 -0
- package/types/ngneers-controls-mask-input.d.ts +434 -0
- package/types/ngneers-controls-menu.d.ts +192 -0
- package/types/ngneers-controls-message.d.ts +21 -0
- package/types/ngneers-controls-number-input.d.ts +146 -0
- package/types/ngneers-controls-paginator.d.ts +255 -0
- package/types/ngneers-controls-popover.d.ts +116 -0
- package/types/ngneers-controls-progress.d.ts +49 -0
- package/types/ngneers-controls-radio.d.ts +91 -0
- package/types/ngneers-controls-roving-focus.d.ts +107 -0
- package/types/ngneers-controls-scroll-shadow.d.ts +25 -0
- package/types/ngneers-controls-scroller.d.ts +151 -0
- package/types/ngneers-controls-select-button.d.ts +51 -0
- package/types/ngneers-controls-select.d.ts +409 -0
- package/types/ngneers-controls-slider.d.ts +57 -0
- package/types/ngneers-controls-snackbar.d.ts +330 -0
- package/types/ngneers-controls-spin-buttons.d.ts +69 -0
- package/types/ngneers-controls-spinner.d.ts +117 -0
- package/types/ngneers-controls-splitter.d.ts +465 -0
- package/types/ngneers-controls-state.d.ts +102 -0
- package/types/ngneers-controls-switch.d.ts +18 -0
- package/types/ngneers-controls-table.d.ts +3127 -0
- package/types/ngneers-controls-tabs.d.ts +118 -0
- package/types/ngneers-controls-tag.d.ts +21 -0
- package/types/ngneers-controls-toast.d.ts +298 -0
- package/types/ngneers-controls-toggle-button.d.ts +48 -0
- package/types/ngneers-controls-tooltip.d.ts +189 -0
- package/types/ngneers-controls-tree.d.ts +409 -0
- package/types/ngneers-controls-upload.d.ts +347 -0
- package/types/ngneers-controls-utils-ng.d.ts +129 -0
- package/types/ngneers-controls-utils.d.ts +130 -0
- package/types/ngneers-controls.d.ts +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngneers-controls-splitter.mjs","sources":["../../src/splitter/panel/splitter-panel.ts","../../src/splitter/panel/splitter-panel.html","../../src/splitter/splitter-calculator.ts","../../src/splitter/utils.ts","../../src/splitter/splitter.ts","../../src/splitter/splitter.html","../../src/splitter/module.ts","../../src/splitter/ngneers-controls-splitter.ts"],"sourcesContent":["import { Component, computed, input, model } from '@angular/core';\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\nimport { generateElementId } from '@ngneers/controls/utils-ng';\nimport { splitterControlTemplate } from '@ngneers/controls-themes/templates/splitter';\n\nimport type { SplitterPanelSize, SplitterPanelSizeLimit } from '../types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-splitter-panel',\n templateUrl: './splitter-panel.html',\n providers: [provideSelf(NgnSplitterPanel)],\n host: {\n role: 'region',\n '[style.grid-area]': 'gridArea()',\n '[aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledBy()',\n },\n})\nexport class NgnSplitterPanel extends NgnBase<'splitter'> {\n protected readonly theme = this.injectThemeTemplate(splitterControlTemplate, 'panel');\n private readonly _fallbackAreaName = generateElementId();\n\n /**\n * The name of the panel, used to identify it in the persisted splitter state and in {@link NgnSplitter.panelOrder}.\n * If nullish, a generated fallback name is used.\n */\n public readonly name = input<string | null>();\n /**\n * The size of the panel along the splitter's layout axis. Accepts `fr` or `px` units.\n * @default 1fr\n */\n public readonly size = model<SplitterPanelSize>('1fr');\n /**\n * The minimum size the panel can be resized to.\n * @default 0px\n */\n public readonly minSize = model<SplitterPanelSizeLimit>('0px');\n /**\n * The maximum size the panel can be resized to.\n * @default 100%\n */\n public readonly maxSize = model<SplitterPanelSizeLimit>('100%');\n\n /**\n * Sets the `aria-label` for the panel region.\n */\n public readonly ariaLabel = input<string | null>();\n /**\n * Sets the `aria-labelledby` for the panel region.\n */\n public readonly ariaLabelledBy = input<string | null>();\n\n protected readonly gridArea = computed(() => this.name() ?? this._fallbackAreaName);\n}\n","<ng-content />\n","import { computed, EmbeddedViewRef, signal, type Signal } from '@angular/core';\nimport {\n ResizeEngine,\n type ResizableItem,\n type ResizeDistributionMode,\n type ResizeSize,\n} from '@ngneers/controls/api/resize';\nimport { Logger, throwExp } from '@ngneers/controls/utils';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { NgnSplitter } from './splitter';\n\nimport type { SplitterLayout } from './types';\n\n/**\n * Type interface for the {@link SplitterCalculator} interface.\n */\nexport interface SplitterCalculatorType {\n new (splitter: NgnSplitter): SplitterCalculator;\n}\n\n/**\n * Represents a calculator for the {@link NgnSplitter} component, handling panel sizes, drag events, and min/max size constraints.\n * This interface defines the methods and properties required for managing the splitter's layout and behavior.\n */\nexport interface SplitterCalculator {\n /**\n * Signal that provides the ordered list of panels in the splitter.\n */\n orderedPanels: Signal<readonly NgnSplitterPanel[]>;\n\n /**\n * Signal that provides the grid template sizes for the splitter (to use in `grid-template-rows` or `grid-template-columns` CSS properties).\n */\n gridTemplateSizes: Signal<string>;\n\n /**\n * Signal that provides the grid template areas for the splitter (to use in `grid-template-areas` CSS property).\n */\n gridTemplateAreas: Signal<string | null>;\n\n /**\n * Signal that provides the current drag context. Returns `null` if no drag is in progress.\n */\n dragContext: Signal<SplitterDragContext | null>;\n\n /**\n * Signal that provides the minimum size of the splitter, calculated based on the panels' min sizes and dividers.\n */\n minSize: Signal<string>;\n\n /**\n * Signal that provides the maximum size of the splitter, calculated based on the panels' max sizes and dividers.\n */\n maxSize: Signal<string>;\n\n /**\n * Starts a drag operation for the specified divider index.\n * @param index The index of the divider to start dragging.\n * @param event The pointer event that initiated the drag.\n */\n startDrag(index: number, event: PointerEvent): void;\n\n /**\n * Handles the drag operation for the specified divider index.\n * @param index The index of the divider being dragged.\n * @param event The pointer event that is being processed during the drag.\n */\n drag(index: number, event: PointerEvent): void;\n\n /**\n * Ends the drag operation for the specified divider index.\n * @param index The index of the divider being dragged.\n * @param event The pointer event that ended the drag.\n * @param isCancel Whether the drag operation was cancelled. If true, the panel sizes will be reset to their original values.\n */\n endDrag(index: number, event: PointerEvent, isCancel: boolean): void;\n\n /**\n * Moves the divider at the specified index by the given pixel delta.\n * @param index The index of the divider to move.\n * @param pxDelta The pixel delta to move the divider by. Positive values move the divider to the right (or down), negative values move it to the left (or up).\n */\n moveDivider(index: number, pxDelta: number): void;\n}\n\n/**\n * Represents the context of a drag operation in the splitter.\n */\nexport type SplitterDragContext = {\n /**\n * The index of the divider being dragged.\n */\n dividerIndex: number;\n /**\n * The ID of the pointer that initiated the drag operation.\n */\n pointerId: number;\n /**\n * The starting position of the pointer when the drag operation started, in pixels.\n */\n startPosition: number;\n};\n\n/**\n * Default implementation of the {@link SplitterCalculator} interface.\n * Delegates all resize math to the generic {@link ResizeEngine}.\n */\nexport class DefaultSplitterCalculator implements SplitterCalculator {\n protected readonly panels: Signal<readonly NgnSplitterPanel[]>;\n protected readonly dividers: Signal<readonly EmbeddedViewRef<unknown>[]>;\n protected readonly panelOrder: Signal<readonly string[] | null | undefined>;\n protected readonly layout: Signal<SplitterLayout>;\n protected readonly splitterSize: Signal<number>;\n\n private readonly _engine: ResizeEngine;\n\n constructor(splitter: NgnSplitter) {\n this.panels = splitter.panels;\n this.dividers = splitter.dividers;\n this.panelOrder = splitter.panelOrder;\n this.layout = splitter.layout;\n this.splitterSize = computed(() =>\n this.layout() === 'vertical' ? splitter.elementSize().height : splitter.elementSize().width\n );\n\n // Create the resize engine with panels mapped as ResizableItems\n this._engine = new ResizeEngine({\n items: computed(() => this.orderedPanels() as unknown as readonly ResizableItem[]),\n containerSize: this.splitterSize,\n gapSizes: this.dividerSizes,\n distributionMode: computed(\n () => (splitter.resizeMode?.() ?? 'adjacent') as ResizeDistributionMode\n ),\n containerConstrained: signal(true), // Splitter is always constrained\n lockSizes: computed(() => splitter.lockSizes?.() ?? false),\n });\n }\n\n public readonly orderedPanels = computed(() => {\n const panels = this.panels();\n const order = this.panelOrder();\n return order\n ? [...panels].sort((a, b) => {\n const aIndex = order.indexOf(a['gridArea']());\n const bIndex = order.indexOf(b['gridArea']());\n if (aIndex === -1 && bIndex === -1) return 0;\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n return aIndex - bIndex;\n })\n : panels;\n });\n\n public readonly gridTemplateSizes = computed(() => this._engine.gridTemplateSizes());\n\n public readonly gridTemplateAreas = computed(() => {\n const panels = this.orderedPanels();\n if (panels.length === 0) return null;\n let result = '';\n panels.forEach((panel, i) => {\n if (i > 0) {\n result +=\n this.layout() === 'horizontal' ? ` ngn-divider-${i - 1} ` : ` \"ngn-divider-${i - 1}\" `;\n }\n result += this.layout() === 'horizontal' ? panel['gridArea']() : `\"${panel['gridArea']()}\"`;\n });\n return this.layout() === 'horizontal' ? `\"${result}\"` : result;\n });\n\n public readonly minSize = computed(() => this._engine.minTotalSize());\n\n public readonly maxSize = computed(() => this._engine.maxTotalSize());\n\n public readonly dragContext = signal<SplitterDragContext | null>(null);\n\n protected readonly dividerSizes = computed(() =>\n this.dividers().map(d => {\n const el = d.rootNodes.find(x => x instanceof HTMLElement);\n return el ? (this.layout() === 'horizontal' ? el.offsetWidth : el.offsetHeight) : 0;\n })\n );\n\n public startDrag(index: number, event: PointerEvent) {\n const panels = this.orderedPanels();\n if (index < 0 || index >= panels.length - 1) return;\n\n const startPosition = this.layout() === 'horizontal' ? event.clientX : event.clientY;\n\n this.dragContext.set({\n dividerIndex: index,\n pointerId: event.pointerId,\n startPosition,\n });\n\n this._engine.startDrag(index, startPosition);\n }\n\n public drag(index: number, event: PointerEvent) {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== index || ctx.pointerId !== event.pointerId) return;\n\n const currentPosition = this.layout() === 'horizontal' ? event.clientX : event.clientY;\n this._engine.drag(index, currentPosition);\n }\n\n public endDrag(index: number, event: PointerEvent, isCancel: boolean) {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== index || ctx.pointerId !== event.pointerId) return;\n\n this._engine.endDrag(index, isCancel);\n this.dragContext.set(null);\n }\n\n public moveDivider(index: number, pxDelta: number) {\n const panels = this.orderedPanels();\n if (index < 0 || index >= panels.length - 1) return;\n\n const leftPanel =\n panels[index] ??\n throwExp('NgnSplitterCalculator', `Left panel is missing for divider at index ${index}`);\n const rightPanel =\n panels[index + 1] ??\n throwExp('NgnSplitterCalculator', `Right panel is missing for divider at index ${index}`);\n\n if (\n !this._engine.isItemSizeCalculated(leftPanel as unknown as ResizableItem) ||\n !this._engine.isItemSizeCalculated(rightPanel as unknown as ResizableItem)\n ) {\n Logger.warn('Cannot move divider, panel sizes are not calculated');\n return;\n }\n\n this._engine.moveDivider(index, pxDelta);\n }\n\n /**\n * Ensures all panels respect their min/max size constraints.\n * Delegates to the underlying {@link ResizeEngine}.\n */\n public ensureMinMaxSizes() {\n this._engine.ensureMinMaxSizes();\n }\n\n /** @internal — used by tests to seed panel sizes into the engine. */\n public setPanelSize(panel: NgnSplitterPanel, size: string) {\n this._engine.setItemSize(panel as unknown as ResizableItem, size as ResizeSize);\n }\n}\n","import type {\n SplitterPanelSize,\n SplitterPanelSizeLimit,\n SplitterPanelSizeLimitUnit,\n SplitterPanelSizeUnit,\n} from './types';\n\nexport type ExpandedSplitterPanelSize = {\n value: number;\n unit: SplitterPanelSizeUnit;\n};\nexport type ExpandedSplitterPanelSizeLimit = {\n value: number;\n unit: SplitterPanelSizeLimitUnit;\n};\n\nexport function isSplitterPanelSize(value: unknown): value is SplitterPanelSize {\n if (typeof value !== 'string') return false;\n const m = value.match(/^(.+)(px|fr)$/);\n if (!m || !m[1]) return false;\n if (isNaN(parseFloat(m[1]))) return false;\n return true;\n}\n\nexport function getSplitterPanelSizeUnit(value: SplitterPanelSize): SplitterPanelSizeUnit {\n return value.slice(-2) as SplitterPanelSizeUnit;\n}\n\nexport function getSplitterPanelSizeValue(value: SplitterPanelSize): number {\n return parseFloat(value.slice(0, -2));\n}\n\nexport function isSplitterPanelSizeLimit(value: unknown): value is SplitterPanelSize {\n if (typeof value !== 'string') return false;\n const m = value.match(/^(.+)(px|%)$/);\n if (!m || !m[1]) return false;\n if (isNaN(parseFloat(m[1]))) return false;\n return true;\n}\n\nexport function getSplitterPanelSizeLimitUnit(\n value: SplitterPanelSizeLimit\n): SplitterPanelSizeLimitUnit {\n return value.endsWith('px') ? 'px' : '%';\n}\n\nexport function getSplitterPanelSizeLimitValue(value: SplitterPanelSizeLimit): number {\n return value.endsWith('px') ? parseFloat(value.slice(0, -2)) : parseFloat(value.slice(0, -1));\n}\n\nexport function getSplitterPanelSizeLimitInPx(\n value: SplitterPanelSizeLimit,\n totalSize: number\n): number {\n const unit = getSplitterPanelSizeLimitUnit(value);\n const sizeValue = getSplitterPanelSizeLimitValue(value);\n return unit === 'px' ? sizeValue : (sizeValue / 100) * totalSize;\n}\n\nexport function expandSplitterPanelSize(value: SplitterPanelSize): ExpandedSplitterPanelSize {\n return {\n value: getSplitterPanelSizeValue(value),\n unit: getSplitterPanelSizeUnit(value),\n };\n}\n\nexport function expandSplitterPanelSizeLimit(\n value: SplitterPanelSizeLimit\n): ExpandedSplitterPanelSizeLimit {\n return {\n value: getSplitterPanelSizeLimitValue(value),\n unit: getSplitterPanelSizeLimitUnit(value),\n };\n}\n\nexport function collapseSplitterPanelSize(size: ExpandedSplitterPanelSize): SplitterPanelSize {\n return `${size.value}${size.unit}`;\n}\n\nexport function collapseSplitterPanelSizeLimit(\n size: ExpandedSplitterPanelSizeLimit\n): SplitterPanelSizeLimit {\n return `${size.value}${size.unit}`;\n}\n","import {\n afterRenderEffect,\n Component,\n computed,\n contentChildren,\n EmbeddedViewRef,\n inject,\n input,\n model,\n type OnDestroy,\n output,\n runInInjectionContext,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n elementSizeSignal,\n NGN_CONFIG,\n NgnTemplate,\n templateTypeFn,\n} from '@ngneers/controls/api/ng';\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { Logger, NgnError } from '@ngneers/controls/utils';\nimport { type NgnStateStorage, registerState } from '@ngneers/controls/utils-ng';\nimport { splitterControlTemplate } from '@ngneers/controls-themes/templates/splitter';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { DefaultSplitterCalculator, type SplitterCalculatorType } from './splitter-calculator';\nimport { isSplitterPanelSize } from './utils';\n\nimport type { SplitterLayout, SplitterResizeMode, SplitterState, SplitterStateData } from './types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-splitter',\n templateUrl: './splitter.html',\n imports: [NgnPt, NgnTemplate],\n providers: [provideSelf(NgnSplitter)],\n host: {\n role: 'region',\n '[style.grid-template-columns]': `layout() === 'horizontal' ? calculator().gridTemplateSizes() : null`,\n '[style.grid-template-rows]': `layout() === 'vertical' ? calculator().gridTemplateSizes() : null`,\n '[style.grid-template-areas]': 'calculator().gridTemplateAreas()',\n '[style.max-width]': `layout() === 'horizontal' ? calculator().maxSize() : null`,\n '[style.max-height]': `layout() === 'vertical' ? calculator().maxSize() : null`,\n '[style.min-width]': `layout() === 'horizontal' ? calculator().minSize() : null`,\n '[style.min-height]': `layout() === 'vertical' ? calculator().minSize() : null`,\n },\n})\nexport class NgnSplitter extends NgnBase<'splitter'> implements OnDestroy {\n private readonly _viewContainer = inject(ViewContainerRef);\n private readonly _config = inject(NGN_CONFIG);\n protected readonly theme = this.injectThemeTemplate(splitterControlTemplate, {\n root: true,\n dragging: () => this.isDragging(),\n horizontal: () => this.layout() === 'horizontal',\n vertical: () => this.layout() === 'vertical',\n });\n protected readonly translations = inject(I18n).translations;\n\n /**\n * The layout of the splitter.\n */\n public readonly layout = model.required<SplitterLayout>();\n /**\n * A array of panel names that defines the order of panels.\n * If nullish, the order is determined by the order the panels are defined in the template.\n */\n public readonly panelOrder = model<string[] | null>();\n /**\n * The storage to use for saving the splitter state.\n * @default `session`\n */\n public readonly stateStorage = input<NgnStateStorage>(\n this._config.defaults.splitter.stateStorage\n );\n /**\n * The key to use for saving the splitter state.\n * If nullish, the state will not be saved.\n */\n public readonly stateKey = input<string | null>();\n /**\n * The type of data to save in the splitter state.\n * @default `['layout', 'panelOrder', 'panelSizes']`\n */\n public readonly stateData = input<readonly SplitterStateData[]>([\n 'layout',\n 'panelOrder',\n 'panelSizes',\n ]);\n /**\n * The type of calculator to use for the splitter.\n * @default `DefaultSplitterCalculator`\n */\n public readonly calculatorType = input<SplitterCalculatorType>(DefaultSplitterCalculator);\n /**\n * The resize distribution mode for the splitter.\n * - `'adjacent'`: Only the panels adjacent to the divider are resized.\n * - `'proportional'`: The deficit is distributed proportionally across all panels on the other side.\n * @default adjacent\n */\n public readonly resizeMode = input<SplitterResizeMode>('adjacent');\n /**\n * Whether to lock affected panels to fixed `px` values after a resize completes.\n * When `true`, panels whose size changed are converted from their original unit to `px`.\n * When `false`, panels keep their original units (`fr`, `px`).\n * @default false\n */\n public readonly lockSizes = input<boolean>(false);\n /**\n * The step size for moving the dividers using the keyboard.\n * This can be a pixel value (e.g., '5px') or a percentage value (e.g., '5%').\n * If a percentage is used, it will be calculated based on the size of the splitter element.\n * @default '5px'\n */\n public readonly step = input<`${number}${'%' | 'px'}`>('5px');\n\n /**\n * Event emitted when the splitter state is being saved.\n * This can be used to modify the state before it is saved.\n */\n public readonly stateSaving = output<SplitterState>();\n /**\n * Event emitted when the splitter state is loaded.\n * This can be used to modify the state before it is applied or to perform actions based on the loaded state.\n */\n public readonly stateLoading = output<SplitterState>();\n\n protected readonly dividerTemplateType = templateTypeFn<never, { index: number }>();\n private readonly _dividerTemplate =\n viewChild.required<TemplateRef<typeof this.dividerTemplateType>>('defaultDividerTemplate');\n\n /**\n * The current dividers in the splitter.\n */\n public readonly dividers = signal<EmbeddedViewRef<typeof this.dividerTemplateType>[]>([]);\n /**\n * The current panels in the splitter.\n */\n public readonly panels = contentChildren(NgnSplitterPanel);\n /**\n * The current size of the splitter element.\n */\n public readonly elementSize = elementSizeSignal(this.element);\n\n /**\n * A value indicating whether the splitter is currently being dragged.\n */\n public readonly isDragging = computed(() => this.calculator().dragContext() !== null);\n\n protected readonly calculator = computed(() => {\n const calculatorType = this.calculatorType();\n return untracked(() => runInInjectionContext(this.injector, () => new calculatorType(this)));\n });\n\n constructor() {\n super();\n\n afterRenderEffect(() => {\n const panels = this.panels();\n this.updateDividers(panels);\n });\n\n registerState({\n storage: () => this.stateStorage(),\n key: () => this.stateKey(),\n valueFn: this.computeState.bind(this),\n onLoad: this.onStateLoad.bind(this),\n debounce: 100,\n });\n }\n\n public ngOnDestroy(): void {\n // Clean up dividers\n this.dividers().forEach(divider => divider.destroy());\n this.dividers.set([]);\n }\n\n protected onHandlePointerDown(index: number, event: PointerEvent) {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n throw new Error('Event target is not an HTMLElement');\n }\n // Make sure the element is stable before capturing the pointer\n requestAnimationFrame(() => {\n try {\n target.setPointerCapture(event.pointerId);\n } catch {\n // Ignore errors if the element is not capable of capturing the pointer\n }\n });\n\n this.calculator().startDrag(index, event);\n }\n\n protected onHandlePointerMove(index: number, event: PointerEvent) {\n this.calculator().drag(index, event);\n }\n\n protected onHandlePointerUp(index: number, event: PointerEvent) {\n this.calculator().endDrag(index, event, false);\n }\n\n protected onHandlePointerCancel(index: number, event: PointerEvent) {\n this.calculator().endDrag(index, event, true);\n }\n\n protected onHandleKeyDown(index: number, event: KeyboardEvent) {\n if (\n (event.key === 'ArrowLeft' && this.layout() === 'horizontal') ||\n (event.key === 'ArrowUp' && this.layout() === 'vertical')\n ) {\n this.calculator().moveDivider(index, -this.getStepInPx());\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (\n (event.key === 'ArrowRight' && this.layout() === 'horizontal') ||\n (event.key === 'ArrowDown' && this.layout() === 'vertical')\n ) {\n this.calculator().moveDivider(index, this.getStepInPx());\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (event.key === 'Home') {\n this.calculator().moveDivider(index, Number.NEGATIVE_INFINITY);\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (event.key === 'End') {\n this.calculator().moveDivider(index, Number.POSITIVE_INFINITY);\n event.preventDefault(); // Prevent default scrolling behavior\n }\n }\n\n private updateDividers(panels: readonly NgnSplitterPanel[]) {\n this.dividers.update(divider => {\n if (divider.length === panels.length - 1) {\n return divider; // No need to update if the number of dividers matches the number of panels\n } else if (divider.length < panels.length - 1) {\n // Add missing dividers\n const newDividers = [...divider];\n for (let i = divider.length; i < panels.length - 1; i++) {\n newDividers.push(this.createDivider(i));\n }\n return newDividers;\n } else {\n // More dividers than needed, remove the excess\n divider.slice(panels.length - 1).forEach(divider => divider.destroy());\n return divider.slice(0, panels.length - 1);\n }\n });\n\n // Move dividers to the correct positions (skip first panel — no divider before it)\n for (let i = 1; i < panels.length; i++) {\n const panel = panels[i]!;\n const divider = this.dividers()[i - 1];\n if (!divider) {\n throw new NgnError('NgnSplitter', `Divider is missing for panel at index ${i}`);\n }\n this.moveDividerBefore(panel, divider);\n }\n }\n\n private createDivider(index: number) {\n const viewRef = this._viewContainer.createEmbeddedView(this._dividerTemplate(), { index });\n viewRef.detectChanges();\n return viewRef;\n }\n\n private moveDividerBefore(panel: NgnSplitterPanel, divider: EmbeddedViewRef<unknown>) {\n const panelElement = panel.element.nativeElement;\n divider.rootNodes.forEach(node => {\n if (node instanceof HTMLElement) {\n panelElement.parentElement?.insertBefore(node, panelElement);\n }\n });\n }\n\n private computeState(previousState: SplitterState | null) {\n const data = this.stateData();\n const state: SplitterState = {\n layout: data.includes('layout') ? this.layout() : undefined,\n panelOrder: data.includes('panelOrder') ? this.panelOrder() : undefined,\n panelSizes: data.includes('panelSizes')\n ? this.panels().reduce(\n (acc, panel, index) => {\n acc[panel.name() || `ngn-panel-${index}`] = panel.size();\n return acc;\n },\n { ...previousState?.panelSizes }\n )\n : undefined,\n };\n\n this.stateSaving.emit(state);\n\n return state;\n }\n\n private onStateLoad(state: SplitterState | null) {\n if (state) {\n this.ensureValidState(state);\n this.stateLoading.emit(state);\n this.applyFromState(state);\n }\n return state;\n }\n\n private ensureValidState(state: SplitterState): void {\n if (state.layout && state.layout !== 'horizontal' && state.layout !== 'vertical') {\n Logger.warn(`Invalid layout in saved splitter state.`, { state });\n delete state.layout;\n }\n\n if (\n state.panelOrder &&\n (!Array.isArray(state.panelOrder) || state.panelOrder.some(x => typeof x !== 'string'))\n ) {\n Logger.warn(`Invalid panelOrder in saved splitter state.`, { state });\n delete state.panelOrder;\n }\n\n if (\n state.panelSizes &&\n (typeof state.panelSizes !== 'object' ||\n state.panelSizes === null ||\n Object.values(state.panelSizes).some(x => !isSplitterPanelSize(x)))\n ) {\n Logger.warn(`Invalid panelSizes in saved splitter state.`, { state });\n delete state.panelSizes;\n }\n }\n\n private applyFromState(state: SplitterState) {\n if (state.layout && this.stateData().includes('layout')) {\n this.layout.set(state.layout);\n }\n if (state.panelOrder && this.stateData().includes('panelOrder')) {\n this.panelOrder.set(state.panelOrder);\n }\n if (state.panelSizes && this.stateData().includes('panelSizes')) {\n const panels = this.panels();\n for (let i = 0; i < panels.length; i++) {\n const panelName = panels[i]?.name() || `ngn-panel-${i}`;\n if (panelName in state.panelSizes) {\n const panelSize = state.panelSizes[panelName];\n if (!panelSize) {\n continue;\n }\n panels[i]?.size.set(panelSize);\n }\n }\n }\n }\n\n /**\n * The divider's current position as a percentage (0–100) of the total panel\n * content size, used for `aria-valuenow` on the `role=\"separator\"` handle.\n * Reads `gridTemplateSizes()` to stay reactive to resizes, then measures the\n * rendered panel sizes on either side of the divider.\n */\n protected dividerValueNow(index: number): number {\n // ponytail: DOM-offset heuristic; one CD-frame lag during drag is fine for\n // an aria value. Swap for an engine-reported px signal if exactness matters.\n this.calculator().gridTemplateSizes(); // reactive trigger\n const panels = this.calculator().orderedPanels();\n const horizontal = this.layout() === 'horizontal';\n let before = 0;\n let total = 0;\n panels.forEach((panel, i) => {\n const el = panel.element.nativeElement;\n const size = horizontal ? el.offsetWidth : el.offsetHeight;\n total += size;\n if (i <= index) before += size;\n });\n return total > 0 ? Math.round((before / total) * 100) : 0;\n }\n\n private getStepInPx(): number {\n const step = this.step();\n if (step.endsWith('px')) {\n return parseFloat(step.slice(0, -2));\n } else if (step.endsWith('%')) {\n const size =\n this.layout() === 'horizontal' ? this.elementSize().width : this.elementSize().height;\n return (parseFloat(step.slice(0, -1)) / 100) * size;\n } else {\n Logger.warn(`Invalid step value: ${step}.`);\n return 10; // Default step in pixels\n }\n }\n}\n","<ng-content />\n\n<ng-template #defaultDividerTemplate [ngnTemplate]=\"dividerTemplateType\" let-index=\"index\">\n <div\n [style.grid-area]=\"`ngn-divider-${index}`\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n divider: true,\n 'divider-dragging': calculator().dragContext()?.dividerIndex === index,\n }\"\n >\n <button\n role=\"separator\"\n [aria-orientation]=\"layout()\"\n [aria-label]=\"translations['splitter_handleLabel']()\"\n [attr.aria-valuenow]=\"dividerValueNow(index)\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [ptInt]=\"this\"\n [ptClass]=\"'divider-handle'\"\n (pointerdown)=\"onHandlePointerDown(index, $event)\"\n (pointermove)=\"onHandlePointerMove(index, $event)\"\n (pointerup)=\"onHandlePointerUp(index, $event)\"\n (pointercancel)=\"onHandlePointerCancel(index, $event)\"\n (keydown)=\"onHandleKeyDown(index, $event)\"\n ></button>\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { NgnSplitter } from './splitter';\n\n// This module is just for grouping the Splitter and SplitterPanel components for convenience.\n// The components are standalone and can be used without this module.\n\n@NgModule({\n imports: [NgnSplitter, NgnSplitterPanel],\n exports: [NgnSplitter, NgnSplitterPanel],\n})\nexport class NgnSplitterModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AAOA;;AAEG;AAYG,MAAO,gBAAiB,SAAQ,OAAmB,CAAA;IACpC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,OAAO,CAAC;IACpE,iBAAiB,GAAG,iBAAiB,EAAE;AAExD;;;AAGG;AACa,IAAA,IAAI,GAAG,KAAK;wFAAiB;AAC7C;;;AAGG;IACa,IAAI,GAAG,KAAK,CAAoB,KAAK;6EAAC;AACtD;;;AAGG;IACa,OAAO,GAAG,KAAK,CAAyB,KAAK;gFAAC;AAC9D;;;AAGG;IACa,OAAO,GAAG,KAAK,CAAyB,MAAM;gFAAC;AAE/D;;AAEG;AACa,IAAA,SAAS,GAAG,KAAK;6FAAiB;AAClD;;AAEG;AACa,IAAA,cAAc,GAAG,KAAK;kGAAiB;AAEpC,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,iBAAiB;iFAAC;uGAlCxE,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,YAAA,EAAA,OAAA,EAAA,eAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,SAAA,EARhB,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,iDCb5C,kBACA,EAAA,CAAA;;2FDoBa,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAX5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,SAAA,EAEnB,CAAC,WAAW,CAAA,gBAAA,CAAkB,CAAC,EAAA,IAAA,EACpC;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,mBAAmB,EAAE,YAAY;AACjC,wBAAA,cAAc,EAAE,aAAa;AAC7B,wBAAA,wBAAwB,EAAE,kBAAkB;AAC7C,qBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA;;;AEqFH;;;AAGG;MACU,yBAAyB,CAAA;AACjB,IAAA,MAAM;AACN,IAAA,QAAQ;AACR,IAAA,UAAU;AACV,IAAA,MAAM;AACN,IAAA,YAAY;AAEd,IAAA,OAAO;AAExB,IAAA,WAAA,CAAY,QAAqB,EAAA;AAC/B,QAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;AAC7B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ;AACjC,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;AACrC,QAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;AAC7B,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAC3B,IAAI,CAAC,MAAM,EAAE,KAAK,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK;yFAC5F;;AAGD,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC;YAC9B,KAAK,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAyC,CAAC;YAClF,aAAa,EAAE,IAAI,CAAC,YAAY;YAChC,QAAQ,EAAE,IAAI,CAAC,YAAY;AAC3B,YAAA,gBAAgB,EAAE,QAAQ,CACxB,OAAO,QAAQ,CAAC,UAAU,IAAI,IAAI,UAAU,CAA2B,CACxE;AACD,YAAA,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,QAAQ,CAAC,MAAM,QAAQ,CAAC,SAAS,IAAI,IAAI,KAAK,CAAC;AAC3D,SAAA,CAAC;IACJ;AAEgB,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,OAAO;AACL,cAAE,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACxB,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;AAC7C,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;AAAE,oBAAA,OAAO,CAAC;gBAC5C,IAAI,MAAM,KAAK,CAAC,CAAC;AAAE,oBAAA,OAAO,CAAC;gBAC3B,IAAI,MAAM,KAAK,CAAC,CAAC;oBAAE,OAAO,CAAC,CAAC;gBAC5B,OAAO,MAAM,GAAG,MAAM;AACxB,YAAA,CAAC;cACD,MAAM;IACZ,CAAC;sFAAC;IAEc,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;0FAAC;AAEpE,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACpC,IAAI,MAAM,GAAG,EAAE;QACf,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE;gBACT,MAAM;oBACJ,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,GAAG,CAAA,aAAA,EAAgB,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA,EAAA,CAAI;YAC1F;YACA,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAA,CAAA,CAAG;AAC7F,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,GAAG,MAAM;IAChE,CAAC;0FAAC;IAEc,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;gFAAC;IAErD,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;gFAAC;IAErD,WAAW,GAAG,MAAM,CAA6B,IAAI;oFAAC;AAEnD,IAAA,YAAY,GAAG,QAAQ,CAAC,MACzC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAG;AACtB,QAAA,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC;AAC1D,QAAA,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,GAAG,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC;AACrF,IAAA,CAAC,CAAC;qFACH;IAEM,SAAS,CAAC,KAAa,EAAE,KAAmB,EAAA;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;QACnC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE;QAE7C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;AAEpF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACnB,YAAA,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,aAAa;AACd,SAAA,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9C;IAEO,IAAI,CAAC,KAAa,EAAE,KAAmB,EAAA;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;YAAE;QAE7E,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;QACtF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC;IAC3C;AAEO,IAAA,OAAO,CAAC,KAAa,EAAE,KAAmB,EAAE,QAAiB,EAAA;AAClE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;YAAE;QAE7E,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;IAEO,WAAW,CAAC,KAAa,EAAE,OAAe,EAAA;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;QACnC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE;AAE7C,QAAA,MAAM,SAAS,GACb,MAAM,CAAC,KAAK,CAAC;AACb,YAAA,QAAQ,CAAC,uBAAuB,EAAE,8CAA8C,KAAK,CAAA,CAAE,CAAC;AAC1F,QAAA,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;AACjB,YAAA,QAAQ,CAAC,uBAAuB,EAAE,+CAA+C,KAAK,CAAA,CAAE,CAAC;QAE3F,IACE,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAqC,CAAC;YACzE,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAsC,CAAC,EAC1E;AACA,YAAA,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC;YAClE;QACF;QAEA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;IAC1C;AAEA;;;AAGG;IACI,iBAAiB,GAAA;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;IAClC;;IAGO,YAAY,CAAC,KAAuB,EAAE,IAAY,EAAA;QACvD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAiC,EAAE,IAAkB,CAAC;IACjF;AACD;;ACxOK,SAAU,mBAAmB,CAAC,KAAc,EAAA;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC;AACtC,IAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,KAAK;IAC7B,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,KAAK;AACzC,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,wBAAwB,CAAC,KAAwB,EAAA;AAC/D,IAAA,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAA0B;AACjD;AAEM,SAAU,yBAAyB,CAAC,KAAwB,EAAA;AAChE,IAAA,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACvC;AAEM,SAAU,wBAAwB,CAAC,KAAc,EAAA;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;AACrC,IAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,KAAK;IAC7B,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,KAAK;AACzC,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,6BAA6B,CAC3C,KAA6B,EAAA;AAE7B,IAAA,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG;AAC1C;AAEM,SAAU,8BAA8B,CAAC,KAA6B,EAAA;AAC1E,IAAA,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/F;AAEM,SAAU,6BAA6B,CAC3C,KAA6B,EAC7B,SAAiB,EAAA;AAEjB,IAAA,MAAM,IAAI,GAAG,6BAA6B,CAAC,KAAK,CAAC;AACjD,IAAA,MAAM,SAAS,GAAG,8BAA8B,CAAC,KAAK,CAAC;AACvD,IAAA,OAAO,IAAI,KAAK,IAAI,GAAG,SAAS,GAAG,CAAC,SAAS,GAAG,GAAG,IAAI,SAAS;AAClE;AAEM,SAAU,uBAAuB,CAAC,KAAwB,EAAA;IAC9D,OAAO;AACL,QAAA,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,EAAE,wBAAwB,CAAC,KAAK,CAAC;KACtC;AACH;AAEM,SAAU,4BAA4B,CAC1C,KAA6B,EAAA;IAE7B,OAAO;AACL,QAAA,KAAK,EAAE,8BAA8B,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,EAAE,6BAA6B,CAAC,KAAK,CAAC;KAC3C;AACH;AAEM,SAAU,yBAAyB,CAAC,IAA+B,EAAA;IACvE,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAA,CAAE;AACpC;AAEM,SAAU,8BAA8B,CAC5C,IAAoC,EAAA;IAEpC,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAA,CAAE;AACpC;;AC/CA;;AAEG;AAiBG,MAAO,WAAY,SAAQ,OAAmB,CAAA;AACjC,IAAA,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACzC,IAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC1B,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,EAAE;AAC3E,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;QACjC,UAAU,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY;QAChD,QAAQ,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,UAAU;AAC7C,KAAA,CAAC;AACiB,IAAA,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY;AAE3D;;AAEG;IACa,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAAkB;AACzD;;;AAGG;AACa,IAAA,UAAU,GAAG,KAAK;8FAAmB;AACrD;;;AAGG;IACa,YAAY,GAAG,KAAK,CAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY;qFAC5C;AACD;;;AAGG;AACa,IAAA,QAAQ,GAAG,KAAK;4FAAiB;AACjD;;;AAGG;IACa,SAAS,GAAG,KAAK,CAA+B;QAC9D,QAAQ;QACR,YAAY;QACZ,YAAY;AACb,KAAA;kFAAC;AACF;;;AAGG;IACa,cAAc,GAAG,KAAK,CAAyB,yBAAyB;uFAAC;AACzF;;;;;AAKG;IACa,UAAU,GAAG,KAAK,CAAqB,UAAU;mFAAC;AAClE;;;;;AAKG;IACa,SAAS,GAAG,KAAK,CAAU,KAAK;kFAAC;AACjD;;;;;AAKG;IACa,IAAI,GAAG,KAAK,CAA2B,KAAK;6EAAC;AAE7D;;;AAGG;IACa,WAAW,GAAG,MAAM,EAAiB;AACrD;;;AAGG;IACa,YAAY,GAAG,MAAM,EAAiB;IAEnC,mBAAmB,GAAG,cAAc,EAA4B;AAClE,IAAA,gBAAgB,GAC/B,SAAS,CAAC,QAAQ,CAA+C,wBAAwB,CAAC;AAE5F;;AAEG;IACa,QAAQ,GAAG,MAAM,CAAqD,EAAE;iFAAC;AACzF;;AAEG;IACa,MAAM,GAAG,eAAe,CAAC,gBAAgB;+EAAC;AAC1D;;AAEG;AACa,IAAA,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;AAE7D;;AAEG;AACa,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI;mFAAC;AAElE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;QAC5C,OAAO,SAAS,CAAC,MAAM,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,CAAC;mFAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QAEP,iBAAiB,CAAC,MAAK;AACrB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAC7B,QAAA,CAAC,CAAC;AAEF,QAAA,aAAa,CAAC;AACZ,YAAA,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;AAClC,YAAA,GAAG,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;YAC1B,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,YAAA,QAAQ,EAAE,GAAG;AACd,SAAA,CAAC;IACJ;IAEO,WAAW,GAAA;;AAEhB,QAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB;IAEU,mBAAmB,CAAC,KAAa,EAAE,KAAmB,EAAA;AAC9D,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;AAC3B,QAAA,IAAI,EAAE,MAAM,YAAY,WAAW,CAAC,EAAE;AACpC,YAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;QACvD;;QAEA,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI;AACF,gBAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;YAC3C;AAAE,YAAA,MAAM;;YAER;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IAC3C;IAEU,mBAAmB,CAAC,KAAa,EAAE,KAAmB,EAAA;QAC9D,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;IACtC;IAEU,iBAAiB,CAAC,KAAa,EAAE,KAAmB,EAAA;AAC5D,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAChD;IAEU,qBAAqB,CAAC,KAAa,EAAE,KAAmB,EAAA;AAChE,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;IAC/C;IAEU,eAAe,CAAC,KAAa,EAAE,KAAoB,EAAA;AAC3D,QAAA,IACE,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY;AAC5D,aAAC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,UAAU,CAAC,EACzD;AACA,YAAA,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACzD,YAAA,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB;AAAO,aAAA,IACL,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY;AAC7D,aAAC,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,UAAU,CAAC,EAC3D;AACA,YAAA,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;AACxD,YAAA,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE;AAC/B,YAAA,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC;AAC9D,YAAA,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;AAC9B,YAAA,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC;AAC9D,YAAA,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB;IACF;AAEQ,IAAA,cAAc,CAAC,MAAmC,EAAA;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAG;YAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxC,OAAO,OAAO,CAAC;YACjB;iBAAO,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;;AAE7C,gBAAA,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC;AAChC,gBAAA,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBACvD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACzC;AACA,gBAAA,OAAO,WAAW;YACpB;iBAAO;;gBAEL,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;AACtE,gBAAA,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5C;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAA,sCAAA,EAAyC,CAAC,CAAA,CAAE,CAAC;YACjF;AACA,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;QACxC;IACF;AAEQ,IAAA,aAAa,CAAC,KAAa,EAAA;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAC1F,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,OAAO,OAAO;IAChB;IAEQ,iBAAiB,CAAC,KAAuB,EAAE,OAAiC,EAAA;AAClF,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa;AAChD,QAAA,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAG;AAC/B,YAAA,IAAI,IAAI,YAAY,WAAW,EAAE;gBAC/B,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC;YAC9D;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,YAAY,CAAC,aAAmC,EAAA;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,MAAM,KAAK,GAAkB;AAC3B,YAAA,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS;AAC3D,YAAA,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,SAAS;AACvE,YAAA,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY;AACpC,kBAAE,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,KAAI;AACpB,oBAAA,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAA,UAAA,EAAa,KAAK,CAAA,CAAE,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE;AACxD,oBAAA,OAAO,GAAG;AACZ,gBAAA,CAAC,EACD,EAAE,GAAG,aAAa,EAAE,UAAU,EAAE;AAEpC,kBAAE,SAAS;SACd;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AAE5B,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,WAAW,CAAC,KAA2B,EAAA;QAC7C,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAC5B;AACA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AAC3C,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE;YAChF,MAAM,CAAC,IAAI,CAAC,CAAA,uCAAA,CAAyC,EAAE,EAAE,KAAK,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC,MAAM;QACrB;QAEA,IACE,KAAK,CAAC,UAAU;aACf,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,EACvF;YACA,MAAM,CAAC,IAAI,CAAC,CAAA,2CAAA,CAA6C,EAAE,EAAE,KAAK,EAAE,CAAC;YACrE,OAAO,KAAK,CAAC,UAAU;QACzB;QAEA,IACE,KAAK,CAAC,UAAU;AAChB,aAAC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;gBACnC,KAAK,CAAC,UAAU,KAAK,IAAI;gBACzB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,EACrE;YACA,MAAM,CAAC,IAAI,CAAC,CAAA,2CAAA,CAA6C,EAAE,EAAE,KAAK,EAAE,CAAC;YACrE,OAAO,KAAK,CAAC,UAAU;QACzB;IACF;AAEQ,IAAA,cAAc,CAAC,KAAoB,EAAA;AACzC,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/B;AACA,QAAA,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;YAC/D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;QACvC;AACA,QAAA,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAC/D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,gBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAA,UAAA,EAAa,CAAC,EAAE;AACvD,gBAAA,IAAI,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE;oBACjC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;oBAC7C,IAAI,CAAC,SAAS,EAAE;wBACd;oBACF;oBACA,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAChC;YACF;QACF;IACF;AAEA;;;;;AAKG;AACO,IAAA,eAAe,CAAC,KAAa,EAAA;;;QAGrC,IAAI,CAAC,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY;QACjD,IAAI,MAAM,GAAG,CAAC;QACd,IAAI,KAAK,GAAG,CAAC;QACb,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AAC1B,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa;AACtC,YAAA,MAAM,IAAI,GAAG,UAAU,GAAG,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,YAAY;YAC1D,KAAK,IAAI,IAAI;YACb,IAAI,CAAC,IAAI,KAAK;gBAAE,MAAM,IAAI,IAAI;AAChC,QAAA,CAAC,CAAC;QACF,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;IAC3D;IAEQ,WAAW,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC;AAAO,aAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC7B,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM;AACvF,YAAA,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI;QACrD;aAAO;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAA,CAAA,CAAG,CAAC;YAC3C,OAAO,EAAE,CAAC;QACZ;IACF;uGAhVW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,cAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,UAAA,EAAA,EAAA,6BAAA,EAAA,qEAAA,EAAA,0BAAA,EAAA,mEAAA,EAAA,2BAAA,EAAA,kCAAA,EAAA,iBAAA,EAAA,2DAAA,EAAA,kBAAA,EAAA,yDAAA,EAAA,iBAAA,EAAA,2DAAA,EAAA,kBAAA,EAAA,yDAAA,EAAA,EAAA,EAAA,SAAA,EAZX,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAsGI,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjJ3D,i+BA4BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDcY,KAAK,2FAAE,WAAW,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAajB,WAAW,EAAA,UAAA,EAAA,CAAA;kBAhBvB,SAAS;+BACE,cAAc,EAAA,OAAA,EAEf,CAAC,KAAK,EAAE,WAAW,CAAC,EAAA,SAAA,EAClB,CAAC,WAAW,CAAA,WAAA,CAAa,CAAC,EAAA,IAAA,EAC/B;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,+BAA+B,EAAE,CAAA,mEAAA,CAAqE;AACtG,wBAAA,4BAA4B,EAAE,CAAA,iEAAA,CAAmE;AACjG,wBAAA,6BAA6B,EAAE,kCAAkC;AACjE,wBAAA,mBAAmB,EAAE,CAAA,yDAAA,CAA2D;AAChF,wBAAA,oBAAoB,EAAE,CAAA,uDAAA,CAAyD;AAC/E,wBAAA,mBAAmB,EAAE,CAAA,yDAAA,CAA2D;AAChF,wBAAA,oBAAoB,EAAE,CAAA,uDAAA,CAAyD;AAChF,qBAAA,EAAA,QAAA,EAAA,i+BAAA,EAAA;AAmFkE,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,wBAAwB,0FASlD,gBAAgB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE5I3D;AACA;MAMa,iBAAiB,CAAA;uGAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAHlB,WAAW,EAAE,gBAAgB,CAAA,EAAA,OAAA,EAAA,CAC7B,WAAW,EAAE,gBAAgB,CAAA,EAAA,CAAA;wGAE5B,iBAAiB,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC;AACxC,oBAAA,OAAO,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC;AACzC,iBAAA;;;ACXD;;AAEG;;;;"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, input, booleanAttribute, computed, Component } from '@angular/core';
|
|
3
|
+
import { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';
|
|
4
|
+
import { I18n } from '@ngneers/controls/i18n';
|
|
5
|
+
import { NgnIcon } from '@ngneers/controls/icon';
|
|
6
|
+
import { stateControlTemplate } from '@ngneers/controls-themes/templates/state';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @category control
|
|
10
|
+
*/
|
|
11
|
+
class NgnState extends NgnBase {
|
|
12
|
+
i18n = inject(I18n).translations;
|
|
13
|
+
/**
|
|
14
|
+
* Whether the indicator is rendered and occupies layout space.
|
|
15
|
+
* @default true
|
|
16
|
+
*/
|
|
17
|
+
visible = input(true, { ...(ngDevMode ? { debugName: "visible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
18
|
+
/**
|
|
19
|
+
* Whether the indicator should replace sibling button content while visible.
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
replaceContent = input(false, { ...(ngDevMode ? { debugName: "replaceContent" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
23
|
+
/**
|
|
24
|
+
* Indicator size in px.
|
|
25
|
+
* @default 16
|
|
26
|
+
*/
|
|
27
|
+
size = input(16, /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
29
|
+
/**
|
|
30
|
+
* Optional spinner stroke thickness. Passed through to ngn-spinner for loading state.
|
|
31
|
+
*/
|
|
32
|
+
thickness = input(/* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [undefined, { debugName: "thickness" }] : /* istanbul ignore next */ []));
|
|
34
|
+
/**
|
|
35
|
+
* Visually-hidden text announced to assistive tech in place of the kind's
|
|
36
|
+
* default label. Use it to convey app-specific meaning (e.g. `"Saving…"`
|
|
37
|
+
* instead of `"Loading"`). When unset, a localized label is derived from the
|
|
38
|
+
* applied {@link kind}.
|
|
39
|
+
*/
|
|
40
|
+
label = input(/* @ts-ignore */
|
|
41
|
+
...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
|
|
42
|
+
/**
|
|
43
|
+
* Politeness of the live region used to announce the state to assistive tech.
|
|
44
|
+
* When omitted, it is derived from the applied {@link kind}: `error`/`warning`
|
|
45
|
+
* announce as `assertive` (mapped to `role="alert"`), everything else as
|
|
46
|
+
* `polite` (`role="status"`).
|
|
47
|
+
*/
|
|
48
|
+
ariaLive = input(/* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [undefined, { debugName: "ariaLive" }] : /* istanbul ignore next */ []));
|
|
50
|
+
/**
|
|
51
|
+
* Icon shown when the applied kind is `cancelled`.
|
|
52
|
+
* @category inputs
|
|
53
|
+
*/
|
|
54
|
+
iconCancelled = input(/* @ts-ignore */
|
|
55
|
+
...(ngDevMode ? [undefined, { debugName: "iconCancelled" }] : /* istanbul ignore next */ []));
|
|
56
|
+
/**
|
|
57
|
+
* Icon shown when the applied kind is `success`.
|
|
58
|
+
* @category inputs
|
|
59
|
+
*/
|
|
60
|
+
iconSuccess = input(/* @ts-ignore */
|
|
61
|
+
...(ngDevMode ? [undefined, { debugName: "iconSuccess" }] : /* istanbul ignore next */ []));
|
|
62
|
+
/**
|
|
63
|
+
* Icon shown when the applied kind is `warning`.
|
|
64
|
+
* @category inputs
|
|
65
|
+
*/
|
|
66
|
+
iconWarning = input(/* @ts-ignore */
|
|
67
|
+
...(ngDevMode ? [undefined, { debugName: "iconWarning" }] : /* istanbul ignore next */ []));
|
|
68
|
+
/**
|
|
69
|
+
* Icon shown when the applied kind is `error`.
|
|
70
|
+
* @category inputs
|
|
71
|
+
*/
|
|
72
|
+
iconError = input(/* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [undefined, { debugName: "iconError" }] : /* istanbul ignore next */ []));
|
|
74
|
+
theme = this.injectThemeTemplate(stateControlTemplate, {
|
|
75
|
+
root: true,
|
|
76
|
+
visible: this.visible,
|
|
77
|
+
'replace-content': this.replaceContent,
|
|
78
|
+
});
|
|
79
|
+
icon = computed(() => {
|
|
80
|
+
switch (this.appliedKind()) {
|
|
81
|
+
case 'cancelled':
|
|
82
|
+
return this.iconCancelled();
|
|
83
|
+
case 'success':
|
|
84
|
+
return this.iconSuccess();
|
|
85
|
+
case 'warning':
|
|
86
|
+
return this.iconWarning();
|
|
87
|
+
case 'error':
|
|
88
|
+
return this.iconError();
|
|
89
|
+
default:
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}, /* @ts-ignore */
|
|
93
|
+
...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
|
|
94
|
+
defaultIcon = computed(() => {
|
|
95
|
+
switch (this.appliedKind()) {
|
|
96
|
+
case 'cancelled':
|
|
97
|
+
return 'upload-cancel';
|
|
98
|
+
case 'success':
|
|
99
|
+
return 'hint-success';
|
|
100
|
+
case 'warning':
|
|
101
|
+
return 'hint-warning';
|
|
102
|
+
case 'error':
|
|
103
|
+
return 'hint-error';
|
|
104
|
+
default:
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
}, /* @ts-ignore */
|
|
108
|
+
...(ngDevMode ? [{ debugName: "defaultIcon" }] : /* istanbul ignore next */ []));
|
|
109
|
+
/**
|
|
110
|
+
* Accessible label for the current state: the explicit {@link label} input,
|
|
111
|
+
* else a localized default for the applied kind. `undefined` when the
|
|
112
|
+
* indicator is hidden or no known kind is applied — the host then carries no
|
|
113
|
+
* live region.
|
|
114
|
+
*/
|
|
115
|
+
resolvedLabel = computed(() => {
|
|
116
|
+
if (!this.visible()) {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
const explicit = this.label();
|
|
120
|
+
if (explicit) {
|
|
121
|
+
return explicit;
|
|
122
|
+
}
|
|
123
|
+
switch (this.appliedKind()) {
|
|
124
|
+
case 'loading':
|
|
125
|
+
return this.i18n['state_loading']();
|
|
126
|
+
case 'success':
|
|
127
|
+
return this.i18n['state_success']();
|
|
128
|
+
case 'warning':
|
|
129
|
+
return this.i18n['state_warning']();
|
|
130
|
+
case 'error':
|
|
131
|
+
return this.i18n['state_error']();
|
|
132
|
+
case 'cancelled':
|
|
133
|
+
return this.i18n['state_cancelled']();
|
|
134
|
+
default:
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
}, /* @ts-ignore */
|
|
138
|
+
...(ngDevMode ? [{ debugName: "resolvedLabel" }] : /* istanbul ignore next */ []));
|
|
139
|
+
/** Resolved live-region politeness — explicit input, else derived from kind. */
|
|
140
|
+
liveMode = computed(() => {
|
|
141
|
+
if (!this.resolvedLabel()) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const explicit = this.ariaLive();
|
|
145
|
+
if (explicit) {
|
|
146
|
+
return explicit;
|
|
147
|
+
}
|
|
148
|
+
const kind = this.appliedKind();
|
|
149
|
+
return kind === 'error' || kind === 'warning' ? 'assertive' : 'polite';
|
|
150
|
+
}, /* @ts-ignore */
|
|
151
|
+
...(ngDevMode ? [{ debugName: "liveMode" }] : /* istanbul ignore next */ []));
|
|
152
|
+
/** Landmark role paired with {@link liveMode} — `alert` when assertive, else `status`. */
|
|
153
|
+
role = computed(() => {
|
|
154
|
+
const live = this.liveMode();
|
|
155
|
+
if (!live || live === 'off') {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
return live === 'assertive' ? 'alert' : 'status';
|
|
159
|
+
}, /* @ts-ignore */
|
|
160
|
+
...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
|
|
161
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnState, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
162
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnState, isStandalone: true, selector: "ngn-state", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, replaceContent: { classPropertyName: "replaceContent", publicName: "replaceContent", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, thickness: { classPropertyName: "thickness", publicName: "thickness", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLive: { classPropertyName: "ariaLive", publicName: "ariaLive", isSignal: true, isRequired: false, transformFunction: null }, iconCancelled: { classPropertyName: "iconCancelled", publicName: "iconCancelled", isSignal: true, isRequired: false, transformFunction: null }, iconSuccess: { classPropertyName: "iconSuccess", publicName: "iconSuccess", isSignal: true, isRequired: false, transformFunction: null }, iconWarning: { classPropertyName: "iconWarning", publicName: "iconWarning", isSignal: true, isRequired: false, transformFunction: null }, iconError: { classPropertyName: "iconError", publicName: "iconError", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--ngn-state-size.px": "size()", "attr.role": "role()", "attr.aria-live": "liveMode()", "attr.aria-atomic": "role() ? 'true' : null" } }, providers: [provideSelf(NgnState)], usesInheritance: true, ngImport: i0, template: "@if (visible()) {\n <span [ptInt]=\"this\" [ptClass]=\"'indicator'\">\n @if (resolvedLabel(); as label) {\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ label }}</span>\n }\n @switch (appliedKind()) {\n @case ('loading') {\n @defer (on immediate) {\n <ngn-spinner\n [ptInt]=\"this\"\n [ptDep]=\"'spinner'\"\n [size]=\"size()\"\n [thickness]=\"thickness()\"\n [attr.aria-hidden]=\"true\"\n />\n }\n }\n @default {\n @if (icon() || defaultIcon()) {\n <ngn-icon\n [ptInt]=\"this\"\n [ptDep]=\"'icon'\"\n [defaultIcon]=\"defaultIcon()\"\n [icon]=\"icon()\"\n [attr.aria-hidden]=\"true\"\n />\n }\n }\n }\n </span>\n}\n", dependencies: [{ kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }], deferBlockDependencies: [() => [NgnPt, /* @ts-ignore */
|
|
163
|
+
import('@ngneers/controls/spinner').then(m => m.NgnSpinner)]] });
|
|
164
|
+
}
|
|
165
|
+
i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.5", ngImport: i0, type: NgnState, resolveDeferredDeps: () => [/* @ts-ignore */
|
|
166
|
+
import('@ngneers/controls/spinner').then(m => m.NgnSpinner)], resolveMetadata: NgnSpinner => ({ decorators: [{
|
|
167
|
+
type: Component,
|
|
168
|
+
args: [{ selector: 'ngn-state', imports: [NgnIcon, NgnPt, NgnSpinner], providers: [provideSelf(NgnState)], host: {
|
|
169
|
+
'[style.--ngn-state-size.px]': 'size()',
|
|
170
|
+
// The kind is conveyed to sighted users purely by icon shape + color, so
|
|
171
|
+
// announce it to assistive tech via a live region. Only set when there is a
|
|
172
|
+
// label (a known kind is applied and the indicator is visible), otherwise
|
|
173
|
+
// the host stays a plain, roleless span.
|
|
174
|
+
'[attr.role]': 'role()',
|
|
175
|
+
'[attr.aria-live]': 'liveMode()',
|
|
176
|
+
'[attr.aria-atomic]': "role() ? 'true' : null",
|
|
177
|
+
}, template: "@if (visible()) {\n <span [ptInt]=\"this\" [ptClass]=\"'indicator'\">\n @if (resolvedLabel(); as label) {\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ label }}</span>\n }\n @switch (appliedKind()) {\n @case ('loading') {\n @defer (on immediate) {\n <ngn-spinner\n [ptInt]=\"this\"\n [ptDep]=\"'spinner'\"\n [size]=\"size()\"\n [thickness]=\"thickness()\"\n [attr.aria-hidden]=\"true\"\n />\n }\n }\n @default {\n @if (icon() || defaultIcon()) {\n <ngn-icon\n [ptInt]=\"this\"\n [ptDep]=\"'icon'\"\n [defaultIcon]=\"defaultIcon()\"\n [icon]=\"icon()\"\n [attr.aria-hidden]=\"true\"\n />\n }\n }\n }\n </span>\n}\n" }]
|
|
178
|
+
}], ctorParameters: null, propDecorators: { visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], replaceContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "replaceContent", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], thickness: [{ type: i0.Input, args: [{ isSignal: true, alias: "thickness", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLive: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLive", required: false }] }], iconCancelled: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconCancelled", required: false }] }], iconSuccess: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconSuccess", required: false }] }], iconWarning: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconWarning", required: false }] }], iconError: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconError", required: false }] }] } }) });
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Generated bundle index. Do not edit.
|
|
182
|
+
*/
|
|
183
|
+
|
|
184
|
+
export { NgnState };
|
|
185
|
+
//# sourceMappingURL=ngneers-controls-state.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngneers-controls-state.mjs","sources":["../../src/state/state.ts","../../src/state/state.html","../../src/state/ngneers-controls-state.ts"],"sourcesContent":["import { booleanAttribute, Component, computed, inject, input } from '@angular/core';\nimport { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { NgnSpinner } from '@ngneers/controls/spinner';\nimport { stateControlTemplate } from '@ngneers/controls-themes/templates/state';\n\nimport type { NgnIconKey } from '@ngneers/controls/icon';\nimport type { IconType } from '@ngneers/controls-custom-types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-state',\n templateUrl: './state.html',\n imports: [NgnIcon, NgnPt, NgnSpinner],\n providers: [provideSelf(NgnState)],\n host: {\n '[style.--ngn-state-size.px]': 'size()',\n // The kind is conveyed to sighted users purely by icon shape + color, so\n // announce it to assistive tech via a live region. Only set when there is a\n // label (a known kind is applied and the indicator is visible), otherwise\n // the host stays a plain, roleless span.\n '[attr.role]': 'role()',\n '[attr.aria-live]': 'liveMode()',\n '[attr.aria-atomic]': \"role() ? 'true' : null\",\n },\n})\nexport class NgnState extends NgnBase<'state'> {\n private readonly i18n = inject(I18n).translations;\n /**\n * Whether the indicator is rendered and occupies layout space.\n * @default true\n */\n public readonly visible = input(true, { transform: booleanAttribute });\n\n /**\n * Whether the indicator should replace sibling button content while visible.\n * @default false\n */\n public readonly replaceContent = input(false, { transform: booleanAttribute });\n\n /**\n * Indicator size in px.\n * @default 16\n */\n public readonly size = input(16);\n\n /**\n * Optional spinner stroke thickness. Passed through to ngn-spinner for loading state.\n */\n public readonly thickness = input<string>();\n\n /**\n * Visually-hidden text announced to assistive tech in place of the kind's\n * default label. Use it to convey app-specific meaning (e.g. `\"Saving…\"`\n * instead of `\"Loading\"`). When unset, a localized label is derived from the\n * applied {@link kind}.\n */\n public readonly label = input<string>();\n\n /**\n * Politeness of the live region used to announce the state to assistive tech.\n * When omitted, it is derived from the applied {@link kind}: `error`/`warning`\n * announce as `assertive` (mapped to `role=\"alert\"`), everything else as\n * `polite` (`role=\"status\"`).\n */\n public readonly ariaLive = input<'polite' | 'assertive' | 'off'>();\n\n /**\n * Icon shown when the applied kind is `cancelled`.\n * @category inputs\n */\n public readonly iconCancelled = input<IconType>();\n\n /**\n * Icon shown when the applied kind is `success`.\n * @category inputs\n */\n public readonly iconSuccess = input<IconType>();\n\n /**\n * Icon shown when the applied kind is `warning`.\n * @category inputs\n */\n public readonly iconWarning = input<IconType>();\n\n /**\n * Icon shown when the applied kind is `error`.\n * @category inputs\n */\n public readonly iconError = input<IconType>();\n\n protected readonly theme = this.injectThemeTemplate(stateControlTemplate, {\n root: true,\n visible: this.visible,\n 'replace-content': this.replaceContent,\n });\n\n protected readonly icon = computed(() => {\n switch (this.appliedKind()) {\n case 'cancelled':\n return this.iconCancelled();\n case 'success':\n return this.iconSuccess();\n case 'warning':\n return this.iconWarning();\n case 'error':\n return this.iconError();\n default:\n return undefined;\n }\n });\n\n protected readonly defaultIcon = computed<NgnIconKey | undefined>(() => {\n switch (this.appliedKind()) {\n case 'cancelled':\n return 'upload-cancel';\n case 'success':\n return 'hint-success';\n case 'warning':\n return 'hint-warning';\n case 'error':\n return 'hint-error';\n default:\n return undefined;\n }\n });\n\n /**\n * Accessible label for the current state: the explicit {@link label} input,\n * else a localized default for the applied kind. `undefined` when the\n * indicator is hidden or no known kind is applied — the host then carries no\n * live region.\n */\n protected readonly resolvedLabel = computed<string | undefined>(() => {\n if (!this.visible()) {\n return undefined;\n }\n const explicit = this.label();\n if (explicit) {\n return explicit;\n }\n switch (this.appliedKind()) {\n case 'loading':\n return this.i18n['state_loading']();\n case 'success':\n return this.i18n['state_success']();\n case 'warning':\n return this.i18n['state_warning']();\n case 'error':\n return this.i18n['state_error']();\n case 'cancelled':\n return this.i18n['state_cancelled']();\n default:\n return undefined;\n }\n });\n\n /** Resolved live-region politeness — explicit input, else derived from kind. */\n protected readonly liveMode = computed<'polite' | 'assertive' | 'off' | null>(() => {\n if (!this.resolvedLabel()) {\n return null;\n }\n const explicit = this.ariaLive();\n if (explicit) {\n return explicit;\n }\n const kind = this.appliedKind();\n return kind === 'error' || kind === 'warning' ? 'assertive' : 'polite';\n });\n\n /** Landmark role paired with {@link liveMode} — `alert` when assertive, else `status`. */\n protected readonly role = computed<'alert' | 'status' | null>(() => {\n const live = this.liveMode();\n if (!live || live === 'off') {\n return null;\n }\n return live === 'assertive' ? 'alert' : 'status';\n });\n}\n","@if (visible()) {\n <span [ptInt]=\"this\" [ptClass]=\"'indicator'\">\n @if (resolvedLabel(); as label) {\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ label }}</span>\n }\n @switch (appliedKind()) {\n @case ('loading') {\n @defer (on immediate) {\n <ngn-spinner\n [ptInt]=\"this\"\n [ptDep]=\"'spinner'\"\n [size]=\"size()\"\n [thickness]=\"thickness()\"\n [attr.aria-hidden]=\"true\"\n />\n }\n }\n @default {\n @if (icon() || defaultIcon()) {\n <ngn-icon\n [ptInt]=\"this\"\n [ptDep]=\"'icon'\"\n [defaultIcon]=\"defaultIcon()\"\n [icon]=\"icon()\"\n [attr.aria-hidden]=\"true\"\n />\n }\n }\n }\n </span>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Component } from '@angular/core';
|
|
3
|
+
import { ValueControlBase, NgnPt, provideSelf } from '@ngneers/controls/base';
|
|
4
|
+
import { switchControlTemplate } from '@ngneers/controls-themes/templates/switch';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @category control
|
|
8
|
+
*/
|
|
9
|
+
class NgnSwitch extends ValueControlBase {
|
|
10
|
+
theme = this.injectThemeTemplate(switchControlTemplate, {
|
|
11
|
+
root: true,
|
|
12
|
+
invalid: () => this.invalid(),
|
|
13
|
+
});
|
|
14
|
+
changed(event) {
|
|
15
|
+
const target = event.target;
|
|
16
|
+
this.value.set(target.checked);
|
|
17
|
+
}
|
|
18
|
+
onClick(event) {
|
|
19
|
+
if (this.readonly() || this.disabled()) {
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
constructor() {
|
|
24
|
+
super();
|
|
25
|
+
}
|
|
26
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnSwitch, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
27
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: NgnSwitch, isStandalone: true, selector: "ngn-switch", providers: [provideSelf(NgnSwitch)], usesInheritance: true, ngImport: i0, template: "<div [ptInt]=\"this\" [ptClass]=\"{ track: true, 'track-checked': !!value() }\">\n <div [ptInt]=\"this\" [ptClass]=\"'thumb'\"></div>\n</div>\n<input\n type=\"checkbox\"\n [checked]=\"value()\"\n (change)=\"changed($event)\"\n (click)=\"onClick($event)\"\n [ptInt]=\"this\"\n [ptClass]=\"'input'\"\n [attr.disabled]=\"disabled() ? '' : undefined\"\n [ariaReadOnly]=\"readonly() ? '' : undefined\"\n [ariaInvalid]=\"invalid() ? 'true' : undefined\"\n [attr.aria-label]=\"label()\"\n [ariaLabelledByElements]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n [id]=\"inputId()\"\n/>\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }] });
|
|
28
|
+
}
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnSwitch, decorators: [{
|
|
30
|
+
type: Component,
|
|
31
|
+
args: [{ selector: 'ngn-switch', imports: [NgnPt], providers: [provideSelf(NgnSwitch)], template: "<div [ptInt]=\"this\" [ptClass]=\"{ track: true, 'track-checked': !!value() }\">\n <div [ptInt]=\"this\" [ptClass]=\"'thumb'\"></div>\n</div>\n<input\n type=\"checkbox\"\n [checked]=\"value()\"\n (change)=\"changed($event)\"\n (click)=\"onClick($event)\"\n [ptInt]=\"this\"\n [ptClass]=\"'input'\"\n [attr.disabled]=\"disabled() ? '' : undefined\"\n [ariaReadOnly]=\"readonly() ? '' : undefined\"\n [ariaInvalid]=\"invalid() ? 'true' : undefined\"\n [attr.aria-label]=\"label()\"\n [ariaLabelledByElements]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n [id]=\"inputId()\"\n/>\n" }]
|
|
32
|
+
}], ctorParameters: () => [] });
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Generated bundle index. Do not edit.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
export { NgnSwitch };
|
|
39
|
+
//# sourceMappingURL=ngneers-controls-switch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngneers-controls-switch.mjs","sources":["../../src/switch/switch.ts","../../src/switch/switch.html","../../src/switch/ngneers-controls-switch.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\nimport { switchControlTemplate } from '@ngneers/controls-themes/templates/switch';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-switch',\n templateUrl: './switch.html',\n imports: [NgnPt],\n providers: [provideSelf(NgnSwitch)],\n})\nexport class NgnSwitch extends ValueControlBase<'switch', boolean> {\n protected readonly theme = this.injectThemeTemplate(switchControlTemplate, {\n root: true,\n invalid: () => this.invalid(),\n });\n\n protected changed(event: Event) {\n const target = event.target as HTMLInputElement;\n this.value.set(target.checked);\n }\n\n protected onClick(event: Event) {\n if (this.readonly() || this.disabled()) {\n event.preventDefault();\n }\n }\n\n constructor() {\n super();\n }\n}\n","<div [ptInt]=\"this\" [ptClass]=\"{ track: true, 'track-checked': !!value() }\">\n <div [ptInt]=\"this\" [ptClass]=\"'thumb'\"></div>\n</div>\n<input\n type=\"checkbox\"\n [checked]=\"value()\"\n (change)=\"changed($event)\"\n (click)=\"onClick($event)\"\n [ptInt]=\"this\"\n [ptClass]=\"'input'\"\n [attr.disabled]=\"disabled() ? '' : undefined\"\n [ariaReadOnly]=\"readonly() ? '' : undefined\"\n [ariaInvalid]=\"invalid() ? 'true' : undefined\"\n [attr.aria-label]=\"label()\"\n [ariaLabelledByElements]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n [id]=\"inputId()\"\n/>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAIA;;AAEG;AAOG,MAAO,SAAU,SAAQ,gBAAmC,CAAA;AAC7C,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;AACzE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE;AAC9B,KAAA,CAAC;AAEQ,IAAA,OAAO,CAAC,KAAY,EAAA;AAC5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;QAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IAChC;AAEU,IAAA,OAAO,CAAC,KAAY,EAAA;QAC5B,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC,KAAK,CAAC,cAAc,EAAE;QACxB;IACF;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;IACT;uGAnBW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAFT,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXrC,qlBAkBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDRY,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGJ,SAAS,EAAA,UAAA,EAAA,CAAA;kBANrB,SAAS;+BACE,YAAY,EAAA,OAAA,EAEb,CAAC,KAAK,CAAC,aACL,CAAC,WAAW,WAAW,CAAC,EAAA,QAAA,EAAA,qlBAAA,EAAA;;;AEXrC;;AAEG;;;;"}
|