@ngneers/controls 0.0.1-next.0 → 0.0.1-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/fesm2022/ngneers-controls-api-resize.mjs +7 -0
  2. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-i18n-translations-de.mjs +3 -0
  4. package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -1
  5. package/fesm2022/ngneers-controls-i18n-translations-en.mjs +3 -0
  6. package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -1
  7. package/fesm2022/ngneers-controls-otp.mjs +251 -0
  8. package/fesm2022/ngneers-controls-otp.mjs.map +1 -0
  9. package/fesm2022/ngneers-controls-splitter.mjs +43 -12
  10. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
  11. package/fesm2022/ngneers-controls-toggle-button.mjs +2 -2
  12. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  13. package/package.json +6 -2
  14. package/types/ngneers-controls-breadcrumb.d.ts +3 -0
  15. package/types/ngneers-controls-calendar.d.ts +3 -0
  16. package/types/ngneers-controls-chip.d.ts +3 -0
  17. package/types/ngneers-controls-dialog.d.ts +3 -0
  18. package/types/ngneers-controls-drawer.d.ts +3 -0
  19. package/types/ngneers-controls-edit-inplace.d.ts +3 -0
  20. package/types/ngneers-controls-filter.d.ts +3 -0
  21. package/types/ngneers-controls-i18n-translations-de.d.ts +3 -0
  22. package/types/ngneers-controls-i18n-translations-en.d.ts +3 -0
  23. package/types/ngneers-controls-i18n.d.ts +3 -0
  24. package/types/ngneers-controls-input-field.d.ts +3 -0
  25. package/types/ngneers-controls-list-box.d.ts +3 -0
  26. package/types/ngneers-controls-mask-input.d.ts +3 -0
  27. package/types/ngneers-controls-otp.d.ts +243 -0
  28. package/types/ngneers-controls-paginator.d.ts +3 -0
  29. package/types/ngneers-controls-select.d.ts +3 -0
  30. package/types/ngneers-controls-snackbar.d.ts +3 -0
  31. package/types/ngneers-controls-splitter.d.ts +12 -2
  32. package/types/ngneers-controls-table.d.ts +3 -0
  33. package/types/ngneers-controls-toast.d.ts +3 -0
  34. package/types/ngneers-controls-tree.d.ts +3 -0
  35. package/types/ngneers-controls-upload.d.ts +3 -0
@@ -1 +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":"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"}
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 // Measure divider positions in the after-render phase (post-layout) and cache\n // them in a signal. Reading DOM offsets directly in the template binding causes\n // NG0100, since the grid sizes are applied in the same CD cycle and the reflow\n // settles the measured value between the CD and verify passes.\n afterRenderEffect(() => {\n const values = this.measureDividerValues();\n untracked(() => {\n const prev = this._dividerValues();\n if (values.length !== prev.length || values.some((v, i) => v !== prev[i])) {\n this._dividerValues.set(values);\n }\n });\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 /** Cached divider positions (percentage) measured post-layout; see the after-render effect in the constructor. */\n private readonly _dividerValues = signal<readonly number[]>([]);\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 the cached value measured in the after-render phase.\n */\n protected dividerValueNow(index: number): number {\n return this._dividerValues()[index] ?? 0;\n }\n\n /**\n * Measures each divider's position as a percentage (0–100) of the total panel\n * content size. Reads `gridTemplateSizes()`, `elementSize()` and `dragContext()`\n * as reactive triggers, then measures the rendered panel sizes.\n */\n private measureDividerValues(): 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 const calculator = this.calculator();\n calculator.gridTemplateSizes(); // reactive trigger\n calculator.dragContext(); // reactive trigger (live update during drag)\n this.elementSize(); // reactive trigger (container resize)\n const panels = calculator.orderedPanels();\n const horizontal = this.layout() === 'horizontal';\n const sizes = panels.map(panel => {\n const el = panel.element.nativeElement;\n return horizontal ? el.offsetWidth : el.offsetHeight;\n });\n const total = sizes.reduce((a, b) => a + b, 0);\n if (total <= 0) return [];\n // One value per divider: cumulative size up to and including panel i.\n const values: number[] = [];\n let before = 0;\n for (let i = 0; i < panels.length - 1; i++) {\n before += sizes[i]!;\n values.push(Math.round((before / total) * 100));\n }\n return values;\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":"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"}
@@ -55,11 +55,11 @@ class NgnToggleButton extends ValueControlBase {
55
55
  this.value.update(v => !v);
56
56
  }
57
57
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnToggleButton, deps: null, target: i0.ɵɵFactoryTarget.Component });
58
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnToggleButton, isStandalone: true, selector: "ngn-toggle-button", inputs: { labelOn: { classPropertyName: "labelOn", publicName: "labelOn", isSignal: true, isRequired: false, transformFunction: null }, labelOff: { classPropertyName: "labelOff", publicName: "labelOff", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconOn: { classPropertyName: "iconOn", publicName: "iconOn", isSignal: true, isRequired: false, transformFunction: null }, iconOff: { classPropertyName: "iconOff", publicName: "iconOff", isSignal: true, isRequired: false, transformFunction: null }, fixedWidth: { classPropertyName: "fixedWidth", publicName: "fixedWidth", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnToggleButton)], usesInheritance: true, ngImport: i0, template: "<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-pressed]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }] });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnToggleButton, isStandalone: true, selector: "ngn-toggle-button", inputs: { labelOn: { classPropertyName: "labelOn", publicName: "labelOn", isSignal: true, isRequired: false, transformFunction: null }, labelOff: { classPropertyName: "labelOff", publicName: "labelOff", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconOn: { classPropertyName: "iconOn", publicName: "iconOn", isSignal: true, isRequired: false, transformFunction: null }, iconOff: { classPropertyName: "iconOff", publicName: "iconOff", isSignal: true, isRequired: false, transformFunction: null }, fixedWidth: { classPropertyName: "fixedWidth", publicName: "fixedWidth", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnToggleButton)], usesInheritance: true, ngImport: i0, template: "<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }] });
59
59
  }
60
60
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnToggleButton, decorators: [{
61
61
  type: Component,
62
- args: [{ selector: 'ngn-toggle-button', providers: [provideSelf(NgnToggleButton)], imports: [NgnPt, NgnIcon], template: "<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-pressed]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n" }]
62
+ args: [{ selector: 'ngn-toggle-button', providers: [provideSelf(NgnToggleButton)], imports: [NgnPt, NgnIcon], template: "<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n" }]
63
63
  }], propDecorators: { labelOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelOn", required: false }] }], labelOff: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelOff", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOn", required: false }] }], iconOff: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOff", required: false }] }], fixedWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fixedWidth", required: false }] }] } });
64
64
 
65
65
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-toggle-button.mjs","sources":["../../src/toggle-button/toggle-button.ts","../../src/toggle-button/toggle-button.html","../../src/toggle-button/ngneers-controls-toggle-button.ts"],"sourcesContent":["import { booleanAttribute, Component, input } from '@angular/core';\nimport { provideSelf, ValueControlBase, NgnPt } from '@ngneers/controls/base';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { toggleButtonControlTemplate } from '@ngneers/controls-themes/templates/toggle-button';\n\nimport type { IconType } from '@ngneers/controls-custom-types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-toggle-button',\n providers: [provideSelf(NgnToggleButton)],\n\n imports: [NgnPt, NgnIcon],\n templateUrl: './toggle-button.html',\n})\nexport class NgnToggleButton extends ValueControlBase<'toggleButton', boolean> {\n protected readonly theme = this.injectThemeTemplate(toggleButtonControlTemplate, {\n root: true,\n active: () => this.value(),\n invalid: () => this.invalid(),\n });\n\n /**\n * Optional labels for on and off states.\n * If not provided, the {@link label} input will be used.\n */\n public readonly labelOn = input<string>();\n /**\n * Optional labels for on and off states.\n * If not provided, the {@link label} input will be used.\n */\n public readonly labelOff = input<string>();\n /**\n * Optional icon for the button. Can be used instead of the label or in combination with it.\n * If {@link iconOn} and {@link iconOff} are provided, they will take precedence over this input for their respective states.\n */\n public readonly icon = input<IconType>();\n /**\n * Optional icons for on and off states.\n * If not provided, the {@link icon} input will be used.\n */\n public readonly iconOn = input<IconType>();\n /**\n * Optional icons for on and off states.\n * If not provided, the {@link icon} input will be used.\n */\n public readonly iconOff = input<IconType>();\n /**\n * If true, the button will always have the width of the longest possible content.\n * @default false\n */\n public readonly fixedWidth = input(false, { transform: booleanAttribute });\n\n public toggle() {\n if (this.disabled() || this.readonly()) {\n return;\n }\n this.value.update(v => !v);\n }\n}\n","<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-pressed]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-toggle-button.mjs","sources":["../../src/toggle-button/toggle-button.ts","../../src/toggle-button/toggle-button.html","../../src/toggle-button/ngneers-controls-toggle-button.ts"],"sourcesContent":["import { booleanAttribute, Component, input } from '@angular/core';\nimport { provideSelf, ValueControlBase, NgnPt } from '@ngneers/controls/base';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { toggleButtonControlTemplate } from '@ngneers/controls-themes/templates/toggle-button';\n\nimport type { IconType } from '@ngneers/controls-custom-types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-toggle-button',\n providers: [provideSelf(NgnToggleButton)],\n\n imports: [NgnPt, NgnIcon],\n templateUrl: './toggle-button.html',\n})\nexport class NgnToggleButton extends ValueControlBase<'toggleButton', boolean> {\n protected readonly theme = this.injectThemeTemplate(toggleButtonControlTemplate, {\n root: true,\n active: () => this.value(),\n invalid: () => this.invalid(),\n });\n\n /**\n * Optional labels for on and off states.\n * If not provided, the {@link label} input will be used.\n */\n public readonly labelOn = input<string>();\n /**\n * Optional labels for on and off states.\n * If not provided, the {@link label} input will be used.\n */\n public readonly labelOff = input<string>();\n /**\n * Optional icon for the button. Can be used instead of the label or in combination with it.\n * If {@link iconOn} and {@link iconOff} are provided, they will take precedence over this input for their respective states.\n */\n public readonly icon = input<IconType>();\n /**\n * Optional icons for on and off states.\n * If not provided, the {@link icon} input will be used.\n */\n public readonly iconOn = input<IconType>();\n /**\n * Optional icons for on and off states.\n * If not provided, the {@link icon} input will be used.\n */\n public readonly iconOff = input<IconType>();\n /**\n * If true, the button will always have the width of the longest possible content.\n * @default false\n */\n public readonly fixedWidth = input(false, { transform: booleanAttribute });\n\n public toggle() {\n if (this.disabled() || this.readonly()) {\n return;\n }\n this.value.update(v => !v);\n }\n}\n","<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngneers/controls",
3
- "version": "0.0.1-next.0",
3
+ "version": "0.0.1-next.1",
4
4
  "description": "Modern, signal-based Angular 22 component library — themeable, accessible, tree-shakeable controls.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://ngneers.dev",
@@ -37,7 +37,7 @@
37
37
  "@angular/router": "22.0.5",
38
38
  "@floating-ui/dom": "^1.7.1",
39
39
  "@iconify/icons-tabler": "^1.0.0",
40
- "@ngneers/controls-themes": "^0.0.1-next.0",
40
+ "@ngneers/controls-themes": "^0.0.1-next.1",
41
41
  "@ngneers/signal-translate": "^20.0.0",
42
42
  "rxjs": "~7.8.0"
43
43
  },
@@ -193,6 +193,10 @@
193
193
  "types": "./types/ngneers-controls-number-input.d.ts",
194
194
  "default": "./fesm2022/ngneers-controls-number-input.mjs"
195
195
  },
196
+ "./otp": {
197
+ "types": "./types/ngneers-controls-otp.d.ts",
198
+ "default": "./fesm2022/ngneers-controls-otp.mjs"
199
+ },
196
200
  "./paginator": {
197
201
  "types": "./types/ngneers-controls-paginator.d.ts",
198
202
  "default": "./fesm2022/ngneers-controls-paginator.mjs"
@@ -182,6 +182,9 @@ declare class NgnBreadcrumb extends BreadcrumbTemplates {
182
182
  segmentRange: string;
183
183
  optionSeparator: string;
184
184
  };
185
+ otp: {
186
+ cellLabel: string;
187
+ };
185
188
  drawer: {
186
189
  close: string;
187
190
  };
@@ -261,6 +261,9 @@ declare class NgnCalendar extends CalendarTemplates {
261
261
  segmentRange: string;
262
262
  optionSeparator: string;
263
263
  };
264
+ otp: {
265
+ cellLabel: string;
266
+ };
264
267
  drawer: {
265
268
  close: string;
266
269
  };
@@ -107,6 +107,9 @@ declare class NgnChip extends NgnBase<'chip'> {
107
107
  segmentRange: string;
108
108
  optionSeparator: string;
109
109
  };
110
+ otp: {
111
+ cellLabel: string;
112
+ };
110
113
  drawer: {
111
114
  close: string;
112
115
  };
@@ -214,6 +214,9 @@ declare class NgnDialog<T, Buttons extends NgnActionButtonConfig<T extends Promp
214
214
  segmentRange: string;
215
215
  optionSeparator: string;
216
216
  };
217
+ otp: {
218
+ cellLabel: string;
219
+ };
217
220
  drawer: {
218
221
  close: string;
219
222
  };
@@ -161,6 +161,9 @@ declare class NgnDrawer extends DrawerTemplates implements Openable {
161
161
  segmentRange: string;
162
162
  optionSeparator: string;
163
163
  };
164
+ otp: {
165
+ cellLabel: string;
166
+ };
164
167
  drawer: {
165
168
  close: string;
166
169
  };
@@ -161,6 +161,9 @@ declare class NgnEditInplace extends EditInplaceTemplates {
161
161
  segmentRange: string;
162
162
  optionSeparator: string;
163
163
  };
164
+ otp: {
165
+ cellLabel: string;
166
+ };
164
167
  drawer: {
165
168
  close: string;
166
169
  };
@@ -310,6 +310,9 @@ declare class NgnFilter<T = unknown> extends ValueControlBase<'filter', NgnFilte
310
310
  segmentRange: string;
311
311
  optionSeparator: string;
312
312
  };
313
+ otp: {
314
+ cellLabel: string;
315
+ };
313
316
  drawer: {
314
317
  close: string;
315
318
  };
@@ -94,6 +94,9 @@ declare const de: {
94
94
  segmentRange: string;
95
95
  optionSeparator: string;
96
96
  };
97
+ otp: {
98
+ cellLabel: string;
99
+ };
97
100
  drawer: {
98
101
  close: string;
99
102
  };
@@ -94,6 +94,9 @@ declare const en: {
94
94
  segmentRange: string;
95
95
  optionSeparator: string;
96
96
  };
97
+ otp: {
98
+ cellLabel: string;
99
+ };
97
100
  drawer: {
98
101
  close: string;
99
102
  };
@@ -98,6 +98,9 @@ declare const en: {
98
98
  segmentRange: string;
99
99
  optionSeparator: string;
100
100
  };
101
+ otp: {
102
+ cellLabel: string;
103
+ };
101
104
  drawer: {
102
105
  close: string;
103
106
  };
@@ -111,6 +111,9 @@ declare class NgnInputField extends NgnBase<'inputField'> {
111
111
  segmentRange: string;
112
112
  optionSeparator: string;
113
113
  };
114
+ otp: {
115
+ cellLabel: string;
116
+ };
114
117
  drawer: {
115
118
  close: string;
116
119
  };
@@ -177,6 +177,9 @@ declare class NgnListBox<Items extends readonly NgnItem[], Multiple extends bool
177
177
  segmentRange: string;
178
178
  optionSeparator: string;
179
179
  };
180
+ otp: {
181
+ cellLabel: string;
182
+ };
180
183
  drawer: {
181
184
  close: string;
182
185
  };
@@ -161,6 +161,9 @@ declare class NgnMaskInput extends ValueControlBase<'maskInput', string | null>
161
161
  segmentRange: string;
162
162
  optionSeparator: string;
163
163
  };
164
+ otp: {
165
+ cellLabel: string;
166
+ };
164
167
  drawer: {
165
168
  close: string;
166
169
  };