@ngneers/controls 0.0.1-next.1 → 0.0.1-next.2
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-api-ng.mjs +11 -18
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-badge.mjs +160 -0
- package/fesm2022/ngneers-controls-badge.mjs.map +1 -0
- package/fesm2022/ngneers-controls-base.mjs +85 -8
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs → ngneers-controls-calendar-time-paM6WVpV.mjs} +2 -2
- package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs.map → ngneers-controls-calendar-time-paM6WVpV.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +13 -6
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +3 -3
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-color-picker.mjs +336 -0
- package/fesm2022/ngneers-controls-color-picker.mjs.map +1 -0
- package/fesm2022/ngneers-controls-default-icons.mjs +5 -0
- package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +64 -7
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -5
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-errors.mjs +203 -148
- package/fesm2022/ngneers-controls-errors.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +2 -2
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-hint.mjs +18 -1
- package/fesm2022/ngneers-controls-hint.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n-translations-de.mjs +14 -0
- package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n-translations-en.mjs +16 -0
- package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +23 -6
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +18 -2
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +49 -9
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +2 -2
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-mask-input.mjs +4 -1
- package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-number-input.mjs +4 -4
- package/fesm2022/ngneers-controls-number-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-otp.mjs +16 -4
- package/fesm2022/ngneers-controls-otp.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +36 -9
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-radio.mjs +4 -4
- package/fesm2022/ngneers-controls-radio.mjs.map +1 -1
- package/fesm2022/ngneers-controls-rating.mjs +180 -0
- package/fesm2022/ngneers-controls-rating.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs +33 -7
- package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -1
- package/fesm2022/ngneers-controls-scroller.mjs +4 -2
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +2 -1
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +24 -4
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +3 -3
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
- package/fesm2022/ngneers-controls-stepper.mjs +142 -0
- package/fesm2022/ngneers-controls-stepper.mjs.map +1 -0
- package/fesm2022/ngneers-controls-switch.mjs +3 -3
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
- package/fesm2022/ngneers-controls-table.mjs +282 -15
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +2 -2
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +3 -3
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +16 -28
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tree.mjs +2 -2
- package/fesm2022/ngneers-controls-tree.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils.mjs +138 -1
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/package.json +18 -2
- package/types/ngneers-controls-api-ng.d.ts +12 -9
- package/types/ngneers-controls-badge.d.ts +67 -0
- package/types/ngneers-controls-base.d.ts +61 -4
- package/types/ngneers-controls-breadcrumb.d.ts +14 -0
- package/types/ngneers-controls-calendar.d.ts +21 -6
- package/types/ngneers-controls-chip.d.ts +14 -0
- package/types/ngneers-controls-color-picker.d.ts +119 -0
- package/types/ngneers-controls-dialog.d.ts +14 -0
- package/types/ngneers-controls-directives.d.ts +31 -2
- package/types/ngneers-controls-drawer.d.ts +14 -0
- package/types/ngneers-controls-edit-inplace.d.ts +20 -0
- package/types/ngneers-controls-errors.d.ts +105 -16
- package/types/ngneers-controls-filter.d.ts +27 -13
- package/types/ngneers-controls-hint.d.ts +8 -1
- package/types/ngneers-controls-i18n-translations-de.d.ts +14 -0
- package/types/ngneers-controls-i18n-translations-en.d.ts +14 -0
- package/types/ngneers-controls-i18n.d.ts +14 -0
- package/types/ngneers-controls-icon.d.ts +2 -2
- package/types/ngneers-controls-input-field.d.ts +25 -2
- package/types/ngneers-controls-input.d.ts +35 -3
- package/types/ngneers-controls-list-box.d.ts +14 -0
- package/types/ngneers-controls-mask-input.d.ts +14 -0
- package/types/ngneers-controls-otp.d.ts +19 -0
- package/types/ngneers-controls-paginator.d.ts +31 -3
- package/types/ngneers-controls-rating.d.ts +69 -0
- package/types/ngneers-controls-scroll-shadow.d.ts +11 -2
- package/types/ngneers-controls-scroller.d.ts +3 -1
- package/types/ngneers-controls-select.d.ts +27 -3
- package/types/ngneers-controls-snackbar.d.ts +14 -0
- package/types/ngneers-controls-splitter.d.ts +14 -0
- package/types/ngneers-controls-state.d.ts +2 -2
- package/types/ngneers-controls-stepper.d.ts +68 -0
- package/types/ngneers-controls-table.d.ts +273 -169
- package/types/ngneers-controls-toast.d.ts +14 -0
- package/types/ngneers-controls-tooltip.d.ts +0 -1
- package/types/ngneers-controls-tree.d.ts +14 -0
- package/types/ngneers-controls-upload.d.ts +14 -0
- package/types/ngneers-controls-utils.d.ts +27 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-tree.mjs","sources":["../../src/tree/tree-templates.ts","../../src/tree/tree-utils.ts","../../src/tree/tree.ts","../../src/tree/tree.html","../../src/tree/ngneers-controls-tree.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\n\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\nimport { ValueControlBase } from '@ngneers/controls/base';\n\nimport type { NgnTreeItem, NgnTreeItemsValue } from '@ngneers/controls/api';\nimport type { InputGeneric } from '@ngneers/controls/utils';\n\n/**\n * Value type for the tree control.\n * * When `multiple` is `true`, the value is an array of node values.\n * * Otherwise it is a single node value.\n *\n * Uses {@link NgnTreeItemsValue} (branch + leaf values) rather than the\n * leaf-only `NgnItemsValue`, since a branch node can be selected too.\n */\nexport type ValueType<Items extends readonly NgnTreeItem[], Multiple extends boolean> =\n InputGeneric<Multiple, false> extends true\n ? NgnTreeItemsValue<Items>[]\n : NgnTreeItemsValue<Items>;\n\n@Directive()\nexport abstract class TreeTemplates<\n Items extends readonly NgnTreeItem[],\n Multiple extends boolean,\n> extends ValueControlBase<'tree', ValueType<Items, Multiple> | null> {\n // Item template\n private readonly _defaultItemTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\n private readonly _userItemTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\n /**\n * Set a custom template for a tree node.\n * Can also be set via an `<ng-template #item>` element. A per-node\n * `item.template` takes precedence over this global template.\n */\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\n protected readonly itemTemplate = computed(\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\n );\n\n // Empty template\n private readonly _defaultEmptyTemplate =\n viewChild.required<TemplateRef<unknown>>('defaultEmptyTemplate');\n private readonly _userEmptyTemplate = contentChild<TemplateRef<unknown>>('empty');\n /**\n * Set a custom template for the empty state.\n * Can also be set via an `<ng-template #empty>` element.\n */\n public readonly templateEmpty = input<TemplateRef<unknown> | null>(null);\n protected readonly emptyTemplate = computed(\n () => this._userEmptyTemplate() ?? this.templateEmpty() ?? this._defaultEmptyTemplate()\n );\n\n public readonly templateTypes = templateTypesFn<{\n item: {\n $implicit: Items[number] | undefined;\n level: number;\n expanded: boolean;\n hasChildren: boolean;\n };\n }>();\n}\n","import type { NgnTreeItem } from '@ngneers/controls/api';\n\nexport interface FlatTreeNode<T = any, V = any> {\n item: NgnTreeItem<T, V>;\n /** 0-based depth. */\n level: number;\n /** Number of siblings at this level (aria-setsize). */\n setSize: number;\n /** 1-based position among siblings (aria-posinset). */\n posInSet: number;\n hasChildren: boolean;\n expanded: boolean;\n /** True when an ancestor is disabled (disable cascades to the subtree). */\n parentDisabled: boolean;\n}\n\n/** Walk the tree, emitting only expanded + visible nodes as a flat list. */\nexport function flattenTree<T, V>(\n items: readonly NgnTreeItem<T, V>[],\n expanded: ReadonlySet<V>,\n level = 0,\n parentDisabled = false\n): FlatTreeNode<T, V>[] {\n const result: FlatTreeNode<T, V>[] = [];\n const setSize = items.length;\n items.forEach((item, index) => {\n // A lazy branch shows a toggle before its children are loaded.\n const hasChildren = (!!item.items && item.items.length > 0) || !!item.lazy;\n const isExpanded = hasChildren && expanded.has(item.value);\n const effectiveDisabled = parentDisabled || !!item.disabled;\n result.push({\n item,\n level,\n setSize,\n posInSet: index + 1,\n hasChildren,\n expanded: isExpanded,\n parentDisabled,\n });\n if (isExpanded && item.items) {\n result.push(...flattenTree(item.items, expanded, level + 1, effectiveDisabled));\n }\n });\n return result;\n}\n\n/**\n * Inject lazily-loaded children (keyed by node value) into the tree, returning\n * a new forest where resolved lazy nodes carry their loaded `items` and are no\n * longer marked `lazy`. Returns the input unchanged when nothing is loaded.\n */\nexport function applyLoadedChildren<T, V>(\n items: readonly NgnTreeItem<T, V>[],\n loaded: ReadonlyMap<V, readonly NgnTreeItem<T, V>[]>\n): readonly NgnTreeItem<T, V>[] {\n if (loaded.size === 0) {\n return items;\n }\n return items.map(item => {\n const cached = loaded.get(item.value);\n if (cached !== undefined) {\n return { ...item, items: [...applyLoadedChildren(cached, loaded)], lazy: false };\n }\n if (item.items && item.items.length > 0) {\n return { ...item, items: [...applyLoadedChildren(item.items, loaded)] };\n }\n return item;\n });\n}\n\n/** All selectable, enabled leaf values under (and including) an item. */\nexport function collectLeafValues<T, V>(item: NgnTreeItem<T, V>, parentDisabled = false): V[] {\n const disabled = parentDisabled || !!item.disabled;\n if (item.items && item.items.length > 0) {\n return item.items.flatMap(child => collectLeafValues(child, disabled));\n }\n if (disabled || item.selectable === false) {\n return [];\n }\n return [item.value];\n}\n\n/** All branch values in the forest (used to auto-expand while filtering). */\nexport function collectBranchValues<T, V>(items: readonly NgnTreeItem<T, V>[]): V[] {\n return items.flatMap(item =>\n item.items && item.items.length > 0 ? [item.value, ...collectBranchValues(item.items)] : []\n );\n}\n\n/** Add/remove all of a node's enabled leaf values against the current value set. */\nexport function cascadeCheck<T, V>(\n node: NgnTreeItem<T, V>,\n shouldCheck: boolean,\n currentValue: readonly V[]\n): V[] {\n const leaves = collectLeafValues(node);\n const set = new Set(currentValue);\n for (const value of leaves) {\n if (shouldCheck) {\n set.add(value);\n } else {\n set.delete(value);\n }\n }\n return [...set];\n}\n\n/** Derive a node's tri-state from which of its leaves are in the value set. */\nexport function computeNodeState<T, V>(\n item: NgnTreeItem<T, V>,\n valueSet: ReadonlySet<V>\n): 'checked' | 'unchecked' | 'indeterminate' {\n const leaves = collectLeafValues(item);\n if (leaves.length === 0) {\n return 'unchecked';\n }\n let checked = 0;\n for (const value of leaves) {\n if (valueSet.has(value)) {\n checked++;\n }\n }\n if (checked === 0) return 'unchecked';\n if (checked === leaves.length) return 'checked';\n return 'indeterminate';\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n type OnInit,\n output,\n runInInjectionContext,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { treeControlTemplate } from '@ngneers/controls-themes/templates/tree';\n\nimport {\n type FilterConfig,\n type FilterConfigInternal,\n filterOptions,\n type NgnTreeItem,\n type NgnTreeItemsValue,\n} from '@ngneers/controls/api';\nimport { NgnStorage, type NgnStorageKind, NgnTemplate } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnScroller, NgnScrollerItem } from '@ngneers/controls/scroller';\nimport { createConditionalSpinner, NgnSpinner } from '@ngneers/controls/spinner';\nimport { Logger, maybeCallback } from '@ngneers/controls/utils';\nimport { asyncComputed } from '@ngneers/controls/utils-ng';\n\nimport { TreeTemplates, type ValueType } from './tree-templates';\nimport {\n applyLoadedChildren,\n cascadeCheck,\n collectBranchValues,\n computeNodeState,\n type FlatTreeNode,\n flattenTree,\n} from './tree-utils';\n\n/** The individual pieces of tree state that can be persisted. */\nexport type NgnTreeStorageState = 'value' | 'expanded';\n\n/**\n * Configuration for persisting tree state (expansion + selection).\n * Pass to the `storage` input, e.g. `{ key: 'my-tree' }` or\n * `{ key: 'my-tree', kind: 'sessionstorage' }`.\n */\nexport interface NgnTreeStorageConfig {\n /** The storage key under which the state is saved. */\n key: string;\n /**\n * Where/how to persist. Accepts `'localstorage'`, `'sessionstorage'`, or a\n * custom `{ initialize, update }` adapter. Defaults to `'localstorage'`.\n */\n kind?: NgnStorageKind<Record<string, unknown>>;\n /**\n * Which states to persist. When omitted, all states are saved. When\n * provided, only the listed states are saved/restored.\n */\n states?: NgnTreeStorageState[];\n}\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-tree',\n templateUrl: './tree.html',\n imports: [\n NgTemplateOutlet,\n NgnScroller,\n NgnScrollerItem,\n NgnCheckbox,\n NgnSpinner,\n NgnTemplate,\n NgnPt,\n ],\n providers: [provideSelf(NgnTree)],\n host: {\n '[attr.tabIndex]': 'focussable() ? 0 : null',\n '(keydown)': 'onKeyDown($event)',\n '(focusout)': 'currentHighlightedValue.set(null)',\n role: 'tree',\n '[attr.aria-activedescendant]':\n 'currentHighlightedValue() != null ? inputId() + \"_node_\" + currentHighlightedValue() : null',\n '[attr.aria-multiselectable]': '!!multiple()',\n '[attr.aria-label]': 'label()',\n '[attr.aria-labelledby]': 'labelledBy()',\n '[id]': 'inputId()',\n },\n})\nexport class NgnTree<Items extends readonly NgnTreeItem[], Multiple extends boolean = false>\n extends TreeTemplates<Items, Multiple>\n implements OnInit\n{\n protected readonly i18n = inject(I18n).translations;\n protected readonly theme = this.injectThemeTemplate(treeControlTemplate, {\n root: true,\n invalid: () => this.invalid(),\n empty: () => !this.flatNodes().length,\n });\n\n private readonly _scroller = viewChild.required<NgnScroller<FlatTreeNode>>(NgnScroller);\n\n /** The tree items to render, as a nested list of {@link NgnTreeItem} objects. */\n public readonly items = input.required<Items>();\n\n /**\n * Whether nodes can be selected/checked.\n * @default true\n */\n public readonly selectable = input(true, { transform: booleanAttribute });\n /**\n * Whether the tree is focusable and participates in keyboard navigation.\n * @default true\n */\n public readonly focussable = input(true, { transform: booleanAttribute });\n /**\n * Whether the tree is virtualized. When enabled, provide {@link itemHeight}.\n * @default false\n */\n public readonly virtual = input(false, { transform: booleanAttribute });\n /**\n * When {@link virtual} is enabled, this defines the height of each node in the list.\n */\n public readonly itemHeight = input<number>();\n /**\n * Enable this to allow selecting multiple nodes. The value then becomes an array of node values.\n * @default false\n */\n public readonly multiple = input<Multiple>();\n /**\n * Whether to render checkboxes. Defaults to `multiple()`.\n * @default multiple()\n */\n public readonly checkbox = input<boolean>();\n /**\n * Boolean to enable filtering, or a `FilterConfig` to customize it.\n * @default false\n */\n public readonly filter = input<FilterConfig<Items[number]> | boolean>(false);\n /** Manually set the filter text. */\n public readonly filterText = input<string | null>(null);\n /** Values of expanded branch nodes (two-way). */\n public readonly expandedValues = model<NgnTreeItemsValue<Items>[]>([]);\n\n /**\n * Persist expansion + selection state across reloads. Provide a key and,\n * optionally, an `NgnStorageKind` (defaults to `'localstorage'`).\n */\n public readonly storage = input<NgnTreeStorageConfig | null>(null);\n private _storage?: NgnStorage<Record<string, unknown>>;\n\n /**\n * Loads the children of a `lazy` node the first time it is expanded.\n * The returned items are cached internally and merged into the tree.\n */\n public readonly loadChildren =\n input<(item: NgnTreeItem) => readonly NgnTreeItem[] | Promise<readonly NgnTreeItem[]>>();\n\n /** Emitted with the node's value whenever a node is clicked/selected. */\n public readonly itemClicked = output<NgnTreeItemsValue<Items>>();\n /** Emitted when a branch is expanded (fires before any lazy load resolves). */\n public readonly nodeExpand = output<NgnTreeItem>();\n\n protected readonly maybeCallback = maybeCallback;\n\n /** Lazily-loaded children, keyed by node value. */\n private readonly _loadedChildren = signal<\n ReadonlyMap<NgnTreeItemsValue<Items>, readonly NgnTreeItem[]>\n >(new Map());\n /** Node values currently awaiting their lazy children. */\n private readonly _loadingNodes = signal<ReadonlySet<NgnTreeItemsValue<Items>>>(new Set());\n\n protected readonly filteredItems = asyncComputed(async () => {\n const filter = !!this.filter();\n const appliedFilterOptions = this._appliedFilterOptions();\n const filterText = this.filterText();\n if (!filter || !filterText) {\n return this.items() as readonly NgnTreeItem[];\n }\n return await filterOptions(this.items(), filterText, appliedFilterOptions);\n }, []);\n\n private readonly _appliedFilterOptions = computed(() => {\n const filter = this.filter();\n const providedFilterArgs = typeof filter === 'boolean' ? {} : filter;\n const options: FilterConfigInternal<NgnTreeItem> = {\n filterFieldsCallback: item => item.label,\n fieldItems: 'items',\n splitWords: true,\n caseSensitive: false,\n filterFn: 'contains',\n ...providedFilterArgs,\n };\n return options;\n });\n\n protected readonly filterIsExecuting = this.filteredItems.isRunning;\n\n /** While filtering, auto-expand every branch that survived the filter. */\n private readonly _autoExpanded = computed(() =>\n this.filterText() ? collectBranchValues(this.filteredItems()) : []\n );\n\n private readonly _expandedSet = computed(\n () => new Set<NgnTreeItemsValue<Items>>([...this.expandedValues(), ...this._autoExpanded()])\n );\n\n /** Filtered items with any lazily-loaded children merged in. */\n private readonly _effectiveItems = computed(() =>\n applyLoadedChildren(this.filteredItems(), this._loadedChildren())\n );\n\n public readonly flatNodes = computed(() =>\n flattenTree(this._effectiveItems(), this._expandedSet())\n );\n\n protected readonly valueArray = computed(() => {\n const v = this.value();\n return (Array.isArray(v) ? v : v != null ? [v] : []) as NgnTreeItemsValue<Items>[];\n });\n private readonly _valueSet = computed(() => new Set(this.valueArray()));\n\n public readonly currentHighlightedValue = signal<NgnTreeItemsValue<Items> | null>(null);\n\n protected readonly showCheckboxes = computed(() => this.checkbox() ?? this.multiple() ?? false);\n\n constructor() {\n super();\n createConditionalSpinner(this.filterIsExecuting);\n\n // Fallback init for when the `storage` config arrives after ngOnInit (e.g.\n // an async binding). Idempotent with the ngOnInit path. Registered before\n // the persistence effect so the store is restored before any write; the\n // persistence effect no-ops until `_storage` exists anyway.\n effect(() => {\n const cfg = this.storage();\n if (cfg) {\n untracked(() => this._initStorage(cfg));\n }\n });\n\n // Persist expansion + selection whenever they change.\n effect(() => {\n const expanded = this.expandedValues();\n const value = this.value();\n untracked(() => {\n if (!this._storage) {\n return;\n }\n if (this._persistsState('expanded')) {\n this._storage.set('expanded', expanded);\n }\n if (this._persistsState('value')) {\n this._storage.set('value', value ?? null);\n }\n });\n });\n\n // Drop cached lazy children when the source items change identity.\n effect(() => {\n this.items();\n untracked(() => {\n if (this._loadedChildren().size || this._loadingNodes().size) {\n this._loadedChildren.set(new Map());\n this._loadingNodes.set(new Set());\n }\n });\n });\n\n effect(() => {\n const highlighted = this.currentHighlightedValue();\n if (highlighted == null) {\n return;\n }\n const index = this.flatNodes().findIndex(node => node.item.value === highlighted);\n if (index >= 0) {\n this._scroller().scrollToIndex(index);\n }\n });\n }\n\n /**\n * Create the store and restore persisted state before the first view check\n * (so it also feeds the SSR render for the `cookie` kind without triggering\n * ExpressionChangedAfterItHasBeenChecked).\n *\n * This is the common path: the `storage` config is normally bound before\n * init, so the restore happens pre-render. When the config only becomes\n * available after init (e.g. an async binding, or a dynamic host that applies\n * inputs after creating the component), the constructor effect below picks it\n * up instead — `_initStorage` is idempotent, so at most one of them runs.\n */\n public ngOnInit(): void {\n const cfg = this.storage();\n if (cfg) {\n this._initStorage(cfg);\n }\n }\n\n /** Create the store and restore persisted state. Runs at most once. */\n private _initStorage(cfg: NgnTreeStorageConfig): void {\n if (this._storage) {\n return;\n }\n // NgnStorage reads platform/document/request tokens, so it needs an\n // injection context.\n this._storage = runInInjectionContext(\n this.injector,\n () =>\n new NgnStorage<Record<string, unknown>>(cfg.key, cfg.kind ?? 'localstorage', {\n expanded: this.expandedValues(),\n value: this.value() ?? null,\n })\n );\n if (this._persistsState('expanded')) {\n const savedExpanded = this._storage.get('expanded');\n if (Array.isArray(savedExpanded)) {\n this.expandedValues.set(savedExpanded as NgnTreeItemsValue<Items>[]);\n }\n }\n if (this._persistsState('value')) {\n const savedValue = this._storage.get('value');\n if (savedValue !== undefined) {\n this.value.set(savedValue as ValueType<Items, Multiple>);\n }\n }\n }\n\n /** Whether the given state should be persisted (all states when unset). */\n private _persistsState(state: NgnTreeStorageState): boolean {\n const states = this.storage()?.states;\n return !states || states.includes(state);\n }\n\n /** Derived tri-state for a node's checkbox / aria-checked. */\n protected nodeState(item: NgnTreeItem): 'checked' | 'unchecked' | 'indeterminate' {\n return computeNodeState(item, this._valueSet());\n }\n\n /** Whether a node can be selected/checked right now. */\n protected isSelectable(node: FlatTreeNode): boolean {\n const disabled = node.parentDisabled || !!node.item.disabled;\n return this.selectable() && node.item.selectable !== false && !disabled;\n }\n\n /** Whether a lazy node is currently loading its children. */\n protected isLoading(item: NgnTreeItem): boolean {\n return this._loadingNodes().has(item.value as NgnTreeItemsValue<Items>);\n }\n\n protected async toggleExpand(item: NgnTreeItem): Promise<void> {\n const value = item.value as NgnTreeItemsValue<Items>;\n const willExpand = !this.expandedValues().includes(value);\n this.expandedValues.update(values =>\n values.includes(value) ? values.filter(v => v !== value) : [...values, value]\n );\n if (!willExpand) {\n return;\n }\n this.nodeExpand.emit(item);\n\n const loader = this.loadChildren();\n if (\n !item.lazy ||\n !loader ||\n this._loadedChildren().has(value) ||\n this._loadingNodes().has(value)\n ) {\n return;\n }\n this._loadingNodes.update(set => new Set(set).add(value));\n let children: readonly NgnTreeItem[] | undefined;\n try {\n children = await loader(item);\n } catch (error) {\n Logger.warn(`ngn-tree: failed to load children for node \"${String(value)}\"`, error);\n }\n // Ignore stale results: if items() changed mid-load, the loading state was\n // cleared and this result should be dropped.\n if (children && this._loadingNodes().has(value)) {\n this._loadedChildren.update(map => new Map(map).set(value, children));\n }\n this._loadingNodes.update(set => {\n const next = new Set(set);\n next.delete(value);\n return next;\n });\n }\n\n protected onRowClick(node: FlatTreeNode): void {\n if (!this.isSelectable(node)) {\n return;\n }\n this.onSelect(node.item);\n }\n\n protected onSelect(item: NgnTreeItem): void {\n const value = item.value as NgnTreeItemsValue<Items>;\n if (this.multiple()) {\n if (this.showCheckboxes()) {\n // Cascade tri-state checking; value stays a leaf-only array.\n const shouldCheck = this.nodeState(item) !== 'checked';\n this.value.set(\n cascadeCheck(item, shouldCheck, this.valueArray()) as ValueType<Items, Multiple>\n );\n } else {\n const current = (this.value() as NgnTreeItemsValue<Items>[]) ?? [];\n this.value.set(\n (current.includes(value)\n ? current.filter(v => v !== value)\n : [...current, value]) as ValueType<Items, Multiple>\n );\n }\n } else {\n // Single-select always stores a single value (never an array), even when\n // checkboxes are shown.\n this.value.set(value as ValueType<Items, Multiple>);\n }\n this.itemClicked.emit(value);\n this.touched.set(true);\n }\n\n public scrollToIndex(index: number): void {\n this._scroller().scrollToIndex(index);\n }\n\n public onKeyDown(event: KeyboardEvent): void {\n const nodes = this.flatNodes();\n if (!nodes.length) {\n return;\n }\n const enabled = nodes.filter(n => !(n.parentDisabled || n.item.disabled));\n const key = event.key;\n\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n this._moveHighlight(enabled, key === 'ArrowDown' ? 1 : -1);\n } else if (key === 'Home' || key === 'End') {\n event.preventDefault();\n event.stopPropagation();\n const target = key === 'Home' ? enabled[0] : enabled[enabled.length - 1];\n this.currentHighlightedValue.set(\n (target?.item.value ?? null) as NgnTreeItemsValue<Items> | null\n );\n } else if (key === 'ArrowRight') {\n event.preventDefault();\n event.stopPropagation();\n this._expandOrEnter(nodes);\n } else if (key === 'ArrowLeft') {\n event.preventDefault();\n event.stopPropagation();\n this._collapseOrLeave(nodes);\n } else if (key === 'Enter' || key === ' ') {\n const node = this._currentNode(nodes);\n if (node && this.isSelectable(node)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.onSelect(node.item);\n }\n } else if (key.length === 1 && /\\S/.test(key)) {\n this._typeahead(enabled, key);\n }\n }\n\n private _currentNode(nodes: readonly FlatTreeNode[]): FlatTreeNode | undefined {\n const current = this.currentHighlightedValue();\n return nodes.find(n => n.item.value === current);\n }\n\n private _moveHighlight(enabled: readonly FlatTreeNode[], dir: 1 | -1): void {\n if (!enabled.length) {\n this.currentHighlightedValue.set(null);\n return;\n }\n const current = this.currentHighlightedValue();\n const idx = enabled.findIndex(n => n.item.value === current);\n let next: number;\n if (idx === -1) {\n next = dir === 1 ? 0 : enabled.length - 1;\n } else {\n next = (idx + dir + enabled.length) % enabled.length;\n }\n const target = enabled[next];\n if (target) {\n this.currentHighlightedValue.set(target.item.value as NgnTreeItemsValue<Items>);\n }\n }\n\n private _expandOrEnter(nodes: readonly FlatTreeNode[]): void {\n const node = this._currentNode(nodes);\n if (!node) {\n return;\n }\n if (node.hasChildren && !node.expanded) {\n void this.toggleExpand(node.item);\n } else if (node.hasChildren && node.expanded) {\n const idx = nodes.indexOf(node);\n for (let i = idx + 1; i < nodes.length; i++) {\n const candidate = nodes[i];\n if (!candidate || candidate.level <= node.level) {\n break; // left this node's subtree\n }\n if (!(candidate.parentDisabled || candidate.item.disabled)) {\n this.currentHighlightedValue.set(candidate.item.value as NgnTreeItemsValue<Items>);\n return;\n }\n }\n }\n }\n\n private _collapseOrLeave(nodes: readonly FlatTreeNode[]): void {\n const node = this._currentNode(nodes);\n if (!node) {\n return;\n }\n if (node.hasChildren && node.expanded) {\n void this.toggleExpand(node.item);\n return;\n }\n // move to parent: previous node with a smaller level\n const idx = nodes.indexOf(node);\n for (let i = idx - 1; i >= 0; i--) {\n const ancestor = nodes[i];\n if (!ancestor) {\n continue;\n }\n if (ancestor.level < node.level) {\n if (!(ancestor.parentDisabled || ancestor.item.disabled)) {\n this.currentHighlightedValue.set(ancestor.item.value as NgnTreeItemsValue<Items>);\n }\n return;\n }\n }\n }\n\n private _typeahead(enabled: readonly FlatTreeNode[], char: string): void {\n const lower = char.toLowerCase();\n const current = this.currentHighlightedValue();\n const start = enabled.findIndex(n => n.item.value === current);\n for (let offset = 1; offset <= enabled.length; offset++) {\n const node = enabled[(start + offset + enabled.length) % enabled.length];\n if (!node) {\n continue;\n }\n const label = maybeCallback(node.item.label).toLowerCase();\n if (label.startsWith(lower)) {\n this.currentHighlightedValue.set(node.item.value as NgnTreeItemsValue<Items>);\n return;\n }\n }\n }\n}\n","<ngn-scroller\n [ptInt]=\"this\"\n [ptDep]=\"'scroller'\"\n [virtual]=\"virtual()\"\n [itemHeight]=\"itemHeight()\"\n [items]=\"flatNodes()\"\n [templateItem]=\"usedItemTemplate\"\n #scroller\n/>\n\n@if (!flatNodes().length) {\n <div role=\"status\">\n <ng-container\n *ngTemplateOutlet=\"emptyTemplate() || defaultEmptyTemplate; context: {}\"\n ></ng-container>\n </div>\n}\n\n<ng-template #usedItemTemplate [ngnTemplate]=\"scroller.templateTypes.item\" let-node>\n @let item = node.item;\n @let disabled = node.parentDisabled || item.disabled;\n @let state = nodeState(item);\n @let selectableNode = isSelectable(node);\n <!--\n Virtual scrolling renders a flat list, so treeitems are not DOM-nested in\n role=\"group\" containers. Per WAI-ARIA, aria-level + aria-setsize +\n aria-posinset are the sanctioned substitute that convey the hierarchy to\n assistive tech. (The `group` CSS class below is visual styling only.)\n -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n [ngnScrollerItem]=\"node\"\n [id]=\"inputId() + '_node_' + item.value\"\n role=\"treeitem\"\n [attr.aria-level]=\"node.level + 1\"\n [attr.aria-setsize]=\"node.setSize\"\n [attr.aria-posinset]=\"node.posInSet\"\n [attr.aria-expanded]=\"node.hasChildren ? node.expanded : null\"\n [attr.aria-selected]=\"\n !showCheckboxes() && selectableNode ? valueArray().includes(item.value) : null\n \"\n [attr.aria-checked]=\"\n showCheckboxes() && selectableNode\n ? state === 'indeterminate'\n ? 'mixed'\n : state === 'checked'\n ? 'true'\n : 'false'\n : null\n \"\n [attr.aria-disabled]=\"disabled ? 'true' : null\"\n [style.--ngn-tree-level]=\"node.level\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n item: !item.items,\n group: !!item.items,\n 'item-selectable': selectableNode,\n 'item-selected': valueArray().includes(item.value),\n 'item-highlighted': item.value === currentHighlightedValue(),\n 'item-disabled': !!disabled,\n 'item-expanded': node.expanded,\n }\"\n (click)=\"onRowClick(node)\"\n >\n @if (node.hasChildren) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [ptInt]=\"this\"\n [ptClass]=\"'toggle'\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"toggleExpand(item); $event.stopPropagation()\"\n >\n <span [ptInt]=\"this\" [ptClass]=\"'toggle-icon'\">\n @if (isLoading(item)) {\n <ngn-spinner [size]=\"14\" />\n } @else {\n <span [ptInt]=\"this\" [ptClass]=\"'toggle-arrow'\"></span>\n }\n </span>\n </button>\n } @else {\n <span [ptInt]=\"this\" [ptClass]=\"'toggle-placeholder'\" aria-hidden=\"true\"></span>\n }\n @if (showCheckboxes() && selectableNode) {\n <ngn-checkbox\n [ptInt]=\"this\"\n [ptDep]=\"'item-checkbox'\"\n [allowIndeterminate]=\"true\"\n [value]=\"state === 'indeterminate' ? null : state === 'checked'\"\n aria-hidden=\"true\"\n inert=\"true\"\n />\n } @else if (showCheckboxes() && selectable() && item.selectable !== false) {\n <!-- Disabled node: show the checkbox for consistency, but disabled. -->\n <ngn-checkbox\n [ptInt]=\"this\"\n [ptDep]=\"'item-checkbox'\"\n [allowIndeterminate]=\"true\"\n [value]=\"state === 'indeterminate' ? null : state === 'checked'\"\n [disabled]=\"true\"\n aria-hidden=\"true\"\n inert=\"true\"\n />\n } @else if (showCheckboxes()) {\n <span [ptInt]=\"this\" [ptClass]=\"'item-checkbox-placeholder'\" aria-hidden=\"true\"></span>\n }\n @if (item.template) {\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item }\"></ng-container>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate();\n context: {\n $implicit: item,\n level: node.level,\n expanded: node.expanded,\n hasChildren: node.hasChildren,\n }\n \"\n ></ng-container>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\n <span [attr.data-testid]=\"item?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-item'\">\n @let label = item?.label;\n @if (label) {\n <span>{{ maybeCallback(label) }}</span>\n } @else {\n <span>​</span>\n }\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyTemplate>\n <span [ptInt]=\"this\" [ptClass]=\"'empty'\" [attr.data-testid]=\"'empty'\">{{\n i18n['tree_noItemsFound']()\n }}</span>\n</ng-template>\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-tree.mjs","sources":["../../src/tree/tree-templates.ts","../../src/tree/tree-utils.ts","../../src/tree/tree.ts","../../src/tree/tree.html","../../src/tree/ngneers-controls-tree.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\n\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\nimport { ValueControlBase } from '@ngneers/controls/base';\n\nimport type { NgnTreeItem, NgnTreeItemsValue } from '@ngneers/controls/api';\nimport type { InputGeneric } from '@ngneers/controls/utils';\n\n/**\n * Value type for the tree control.\n * * When `multiple` is `true`, the value is an array of node values.\n * * Otherwise it is a single node value.\n *\n * Uses {@link NgnTreeItemsValue} (branch + leaf values) rather than the\n * leaf-only `NgnItemsValue`, since a branch node can be selected too.\n */\nexport type ValueType<Items extends readonly NgnTreeItem[], Multiple extends boolean> =\n InputGeneric<Multiple, false> extends true\n ? NgnTreeItemsValue<Items>[]\n : NgnTreeItemsValue<Items>;\n\n@Directive()\nexport abstract class TreeTemplates<\n Items extends readonly NgnTreeItem[],\n Multiple extends boolean,\n> extends ValueControlBase<'tree', ValueType<Items, Multiple> | null> {\n // Item template\n private readonly _defaultItemTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\n private readonly _userItemTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\n /**\n * Set a custom template for a tree node.\n * Can also be set via an `<ng-template #item>` element. A per-node\n * `item.template` takes precedence over this global template.\n */\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\n protected readonly itemTemplate = computed(\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\n );\n\n // Empty template\n private readonly _defaultEmptyTemplate =\n viewChild.required<TemplateRef<unknown>>('defaultEmptyTemplate');\n private readonly _userEmptyTemplate = contentChild<TemplateRef<unknown>>('empty');\n /**\n * Set a custom template for the empty state.\n * Can also be set via an `<ng-template #empty>` element.\n */\n public readonly templateEmpty = input<TemplateRef<unknown> | null>(null);\n protected readonly emptyTemplate = computed(\n () => this._userEmptyTemplate() ?? this.templateEmpty() ?? this._defaultEmptyTemplate()\n );\n\n public readonly templateTypes = templateTypesFn<{\n item: {\n $implicit: Items[number] | undefined;\n level: number;\n expanded: boolean;\n hasChildren: boolean;\n };\n }>();\n}\n","import type { NgnTreeItem } from '@ngneers/controls/api';\n\nexport interface FlatTreeNode<T = any, V = any> {\n item: NgnTreeItem<T, V>;\n /** 0-based depth. */\n level: number;\n /** Number of siblings at this level (aria-setsize). */\n setSize: number;\n /** 1-based position among siblings (aria-posinset). */\n posInSet: number;\n hasChildren: boolean;\n expanded: boolean;\n /** True when an ancestor is disabled (disable cascades to the subtree). */\n parentDisabled: boolean;\n}\n\n/** Walk the tree, emitting only expanded + visible nodes as a flat list. */\nexport function flattenTree<T, V>(\n items: readonly NgnTreeItem<T, V>[],\n expanded: ReadonlySet<V>,\n level = 0,\n parentDisabled = false\n): FlatTreeNode<T, V>[] {\n const result: FlatTreeNode<T, V>[] = [];\n const setSize = items.length;\n items.forEach((item, index) => {\n // A lazy branch shows a toggle before its children are loaded.\n const hasChildren = (!!item.items && item.items.length > 0) || !!item.lazy;\n const isExpanded = hasChildren && expanded.has(item.value);\n const effectiveDisabled = parentDisabled || !!item.disabled;\n result.push({\n item,\n level,\n setSize,\n posInSet: index + 1,\n hasChildren,\n expanded: isExpanded,\n parentDisabled,\n });\n if (isExpanded && item.items) {\n result.push(...flattenTree(item.items, expanded, level + 1, effectiveDisabled));\n }\n });\n return result;\n}\n\n/**\n * Inject lazily-loaded children (keyed by node value) into the tree, returning\n * a new forest where resolved lazy nodes carry their loaded `items` and are no\n * longer marked `lazy`. Returns the input unchanged when nothing is loaded.\n */\nexport function applyLoadedChildren<T, V>(\n items: readonly NgnTreeItem<T, V>[],\n loaded: ReadonlyMap<V, readonly NgnTreeItem<T, V>[]>\n): readonly NgnTreeItem<T, V>[] {\n if (loaded.size === 0) {\n return items;\n }\n return items.map(item => {\n const cached = loaded.get(item.value);\n if (cached !== undefined) {\n return { ...item, items: [...applyLoadedChildren(cached, loaded)], lazy: false };\n }\n if (item.items && item.items.length > 0) {\n return { ...item, items: [...applyLoadedChildren(item.items, loaded)] };\n }\n return item;\n });\n}\n\n/** All selectable, enabled leaf values under (and including) an item. */\nexport function collectLeafValues<T, V>(item: NgnTreeItem<T, V>, parentDisabled = false): V[] {\n const disabled = parentDisabled || !!item.disabled;\n if (item.items && item.items.length > 0) {\n return item.items.flatMap(child => collectLeafValues(child, disabled));\n }\n if (disabled || item.selectable === false) {\n return [];\n }\n return [item.value];\n}\n\n/** All branch values in the forest (used to auto-expand while filtering). */\nexport function collectBranchValues<T, V>(items: readonly NgnTreeItem<T, V>[]): V[] {\n return items.flatMap(item =>\n item.items && item.items.length > 0 ? [item.value, ...collectBranchValues(item.items)] : []\n );\n}\n\n/** Add/remove all of a node's enabled leaf values against the current value set. */\nexport function cascadeCheck<T, V>(\n node: NgnTreeItem<T, V>,\n shouldCheck: boolean,\n currentValue: readonly V[]\n): V[] {\n const leaves = collectLeafValues(node);\n const set = new Set(currentValue);\n for (const value of leaves) {\n if (shouldCheck) {\n set.add(value);\n } else {\n set.delete(value);\n }\n }\n return [...set];\n}\n\n/** Derive a node's tri-state from which of its leaves are in the value set. */\nexport function computeNodeState<T, V>(\n item: NgnTreeItem<T, V>,\n valueSet: ReadonlySet<V>\n): 'checked' | 'unchecked' | 'indeterminate' {\n const leaves = collectLeafValues(item);\n if (leaves.length === 0) {\n return 'unchecked';\n }\n let checked = 0;\n for (const value of leaves) {\n if (valueSet.has(value)) {\n checked++;\n }\n }\n if (checked === 0) return 'unchecked';\n if (checked === leaves.length) return 'checked';\n return 'indeterminate';\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n type OnInit,\n output,\n runInInjectionContext,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { treeControlTemplate } from '@ngneers/controls-themes/templates/tree';\n\nimport {\n type FilterConfig,\n type FilterConfigInternal,\n filterOptions,\n type NgnTreeItem,\n type NgnTreeItemsValue,\n} from '@ngneers/controls/api';\nimport { NgnStorage, type NgnStorageKind, NgnTemplate } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnScroller, NgnScrollerItem } from '@ngneers/controls/scroller';\nimport { createConditionalSpinner, NgnSpinner } from '@ngneers/controls/spinner';\nimport { Logger, maybeCallback } from '@ngneers/controls/utils';\nimport { asyncComputed } from '@ngneers/controls/utils-ng';\n\nimport { TreeTemplates, type ValueType } from './tree-templates';\nimport {\n applyLoadedChildren,\n cascadeCheck,\n collectBranchValues,\n computeNodeState,\n type FlatTreeNode,\n flattenTree,\n} from './tree-utils';\n\n/** The individual pieces of tree state that can be persisted. */\nexport type NgnTreeStorageState = 'value' | 'expanded';\n\n/**\n * Configuration for persisting tree state (expansion + selection).\n * Pass to the `storage` input, e.g. `{ key: 'my-tree' }` or\n * `{ key: 'my-tree', kind: 'sessionstorage' }`.\n */\nexport interface NgnTreeStorageConfig {\n /** The storage key under which the state is saved. */\n key: string;\n /**\n * Where/how to persist. Accepts `'localstorage'`, `'sessionstorage'`, or a\n * custom `{ initialize, update }` adapter. Defaults to `'localstorage'`.\n */\n kind?: NgnStorageKind<Record<string, unknown>>;\n /**\n * Which states to persist. When omitted, all states are saved. When\n * provided, only the listed states are saved/restored.\n */\n states?: NgnTreeStorageState[];\n}\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-tree',\n templateUrl: './tree.html',\n imports: [\n NgTemplateOutlet,\n NgnScroller,\n NgnScrollerItem,\n NgnCheckbox,\n NgnSpinner,\n NgnTemplate,\n NgnPt,\n ],\n providers: [provideSelf(NgnTree)],\n host: {\n '[attr.tabIndex]': 'focussable() ? 0 : null',\n '(keydown)': 'onKeyDown($event)',\n '(focusout)': 'currentHighlightedValue.set(null)',\n role: 'tree',\n '[attr.aria-activedescendant]':\n 'currentHighlightedValue() != null ? inputId() + \"_node_\" + currentHighlightedValue() : null',\n '[attr.aria-multiselectable]': '!!multiple()',\n '[attr.aria-label]': 'label()',\n '[attr.aria-labelledby]': 'labelledBy()',\n '[id]': 'inputId()',\n },\n})\nexport class NgnTree<Items extends readonly NgnTreeItem[], Multiple extends boolean = false>\n extends TreeTemplates<Items, Multiple>\n implements OnInit\n{\n protected readonly i18n = inject(I18n).translations;\n protected readonly theme = this.injectThemeTemplate(treeControlTemplate, {\n root: true,\n invalid: () => this.invalidState(),\n empty: () => !this.flatNodes().length,\n });\n\n private readonly _scroller = viewChild.required<NgnScroller<FlatTreeNode>>(NgnScroller);\n\n /** The tree items to render, as a nested list of {@link NgnTreeItem} objects. */\n public readonly items = input.required<Items>();\n\n /**\n * Whether nodes can be selected/checked.\n * @default true\n */\n public readonly selectable = input(true, { transform: booleanAttribute });\n /**\n * Whether the tree is focusable and participates in keyboard navigation.\n * @default true\n */\n public readonly focussable = input(true, { transform: booleanAttribute });\n /**\n * Whether the tree is virtualized. When enabled, provide {@link itemHeight}.\n * @default false\n */\n public readonly virtual = input(false, { transform: booleanAttribute });\n /**\n * When {@link virtual} is enabled, this defines the height of each node in the list.\n */\n public readonly itemHeight = input<number>();\n /**\n * Enable this to allow selecting multiple nodes. The value then becomes an array of node values.\n * @default false\n */\n public readonly multiple = input<Multiple>();\n /**\n * Whether to render checkboxes. Defaults to `multiple()`.\n * @default multiple()\n */\n public readonly checkbox = input<boolean>();\n /**\n * Boolean to enable filtering, or a `FilterConfig` to customize it.\n * @default false\n */\n public readonly filter = input<FilterConfig<Items[number]> | boolean>(false);\n /** Manually set the filter text. */\n public readonly filterText = input<string | null>(null);\n /** Values of expanded branch nodes (two-way). */\n public readonly expandedValues = model<NgnTreeItemsValue<Items>[]>([]);\n\n /**\n * Persist expansion + selection state across reloads. Provide a key and,\n * optionally, an `NgnStorageKind` (defaults to `'localstorage'`).\n */\n public readonly storage = input<NgnTreeStorageConfig | null>(null);\n private _storage?: NgnStorage<Record<string, unknown>>;\n\n /**\n * Loads the children of a `lazy` node the first time it is expanded.\n * The returned items are cached internally and merged into the tree.\n */\n public readonly loadChildren =\n input<(item: NgnTreeItem) => readonly NgnTreeItem[] | Promise<readonly NgnTreeItem[]>>();\n\n /** Emitted with the node's value whenever a node is clicked/selected. */\n public readonly itemClicked = output<NgnTreeItemsValue<Items>>();\n /** Emitted when a branch is expanded (fires before any lazy load resolves). */\n public readonly nodeExpand = output<NgnTreeItem>();\n\n protected readonly maybeCallback = maybeCallback;\n\n /** Lazily-loaded children, keyed by node value. */\n private readonly _loadedChildren = signal<\n ReadonlyMap<NgnTreeItemsValue<Items>, readonly NgnTreeItem[]>\n >(new Map());\n /** Node values currently awaiting their lazy children. */\n private readonly _loadingNodes = signal<ReadonlySet<NgnTreeItemsValue<Items>>>(new Set());\n\n protected readonly filteredItems = asyncComputed(async () => {\n const filter = !!this.filter();\n const appliedFilterOptions = this._appliedFilterOptions();\n const filterText = this.filterText();\n if (!filter || !filterText) {\n return this.items() as readonly NgnTreeItem[];\n }\n return await filterOptions(this.items(), filterText, appliedFilterOptions);\n }, []);\n\n private readonly _appliedFilterOptions = computed(() => {\n const filter = this.filter();\n const providedFilterArgs = typeof filter === 'boolean' ? {} : filter;\n const options: FilterConfigInternal<NgnTreeItem> = {\n filterFieldsCallback: item => item.label,\n fieldItems: 'items',\n splitWords: true,\n caseSensitive: false,\n filterFn: 'contains',\n ...providedFilterArgs,\n };\n return options;\n });\n\n protected readonly filterIsExecuting = this.filteredItems.isRunning;\n\n /** While filtering, auto-expand every branch that survived the filter. */\n private readonly _autoExpanded = computed(() =>\n this.filterText() ? collectBranchValues(this.filteredItems()) : []\n );\n\n private readonly _expandedSet = computed(\n () => new Set<NgnTreeItemsValue<Items>>([...this.expandedValues(), ...this._autoExpanded()])\n );\n\n /** Filtered items with any lazily-loaded children merged in. */\n private readonly _effectiveItems = computed(() =>\n applyLoadedChildren(this.filteredItems(), this._loadedChildren())\n );\n\n public readonly flatNodes = computed(() =>\n flattenTree(this._effectiveItems(), this._expandedSet())\n );\n\n protected readonly valueArray = computed(() => {\n const v = this.value();\n return (Array.isArray(v) ? v : v != null ? [v] : []) as NgnTreeItemsValue<Items>[];\n });\n private readonly _valueSet = computed(() => new Set(this.valueArray()));\n\n public readonly currentHighlightedValue = signal<NgnTreeItemsValue<Items> | null>(null);\n\n protected readonly showCheckboxes = computed(() => this.checkbox() ?? this.multiple() ?? false);\n\n constructor() {\n super();\n createConditionalSpinner(this.filterIsExecuting);\n\n // Fallback init for when the `storage` config arrives after ngOnInit (e.g.\n // an async binding). Idempotent with the ngOnInit path. Registered before\n // the persistence effect so the store is restored before any write; the\n // persistence effect no-ops until `_storage` exists anyway.\n effect(() => {\n const cfg = this.storage();\n if (cfg) {\n untracked(() => this._initStorage(cfg));\n }\n });\n\n // Persist expansion + selection whenever they change.\n effect(() => {\n const expanded = this.expandedValues();\n const value = this.value();\n untracked(() => {\n if (!this._storage) {\n return;\n }\n if (this._persistsState('expanded')) {\n this._storage.set('expanded', expanded);\n }\n if (this._persistsState('value')) {\n this._storage.set('value', value ?? null);\n }\n });\n });\n\n // Drop cached lazy children when the source items change identity.\n effect(() => {\n this.items();\n untracked(() => {\n if (this._loadedChildren().size || this._loadingNodes().size) {\n this._loadedChildren.set(new Map());\n this._loadingNodes.set(new Set());\n }\n });\n });\n\n effect(() => {\n const highlighted = this.currentHighlightedValue();\n if (highlighted == null) {\n return;\n }\n const index = this.flatNodes().findIndex(node => node.item.value === highlighted);\n if (index >= 0) {\n this._scroller().scrollToIndex(index);\n }\n });\n }\n\n /**\n * Create the store and restore persisted state before the first view check\n * (so it also feeds the SSR render for the `cookie` kind without triggering\n * ExpressionChangedAfterItHasBeenChecked).\n *\n * This is the common path: the `storage` config is normally bound before\n * init, so the restore happens pre-render. When the config only becomes\n * available after init (e.g. an async binding, or a dynamic host that applies\n * inputs after creating the component), the constructor effect below picks it\n * up instead — `_initStorage` is idempotent, so at most one of them runs.\n */\n public ngOnInit(): void {\n const cfg = this.storage();\n if (cfg) {\n this._initStorage(cfg);\n }\n }\n\n /** Create the store and restore persisted state. Runs at most once. */\n private _initStorage(cfg: NgnTreeStorageConfig): void {\n if (this._storage) {\n return;\n }\n // NgnStorage reads platform/document/request tokens, so it needs an\n // injection context.\n this._storage = runInInjectionContext(\n this.injector,\n () =>\n new NgnStorage<Record<string, unknown>>(cfg.key, cfg.kind ?? 'localstorage', {\n expanded: this.expandedValues(),\n value: this.value() ?? null,\n })\n );\n if (this._persistsState('expanded')) {\n const savedExpanded = this._storage.get('expanded');\n if (Array.isArray(savedExpanded)) {\n this.expandedValues.set(savedExpanded as NgnTreeItemsValue<Items>[]);\n }\n }\n if (this._persistsState('value')) {\n const savedValue = this._storage.get('value');\n if (savedValue !== undefined) {\n this.value.set(savedValue as ValueType<Items, Multiple>);\n }\n }\n }\n\n /** Whether the given state should be persisted (all states when unset). */\n private _persistsState(state: NgnTreeStorageState): boolean {\n const states = this.storage()?.states;\n return !states || states.includes(state);\n }\n\n /** Derived tri-state for a node's checkbox / aria-checked. */\n protected nodeState(item: NgnTreeItem): 'checked' | 'unchecked' | 'indeterminate' {\n return computeNodeState(item, this._valueSet());\n }\n\n /** Whether a node can be selected/checked right now. */\n protected isSelectable(node: FlatTreeNode): boolean {\n const disabled = node.parentDisabled || !!node.item.disabled;\n return this.selectable() && node.item.selectable !== false && !disabled;\n }\n\n /** Whether a lazy node is currently loading its children. */\n protected isLoading(item: NgnTreeItem): boolean {\n return this._loadingNodes().has(item.value as NgnTreeItemsValue<Items>);\n }\n\n protected async toggleExpand(item: NgnTreeItem): Promise<void> {\n const value = item.value as NgnTreeItemsValue<Items>;\n const willExpand = !this.expandedValues().includes(value);\n this.expandedValues.update(values =>\n values.includes(value) ? values.filter(v => v !== value) : [...values, value]\n );\n if (!willExpand) {\n return;\n }\n this.nodeExpand.emit(item);\n\n const loader = this.loadChildren();\n if (\n !item.lazy ||\n !loader ||\n this._loadedChildren().has(value) ||\n this._loadingNodes().has(value)\n ) {\n return;\n }\n this._loadingNodes.update(set => new Set(set).add(value));\n let children: readonly NgnTreeItem[] | undefined;\n try {\n children = await loader(item);\n } catch (error) {\n Logger.warn(`ngn-tree: failed to load children for node \"${String(value)}\"`, error);\n }\n // Ignore stale results: if items() changed mid-load, the loading state was\n // cleared and this result should be dropped.\n if (children && this._loadingNodes().has(value)) {\n this._loadedChildren.update(map => new Map(map).set(value, children));\n }\n this._loadingNodes.update(set => {\n const next = new Set(set);\n next.delete(value);\n return next;\n });\n }\n\n protected onRowClick(node: FlatTreeNode): void {\n if (!this.isSelectable(node)) {\n return;\n }\n this.onSelect(node.item);\n }\n\n protected onSelect(item: NgnTreeItem): void {\n const value = item.value as NgnTreeItemsValue<Items>;\n if (this.multiple()) {\n if (this.showCheckboxes()) {\n // Cascade tri-state checking; value stays a leaf-only array.\n const shouldCheck = this.nodeState(item) !== 'checked';\n this.value.set(\n cascadeCheck(item, shouldCheck, this.valueArray()) as ValueType<Items, Multiple>\n );\n } else {\n const current = (this.value() as NgnTreeItemsValue<Items>[]) ?? [];\n this.value.set(\n (current.includes(value)\n ? current.filter(v => v !== value)\n : [...current, value]) as ValueType<Items, Multiple>\n );\n }\n } else {\n // Single-select always stores a single value (never an array), even when\n // checkboxes are shown.\n this.value.set(value as ValueType<Items, Multiple>);\n }\n this.itemClicked.emit(value);\n this.markTouched();\n }\n\n public scrollToIndex(index: number): void {\n this._scroller().scrollToIndex(index);\n }\n\n public onKeyDown(event: KeyboardEvent): void {\n const nodes = this.flatNodes();\n if (!nodes.length) {\n return;\n }\n const enabled = nodes.filter(n => !(n.parentDisabled || n.item.disabled));\n const key = event.key;\n\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n this._moveHighlight(enabled, key === 'ArrowDown' ? 1 : -1);\n } else if (key === 'Home' || key === 'End') {\n event.preventDefault();\n event.stopPropagation();\n const target = key === 'Home' ? enabled[0] : enabled[enabled.length - 1];\n this.currentHighlightedValue.set(\n (target?.item.value ?? null) as NgnTreeItemsValue<Items> | null\n );\n } else if (key === 'ArrowRight') {\n event.preventDefault();\n event.stopPropagation();\n this._expandOrEnter(nodes);\n } else if (key === 'ArrowLeft') {\n event.preventDefault();\n event.stopPropagation();\n this._collapseOrLeave(nodes);\n } else if (key === 'Enter' || key === ' ') {\n const node = this._currentNode(nodes);\n if (node && this.isSelectable(node)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.onSelect(node.item);\n }\n } else if (key.length === 1 && /\\S/.test(key)) {\n this._typeahead(enabled, key);\n }\n }\n\n private _currentNode(nodes: readonly FlatTreeNode[]): FlatTreeNode | undefined {\n const current = this.currentHighlightedValue();\n return nodes.find(n => n.item.value === current);\n }\n\n private _moveHighlight(enabled: readonly FlatTreeNode[], dir: 1 | -1): void {\n if (!enabled.length) {\n this.currentHighlightedValue.set(null);\n return;\n }\n const current = this.currentHighlightedValue();\n const idx = enabled.findIndex(n => n.item.value === current);\n let next: number;\n if (idx === -1) {\n next = dir === 1 ? 0 : enabled.length - 1;\n } else {\n next = (idx + dir + enabled.length) % enabled.length;\n }\n const target = enabled[next];\n if (target) {\n this.currentHighlightedValue.set(target.item.value as NgnTreeItemsValue<Items>);\n }\n }\n\n private _expandOrEnter(nodes: readonly FlatTreeNode[]): void {\n const node = this._currentNode(nodes);\n if (!node) {\n return;\n }\n if (node.hasChildren && !node.expanded) {\n void this.toggleExpand(node.item);\n } else if (node.hasChildren && node.expanded) {\n const idx = nodes.indexOf(node);\n for (let i = idx + 1; i < nodes.length; i++) {\n const candidate = nodes[i];\n if (!candidate || candidate.level <= node.level) {\n break; // left this node's subtree\n }\n if (!(candidate.parentDisabled || candidate.item.disabled)) {\n this.currentHighlightedValue.set(candidate.item.value as NgnTreeItemsValue<Items>);\n return;\n }\n }\n }\n }\n\n private _collapseOrLeave(nodes: readonly FlatTreeNode[]): void {\n const node = this._currentNode(nodes);\n if (!node) {\n return;\n }\n if (node.hasChildren && node.expanded) {\n void this.toggleExpand(node.item);\n return;\n }\n // move to parent: previous node with a smaller level\n const idx = nodes.indexOf(node);\n for (let i = idx - 1; i >= 0; i--) {\n const ancestor = nodes[i];\n if (!ancestor) {\n continue;\n }\n if (ancestor.level < node.level) {\n if (!(ancestor.parentDisabled || ancestor.item.disabled)) {\n this.currentHighlightedValue.set(ancestor.item.value as NgnTreeItemsValue<Items>);\n }\n return;\n }\n }\n }\n\n private _typeahead(enabled: readonly FlatTreeNode[], char: string): void {\n const lower = char.toLowerCase();\n const current = this.currentHighlightedValue();\n const start = enabled.findIndex(n => n.item.value === current);\n for (let offset = 1; offset <= enabled.length; offset++) {\n const node = enabled[(start + offset + enabled.length) % enabled.length];\n if (!node) {\n continue;\n }\n const label = maybeCallback(node.item.label).toLowerCase();\n if (label.startsWith(lower)) {\n this.currentHighlightedValue.set(node.item.value as NgnTreeItemsValue<Items>);\n return;\n }\n }\n }\n}\n","<ngn-scroller\n [ptInt]=\"this\"\n [ptDep]=\"'scroller'\"\n [virtual]=\"virtual()\"\n [itemHeight]=\"itemHeight()\"\n [items]=\"flatNodes()\"\n [templateItem]=\"usedItemTemplate\"\n #scroller\n/>\n\n@if (!flatNodes().length) {\n <div role=\"status\">\n <ng-container\n *ngTemplateOutlet=\"emptyTemplate() || defaultEmptyTemplate; context: {}\"\n ></ng-container>\n </div>\n}\n\n<ng-template #usedItemTemplate [ngnTemplate]=\"scroller.templateTypes.item\" let-node>\n @let item = node.item;\n @let disabled = node.parentDisabled || item.disabled;\n @let state = nodeState(item);\n @let selectableNode = isSelectable(node);\n <!--\n Virtual scrolling renders a flat list, so treeitems are not DOM-nested in\n role=\"group\" containers. Per WAI-ARIA, aria-level + aria-setsize +\n aria-posinset are the sanctioned substitute that convey the hierarchy to\n assistive tech. (The `group` CSS class below is visual styling only.)\n -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n [ngnScrollerItem]=\"node\"\n [id]=\"inputId() + '_node_' + item.value\"\n role=\"treeitem\"\n [attr.aria-level]=\"node.level + 1\"\n [attr.aria-setsize]=\"node.setSize\"\n [attr.aria-posinset]=\"node.posInSet\"\n [attr.aria-expanded]=\"node.hasChildren ? node.expanded : null\"\n [attr.aria-selected]=\"\n !showCheckboxes() && selectableNode ? valueArray().includes(item.value) : null\n \"\n [attr.aria-checked]=\"\n showCheckboxes() && selectableNode\n ? state === 'indeterminate'\n ? 'mixed'\n : state === 'checked'\n ? 'true'\n : 'false'\n : null\n \"\n [attr.aria-disabled]=\"disabled ? 'true' : null\"\n [style.--ngn-tree-level]=\"node.level\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n item: !item.items,\n group: !!item.items,\n 'item-selectable': selectableNode,\n 'item-selected': valueArray().includes(item.value),\n 'item-highlighted': item.value === currentHighlightedValue(),\n 'item-disabled': !!disabled,\n 'item-expanded': node.expanded,\n }\"\n (click)=\"onRowClick(node)\"\n >\n @if (node.hasChildren) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [ptInt]=\"this\"\n [ptClass]=\"'toggle'\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"toggleExpand(item); $event.stopPropagation()\"\n >\n <span [ptInt]=\"this\" [ptClass]=\"'toggle-icon'\">\n @if (isLoading(item)) {\n <ngn-spinner [size]=\"14\" />\n } @else {\n <span [ptInt]=\"this\" [ptClass]=\"'toggle-arrow'\"></span>\n }\n </span>\n </button>\n } @else {\n <span [ptInt]=\"this\" [ptClass]=\"'toggle-placeholder'\" aria-hidden=\"true\"></span>\n }\n @if (showCheckboxes() && selectableNode) {\n <ngn-checkbox\n [ptInt]=\"this\"\n [ptDep]=\"'item-checkbox'\"\n [allowIndeterminate]=\"true\"\n [value]=\"state === 'indeterminate' ? null : state === 'checked'\"\n aria-hidden=\"true\"\n inert=\"true\"\n />\n } @else if (showCheckboxes() && selectable() && item.selectable !== false) {\n <!-- Disabled node: show the checkbox for consistency, but disabled. -->\n <ngn-checkbox\n [ptInt]=\"this\"\n [ptDep]=\"'item-checkbox'\"\n [allowIndeterminate]=\"true\"\n [value]=\"state === 'indeterminate' ? null : state === 'checked'\"\n [disabled]=\"true\"\n aria-hidden=\"true\"\n inert=\"true\"\n />\n } @else if (showCheckboxes()) {\n <span [ptInt]=\"this\" [ptClass]=\"'item-checkbox-placeholder'\" aria-hidden=\"true\"></span>\n }\n @if (item.template) {\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item }\"></ng-container>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate();\n context: {\n $implicit: item,\n level: node.level,\n expanded: node.expanded,\n hasChildren: node.hasChildren,\n }\n \"\n ></ng-container>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\n <span [attr.data-testid]=\"item?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-item'\">\n @let label = item?.label;\n @if (label) {\n <span>{{ maybeCallback(label) }}</span>\n } @else {\n <span>​</span>\n }\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyTemplate>\n <span [ptInt]=\"this\" [ptClass]=\"'empty'\" [attr.data-testid]=\"'empty'\">{{\n i18n['tree_noItemsFound']()\n }}</span>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,140 @@
|
|
|
1
|
+
const clamp = (n, min, max) => Math.min(max, Math.max(min, n));
|
|
2
|
+
const round = (n) => Math.round(n);
|
|
3
|
+
/** Parse a hex / rgb(a) / hsl(a) string into RGBA, or null if unrecognized. */
|
|
4
|
+
function parseColor(input) {
|
|
5
|
+
const s = input.trim().toLowerCase();
|
|
6
|
+
// hex
|
|
7
|
+
const hex = s.match(/^#([0-9a-f]{3,8})$/);
|
|
8
|
+
if (hex) {
|
|
9
|
+
const h = hex[1];
|
|
10
|
+
if (h.length === 3 || h.length === 4) {
|
|
11
|
+
const r = parseInt(h[0] + h[0], 16);
|
|
12
|
+
const g = parseInt(h[1] + h[1], 16);
|
|
13
|
+
const b = parseInt(h[2] + h[2], 16);
|
|
14
|
+
const a = h.length === 4 ? parseInt(h[3] + h[3], 16) / 255 : 1;
|
|
15
|
+
return { r, g, b, a };
|
|
16
|
+
}
|
|
17
|
+
if (h.length === 6 || h.length === 8) {
|
|
18
|
+
const r = parseInt(h.slice(0, 2), 16);
|
|
19
|
+
const g = parseInt(h.slice(2, 4), 16);
|
|
20
|
+
const b = parseInt(h.slice(4, 6), 16);
|
|
21
|
+
const a = h.length === 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1;
|
|
22
|
+
return { r, g, b, a };
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
// rgb / rgba
|
|
27
|
+
const rgb = s.match(/^rgba?\(\s*(-?[\d.]+)[,\s]+(-?[\d.]+)[,\s]+(-?[\d.]+)(?:[,\s/]+([\d.]+))?\s*\)$/);
|
|
28
|
+
if (rgb) {
|
|
29
|
+
return {
|
|
30
|
+
r: clamp(round(parseFloat(rgb[1])), 0, 255),
|
|
31
|
+
g: clamp(round(parseFloat(rgb[2])), 0, 255),
|
|
32
|
+
b: clamp(round(parseFloat(rgb[3])), 0, 255),
|
|
33
|
+
a: rgb[4] !== undefined ? clamp(parseFloat(rgb[4]), 0, 1) : 1,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// hsl / hsla
|
|
37
|
+
const hsl = s.match(/^hsla?\(\s*([\d.]+)[,\s]+([\d.]+)%[,\s]+([\d.]+)%(?:[,\s/]+([\d.]+))?\s*\)$/);
|
|
38
|
+
if (hsl) {
|
|
39
|
+
const h = parseFloat(hsl[1]);
|
|
40
|
+
const sl = parseFloat(hsl[2]) / 100;
|
|
41
|
+
const l = parseFloat(hsl[3]) / 100;
|
|
42
|
+
const a = hsl[4] !== undefined ? clamp(parseFloat(hsl[4]), 0, 1) : 1;
|
|
43
|
+
return { ...hslToRgb(h, sl, l), a };
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function hslToRgb(h, s, l) {
|
|
48
|
+
h = ((h % 360) + 360) % 360;
|
|
49
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
50
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
51
|
+
const m = l - c / 2;
|
|
52
|
+
let r = 0;
|
|
53
|
+
let g = 0;
|
|
54
|
+
let b = 0;
|
|
55
|
+
if (h < 60)
|
|
56
|
+
[r, g, b] = [c, x, 0];
|
|
57
|
+
else if (h < 120)
|
|
58
|
+
[r, g, b] = [x, c, 0];
|
|
59
|
+
else if (h < 180)
|
|
60
|
+
[r, g, b] = [0, c, x];
|
|
61
|
+
else if (h < 240)
|
|
62
|
+
[r, g, b] = [0, x, c];
|
|
63
|
+
else if (h < 300)
|
|
64
|
+
[r, g, b] = [x, 0, c];
|
|
65
|
+
else
|
|
66
|
+
[r, g, b] = [c, 0, x];
|
|
67
|
+
return { r: round((r + m) * 255), g: round((g + m) * 255), b: round((b + m) * 255) };
|
|
68
|
+
}
|
|
69
|
+
/** RGBA → HSVA. */
|
|
70
|
+
function rgbaToHsva({ r, g, b, a }) {
|
|
71
|
+
const rn = r / 255;
|
|
72
|
+
const gn = g / 255;
|
|
73
|
+
const bn = b / 255;
|
|
74
|
+
const max = Math.max(rn, gn, bn);
|
|
75
|
+
const min = Math.min(rn, gn, bn);
|
|
76
|
+
const d = max - min;
|
|
77
|
+
let h = 0;
|
|
78
|
+
if (d !== 0) {
|
|
79
|
+
if (max === rn)
|
|
80
|
+
h = ((gn - bn) / d) % 6;
|
|
81
|
+
else if (max === gn)
|
|
82
|
+
h = (bn - rn) / d + 2;
|
|
83
|
+
else
|
|
84
|
+
h = (rn - gn) / d + 4;
|
|
85
|
+
h *= 60;
|
|
86
|
+
if (h < 0)
|
|
87
|
+
h += 360;
|
|
88
|
+
}
|
|
89
|
+
const s = max === 0 ? 0 : d / max;
|
|
90
|
+
return { h, s, v: max, a };
|
|
91
|
+
}
|
|
92
|
+
/** HSVA → RGBA. */
|
|
93
|
+
function hsvaToRgba({ h, s, v, a }) {
|
|
94
|
+
h = ((h % 360) + 360) % 360;
|
|
95
|
+
const c = v * s;
|
|
96
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
97
|
+
const m = v - c;
|
|
98
|
+
let r = 0;
|
|
99
|
+
let g = 0;
|
|
100
|
+
let b = 0;
|
|
101
|
+
if (h < 60)
|
|
102
|
+
[r, g, b] = [c, x, 0];
|
|
103
|
+
else if (h < 120)
|
|
104
|
+
[r, g, b] = [x, c, 0];
|
|
105
|
+
else if (h < 180)
|
|
106
|
+
[r, g, b] = [0, c, x];
|
|
107
|
+
else if (h < 240)
|
|
108
|
+
[r, g, b] = [0, x, c];
|
|
109
|
+
else if (h < 300)
|
|
110
|
+
[r, g, b] = [x, 0, c];
|
|
111
|
+
else
|
|
112
|
+
[r, g, b] = [c, 0, x];
|
|
113
|
+
return { r: round((r + m) * 255), g: round((g + m) * 255), b: round((b + m) * 255), a };
|
|
114
|
+
}
|
|
115
|
+
const toHex2 = (n) => clamp(round(n), 0, 255).toString(16).padStart(2, '0');
|
|
116
|
+
/** Serialize RGBA to the given format. `withAlpha` includes the alpha channel. */
|
|
117
|
+
function formatColor(c, format, withAlpha) {
|
|
118
|
+
const a = clamp(c.a, 0, 1);
|
|
119
|
+
if (format === 'hex') {
|
|
120
|
+
const base = `#${toHex2(c.r)}${toHex2(c.g)}${toHex2(c.b)}`;
|
|
121
|
+
return withAlpha ? `${base}${toHex2(a * 255)}` : base;
|
|
122
|
+
}
|
|
123
|
+
if (format === 'rgb') {
|
|
124
|
+
return withAlpha
|
|
125
|
+
? `rgba(${round(c.r)}, ${round(c.g)}, ${round(c.b)}, ${+a.toFixed(2)})`
|
|
126
|
+
: `rgb(${round(c.r)}, ${round(c.g)}, ${round(c.b)})`;
|
|
127
|
+
}
|
|
128
|
+
// hsl
|
|
129
|
+
const { h, s, v } = rgbaToHsva(c);
|
|
130
|
+
const l = v - (v * s) / 2;
|
|
131
|
+
const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l);
|
|
132
|
+
const H = round(h);
|
|
133
|
+
const S = round(sl * 100);
|
|
134
|
+
const L = round(l * 100);
|
|
135
|
+
return withAlpha ? `hsla(${H}, ${S}%, ${L}%, ${+a.toFixed(2)})` : `hsl(${H}, ${S}%, ${L}%)`;
|
|
136
|
+
}
|
|
137
|
+
|
|
1
138
|
function toggleClass(element, className, state) {
|
|
2
139
|
const classes = Array.isArray(className)
|
|
3
140
|
? className.flatMap(x => x.split(' '))
|
|
@@ -257,5 +394,5 @@ function toMilliseconds(days, hours, minutes, seconds, milliseconds) {
|
|
|
257
394
|
* Generated bundle index. Do not edit.
|
|
258
395
|
*/
|
|
259
396
|
|
|
260
|
-
export { Logger, NgnError, areArraysDeepEqual, areObjectsDeepEqual, deepCopy, deepMerge, fuzzyMatch, getPropertyIfExists, getScrollTop, getTimeSpan, getTimeSpanMilliseconds, getTimeSpanString, globalPropertyName, isObject, isTimeSpan, maybeCallback, notNullish, objectEntries, objectKeys, throwExp, toggleClass };
|
|
397
|
+
export { Logger, NgnError, areArraysDeepEqual, areObjectsDeepEqual, deepCopy, deepMerge, formatColor, fuzzyMatch, getPropertyIfExists, getScrollTop, getTimeSpan, getTimeSpanMilliseconds, getTimeSpanString, globalPropertyName, hsvaToRgba, isObject, isTimeSpan, maybeCallback, notNullish, objectEntries, objectKeys, parseColor, rgbaToHsva, throwExp, toggleClass };
|
|
261
398
|
//# sourceMappingURL=ngneers-controls-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-utils.mjs","sources":["../../src/utils/dom.ts","../../src/utils/object.ts","../../src/utils/equality.ts","../../src/utils/error.ts","../../src/utils/functions.ts","../../src/utils/fuzzy-match.ts","../../src/utils/globals.ts","../../src/utils/logger.ts","../../src/utils/not-nullish.ts","../../src/utils/positioning.ts","../../src/utils/time-span.ts","../../src/utils/ngneers-controls-utils.ts"],"sourcesContent":["export function toggleClass(element: HTMLElement, className: string | string[], state: boolean) {\n const classes = Array.isArray(className)\n ? className.flatMap(x => x.split(' '))\n : className.split(' ');\n classes.forEach(cls => element.classList.toggle(cls, state));\n}\n","import type { AllKeysOfUnion } from './types';\n\nexport function deepCopy<T>(obj: T): T extends ReadonlyArray<infer U> ? Array<U> : T {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function objectKeys<T extends object>(obj: T): (keyof T)[] {\n return Object.keys(obj) as (keyof T)[];\n}\n\nexport function objectEntries<T extends object>(obj: T): [keyof T, T[keyof T]][] {\n return Object.entries(obj) as [keyof T, T[keyof T]][];\n}\n\nexport function isObject(item: unknown): item is Record<string, unknown> {\n return item !== null && typeof item === 'object' && !Array.isArray(item);\n}\n\nexport function deepMerge<T extends Record<string, unknown>, U extends Record<string, unknown>>(\n target: T,\n source: U\n): T & U {\n const output = { ...target } as T & U;\n for (const key of objectKeys(source)) {\n const value = source[key];\n if (isObject(value) && isObject(output[key])) {\n (output[key] as Record<string, unknown>) = deepMerge(\n output[key] as Record<string, unknown>,\n value\n );\n } else {\n (output[key] as U[keyof U]) = value;\n }\n }\n return output;\n}\n\nexport function getPropertyIfExists<T extends object, K extends AllKeysOfUnion<T>>(\n obj: T,\n key: K\n): T[K] | undefined {\n if (key in obj) {\n return obj[key];\n }\n return undefined;\n}\n","import { objectKeys } from './object';\n\nexport function areObjectsDeepEqual<T extends object>(a: T, b: T): boolean {\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n return objectKeys(a).every(key => {\n if (typeof a[key] !== typeof b[key]) {\n return false;\n }\n if (typeof a[key] === 'object') {\n return areObjectsDeepEqual(a[key] as object, b[key] as object);\n }\n return a[key] === b[key];\n });\n}\n\nexport function areArraysDeepEqual<T>(a: readonly T[], b: readonly T[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (typeof a[i] === 'object' && typeof b[i] === 'object') {\n const res = areObjectsDeepEqual(a[i] as object, b[i] as object);\n if (!res) {\n return false;\n }\n } else {\n const res = a[i] === b[i];\n if (!res) {\n return false;\n }\n }\n }\n return true;\n}\n","export function throwExp(\n moduleName: string,\n errorMsg: string,\n ...additionalContext: unknown[]\n): never {\n throw new NgnError(moduleName, errorMsg, ...additionalContext);\n}\n\nexport class NgnError extends Error {\n public readonly additionalContext?: unknown[];\n constructor(area: string, errorMsg: string, ...additionalContext: unknown[]) {\n if (typeof window !== 'undefined' && window['__ngn-controls-global__']?.fancyLogging) {\n console.log(\n `%c💥%c[${area}]`,\n 'font-size: 24px;',\n 'color: #ff0042; font-size: 20px; background-color: #000000;',\n ...additionalContext\n );\n }\n\n super(`[${area}] ${errorMsg}`);\n this.name = 'NgnError';\n this.additionalContext = additionalContext;\n }\n}\n","export function maybeCallback<T>(value: T | (() => T)): T {\n return typeof value === 'function' ? (value as () => T)() : value;\n}\n","export function fuzzyMatch(input: string, search: string) {\n // Edge cases\n const searchLen = search.length;\n if (searchLen === 0) return true;\n const inputLen = input.length;\n if (searchLen > inputLen) return false;\n\n // Micro-optimized main loop\n let searchPos = 0;\n\n for (let i = 0; i < inputLen && searchPos < searchLen; i++) {\n if (input.charCodeAt(i) === search.charCodeAt(searchPos)) {\n searchPos++;\n // Early exit when remaining input can't contain remaining search\n if (searchLen - searchPos > inputLen - i - 1) return false;\n }\n // Early exit when remaining lengths match but current chars don't\n else if (searchLen - searchPos === inputLen - i) return false;\n }\n\n return searchPos === searchLen;\n}\n","export const globalPropertyName = '__ngn-controls-global__';\n\nexport interface NgnGlobalType {\n nextElementId: number;\n fancyLogging: boolean;\n}\n\ndeclare global {\n interface Window {\n [globalPropertyName]: NgnGlobalType;\n }\n}\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport const Logger = new (class {\n public logLevel: LogLevel = 'info';\n\n public debug(...args: unknown[]) {\n if (this.logLevel === 'debug') {\n console.debug(...args);\n }\n }\n\n public info(...args: unknown[]) {\n if (this.logLevel === 'debug' || this.logLevel === 'info') {\n console.info(...args);\n }\n }\n\n public warn(...args: unknown[]) {\n if (this.logLevel === 'debug' || this.logLevel === 'info' || this.logLevel === 'warn') {\n console.warn(...args);\n }\n }\n\n public error(...args: unknown[]) {\n if (\n this.logLevel === 'debug' ||\n this.logLevel === 'info' ||\n this.logLevel === 'warn' ||\n this.logLevel === 'error'\n ) {\n console.error(...args);\n }\n }\n})();\n","export function notNullish<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n","export function getScrollTop(\n elementOffsetTop: number,\n elementHeight: number,\n containerHeight: number,\n currentScrollTop: number,\n behavior: ScrollLogicalPosition\n): number {\n switch (behavior) {\n case 'start':\n return elementOffsetTop;\n case 'end':\n return elementOffsetTop - containerHeight + elementHeight;\n case 'center':\n return elementOffsetTop - (containerHeight - elementHeight) / 2;\n case 'nearest': {\n const start = elementOffsetTop;\n const end = elementOffsetTop - containerHeight + elementHeight;\n if (currentScrollTop > end && currentScrollTop < start) {\n return currentScrollTop;\n }\n return Math.abs(start - currentScrollTop) < Math.abs(end - currentScrollTop) ? start : end;\n }\n }\n}\n","const timeSpanRegex = /^(?:(.+)d)?(?:(.+)h)?(?:(.+)m)?(?:([^m]+)s)?(?:(.+)ms)?$/;\n\n/**\n * Represents a time span that can be expressed in various formats:\n * - As a number (milliseconds)\n * - As a string in the format \"XdXhXmXsXms\" where each part is optional (e.g., \"1d2h30m45s500ms\" or \"2h15m\")\n * - As an object with properties for days, hours, minutes, seconds, and milliseconds\n * @example\n * ```typescript\n * // As a number\n * const duration1: TimeSpan = 5000;\n * // As a string\n * const duration2: TimeSpan = \"1d2h30m45s500ms\";\n * // As an object\n * const duration3: TimeSpan = { days: 1, hours: 2, minutes: 30, seconds: 45, milliseconds: 500 };\n * ```\n */\nexport type TimeSpan =\n | number\n | `${`${number}d` | ''}${`${number}h` | ''}${`${number}m` | ''}${`${number}s` | ''}${`${number}ms` | ''}`\n | {\n /**\n * Number of days in the time span.\n */\n days?: number;\n /**\n * Number of hours in the time span.\n */\n hours?: number;\n /**\n * Number of minutes in the time span.\n */\n minutes?: number;\n /**\n * Number of seconds in the time span.\n */\n seconds?: number;\n /**\n * Number of milliseconds in the time span.\n */\n milliseconds?: number;\n };\n\n/**\n * Checks if the provided value is a valid TimeSpan.\n * @param value The value to check.\n * @returns `true` if the value is a valid TimeSpan, otherwise `false`.\n */\nexport function isTimeSpan(value: unknown): value is TimeSpan {\n if (typeof value === 'number') return true;\n if (typeof value === 'string') {\n const match = value.match(timeSpanRegex);\n return !!match && !match.slice(1).some(part => part !== undefined && isNaN(Number(part)));\n }\n if (typeof value === 'object' && value !== null) {\n return (\n 'days' in value ||\n 'hours' in value ||\n 'minutes' in value ||\n 'seconds' in value ||\n 'milliseconds' in value\n );\n }\n return false;\n}\n\n/**\n * Converts a TimeSpan to milliseconds.\n * @param timeSpan The TimeSpan to convert.\n * @returns The equivalent time span in milliseconds.\n */\nexport function getTimeSpanMilliseconds(timeSpan: TimeSpan): number {\n if (typeof timeSpan === 'number') return timeSpan;\n\n if (typeof timeSpan === 'string') {\n const parts = parseTimeSpanString(timeSpan);\n return parts ? toMilliseconds(...parts) : 0;\n }\n\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\n return toMilliseconds(days, hours, minutes, seconds, milliseconds);\n}\n\n/**\n * Converts a TimeSpan to a string representation.\n * @param timeSpan The TimeSpan to convert.\n * @returns A string representation of the time span.\n */\nexport function getTimeSpanString(timeSpan: TimeSpan): string {\n if (typeof timeSpan === 'number') return `${timeSpan}ms`;\n if (typeof timeSpan === 'string') return timeSpan;\n\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\n return (\n (days ? `${days}d` : '') +\n (hours ? `${hours}h` : '') +\n (minutes ? `${minutes}m` : '') +\n (seconds ? `${seconds}s` : '') +\n (milliseconds ? `${milliseconds}ms` : '')\n );\n}\n\n/**\n * Converts a TimeSpan to an object representation.\n * @param timeSpan The TimeSpan to convert.\n * @returns An object representation of the time span with properties for days, hours, minutes, seconds, and milliseconds.\n */\nexport function getTimeSpan(timeSpan: TimeSpan): TimeSpan & object {\n if (typeof timeSpan === 'number') {\n return { milliseconds: timeSpan };\n }\n\n if (typeof timeSpan === 'string') {\n const parts = parseTimeSpanString(timeSpan);\n if (!parts) return {};\n const [days, hours, minutes, seconds, milliseconds] = parts;\n return { days, hours, minutes, seconds, milliseconds };\n }\n\n return timeSpan;\n}\n\nfunction parseTimeSpanString(timeSpan: string): number[] | undefined {\n const match = timeSpan.match(timeSpanRegex);\n if (!match) return undefined;\n return match.slice(1).map(part => Number(part) || 0);\n}\n\nfunction toMilliseconds(\n days?: number,\n hours?: number,\n minutes?: number,\n seconds?: number,\n milliseconds?: number\n): number {\n return (\n (days || 0) * 86400000 + // 24 * 60 * 60 * 1000\n (hours || 0) * 3600000 + // 60 * 60 * 1000\n (minutes || 0) * 60000 + // 60 * 1000\n (seconds || 0) * 1000 +\n (milliseconds || 0)\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-utils.mjs","sources":["../../src/utils/color.ts","../../src/utils/dom.ts","../../src/utils/object.ts","../../src/utils/equality.ts","../../src/utils/error.ts","../../src/utils/functions.ts","../../src/utils/fuzzy-match.ts","../../src/utils/globals.ts","../../src/utils/logger.ts","../../src/utils/not-nullish.ts","../../src/utils/positioning.ts","../../src/utils/time-span.ts","../../src/utils/ngneers-controls-utils.ts"],"sourcesContent":["/** RGBA color. r/g/b are 0–255, a is 0–1. */\nexport type RGBA = { r: number; g: number; b: number; a: number };\n/** HSVA color. h is 0–360, s/v/a are 0–1. */\nexport type HSVA = { h: number; s: number; v: number; a: number };\n/** Supported serialization formats. */\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl';\n\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n));\nconst round = (n: number) => Math.round(n);\n\n/** Parse a hex / rgb(a) / hsl(a) string into RGBA, or null if unrecognized. */\nexport function parseColor(input: string): RGBA | null {\n const s = input.trim().toLowerCase();\n\n // hex\n const hex = s.match(/^#([0-9a-f]{3,8})$/);\n if (hex) {\n const h = hex[1]!;\n if (h.length === 3 || h.length === 4) {\n const r = parseInt(h[0]! + h[0]!, 16);\n const g = parseInt(h[1]! + h[1]!, 16);\n const b = parseInt(h[2]! + h[2]!, 16);\n const a = h.length === 4 ? parseInt(h[3]! + h[3]!, 16) / 255 : 1;\n return { r, g, b, a };\n }\n if (h.length === 6 || h.length === 8) {\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n const a = h.length === 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1;\n return { r, g, b, a };\n }\n return null;\n }\n\n // rgb / rgba\n const rgb = s.match(\n /^rgba?\\(\\s*(-?[\\d.]+)[,\\s]+(-?[\\d.]+)[,\\s]+(-?[\\d.]+)(?:[,\\s/]+([\\d.]+))?\\s*\\)$/\n );\n if (rgb) {\n return {\n r: clamp(round(parseFloat(rgb[1]!)), 0, 255),\n g: clamp(round(parseFloat(rgb[2]!)), 0, 255),\n b: clamp(round(parseFloat(rgb[3]!)), 0, 255),\n a: rgb[4] !== undefined ? clamp(parseFloat(rgb[4]), 0, 1) : 1,\n };\n }\n\n // hsl / hsla\n const hsl = s.match(\n /^hsla?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)%[,\\s]+([\\d.]+)%(?:[,\\s/]+([\\d.]+))?\\s*\\)$/\n );\n if (hsl) {\n const h = parseFloat(hsl[1]!);\n const sl = parseFloat(hsl[2]!) / 100;\n const l = parseFloat(hsl[3]!) / 100;\n const a = hsl[4] !== undefined ? clamp(parseFloat(hsl[4]), 0, 1) : 1;\n return { ...hslToRgb(h, sl, l), a };\n }\n\n return null;\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n h = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0;\n let g = 0;\n let b = 0;\n if (h < 60) [r, g, b] = [c, x, 0];\n else if (h < 120) [r, g, b] = [x, c, 0];\n else if (h < 180) [r, g, b] = [0, c, x];\n else if (h < 240) [r, g, b] = [0, x, c];\n else if (h < 300) [r, g, b] = [x, 0, c];\n else [r, g, b] = [c, 0, x];\n return { r: round((r + m) * 255), g: round((g + m) * 255), b: round((b + m) * 255) };\n}\n\n/** RGBA → HSVA. */\nexport function rgbaToHsva({ r, g, b, a }: RGBA): HSVA {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === rn) h = ((gn - bn) / d) % 6;\n else if (max === gn) h = (bn - rn) / d + 2;\n else h = (rn - gn) / d + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n const s = max === 0 ? 0 : d / max;\n return { h, s, v: max, a };\n}\n\n/** HSVA → RGBA. */\nexport function hsvaToRgba({ h, s, v, a }: HSVA): RGBA {\n h = ((h % 360) + 360) % 360;\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n let r = 0;\n let g = 0;\n let b = 0;\n if (h < 60) [r, g, b] = [c, x, 0];\n else if (h < 120) [r, g, b] = [x, c, 0];\n else if (h < 180) [r, g, b] = [0, c, x];\n else if (h < 240) [r, g, b] = [0, x, c];\n else if (h < 300) [r, g, b] = [x, 0, c];\n else [r, g, b] = [c, 0, x];\n return { r: round((r + m) * 255), g: round((g + m) * 255), b: round((b + m) * 255), a };\n}\n\nconst toHex2 = (n: number) => clamp(round(n), 0, 255).toString(16).padStart(2, '0');\n\n/** Serialize RGBA to the given format. `withAlpha` includes the alpha channel. */\nexport function formatColor(c: RGBA, format: ColorFormat, withAlpha: boolean): string {\n const a = clamp(c.a, 0, 1);\n if (format === 'hex') {\n const base = `#${toHex2(c.r)}${toHex2(c.g)}${toHex2(c.b)}`;\n return withAlpha ? `${base}${toHex2(a * 255)}` : base;\n }\n if (format === 'rgb') {\n return withAlpha\n ? `rgba(${round(c.r)}, ${round(c.g)}, ${round(c.b)}, ${+a.toFixed(2)})`\n : `rgb(${round(c.r)}, ${round(c.g)}, ${round(c.b)})`;\n }\n // hsl\n const { h, s, v } = rgbaToHsva(c);\n const l = v - (v * s) / 2;\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l);\n const H = round(h);\n const S = round(sl * 100);\n const L = round(l * 100);\n return withAlpha ? `hsla(${H}, ${S}%, ${L}%, ${+a.toFixed(2)})` : `hsl(${H}, ${S}%, ${L}%)`;\n}\n","export function toggleClass(element: HTMLElement, className: string | string[], state: boolean) {\n const classes = Array.isArray(className)\n ? className.flatMap(x => x.split(' '))\n : className.split(' ');\n classes.forEach(cls => element.classList.toggle(cls, state));\n}\n","import type { AllKeysOfUnion } from './types';\n\nexport function deepCopy<T>(obj: T): T extends ReadonlyArray<infer U> ? Array<U> : T {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function objectKeys<T extends object>(obj: T): (keyof T)[] {\n return Object.keys(obj) as (keyof T)[];\n}\n\nexport function objectEntries<T extends object>(obj: T): [keyof T, T[keyof T]][] {\n return Object.entries(obj) as [keyof T, T[keyof T]][];\n}\n\nexport function isObject(item: unknown): item is Record<string, unknown> {\n return item !== null && typeof item === 'object' && !Array.isArray(item);\n}\n\nexport function deepMerge<T extends Record<string, unknown>, U extends Record<string, unknown>>(\n target: T,\n source: U\n): T & U {\n const output = { ...target } as T & U;\n for (const key of objectKeys(source)) {\n const value = source[key];\n if (isObject(value) && isObject(output[key])) {\n (output[key] as Record<string, unknown>) = deepMerge(\n output[key] as Record<string, unknown>,\n value\n );\n } else {\n (output[key] as U[keyof U]) = value;\n }\n }\n return output;\n}\n\nexport function getPropertyIfExists<T extends object, K extends AllKeysOfUnion<T>>(\n obj: T,\n key: K\n): T[K] | undefined {\n if (key in obj) {\n return obj[key];\n }\n return undefined;\n}\n","import { objectKeys } from './object';\n\nexport function areObjectsDeepEqual<T extends object>(a: T, b: T): boolean {\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n return objectKeys(a).every(key => {\n if (typeof a[key] !== typeof b[key]) {\n return false;\n }\n if (typeof a[key] === 'object') {\n return areObjectsDeepEqual(a[key] as object, b[key] as object);\n }\n return a[key] === b[key];\n });\n}\n\nexport function areArraysDeepEqual<T>(a: readonly T[], b: readonly T[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (typeof a[i] === 'object' && typeof b[i] === 'object') {\n const res = areObjectsDeepEqual(a[i] as object, b[i] as object);\n if (!res) {\n return false;\n }\n } else {\n const res = a[i] === b[i];\n if (!res) {\n return false;\n }\n }\n }\n return true;\n}\n","export function throwExp(\n moduleName: string,\n errorMsg: string,\n ...additionalContext: unknown[]\n): never {\n throw new NgnError(moduleName, errorMsg, ...additionalContext);\n}\n\nexport class NgnError extends Error {\n public readonly additionalContext?: unknown[];\n constructor(area: string, errorMsg: string, ...additionalContext: unknown[]) {\n if (typeof window !== 'undefined' && window['__ngn-controls-global__']?.fancyLogging) {\n console.log(\n `%c💥%c[${area}]`,\n 'font-size: 24px;',\n 'color: #ff0042; font-size: 20px; background-color: #000000;',\n ...additionalContext\n );\n }\n\n super(`[${area}] ${errorMsg}`);\n this.name = 'NgnError';\n this.additionalContext = additionalContext;\n }\n}\n","export function maybeCallback<T>(value: T | (() => T)): T {\n return typeof value === 'function' ? (value as () => T)() : value;\n}\n","export function fuzzyMatch(input: string, search: string) {\n // Edge cases\n const searchLen = search.length;\n if (searchLen === 0) return true;\n const inputLen = input.length;\n if (searchLen > inputLen) return false;\n\n // Micro-optimized main loop\n let searchPos = 0;\n\n for (let i = 0; i < inputLen && searchPos < searchLen; i++) {\n if (input.charCodeAt(i) === search.charCodeAt(searchPos)) {\n searchPos++;\n // Early exit when remaining input can't contain remaining search\n if (searchLen - searchPos > inputLen - i - 1) return false;\n }\n // Early exit when remaining lengths match but current chars don't\n else if (searchLen - searchPos === inputLen - i) return false;\n }\n\n return searchPos === searchLen;\n}\n","export const globalPropertyName = '__ngn-controls-global__';\n\nexport interface NgnGlobalType {\n nextElementId: number;\n fancyLogging: boolean;\n}\n\ndeclare global {\n interface Window {\n [globalPropertyName]: NgnGlobalType;\n }\n}\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport const Logger = new (class {\n public logLevel: LogLevel = 'info';\n\n public debug(...args: unknown[]) {\n if (this.logLevel === 'debug') {\n console.debug(...args);\n }\n }\n\n public info(...args: unknown[]) {\n if (this.logLevel === 'debug' || this.logLevel === 'info') {\n console.info(...args);\n }\n }\n\n public warn(...args: unknown[]) {\n if (this.logLevel === 'debug' || this.logLevel === 'info' || this.logLevel === 'warn') {\n console.warn(...args);\n }\n }\n\n public error(...args: unknown[]) {\n if (\n this.logLevel === 'debug' ||\n this.logLevel === 'info' ||\n this.logLevel === 'warn' ||\n this.logLevel === 'error'\n ) {\n console.error(...args);\n }\n }\n})();\n","export function notNullish<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n","export function getScrollTop(\n elementOffsetTop: number,\n elementHeight: number,\n containerHeight: number,\n currentScrollTop: number,\n behavior: ScrollLogicalPosition\n): number {\n switch (behavior) {\n case 'start':\n return elementOffsetTop;\n case 'end':\n return elementOffsetTop - containerHeight + elementHeight;\n case 'center':\n return elementOffsetTop - (containerHeight - elementHeight) / 2;\n case 'nearest': {\n const start = elementOffsetTop;\n const end = elementOffsetTop - containerHeight + elementHeight;\n if (currentScrollTop > end && currentScrollTop < start) {\n return currentScrollTop;\n }\n return Math.abs(start - currentScrollTop) < Math.abs(end - currentScrollTop) ? start : end;\n }\n }\n}\n","const timeSpanRegex = /^(?:(.+)d)?(?:(.+)h)?(?:(.+)m)?(?:([^m]+)s)?(?:(.+)ms)?$/;\n\n/**\n * Represents a time span that can be expressed in various formats:\n * - As a number (milliseconds)\n * - As a string in the format \"XdXhXmXsXms\" where each part is optional (e.g., \"1d2h30m45s500ms\" or \"2h15m\")\n * - As an object with properties for days, hours, minutes, seconds, and milliseconds\n * @example\n * ```typescript\n * // As a number\n * const duration1: TimeSpan = 5000;\n * // As a string\n * const duration2: TimeSpan = \"1d2h30m45s500ms\";\n * // As an object\n * const duration3: TimeSpan = { days: 1, hours: 2, minutes: 30, seconds: 45, milliseconds: 500 };\n * ```\n */\nexport type TimeSpan =\n | number\n | `${`${number}d` | ''}${`${number}h` | ''}${`${number}m` | ''}${`${number}s` | ''}${`${number}ms` | ''}`\n | {\n /**\n * Number of days in the time span.\n */\n days?: number;\n /**\n * Number of hours in the time span.\n */\n hours?: number;\n /**\n * Number of minutes in the time span.\n */\n minutes?: number;\n /**\n * Number of seconds in the time span.\n */\n seconds?: number;\n /**\n * Number of milliseconds in the time span.\n */\n milliseconds?: number;\n };\n\n/**\n * Checks if the provided value is a valid TimeSpan.\n * @param value The value to check.\n * @returns `true` if the value is a valid TimeSpan, otherwise `false`.\n */\nexport function isTimeSpan(value: unknown): value is TimeSpan {\n if (typeof value === 'number') return true;\n if (typeof value === 'string') {\n const match = value.match(timeSpanRegex);\n return !!match && !match.slice(1).some(part => part !== undefined && isNaN(Number(part)));\n }\n if (typeof value === 'object' && value !== null) {\n return (\n 'days' in value ||\n 'hours' in value ||\n 'minutes' in value ||\n 'seconds' in value ||\n 'milliseconds' in value\n );\n }\n return false;\n}\n\n/**\n * Converts a TimeSpan to milliseconds.\n * @param timeSpan The TimeSpan to convert.\n * @returns The equivalent time span in milliseconds.\n */\nexport function getTimeSpanMilliseconds(timeSpan: TimeSpan): number {\n if (typeof timeSpan === 'number') return timeSpan;\n\n if (typeof timeSpan === 'string') {\n const parts = parseTimeSpanString(timeSpan);\n return parts ? toMilliseconds(...parts) : 0;\n }\n\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\n return toMilliseconds(days, hours, minutes, seconds, milliseconds);\n}\n\n/**\n * Converts a TimeSpan to a string representation.\n * @param timeSpan The TimeSpan to convert.\n * @returns A string representation of the time span.\n */\nexport function getTimeSpanString(timeSpan: TimeSpan): string {\n if (typeof timeSpan === 'number') return `${timeSpan}ms`;\n if (typeof timeSpan === 'string') return timeSpan;\n\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\n return (\n (days ? `${days}d` : '') +\n (hours ? `${hours}h` : '') +\n (minutes ? `${minutes}m` : '') +\n (seconds ? `${seconds}s` : '') +\n (milliseconds ? `${milliseconds}ms` : '')\n );\n}\n\n/**\n * Converts a TimeSpan to an object representation.\n * @param timeSpan The TimeSpan to convert.\n * @returns An object representation of the time span with properties for days, hours, minutes, seconds, and milliseconds.\n */\nexport function getTimeSpan(timeSpan: TimeSpan): TimeSpan & object {\n if (typeof timeSpan === 'number') {\n return { milliseconds: timeSpan };\n }\n\n if (typeof timeSpan === 'string') {\n const parts = parseTimeSpanString(timeSpan);\n if (!parts) return {};\n const [days, hours, minutes, seconds, milliseconds] = parts;\n return { days, hours, minutes, seconds, milliseconds };\n }\n\n return timeSpan;\n}\n\nfunction parseTimeSpanString(timeSpan: string): number[] | undefined {\n const match = timeSpan.match(timeSpanRegex);\n if (!match) return undefined;\n return match.slice(1).map(part => Number(part) || 0);\n}\n\nfunction toMilliseconds(\n days?: number,\n hours?: number,\n minutes?: number,\n seconds?: number,\n milliseconds?: number\n): number {\n return (\n (days || 0) * 86400000 + // 24 * 60 * 60 * 1000\n (hours || 0) * 3600000 + // 60 * 60 * 1000\n (minutes || 0) * 60000 + // 60 * 1000\n (seconds || 0) * 1000 +\n (milliseconds || 0)\n );\n}\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.
|
|
3
|
+
"version": "0.0.1-next.2",
|
|
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.
|
|
40
|
+
"@ngneers/controls-themes": "^0.0.1-next.2",
|
|
41
41
|
"@ngneers/signal-translate": "^20.0.0",
|
|
42
42
|
"rxjs": "~7.8.0"
|
|
43
43
|
},
|
|
@@ -77,6 +77,10 @@
|
|
|
77
77
|
"types": "./types/ngneers-controls-avatar.d.ts",
|
|
78
78
|
"default": "./fesm2022/ngneers-controls-avatar.mjs"
|
|
79
79
|
},
|
|
80
|
+
"./badge": {
|
|
81
|
+
"types": "./types/ngneers-controls-badge.d.ts",
|
|
82
|
+
"default": "./fesm2022/ngneers-controls-badge.mjs"
|
|
83
|
+
},
|
|
80
84
|
"./base": {
|
|
81
85
|
"types": "./types/ngneers-controls-base.d.ts",
|
|
82
86
|
"default": "./fesm2022/ngneers-controls-base.mjs"
|
|
@@ -105,6 +109,10 @@
|
|
|
105
109
|
"types": "./types/ngneers-controls-chip.d.ts",
|
|
106
110
|
"default": "./fesm2022/ngneers-controls-chip.mjs"
|
|
107
111
|
},
|
|
112
|
+
"./color-picker": {
|
|
113
|
+
"types": "./types/ngneers-controls-color-picker.d.ts",
|
|
114
|
+
"default": "./fesm2022/ngneers-controls-color-picker.mjs"
|
|
115
|
+
},
|
|
108
116
|
"./default-icons": {
|
|
109
117
|
"types": "./types/ngneers-controls-default-icons.d.ts",
|
|
110
118
|
"default": "./fesm2022/ngneers-controls-default-icons.mjs"
|
|
@@ -213,6 +221,10 @@
|
|
|
213
221
|
"types": "./types/ngneers-controls-radio.d.ts",
|
|
214
222
|
"default": "./fesm2022/ngneers-controls-radio.mjs"
|
|
215
223
|
},
|
|
224
|
+
"./rating": {
|
|
225
|
+
"types": "./types/ngneers-controls-rating.d.ts",
|
|
226
|
+
"default": "./fesm2022/ngneers-controls-rating.mjs"
|
|
227
|
+
},
|
|
216
228
|
"./roving-focus": {
|
|
217
229
|
"types": "./types/ngneers-controls-roving-focus.d.ts",
|
|
218
230
|
"default": "./fesm2022/ngneers-controls-roving-focus.mjs"
|
|
@@ -257,6 +269,10 @@
|
|
|
257
269
|
"types": "./types/ngneers-controls-state.d.ts",
|
|
258
270
|
"default": "./fesm2022/ngneers-controls-state.mjs"
|
|
259
271
|
},
|
|
272
|
+
"./stepper": {
|
|
273
|
+
"types": "./types/ngneers-controls-stepper.d.ts",
|
|
274
|
+
"default": "./fesm2022/ngneers-controls-stepper.mjs"
|
|
275
|
+
},
|
|
260
276
|
"./switch": {
|
|
261
277
|
"types": "./types/ngneers-controls-switch.d.ts",
|
|
262
278
|
"default": "./fesm2022/ngneers-controls-switch.mjs"
|