@tailng-ui/components 0.1.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/package.json +9 -4
  2. package/src/lib/feedback/toast/tng-toast.component.d.ts +55 -6
  3. package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -1
  4. package/src/lib/feedback/toast/tng-toast.component.js +234 -23
  5. package/src/lib/feedback/toast/tng-toast.component.js.map +1 -1
  6. package/src/lib/form/autocomplete/tng-autocomplete.component.js +1 -1
  7. package/src/lib/form/autocomplete/tng-autocomplete.component.js.map +1 -1
  8. package/src/lib/form/chips/tng-chips.component.d.ts +9 -1
  9. package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -1
  10. package/src/lib/form/chips/tng-chips.component.js +39 -3
  11. package/src/lib/form/chips/tng-chips.component.js.map +1 -1
  12. package/src/lib/form/index.d.ts +2 -2
  13. package/src/lib/form/index.d.ts.map +1 -1
  14. package/src/lib/form/index.js +2 -2
  15. package/src/lib/form/index.js.map +1 -1
  16. package/src/lib/form/input-otp/index.d.ts +3 -0
  17. package/src/lib/form/input-otp/index.d.ts.map +1 -0
  18. package/src/lib/form/input-otp/index.js +3 -0
  19. package/src/lib/form/input-otp/index.js.map +1 -0
  20. package/src/lib/form/input-otp/tng-input-otp.component.d.ts +79 -7
  21. package/src/lib/form/input-otp/tng-input-otp.component.d.ts.map +1 -1
  22. package/src/lib/form/input-otp/tng-input-otp.component.js +441 -81
  23. package/src/lib/form/input-otp/tng-input-otp.component.js.map +1 -1
  24. package/src/lib/form/radio/tng-radio.component.d.ts +4 -0
  25. package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -1
  26. package/src/lib/form/radio/tng-radio.component.js +15 -0
  27. package/src/lib/form/radio/tng-radio.component.js.map +1 -1
  28. package/src/lib/form/textarea/tng-textarea.component.d.ts +2 -0
  29. package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -1
  30. package/src/lib/form/textarea/tng-textarea.component.js +7 -4
  31. package/src/lib/form/textarea/tng-textarea.component.js.map +1 -1
  32. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts +10 -0
  33. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -1
  34. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +52 -1
  35. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -1
  36. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts +1 -0
  37. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -1
  38. package/src/lib/navigation/context-menu/tng-context-menu.component.js +20 -4
  39. package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -1
  40. package/src/lib/overlay/popover/tng-popover.component.d.ts +14 -19
  41. package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -1
  42. package/src/lib/overlay/popover/tng-popover.component.js +24 -105
  43. package/src/lib/overlay/popover/tng-popover.component.js.map +1 -1
  44. package/src/lib/overlay/tng-overlay-focus-handoff.d.ts +10 -0
  45. package/src/lib/overlay/tng-overlay-focus-handoff.d.ts.map +1 -0
  46. package/src/lib/overlay/tng-overlay-focus-handoff.js +3 -0
  47. package/src/lib/overlay/tng-overlay-focus-handoff.js.map +1 -0
  48. package/src/lib/overlay/tng-overlay-runtime.d.ts +2 -2
  49. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts +1 -18
  50. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -1
  51. package/src/lib/overlay/tooltip/tng-tooltip.component.js +5 -85
  52. package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -1
  53. package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -1
  54. package/src/lib/utility/avatar/tng-avatar.component.js +8 -1
  55. package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -1
  56. package/src/lib/utility/tag/tng-tag.component.d.ts +8 -0
  57. package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -1
  58. package/src/lib/utility/tag/tng-tag.component.js +16 -3
  59. package/src/lib/utility/tag/tng-tag.component.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tng-input-otp.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/input-otp/tng-input-otp.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, computed, input, output } from '@angular/core';\nimport { normalizeTngOtpLength, TngInputOtp as TngInputOtpPrimitive } from '@tailng-ui/primitives';\n\nfunction toOtpSlots(length: number, value: string): string[] {\n const slots = Array.from({ length }, () => '');\n\n for (const [index, char] of Array.from(value).entries()) {\n if (index >= length) {\n break;\n }\n\n slots[index] = char;\n }\n\n return slots;\n}\n\nfunction joinOtpSlots(slots: readonly string[]): string {\n return slots.join('');\n}\n\nexport function sanitizeTngOtpValue(value: string): string {\n return value.replace(/[^a-zA-Z0-9]/g, '');\n}\n\nexport function applyTngOtpSlotValue(\n slots: readonly string[],\n index: number,\n nextValue: string,\n): readonly string[] {\n if (index < 0 || index >= slots.length) {\n return slots;\n }\n\n const nextSlots = [...slots];\n nextSlots[index] = sanitizeTngOtpValue(nextValue).slice(0, 1);\n return nextSlots;\n}\n\nfunction isFilledOtp(slots: readonly string[]): boolean {\n return slots.every((slot) => slot.length === 1);\n}\n\nfunction focusOtpInput(index: number): void {\n const target = document.querySelector<HTMLInputElement>(`[data-tng-otp-slot='${index}']`);\n target?.focus();\n target?.select();\n}\n\nfunction readInputValue(event: unknown): string | null {\n if (!(event instanceof Event)) {\n return null;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return null;\n }\n\n return target.value;\n}\n\nfunction readClipboardText(event: unknown): string | null {\n if (!(event instanceof ClipboardEvent)) {\n return null;\n }\n\n return event.clipboardData?.getData('text') ?? null;\n}\n\nfunction handleOtpArrowNavigation(index: number, key: string, total: number): boolean {\n if (key === 'ArrowLeft' && index > 0) {\n focusOtpInput(index - 1);\n return true;\n }\n\n if (key === 'ArrowRight' && index < total - 1) {\n focusOtpInput(index + 1);\n return true;\n }\n\n return false;\n}\n\nfunction shouldMoveBackForDelete(slots: readonly string[], index: number, key: string): boolean {\n if (key !== 'Backspace') {\n return false;\n }\n\n if (index === 0) {\n return false;\n }\n\n return slots[index] === '';\n}\n\n@Component({\n selector: 'tng-input-otp',\n imports: [TngInputOtpPrimitive],\n templateUrl: './tng-input-otp.component.html',\n styleUrl: './tng-input-otp.component.css',\n})\nexport class TngInputOtpComponent {\n public readonly length = input<number, number | string>(6, {\n transform: (value: number | string): number =>\n normalizeTngOtpLength(typeof value === 'number' ? value : Number(value)),\n });\n public readonly value = input<string>('');\n\n public readonly valueChange = output<string>();\n public readonly complete = output<string>();\n\n protected readonly slots = computed<readonly string[]>(() =>\n toOtpSlots(this.length(), sanitizeTngOtpValue(this.value())),\n );\n\n protected onSlotInput(index: number, event: unknown): void {\n const value = readInputValue(event);\n if (value === null) {\n return;\n }\n\n const nextSlots = applyTngOtpSlotValue(this.slots(), index, value);\n const nextValue = joinOtpSlots(nextSlots);\n this.valueChange.emit(nextValue);\n\n if (nextSlots[index] !== '' && index < nextSlots.length - 1) {\n focusOtpInput(index + 1);\n }\n\n if (isFilledOtp(nextSlots)) {\n this.complete.emit(nextValue);\n }\n }\n\n protected onSlotKeydown(index: number, event: unknown): void {\n if (!(event instanceof KeyboardEvent)) {\n return;\n }\n\n if (handleOtpArrowNavigation(index, event.key, this.slots().length)) {\n event.preventDefault();\n return;\n }\n\n if (!shouldMoveBackForDelete(this.slots(), index, event.key)) {\n return;\n }\n\n event.preventDefault();\n const nextSlots = applyTngOtpSlotValue(this.slots(), index - 1, '');\n this.valueChange.emit(joinOtpSlots(nextSlots));\n focusOtpInput(index - 1);\n }\n\n protected onSlotsPaste(event: unknown): void {\n const clipboardValue = readClipboardText(event);\n if (clipboardValue === null) {\n return;\n }\n\n const cleanedValue = sanitizeTngOtpValue(clipboardValue).slice(0, this.length());\n if (cleanedValue.length === 0) {\n return;\n }\n\n if (event instanceof ClipboardEvent) {\n event.preventDefault();\n }\n\n this.valueChange.emit(cleanedValue);\n\n if (cleanedValue.length >= this.length()) {\n this.complete.emit(cleanedValue);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"tng-input-otp.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/input-otp/tng-input-otp.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterViewInit,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n output,\n Renderer2,\n signal,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n clampTngOtpValue,\n normalizeTngOtpLength,\n resolveTngOtpState,\n TngInputOtp as TngInputOtpPrimitive,\n} from '@tailng-ui/primitives';\n\nexport type TngInputOtpType = 'numeric' | 'alphanumeric' | 'custom';\nexport type TngInputOtpInputMode = 'numeric' | 'text' | 'tel' | 'decimal';\n\nconst tngOtpDigitPattern = /^\\d$/;\nconst tngOtpAlphanumericPattern = /^[a-zA-Z0-9]$/;\n\nlet tngInputOtpInstanceCounter = 0;\n\nfunction toNonGlobalRegex(pattern: RegExp): RegExp {\n const flags = pattern.flags.replace(/g/g, '');\n return new RegExp(pattern.source, flags);\n}\n\nexport function sanitizeTngOtpCharacters(\n value: string,\n mode: TngInputOtpType,\n pattern: string | RegExp | null,\n): readonly string[] {\n const compiledPattern =\n mode !== 'custom'\n ? null\n : typeof pattern === 'string'\n ? new RegExp(pattern)\n : pattern === null\n ? null\n : toNonGlobalRegex(pattern);\n\n const acceptedChars: string[] = [];\n for (const char of Array.from(value)) {\n if (mode === 'numeric' && !tngOtpDigitPattern.test(char)) {\n continue;\n }\n\n if (mode === 'alphanumeric' && !tngOtpAlphanumericPattern.test(char)) {\n continue;\n }\n\n if (compiledPattern && !compiledPattern.test(char)) {\n continue;\n }\n\n acceptedChars.push(char);\n }\n\n return acceptedChars;\n}\n\nexport function toTngOtpSlots(length: number, value: string): readonly string[] {\n const safeLength = normalizeTngOtpLength(length);\n const slots = Array.from({ length: safeLength }, () => '');\n const chars = Array.from(clampTngOtpValue(value, safeLength));\n\n for (const [index, char] of chars.entries()) {\n if (index >= safeLength) {\n break;\n }\n\n slots[index] = char;\n }\n\n return slots;\n}\n\nexport function applyTngOtpCharacters(\n value: string,\n startIndex: number,\n characters: readonly string[],\n maxLength: number,\n): string {\n const safeLength = normalizeTngOtpLength(maxLength);\n const nextChars = Array.from(clampTngOtpValue(value, safeLength));\n const safeStart = Math.max(0, Math.min(startIndex, safeLength - 1));\n\n let cursor = nextChars.length < safeLength ? Math.min(safeStart, nextChars.length) : safeStart;\n for (const char of characters) {\n if (cursor >= safeLength) {\n break;\n }\n\n if (cursor < nextChars.length) {\n nextChars[cursor] = char;\n } else {\n nextChars.push(char);\n }\n\n cursor += 1;\n }\n\n return nextChars.slice(0, safeLength).join('');\n}\n\nexport function removeTngOtpCharacter(value: string, index: number): string {\n const chars = Array.from(value);\n if (index < 0 || index >= chars.length) {\n return value;\n }\n\n chars.splice(index, 1);\n return chars.join('');\n}\n\nexport function resolveTngOtpEntryIndex(value: string, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n const safeValue = clampTngOtpValue(value, safeLength);\n if (safeValue.length >= safeLength) {\n return safeLength - 1;\n }\n\n return safeValue.length;\n}\n\nexport function resolveTngOtpEndIndex(value: string, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n const safeValue = clampTngOtpValue(value, safeLength);\n if (safeValue.length === 0) {\n return safeLength - 1;\n }\n\n return Math.max(0, safeValue.length - 1);\n}\n\nfunction clampOtpIndex(index: number, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n if (!Number.isFinite(index)) {\n return 0;\n }\n\n if (index < 0) {\n return 0;\n }\n\n if (index >= safeLength) {\n return safeLength - 1;\n }\n\n return Math.trunc(index);\n}\n\n@Component({\n selector: 'tng-input-otp',\n standalone: true,\n imports: [TngInputOtpPrimitive],\n templateUrl: './tng-input-otp.component.html',\n styleUrl: './tng-input-otp.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TngInputOtpComponent),\n multi: true,\n },\n ],\n})\nexport class TngInputOtpComponent implements AfterViewInit, ControlValueAccessor {\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private readonly generatedId = `tng-input-otp-${++tngInputOtpInstanceCounter}`;\n private resetUnlisten: (() => void) | null = null;\n private hasInitializedUncontrolled = false;\n\n private onChangeCallback: (value: string) => void = () => undefined;\n private onTouchedCallback: () => void = () => undefined;\n\n private readonly uncontrolledValue = signal('');\n private readonly formsDisabled = signal(false);\n private readonly focusedState = signal(false);\n private readonly focusVisibleState = signal(false);\n private readonly keyboardInteraction = signal(false);\n private readonly activeIndexState = signal(0);\n\n public readonly length = input<number, number | string>(6, {\n transform: (value: number | string): number =>\n normalizeTngOtpLength(typeof value === 'number' ? value : Number(value)),\n });\n public readonly valueInput = input<string | null | undefined>(undefined, { alias: 'value' });\n public readonly defaultValue = input<string>('');\n public readonly type = input<TngInputOtpType>('numeric');\n public readonly pattern = input<string | RegExp | null>(null);\n\n public readonly mask = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly disabledInput = input<boolean, boolean | string>(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n public readonly readonly = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly invalid = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly autoFocus = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly selectOnFocus = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n\n public readonly placeholderChar = input<string>('');\n public readonly name = input<string | null>(null);\n public readonly id = input<string | null>(null);\n public readonly form = input<string | null>(null);\n public readonly autocomplete = input<string>('one-time-code');\n public readonly inputMode = input<TngInputOtpInputMode | null>(null);\n public readonly ariaLabel = input<string | null>(null);\n public readonly ariaLabelledby = input<string | null>(null);\n public readonly ariaDescribedby = input<string | null>(null);\n\n public readonly valueChange = output<string>();\n public readonly complete = output<string>();\n\n protected readonly disabled = computed(() => this.disabledInput() || this.formsDisabled());\n protected readonly focused = computed(() => this.focusedState());\n protected readonly focusVisible = computed(() => this.focusVisibleState());\n protected readonly activeIndex = computed(() => clampOtpIndex(this.activeIndexState(), this.length()));\n protected readonly rootId = computed(() => this.id() ?? this.generatedId);\n\n protected readonly currentValue = computed(() => {\n const controlled = this.valueInput();\n if (controlled !== undefined) {\n return this.normalizeAndClamp(controlled ?? '');\n }\n\n return this.normalizeAndClamp(this.uncontrolledValue());\n });\n\n protected readonly slots = computed(() => toTngOtpSlots(this.length(), this.currentValue()));\n protected readonly completionState = computed(() => resolveTngOtpState(this.length(), this.currentValue()));\n\n protected readonly resolvedInputMode = computed<TngInputOtpInputMode>(() => {\n const explicit = this.inputMode();\n if (explicit !== null) {\n return explicit;\n }\n\n return this.type() === 'numeric' ? 'numeric' : 'text';\n });\n\n protected readonly slotInputType = computed<'password' | 'text'>(() =>\n this.mask() ? 'password' : 'text',\n );\n\n private readonly syncUncontrolledState = effect(\n () => {\n const controlled = this.valueInput();\n const length = this.length();\n this.type();\n this.pattern();\n\n if (controlled !== undefined) {\n if (!this.focusedState()) {\n this.activeIndexState.set(\n resolveTngOtpEntryIndex(this.normalizeAndClamp(controlled ?? ''), length),\n );\n }\n\n return;\n }\n\n const normalizedDefault = this.normalizeAndClamp(this.defaultValue());\n if (!this.hasInitializedUncontrolled) {\n this.hasInitializedUncontrolled = true;\n this.uncontrolledValue.set(normalizedDefault);\n this.activeIndexState.set(resolveTngOtpEntryIndex(normalizedDefault, length));\n return;\n }\n\n const normalizedCurrent = this.normalizeAndClamp(this.uncontrolledValue());\n if (normalizedCurrent !== this.uncontrolledValue()) {\n this.uncontrolledValue.set(normalizedCurrent);\n }\n\n this.activeIndexState.update((index) => clampOtpIndex(index, length));\n },\n );\n\n public ngAfterViewInit(): void {\n this.attachFormResetListener();\n\n if (!this.autoFocus() || this.disabled()) {\n return;\n }\n\n queueMicrotask(() => {\n if (this.disabled()) {\n return;\n }\n\n this.focusSlot(resolveTngOtpEntryIndex(this.currentValue(), this.length()), this.selectOnFocus());\n });\n }\n\n public ngOnDestroy(): void {\n this.resetUnlisten?.();\n this.resetUnlisten = null;\n }\n\n public writeValue(value: string | null): void {\n const normalized = this.normalizeAndClamp(value ?? '');\n this.hasInitializedUncontrolled = true;\n this.uncontrolledValue.set(normalized);\n\n if (!this.focusedState()) {\n this.activeIndexState.set(resolveTngOtpEntryIndex(normalized, this.length()));\n }\n }\n\n public registerOnChange(fn: (value: string) => void): void {\n this.onChangeCallback = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouchedCallback = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.formsDisabled.set(isDisabled);\n }\n\n protected onSlotPointerDown(): void {\n this.keyboardInteraction.set(false);\n }\n\n protected onSlotFocus(index: number, event: FocusEvent): void {\n const target = event.target;\n const nextIndex = this.resolveEditableIndex(index);\n this.activeIndexState.set(nextIndex);\n this.focusedState.set(true);\n\n if (target instanceof HTMLElement && target.matches(':focus-visible')) {\n this.focusVisibleState.set(true);\n } else {\n this.focusVisibleState.set(this.keyboardInteraction());\n }\n\n if (this.selectOnFocus() && target instanceof HTMLInputElement) {\n target.select();\n }\n }\n\n protected onSlotBlur(event: FocusEvent): void {\n const host = this.hostRef.nativeElement;\n const relatedTarget = event.relatedTarget;\n if (relatedTarget instanceof Node && host.contains(relatedTarget)) {\n return;\n }\n\n queueMicrotask(() => {\n if (this.isFocusWithinHost()) {\n return;\n }\n\n this.focusedState.set(false);\n this.focusVisibleState.set(false);\n this.onTouchedCallback();\n });\n }\n\n protected onSlotKeydown(index: number, event: KeyboardEvent): void {\n this.keyboardInteraction.set(true);\n\n const editableIndex = this.resolveEditableIndex(index);\n const total = this.length();\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n this.focusSlot(Math.max(0, editableIndex - 1), true);\n return;\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.focusSlot(Math.min(total - 1, editableIndex + 1), true);\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n this.focusSlot(0, true);\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n this.focusSlot(resolveTngOtpEndIndex(this.currentValue(), total), true);\n return;\n }\n\n if (event.key === 'Backspace') {\n event.preventDefault();\n this.handleBackspace(editableIndex);\n return;\n }\n\n if (event.key === 'Delete') {\n event.preventDefault();\n this.handleDelete(editableIndex);\n return;\n }\n\n if ((this.disabled() || this.readonly()) && event.key.length === 1) {\n event.preventDefault();\n }\n }\n\n protected onSlotInput(index: number, event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n\n if (this.disabled() || this.readonly()) {\n target.value = this.slotValue(this.resolveEditableIndex(index));\n return;\n }\n\n const chars = sanitizeTngOtpCharacters(target.value, this.type(), this.pattern());\n if (chars.length === 0) {\n const nextValue = removeTngOtpCharacter(this.currentValue(), this.resolveEditableIndex(index));\n this.commitValue(nextValue, this.resolveEditableIndex(index));\n return;\n }\n\n const previousValue = this.currentValue();\n const totalLength = this.length();\n const editableIndex = this.resolveEditableIndex(index);\n const wasCompleteBeforeInput = previousValue.length >= totalLength;\n const wasReplacingExistingCharacter = editableIndex < previousValue.length;\n const nextValue = applyTngOtpCharacters(previousValue, editableIndex, chars, totalLength);\n const nextFocus =\n wasCompleteBeforeInput || wasReplacingExistingCharacter\n ? Math.min(totalLength - 1, editableIndex + chars.length)\n : nextValue.length >= totalLength\n ? totalLength - 1\n : Math.min(totalLength - 1, Math.max(editableIndex + chars.length, nextValue.length));\n\n this.commitValue(nextValue, nextFocus);\n }\n\n protected onSlotPaste(index: number, event: ClipboardEvent): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n const clipboardValue = event.clipboardData?.getData('text') ?? '';\n const chars = sanitizeTngOtpCharacters(clipboardValue, this.type(), this.pattern());\n if (chars.length === 0) {\n event.preventDefault();\n return;\n }\n\n event.preventDefault();\n const editableIndex = this.resolveEditableIndex(index);\n const nextValue = applyTngOtpCharacters(this.currentValue(), editableIndex, chars, this.length());\n const nextFocus =\n nextValue.length >= this.length()\n ? this.length() - 1\n : Math.min(this.length() - 1, nextValue.length);\n\n this.commitValue(nextValue, nextFocus);\n }\n\n protected slotValue(index: number): string {\n const slot = this.slots()[index];\n return slot ?? '';\n }\n\n protected slotPlaceholder(index: number): string | null {\n if (this.placeholderChar().length === 0) {\n return null;\n }\n\n return this.slotValue(index) === '' ? this.placeholderChar() : null;\n }\n\n protected slotAriaLabel(index: number): string {\n const prefix = this.ariaLabel();\n const base = prefix?.trim() ? `${prefix.trim()} - ` : '';\n return `${base}Character ${index + 1} of ${this.length()}`;\n }\n\n protected isSlotTabbable(index: number): boolean {\n return this.activeIndex() === index;\n }\n\n private handleBackspace(index: number): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n const currentValue = this.currentValue();\n if (currentValue.length === 0) {\n return;\n }\n\n if (index < currentValue.length) {\n const nextValue = removeTngOtpCharacter(currentValue, index);\n const nextFocus = Math.min(index, Math.max(0, nextValue.length));\n this.commitValue(nextValue, nextFocus);\n return;\n }\n\n const previousIndex = Math.max(0, currentValue.length - 1);\n const nextValue = removeTngOtpCharacter(currentValue, previousIndex);\n this.commitValue(nextValue, Math.max(0, previousIndex));\n }\n\n private handleDelete(index: number): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n if (index >= this.currentValue().length) {\n return;\n }\n\n const nextValue = removeTngOtpCharacter(this.currentValue(), index);\n this.commitValue(nextValue, index);\n }\n\n private commitValue(nextValue: string, nextFocusIndex: number): void {\n const previousValue = this.currentValue();\n const normalized = this.normalizeAndClamp(nextValue);\n const didChange = normalized !== previousValue;\n\n if (this.valueInput() === undefined) {\n this.uncontrolledValue.set(normalized);\n }\n\n this.activeIndexState.set(clampOtpIndex(nextFocusIndex, this.length()));\n\n if (didChange) {\n this.valueChange.emit(normalized);\n this.onChangeCallback(normalized);\n\n if (resolveTngOtpState(this.length(), normalized) === 'complete') {\n this.complete.emit(normalized);\n }\n }\n\n queueMicrotask(() => {\n this.syncSlotInputValues();\n if (!this.focusedState() && !this.isFocusWithinHost()) {\n return;\n }\n\n this.focusSlot(this.activeIndex(), this.selectOnFocus());\n });\n }\n\n private resolveEditableIndex(index: number): number {\n const safeIndex = clampOtpIndex(index, this.length());\n const currentValueLength = this.currentValue().length;\n\n if (currentValueLength >= this.length()) {\n return safeIndex;\n }\n\n return Math.min(safeIndex, currentValueLength);\n }\n\n private focusSlot(index: number, select: boolean): void {\n const safeIndex = clampOtpIndex(index, this.length());\n const slot = this.hostRef.nativeElement.querySelector<HTMLInputElement>(\n `[data-tng-otp-slot='${safeIndex}']`,\n );\n\n if (!(slot instanceof HTMLInputElement)) {\n return;\n }\n\n slot.focus();\n if (select) {\n slot.select();\n }\n\n this.activeIndexState.set(safeIndex);\n }\n\n private syncSlotInputValues(): void {\n const slotValues = this.slots();\n const slotInputs = this.hostRef.nativeElement.querySelectorAll<HTMLInputElement>('.tng-input-otp-slot');\n slotInputs.forEach((slotInput, index) => {\n slotInput.value = slotValues[index] ?? '';\n });\n }\n\n private isFocusWithinHost(): boolean {\n const ownerDocument = this.hostRef.nativeElement.ownerDocument;\n const activeElement = ownerDocument?.activeElement;\n return activeElement instanceof Node && this.hostRef.nativeElement.contains(activeElement);\n }\n\n private normalizeAndClamp(value: string): string {\n const chars = sanitizeTngOtpCharacters(value, this.type(), this.pattern());\n const safeLength = this.length();\n return chars.slice(0, safeLength).join('');\n }\n\n private attachFormResetListener(): void {\n const formId = this.form();\n const ownerForm =\n formId !== null\n ? this.hostRef.nativeElement.ownerDocument?.getElementById(formId)\n : this.hostRef.nativeElement.closest('form');\n\n if (!(ownerForm instanceof HTMLFormElement)) {\n return;\n }\n\n this.resetUnlisten?.();\n this.resetUnlisten = this.renderer.listen(ownerForm, 'reset', () => {\n if (this.valueInput() !== undefined) {\n return;\n }\n\n const resetValue = this.normalizeAndClamp(this.defaultValue());\n this.uncontrolledValue.set(resetValue);\n this.activeIndexState.set(resolveTngOtpEntryIndex(resetValue, this.length()));\n this.valueChange.emit(resetValue);\n this.onChangeCallback(resetValue);\n });\n }\n}\n"]}
@@ -1,9 +1,13 @@
1
1
  export declare function readTngRadioChecked(event: unknown): boolean | null;
2
+ export declare function shouldEmitTngRadioCheckedChange(disabled: boolean, readonly: boolean): boolean;
2
3
  export declare class TngRadioComponent {
3
4
  readonly ariaDescribedBy: import("@angular/core").InputSignal<string | null>;
5
+ readonly ariaInvalid: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
4
6
  readonly checked: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
5
7
  readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
8
+ readonly invalid: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
6
9
  readonly name: import("@angular/core").InputSignal<string | null>;
10
+ readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
7
11
  readonly required: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
8
12
  readonly value: import("@angular/core").InputSignal<string>;
9
13
  readonly checkedChange: import("@angular/core").OutputEmitterRef<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"tng-radio.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/radio/tng-radio.component.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAWlE;AAED,qBAMa,iBAAiB;IAC5B,SAAgB,eAAe,qDAA8B;IAC7D,SAAgB,OAAO,8EAEpB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,IAAI,qDAA8B;IAClD,SAAgB,QAAQ,8EAErB;IACH,SAAgB,KAAK,8CAAuB;IAE5C,SAAgB,aAAa,oDAAqB;IAE3C,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAQtC"}
1
+ {"version":3,"file":"tng-radio.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/radio/tng-radio.component.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAWlE;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAE7F;AAED,qBAMa,iBAAiB;IAC5B,SAAgB,eAAe,qDAA8B;IAC7D,SAAgB,WAAW,8EAExB;IACH,SAAgB,OAAO,8EAEpB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,OAAO,8EAEpB;IACH,SAAgB,IAAI,qDAA8B;IAClD,SAAgB,QAAQ,8EAErB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,KAAK,8CAAuB;IAE5C,SAAgB,aAAa,oDAAqB;IAE3C,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAYtC"}
@@ -11,15 +11,27 @@ export function readTngRadioChecked(event) {
11
11
  }
12
12
  return target.checked;
13
13
  }
14
+ export function shouldEmitTngRadioCheckedChange(disabled, readonly) {
15
+ return !disabled && !readonly;
16
+ }
14
17
  let TngRadioComponent = class TngRadioComponent {
15
18
  ariaDescribedBy = input(null);
19
+ ariaInvalid = input(false, {
20
+ transform: booleanAttribute,
21
+ });
16
22
  checked = input(false, {
17
23
  transform: booleanAttribute,
18
24
  });
19
25
  disabled = input(false, {
20
26
  transform: booleanAttribute,
21
27
  });
28
+ invalid = input(false, {
29
+ transform: booleanAttribute,
30
+ });
22
31
  name = input(null);
32
+ readonly = input(false, {
33
+ transform: booleanAttribute,
34
+ });
23
35
  required = input(false, {
24
36
  transform: booleanAttribute,
25
37
  });
@@ -30,6 +42,9 @@ let TngRadioComponent = class TngRadioComponent {
30
42
  if (checked === null) {
31
43
  return;
32
44
  }
45
+ if (!shouldEmitTngRadioCheckedChange(this.disabled(), this.readonly())) {
46
+ return;
47
+ }
33
48
  this.checkedChange.emit(checked);
34
49
  }
35
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tng-radio.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/radio/tng-radio.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,CAAC,MAAM,YAAY,gBAAgB,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAQM,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACZ,eAAe,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAC7C,OAAO,GAAG,KAAK,CAA4B,KAAK,EAAE;QAChE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,IAAI,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAClC,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,KAAK,GAAG,KAAK,CAAS,IAAI,CAAC,CAAC;IAE5B,aAAa,GAAG,MAAM,EAAW,CAAC;IAE3C,QAAQ,CAAC,KAAc;QAC5B,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AAxBY,iBAAiB;IAN7B,SAAS,CAAC;QACT,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,CAAC,iBAAiB,CAAC;QAC5B,WAAW,EAAE,4BAA4B;QACzC,QAAQ,EAAE,2BAA2B;KACtC,CAAC;GACW,iBAAiB,CAwB7B","sourcesContent":["import { booleanAttribute, Component, input, output } from '@angular/core';\nimport { TngRadio as TngRadioPrimitive } from '@tailng-ui/primitives';\n\nexport function readTngRadioChecked(event: unknown): boolean | null {\n if (!(event instanceof Event)) {\n return null;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return null;\n }\n\n return target.checked;\n}\n\n@Component({\n selector: 'tng-radio',\n imports: [TngRadioPrimitive],\n templateUrl: './tng-radio.component.html',\n styleUrl: './tng-radio.component.css',\n})\nexport class TngRadioComponent {\n public readonly ariaDescribedBy = input<string | null>(null);\n public readonly checked = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly name = input<string | null>(null);\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly value = input<string>('on');\n\n public readonly checkedChange = output<boolean>();\n\n public onChange(event: unknown): void {\n const checked = readTngRadioChecked(event);\n if (checked === null) {\n return;\n }\n\n this.checkedChange.emit(checked);\n }\n}\n"]}
1
+ {"version":3,"file":"tng-radio.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/radio/tng-radio.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,CAAC,MAAM,YAAY,gBAAgB,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,QAAiB,EAAE,QAAiB;IAClF,OAAO,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC;AAChC,CAAC;AAQM,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACZ,eAAe,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAC7C,WAAW,GAAG,KAAK,CAA4B,KAAK,EAAE;QACpE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,OAAO,GAAG,KAAK,CAA4B,KAAK,EAAE;QAChE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,OAAO,GAAG,KAAK,CAA4B,KAAK,EAAE;QAChE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,IAAI,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAClC,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,KAAK,GAAG,KAAK,CAAS,IAAI,CAAC,CAAC;IAE5B,aAAa,GAAG,MAAM,EAAW,CAAC;IAE3C,QAAQ,CAAC,KAAc;QAC5B,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YACvE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AArCY,iBAAiB;IAN7B,SAAS,CAAC;QACT,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,CAAC,iBAAiB,CAAC;QAC5B,WAAW,EAAE,4BAA4B;QACzC,QAAQ,EAAE,2BAA2B;KACtC,CAAC;GACW,iBAAiB,CAqC7B","sourcesContent":["import { booleanAttribute, Component, input, output } from '@angular/core';\nimport { TngRadio as TngRadioPrimitive } from '@tailng-ui/primitives';\n\nexport function readTngRadioChecked(event: unknown): boolean | null {\n if (!(event instanceof Event)) {\n return null;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return null;\n }\n\n return target.checked;\n}\n\nexport function shouldEmitTngRadioCheckedChange(disabled: boolean, readonly: boolean): boolean {\n return !disabled && !readonly;\n}\n\n@Component({\n selector: 'tng-radio',\n imports: [TngRadioPrimitive],\n templateUrl: './tng-radio.component.html',\n styleUrl: './tng-radio.component.css',\n})\nexport class TngRadioComponent {\n public readonly ariaDescribedBy = input<string | null>(null);\n public readonly ariaInvalid = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly checked = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly invalid = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly name = input<string | null>(null);\n public readonly readonly = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly value = input<string>('on');\n\n public readonly checkedChange = output<boolean>();\n\n public onChange(event: unknown): void {\n const checked = readTngRadioChecked(event);\n if (checked === null) {\n return;\n }\n\n if (!shouldEmitTngRadioCheckedChange(this.disabled(), this.readonly())) {\n return;\n }\n\n this.checkedChange.emit(checked);\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { type TngTextareaResize } from '@tailng-ui/primitives';
1
2
  type NullableBooleanInput = boolean | null | string | undefined;
2
3
  export declare function readTngTextareaEventValue(event: unknown): string | null;
3
4
  export declare class TngTextareaComponent {
@@ -9,6 +10,7 @@ export declare class TngTextareaComponent {
9
10
  readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
10
11
  readonly required: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
11
12
  readonly rows: import("@angular/core").InputSignalWithTransform<number, string | number>;
13
+ readonly resize: import("@angular/core").InputSignalWithTransform<TngTextareaResize, string>;
12
14
  readonly value: import("@angular/core").InputSignal<string | null>;
13
15
  readonly valueChange: import("@angular/core").OutputEmitterRef<string>;
14
16
  onInput(event: unknown): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tng-textarea.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/textarea/tng-textarea.component.ts"],"names":[],"mappings":"AAOA,KAAK,oBAAoB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWvE;AAED,qBAMa,oBAAoB;IAC/B,SAAgB,eAAe,qDAA8B;IAC7D,SAAgB,WAAW,yFAExB;IACH,SAAgB,YAAY,yFAEzB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,WAAW,qDAA8B;IACzD,SAAgB,QAAQ,8EAErB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,IAAI,4EAGjB;IACH,SAAgB,KAAK,qDAA8B;IAEnD,SAAgB,WAAW,mDAAoB;IAExC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAQrC"}
1
+ {"version":3,"file":"tng-textarea.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/textarea/tng-textarea.component.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,KAAK,oBAAoB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWvE;AAED,qBAMa,oBAAoB;IAC/B,SAAgB,eAAe,qDAA8B;IAC7D,SAAgB,WAAW,yFAExB;IACH,SAAgB,YAAY,yFAEzB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,WAAW,qDAA8B;IACzD,SAAgB,QAAQ,8EAErB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,IAAI,4EAGjB;IACH,SAAgB,MAAM,8EAEnB;IACH,SAAgB,KAAK,qDAA8B;IAEnD,SAAgB,WAAW,mDAAoB;IAExC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAQrC"}
@@ -1,6 +1,6 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { booleanAttribute, Component, input, output } from '@angular/core';
3
- import { coerceTngTextareaNullableBoolean, normalizeTngTextareaRows, TngTextarea as TngTextareaPrimitive, } from '@tailng-ui/primitives';
3
+ import { coerceTngInputNullableBoolean, normalizeTngTextareaResize, normalizeTngTextareaRows, TngInput, } from '@tailng-ui/primitives';
4
4
  export function readTngTextareaEventValue(event) {
5
5
  if (!(event instanceof Event)) {
6
6
  return null;
@@ -14,10 +14,10 @@ export function readTngTextareaEventValue(event) {
14
14
  let TngTextareaComponent = class TngTextareaComponent {
15
15
  ariaDescribedBy = input(null);
16
16
  ariaInvalid = input(null, {
17
- transform: coerceTngTextareaNullableBoolean,
17
+ transform: coerceTngInputNullableBoolean,
18
18
  });
19
19
  ariaRequired = input(null, {
20
- transform: coerceTngTextareaNullableBoolean,
20
+ transform: coerceTngInputNullableBoolean,
21
21
  });
22
22
  disabled = input(false, {
23
23
  transform: booleanAttribute,
@@ -32,6 +32,9 @@ let TngTextareaComponent = class TngTextareaComponent {
32
32
  rows = input(3, {
33
33
  transform: (value) => normalizeTngTextareaRows(typeof value === 'number' ? value : Number(value)),
34
34
  });
35
+ resize = input('vertical', {
36
+ transform: normalizeTngTextareaResize,
37
+ });
35
38
  value = input(null);
36
39
  valueChange = output();
37
40
  onInput(event) {
@@ -45,7 +48,7 @@ let TngTextareaComponent = class TngTextareaComponent {
45
48
  TngTextareaComponent = __decorate([
46
49
  Component({
47
50
  selector: 'tng-textarea',
48
- imports: [TngTextareaPrimitive],
51
+ imports: [TngInput],
49
52
  templateUrl: './tng-textarea.component.html',
50
53
  styleUrl: './tng-textarea.component.css',
51
54
  })
@@ -1 +1 @@
1
- {"version":3,"file":"tng-textarea.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/textarea/tng-textarea.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,gCAAgC,EAChC,wBAAwB,EACxB,WAAW,IAAI,oBAAoB,GACpC,MAAM,uBAAuB,CAAC;AAI/B,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,CAAC,MAAM,YAAY,mBAAmB,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAQM,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACf,eAAe,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAC7C,WAAW,GAAG,KAAK,CAAuC,IAAI,EAAE;QAC9E,SAAS,EAAE,gCAAgC;KAC5C,CAAC,CAAC;IACa,YAAY,GAAG,KAAK,CAAuC,IAAI,EAAE;QAC/E,SAAS,EAAE,gCAAgC;KAC5C,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,WAAW,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IACzC,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,IAAI,GAAG,KAAK,CAA0B,CAAC,EAAE;QACvD,SAAS,EAAE,CAAC,KAAsB,EAAU,EAAE,CAC5C,wBAAwB,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC9E,CAAC,CAAC;IACa,KAAK,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAEnC,WAAW,GAAG,MAAM,EAAU,CAAC;IAExC,OAAO,CAAC,KAAc;QAC3B,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF,CAAA;AAlCY,oBAAoB;IANhC,SAAS,CAAC;QACT,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,EAAE,8BAA8B;KACzC,CAAC;GACW,oBAAoB,CAkChC","sourcesContent":["import { booleanAttribute, Component, input, output } from '@angular/core';\nimport {\n coerceTngTextareaNullableBoolean,\n normalizeTngTextareaRows,\n TngTextarea as TngTextareaPrimitive,\n} from '@tailng-ui/primitives';\n\ntype NullableBooleanInput = boolean | null | string | undefined;\n\nexport function readTngTextareaEventValue(event: unknown): string | null {\n if (!(event instanceof Event)) {\n return null;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLTextAreaElement)) {\n return null;\n }\n\n return target.value;\n}\n\n@Component({\n selector: 'tng-textarea',\n imports: [TngTextareaPrimitive],\n templateUrl: './tng-textarea.component.html',\n styleUrl: './tng-textarea.component.css',\n})\nexport class TngTextareaComponent {\n public readonly ariaDescribedBy = input<string | null>(null);\n public readonly ariaInvalid = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngTextareaNullableBoolean,\n });\n public readonly ariaRequired = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngTextareaNullableBoolean,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly placeholder = input<string | null>(null);\n public readonly readonly = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly rows = input<number, number | string>(3, {\n transform: (value: number | string): number =>\n normalizeTngTextareaRows(typeof value === 'number' ? value : Number(value)),\n });\n public readonly value = input<string | null>(null);\n\n public readonly valueChange = output<string>();\n\n public onInput(event: unknown): void {\n const value = readTngTextareaEventValue(event);\n if (value === null) {\n return;\n }\n\n this.valueChange.emit(value);\n }\n}\n"]}
1
+ {"version":3,"file":"tng-textarea.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/textarea/tng-textarea.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,wBAAwB,EACxB,QAAQ,GAET,MAAM,uBAAuB,CAAC;AAI/B,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,CAAC,MAAM,YAAY,mBAAmB,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAQM,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACf,eAAe,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAC7C,WAAW,GAAG,KAAK,CAAuC,IAAI,EAAE;QAC9E,SAAS,EAAE,6BAA6B;KACzC,CAAC,CAAC;IACa,YAAY,GAAG,KAAK,CAAuC,IAAI,EAAE;QAC/E,SAAS,EAAE,6BAA6B;KACzC,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,WAAW,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IACzC,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,IAAI,GAAG,KAAK,CAA0B,CAAC,EAAE;QACvD,SAAS,EAAE,CAAC,KAAsB,EAAU,EAAE,CAC5C,wBAAwB,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC9E,CAAC,CAAC;IACa,MAAM,GAAG,KAAK,CAAgD,UAAU,EAAE;QACxF,SAAS,EAAE,0BAA0B;KACtC,CAAC,CAAC;IACa,KAAK,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAEnC,WAAW,GAAG,MAAM,EAAU,CAAC;IAExC,OAAO,CAAC,KAAc;QAC3B,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF,CAAA;AArCY,oBAAoB;IANhC,SAAS,CAAC;QACT,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,CAAC,QAAQ,CAAC;QACnB,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,EAAE,8BAA8B;KACzC,CAAC;GACW,oBAAoB,CAqChC","sourcesContent":["import { booleanAttribute, Component, input, output } from '@angular/core';\nimport {\n coerceTngInputNullableBoolean,\n normalizeTngTextareaResize,\n normalizeTngTextareaRows,\n TngInput,\n type TngTextareaResize,\n} from '@tailng-ui/primitives';\n\ntype NullableBooleanInput = boolean | null | string | undefined;\n\nexport function readTngTextareaEventValue(event: unknown): string | null {\n if (!(event instanceof Event)) {\n return null;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLTextAreaElement)) {\n return null;\n }\n\n return target.value;\n}\n\n@Component({\n selector: 'tng-textarea',\n imports: [TngInput],\n templateUrl: './tng-textarea.component.html',\n styleUrl: './tng-textarea.component.css',\n})\nexport class TngTextareaComponent {\n public readonly ariaDescribedBy = input<string | null>(null);\n public readonly ariaInvalid = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngInputNullableBoolean,\n });\n public readonly ariaRequired = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngInputNullableBoolean,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly placeholder = input<string | null>(null);\n public readonly readonly = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly rows = input<number, number | string>(3, {\n transform: (value: number | string): number =>\n normalizeTngTextareaRows(typeof value === 'number' ? value : Number(value)),\n });\n public readonly resize = input<TngTextareaResize, TngTextareaResize | string>('vertical', {\n transform: normalizeTngTextareaResize,\n });\n public readonly value = input<string | null>(null);\n\n public readonly valueChange = output<string>();\n\n public onInput(event: unknown): void {\n const value = readTngTextareaEventValue(event);\n if (value === null) {\n return;\n }\n\n this.valueChange.emit(value);\n }\n}\n"]}
@@ -2,12 +2,16 @@ import { type TemplateRef } from '@angular/core';
2
2
  import { Subject } from 'rxjs';
3
3
  export type TngBreadcrumbItemDisplayMode = 'ellipsis' | 'hidden' | 'visible';
4
4
  export declare class TngBreadcrumbItemComponent {
5
+ private readonly hostRef;
6
+ private keyboardModality;
5
7
  readonly stateChanges: Subject<void>;
6
8
  readonly current: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
7
9
  readonly currentAsLink: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
8
10
  readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
9
11
  readonly href: import("@angular/core").InputSignal<string | null>;
10
12
  readonly routerLink: import("@angular/core").InputSignal<string | readonly (string | number)[] | null>;
13
+ protected readonly isFocused: import("@angular/core").WritableSignal<boolean>;
14
+ protected readonly isFocusVisible: import("@angular/core").WritableSignal<boolean>;
11
15
  protected readonly displayMode: import("@angular/core").WritableSignal<TngBreadcrumbItemDisplayMode>;
12
16
  protected readonly collapseLabel: import("@angular/core").WritableSignal<string>;
13
17
  protected readonly isResolvedCurrent: import("@angular/core").WritableSignal<boolean>;
@@ -24,5 +28,11 @@ export declare class TngBreadcrumbItemComponent {
24
28
  protected hasHrefLink(): boolean;
25
29
  protected hasRouterLink(): boolean;
26
30
  protected onLinkClick(event: MouseEvent): void;
31
+ protected onKeydown(): void;
32
+ protected onPointerdown(): void;
33
+ protected onMousedown(): void;
34
+ protected onTouchstart(): void;
35
+ protected onFocusin(event: FocusEvent): void;
36
+ protected onFocusout(event: FocusEvent): void;
27
37
  }
28
38
  //# sourceMappingURL=tng-breadcrumb-item.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-breadcrumb-item.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAM7F,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,MAAM,4BAA4B,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7E,qBAYa,0BAA0B;IACrC,SAAgB,YAAY,gBAAuB;IACnD,SAAgB,OAAO,qEAAiD;IACxE,SAAgB,aAAa,qEAAiD;IAC9E,SAAgB,QAAQ,qEAAiD;IACzE,SAAgB,IAAI,qDAA8B;IAClD,SAAgB,UAAU,oFAA6D;IAEvF,SAAS,CAAC,QAAQ,CAAC,WAAW,uEAAmD;IACjF,SAAS,CAAC,QAAQ,CAAC,aAAa,iDAAkB;IAClD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,kDAAiB;IACrD,SAAS,CAAC,QAAQ,CAAC,SAAS,iDAAe;IAC3C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,sEAA6C;IACjF,SAAS,CAAC,QAAQ,CAAC,aAAa,kDAAiB;;IAW1C,WAAW,IAAI,IAAI;IAInB,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,IAAI,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAK/E,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIxC,YAAY,CACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,EACtB,iBAAiB,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,GAC7C,IAAI;IAMP,SAAS,CAAC,gBAAgB,IAAI,OAAO;IAarC,SAAS,CAAC,WAAW,IAAI,OAAO;IAIhC,SAAS,CAAC,aAAa,IAAI,OAAO;IAIlC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAQ/C"}
1
+ {"version":3,"file":"tng-breadcrumb-item.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.ts"],"names":[],"mappings":"AACA,OAAO,EAQL,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,MAAM,4BAA4B,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7E,qBAYa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,gBAAgB,CAAS;IAEjC,SAAgB,YAAY,gBAAuB;IACnD,SAAgB,OAAO,qEAAiD;IACxE,SAAgB,aAAa,qEAAiD;IAC9E,SAAgB,QAAQ,qEAAiD;IACzE,SAAgB,IAAI,qDAA8B;IAClD,SAAgB,UAAU,oFAA6D;IAEvF,SAAS,CAAC,QAAQ,CAAC,SAAS,kDAAiB;IAC7C,SAAS,CAAC,QAAQ,CAAC,cAAc,kDAAiB;IAClD,SAAS,CAAC,QAAQ,CAAC,WAAW,uEAAmD;IACjF,SAAS,CAAC,QAAQ,CAAC,aAAa,iDAAkB;IAClD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,kDAAiB;IACrD,SAAS,CAAC,QAAQ,CAAC,SAAS,iDAAe;IAC3C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,sEAA6C;IACjF,SAAS,CAAC,QAAQ,CAAC,aAAa,kDAAiB;;IAW1C,WAAW,IAAI,IAAI;IAInB,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,IAAI,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAK/E,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIxC,YAAY,CACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,EACtB,iBAAiB,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,GAC7C,IAAI;IAMP,SAAS,CAAC,gBAAgB,IAAI,OAAO;IAarC,SAAS,CAAC,WAAW,IAAI,OAAO;IAIhC,SAAS,CAAC,aAAa,IAAI,OAAO;IAIlC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAU9C,SAAS,CAAC,SAAS,IAAI,IAAI;IAK3B,SAAS,CAAC,aAAa,IAAI,IAAI;IAK/B,SAAS,CAAC,WAAW,IAAI,IAAI;IAK7B,SAAS,CAAC,YAAY,IAAI,IAAI;IAK9B,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAa5C,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAS9C"}
@@ -1,17 +1,21 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { NgTemplateOutlet } from '@angular/common';
3
- import { booleanAttribute, Component, input, signal } from '@angular/core';
3
+ import { booleanAttribute, Component, ElementRef, HostListener, inject, input, signal, } from '@angular/core';
4
4
  import { RouterLink } from '@angular/router';
5
5
  import { TngBreadcrumbItem as TngBreadcrumbItemPrimitive, TngBreadcrumbLink as TngBreadcrumbLinkPrimitive, } from '@tailng-ui/primitives';
6
6
  import { Subject } from 'rxjs';
7
7
  import { TngBreadcrumbSeparatorComponent } from './tng-breadcrumb-separator.component';
8
8
  let TngBreadcrumbItemComponent = class TngBreadcrumbItemComponent {
9
+ hostRef = inject(ElementRef);
10
+ keyboardModality = false;
9
11
  stateChanges = new Subject();
10
12
  current = input(false, { transform: booleanAttribute });
11
13
  currentAsLink = input(false, { transform: booleanAttribute });
12
14
  disabled = input(false, { transform: booleanAttribute });
13
15
  href = input(null);
14
16
  routerLink = input(null);
17
+ isFocused = signal(false);
18
+ isFocusVisible = signal(false);
15
19
  displayMode = signal('visible');
16
20
  collapseLabel = signal('More');
17
21
  isResolvedCurrent = signal(false);
@@ -67,7 +71,54 @@ let TngBreadcrumbItemComponent = class TngBreadcrumbItemComponent {
67
71
  event.preventDefault();
68
72
  event.stopImmediatePropagation();
69
73
  }
74
+ onKeydown() {
75
+ this.keyboardModality = true;
76
+ }
77
+ onPointerdown() {
78
+ this.keyboardModality = false;
79
+ }
80
+ onMousedown() {
81
+ this.keyboardModality = false;
82
+ }
83
+ onTouchstart() {
84
+ this.keyboardModality = false;
85
+ }
86
+ onFocusin(event) {
87
+ this.isFocused.set(true);
88
+ const target = event.target;
89
+ if (target instanceof HTMLElement) {
90
+ this.isFocusVisible.set(target.matches(':focus-visible') || this.keyboardModality);
91
+ return;
92
+ }
93
+ this.isFocusVisible.set(this.keyboardModality);
94
+ }
95
+ onFocusout(event) {
96
+ const relatedTarget = event.relatedTarget;
97
+ if (relatedTarget instanceof Node && this.hostRef.nativeElement.contains(relatedTarget)) {
98
+ return;
99
+ }
100
+ this.isFocused.set(false);
101
+ this.isFocusVisible.set(false);
102
+ }
70
103
  };
104
+ __decorate([
105
+ HostListener('keydown')
106
+ ], TngBreadcrumbItemComponent.prototype, "onKeydown", null);
107
+ __decorate([
108
+ HostListener('pointerdown')
109
+ ], TngBreadcrumbItemComponent.prototype, "onPointerdown", null);
110
+ __decorate([
111
+ HostListener('mousedown')
112
+ ], TngBreadcrumbItemComponent.prototype, "onMousedown", null);
113
+ __decorate([
114
+ HostListener('touchstart')
115
+ ], TngBreadcrumbItemComponent.prototype, "onTouchstart", null);
116
+ __decorate([
117
+ HostListener('focusin', ['$event'])
118
+ ], TngBreadcrumbItemComponent.prototype, "onFocusin", null);
119
+ __decorate([
120
+ HostListener('focusout', ['$event'])
121
+ ], TngBreadcrumbItemComponent.prototype, "onFocusout", null);
71
122
  TngBreadcrumbItemComponent = __decorate([
72
123
  Component({
73
124
  selector: 'tng-breadcrumb-item',
@@ -1 +1 @@
1
- {"version":3,"file":"tng-breadcrumb-item.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, Component, input, signal, type TemplateRef } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport {\n TngBreadcrumbItem as TngBreadcrumbItemPrimitive,\n TngBreadcrumbLink as TngBreadcrumbLinkPrimitive,\n} from '@tailng-ui/primitives';\nimport { Subject } from 'rxjs';\nimport { TngBreadcrumbSeparatorComponent } from './tng-breadcrumb-separator.component';\n\nexport type TngBreadcrumbItemDisplayMode = 'ellipsis' | 'hidden' | 'visible';\n\n@Component({\n selector: 'tng-breadcrumb-item',\n imports: [\n RouterLink,\n NgTemplateOutlet,\n TngBreadcrumbItemPrimitive,\n TngBreadcrumbLinkPrimitive,\n TngBreadcrumbSeparatorComponent,\n ],\n templateUrl: './tng-breadcrumb-item.component.html',\n styleUrl: './tng-breadcrumb-item.component.css',\n})\nexport class TngBreadcrumbItemComponent {\n public readonly stateChanges = new Subject<void>();\n public readonly current = input(false, { transform: booleanAttribute });\n public readonly currentAsLink = input(false, { transform: booleanAttribute });\n public readonly disabled = input(false, { transform: booleanAttribute });\n public readonly href = input<string | null>(null);\n public readonly routerLink = input<string | readonly (number | string)[] | null>(null);\n\n protected readonly displayMode = signal<TngBreadcrumbItemDisplayMode>('visible');\n protected readonly collapseLabel = signal('More');\n protected readonly isResolvedCurrent = signal(false);\n protected readonly separator = signal('/');\n protected readonly separatorTemplate = signal<TemplateRef<unknown> | null>(null);\n protected readonly showSeparator = signal(false);\n\n public constructor() {\n this.current();\n this.currentAsLink();\n this.disabled();\n this.href();\n this.routerLink();\n queueMicrotask(() => this.stateChanges.next());\n }\n\n public ngOnChanges(): void {\n this.stateChanges.next();\n }\n\n public ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n public setDisplayMode(mode: TngBreadcrumbItemDisplayMode, collapseLabel: string): void {\n this.displayMode.set(mode);\n this.collapseLabel.set(collapseLabel);\n }\n\n public setResolvedCurrent(value: boolean): void {\n this.isResolvedCurrent.set(value);\n }\n\n public setSeparator(\n separator: string,\n showSeparator: boolean,\n separatorTemplate: TemplateRef<unknown> | null,\n ): void {\n this.separator.set(separator);\n this.showSeparator.set(showSeparator);\n this.separatorTemplate.set(separatorTemplate);\n }\n\n protected shouldRenderLink(): boolean {\n const hasExplicitTarget = this.hasHrefLink() || this.hasRouterLink();\n if (!hasExplicitTarget) {\n return false;\n }\n\n if (!this.isResolvedCurrent()) {\n return true;\n }\n\n return this.currentAsLink();\n }\n\n protected hasHrefLink(): boolean {\n return this.href() !== null;\n }\n\n protected hasRouterLink(): boolean {\n return this.routerLink() !== null;\n }\n\n protected onLinkClick(event: MouseEvent): void {\n if (!this.disabled()) {\n return;\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n}\n"]}
1
+ {"version":3,"file":"tng-breadcrumb-item.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,EACN,KAAK,EACL,MAAM,GAEP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,iBAAiB,IAAI,0BAA0B,EAC/C,iBAAiB,IAAI,0BAA0B,GAChD,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAgBhF,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IACpB,OAAO,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC;IAC/D,gBAAgB,GAAG,KAAK,CAAC;IAEjB,YAAY,GAAG,IAAI,OAAO,EAAQ,CAAC;IACnC,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACxD,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC9D,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzD,IAAI,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAClC,UAAU,GAAG,KAAK,CAA+C,IAAI,CAAC,CAAC;IAEpE,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,WAAW,GAAG,MAAM,CAA+B,SAAS,CAAC,CAAC;IAC9D,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,iBAAiB,GAAG,MAAM,CAA8B,IAAI,CAAC,CAAC;IAC9D,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjD;QACE,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAEM,cAAc,CAAC,IAAkC,EAAE,aAAqB;QAC7E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAEM,kBAAkB,CAAC,KAAc;QACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEM,YAAY,CACjB,SAAiB,EACjB,aAAsB,EACtB,iBAA8C;QAE9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAChD,CAAC;IAES,gBAAgB;QACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACrE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAES,WAAW;QACnB,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;IAC9B,CAAC;IAES,aAAa;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC;IACpC,CAAC;IAES,WAAW,CAAC,KAAiB;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;IACnC,CAAC;IAGS,SAAS;QACjB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAGS,aAAa;QACrB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAGS,WAAW;QACnB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAGS,YAAY;QACpB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAGS,SAAS,CAAC,KAAiB;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjD,CAAC;IAGS,UAAU,CAAC,KAAiB;QACpC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAC1C,IAAI,aAAa,YAAY,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACxF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;CACF,CAAA;AA1CW;IADT,YAAY,CAAC,SAAS,CAAC;2DAGvB;AAGS;IADT,YAAY,CAAC,aAAa,CAAC;+DAG3B;AAGS;IADT,YAAY,CAAC,WAAW,CAAC;6DAGzB;AAGS;IADT,YAAY,CAAC,YAAY,CAAC;8DAG1B;AAGS;IADT,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;2DAWnC;AAGS;IADT,YAAY,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;4DASpC;AAhIU,0BAA0B;IAZtC,SAAS,CAAC;QACT,QAAQ,EAAE,qBAAqB;QAC/B,OAAO,EAAE;YACP,UAAU;YACV,gBAAgB;YAChB,0BAA0B;YAC1B,0BAA0B;YAC1B,+BAA+B;SAChC;QACD,WAAW,EAAE,sCAAsC;QACnD,QAAQ,EAAE,qCAAqC;KAChD,CAAC;GACW,0BAA0B,CAiItC","sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n ElementRef,\n HostListener,\n inject,\n input,\n signal,\n type TemplateRef,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport {\n TngBreadcrumbItem as TngBreadcrumbItemPrimitive,\n TngBreadcrumbLink as TngBreadcrumbLinkPrimitive,\n} from '@tailng-ui/primitives';\nimport { Subject } from 'rxjs';\nimport { TngBreadcrumbSeparatorComponent } from './tng-breadcrumb-separator.component';\n\nexport type TngBreadcrumbItemDisplayMode = 'ellipsis' | 'hidden' | 'visible';\n\n@Component({\n selector: 'tng-breadcrumb-item',\n imports: [\n RouterLink,\n NgTemplateOutlet,\n TngBreadcrumbItemPrimitive,\n TngBreadcrumbLinkPrimitive,\n TngBreadcrumbSeparatorComponent,\n ],\n templateUrl: './tng-breadcrumb-item.component.html',\n styleUrl: './tng-breadcrumb-item.component.css',\n})\nexport class TngBreadcrumbItemComponent {\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private keyboardModality = false;\n\n public readonly stateChanges = new Subject<void>();\n public readonly current = input(false, { transform: booleanAttribute });\n public readonly currentAsLink = input(false, { transform: booleanAttribute });\n public readonly disabled = input(false, { transform: booleanAttribute });\n public readonly href = input<string | null>(null);\n public readonly routerLink = input<string | readonly (number | string)[] | null>(null);\n\n protected readonly isFocused = signal(false);\n protected readonly isFocusVisible = signal(false);\n protected readonly displayMode = signal<TngBreadcrumbItemDisplayMode>('visible');\n protected readonly collapseLabel = signal('More');\n protected readonly isResolvedCurrent = signal(false);\n protected readonly separator = signal('/');\n protected readonly separatorTemplate = signal<TemplateRef<unknown> | null>(null);\n protected readonly showSeparator = signal(false);\n\n public constructor() {\n this.current();\n this.currentAsLink();\n this.disabled();\n this.href();\n this.routerLink();\n queueMicrotask(() => this.stateChanges.next());\n }\n\n public ngOnChanges(): void {\n this.stateChanges.next();\n }\n\n public ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n public setDisplayMode(mode: TngBreadcrumbItemDisplayMode, collapseLabel: string): void {\n this.displayMode.set(mode);\n this.collapseLabel.set(collapseLabel);\n }\n\n public setResolvedCurrent(value: boolean): void {\n this.isResolvedCurrent.set(value);\n }\n\n public setSeparator(\n separator: string,\n showSeparator: boolean,\n separatorTemplate: TemplateRef<unknown> | null,\n ): void {\n this.separator.set(separator);\n this.showSeparator.set(showSeparator);\n this.separatorTemplate.set(separatorTemplate);\n }\n\n protected shouldRenderLink(): boolean {\n const hasExplicitTarget = this.hasHrefLink() || this.hasRouterLink();\n if (!hasExplicitTarget) {\n return false;\n }\n\n if (!this.isResolvedCurrent()) {\n return true;\n }\n\n return this.currentAsLink();\n }\n\n protected hasHrefLink(): boolean {\n return this.href() !== null;\n }\n\n protected hasRouterLink(): boolean {\n return this.routerLink() !== null;\n }\n\n protected onLinkClick(event: MouseEvent): void {\n if (!this.disabled()) {\n return;\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n @HostListener('keydown')\n protected onKeydown(): void {\n this.keyboardModality = true;\n }\n\n @HostListener('pointerdown')\n protected onPointerdown(): void {\n this.keyboardModality = false;\n }\n\n @HostListener('mousedown')\n protected onMousedown(): void {\n this.keyboardModality = false;\n }\n\n @HostListener('touchstart')\n protected onTouchstart(): void {\n this.keyboardModality = false;\n }\n\n @HostListener('focusin', ['$event'])\n protected onFocusin(event: FocusEvent): void {\n this.isFocused.set(true);\n\n const target = event.target;\n if (target instanceof HTMLElement) {\n this.isFocusVisible.set(target.matches(':focus-visible') || this.keyboardModality);\n return;\n }\n\n this.isFocusVisible.set(this.keyboardModality);\n }\n\n @HostListener('focusout', ['$event'])\n protected onFocusout(event: FocusEvent): void {\n const relatedTarget = event.relatedTarget;\n if (relatedTarget instanceof Node && this.hostRef.nativeElement.contains(relatedTarget)) {\n return;\n }\n\n this.isFocused.set(false);\n this.isFocusVisible.set(false);\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  export declare class TngContextMenuComponent {
2
2
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
3
+ protected get hostAriaLabel(): string;
3
4
  }
4
5
  //# sourceMappingURL=tng-context-menu.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-context-menu.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/navigation/context-menu/tng-context-menu.component.ts"],"names":[],"mappings":"AAGA,qBAMa,uBAAuB;IAClC,SAAgB,SAAS,8CAAiC;CAC3D"}
1
+ {"version":3,"file":"tng-context-menu.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/navigation/context-menu/tng-context-menu.component.ts"],"names":[],"mappings":"AAMA,qBAgBa,uBAAuB;IAClC,SAAgB,SAAS,8CAAiC;IAG1D,SAAS,KAAK,aAAa,IAAI,MAAM,CAEpC;CACF"}
@@ -1,15 +1,31 @@
1
1
  import { __decorate } from "tslib";
2
- import { Component, input } from '@angular/core';
3
- import { TngContextMenu as TngContextMenuPrimitive } from '@tailng-ui/primitives';
2
+ import { Component, HostBinding, input } from '@angular/core';
3
+ import { TngContextMenu as TngContextMenuPrimitive, TngMenu as TngMenuPrimitive, } from '@tailng-ui/primitives';
4
4
  let TngContextMenuComponent = class TngContextMenuComponent {
5
- ariaLabel = input('Context Menu');
5
+ ariaLabel = input('Context menu');
6
+ get hostAriaLabel() {
7
+ return this.ariaLabel();
8
+ }
6
9
  };
10
+ __decorate([
11
+ HostBinding('attr.aria-label')
12
+ ], TngContextMenuComponent.prototype, "hostAriaLabel", null);
7
13
  TngContextMenuComponent = __decorate([
8
14
  Component({
9
15
  selector: 'tng-context-menu',
10
- imports: [TngContextMenuPrimitive],
16
+ hostDirectives: [
17
+ {
18
+ directive: TngMenuPrimitive,
19
+ inputs: ['loop', 'disabled', 'closeOnSelect', 'dismissOnOutsideClick', 'dismissOnFocusout'],
20
+ outputs: ['tngMenuOpened', 'tngMenuClosed', 'tngMenuSelect'],
21
+ },
22
+ {
23
+ directive: TngContextMenuPrimitive,
24
+ },
25
+ ],
11
26
  templateUrl: './tng-context-menu.component.html',
12
27
  styleUrl: './tng-context-menu.component.css',
28
+ exportAs: 'tngContextMenuComponent',
13
29
  })
14
30
  ], TngContextMenuComponent);
15
31
  export { TngContextMenuComponent };
@@ -1 +1 @@
1
- {"version":3,"file":"tng-context-menu.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/navigation/context-menu/tng-context-menu.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAQ3E,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAClB,SAAS,GAAG,KAAK,CAAS,cAAc,CAAC,CAAC;CAC3D,CAAA;AAFY,uBAAuB;IANnC,SAAS,CAAC;QACT,QAAQ,EAAE,kBAAkB;QAC5B,OAAO,EAAE,CAAC,uBAAuB,CAAC;QAClC,WAAW,EAAE,mCAAmC;QAChD,QAAQ,EAAE,kCAAkC;KAC7C,CAAC;GACW,uBAAuB,CAEnC","sourcesContent":["import { Component, input } from '@angular/core';\nimport { TngContextMenu as TngContextMenuPrimitive } from '@tailng-ui/primitives';\n\n@Component({\n selector: 'tng-context-menu',\n imports: [TngContextMenuPrimitive],\n templateUrl: './tng-context-menu.component.html',\n styleUrl: './tng-context-menu.component.css',\n})\nexport class TngContextMenuComponent {\n public readonly ariaLabel = input<string>('Context Menu');\n}\n"]}
1
+ {"version":3,"file":"tng-context-menu.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/navigation/context-menu/tng-context-menu.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,cAAc,IAAI,uBAAuB,EACzC,OAAO,IAAI,gBAAgB,GAC5B,MAAM,uBAAuB,CAAC;AAkBxB,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAClB,SAAS,GAAG,KAAK,CAAS,cAAc,CAAC,CAAC;IAG1D,IAAc,aAAa;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;CACF,CAAA;AAHC;IADC,WAAW,CAAC,iBAAiB,CAAC;4DAG9B;AANU,uBAAuB;IAhBnC,SAAS,CAAC;QACT,QAAQ,EAAE,kBAAkB;QAC5B,cAAc,EAAE;YACd;gBACE,SAAS,EAAE,gBAAgB;gBAC3B,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,EAAE,mBAAmB,CAAC;gBAC3F,OAAO,EAAE,CAAC,eAAe,EAAE,eAAe,EAAE,eAAe,CAAC;aAC7D;YACD;gBACE,SAAS,EAAE,uBAAuB;aACnC;SACF;QACD,WAAW,EAAE,mCAAmC;QAChD,QAAQ,EAAE,kCAAkC;QAC5C,QAAQ,EAAE,yBAAyB;KACpC,CAAC;GACW,uBAAuB,CAOnC","sourcesContent":["import { Component, HostBinding, input } from '@angular/core';\nimport {\n TngContextMenu as TngContextMenuPrimitive,\n TngMenu as TngMenuPrimitive,\n} from '@tailng-ui/primitives';\n\n@Component({\n selector: 'tng-context-menu',\n hostDirectives: [\n {\n directive: TngMenuPrimitive,\n inputs: ['loop', 'disabled', 'closeOnSelect', 'dismissOnOutsideClick', 'dismissOnFocusout'],\n outputs: ['tngMenuOpened', 'tngMenuClosed', 'tngMenuSelect'],\n },\n {\n directive: TngContextMenuPrimitive,\n },\n ],\n templateUrl: './tng-context-menu.component.html',\n styleUrl: './tng-context-menu.component.css',\n exportAs: 'tngContextMenuComponent',\n})\nexport class TngContextMenuComponent {\n public readonly ariaLabel = input<string>('Context menu');\n\n @HostBinding('attr.aria-label')\n protected get hostAriaLabel(): string {\n return this.ariaLabel();\n }\n}\n"]}
@@ -1,28 +1,23 @@
1
- import type { OnDestroy } from '@angular/core';
2
- export type TngPopoverCloseReason = 'escape' | 'outside-pointer' | 'programmatic' | 'trigger-toggle';
3
- export declare class TngPopoverComponent implements OnDestroy {
1
+ import { TngPopover as TngPopoverPrimitive, type TngPopoverAlign, type TngPopoverAriaHasPopup, type TngPopoverAutoFocus, type TngPopoverCloseReason, type TngPopoverPanelRole, type TngPopoverSide } from '@tailng-ui/primitives';
2
+ export type { TngPopoverAlign, TngPopoverAriaHasPopup, TngPopoverAutoFocus, TngPopoverCloseReason, TngPopoverPanelRole, TngPopoverSide, } from '@tailng-ui/primitives';
3
+ type OptionalBooleanInput = boolean | null | string | undefined;
4
+ export declare class TngPopoverComponent {
4
5
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
6
+ readonly ariaHasPopup: import("@angular/core").InputSignal<TngPopoverAriaHasPopup>;
7
+ readonly autoFocus: import("@angular/core").InputSignal<TngPopoverAutoFocus>;
8
+ readonly align: import("@angular/core").InputSignal<TngPopoverAlign>;
5
9
  readonly closeOnEscape: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
6
10
  readonly closeOnOutsidePointer: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
7
- readonly open: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
11
+ readonly defaultOpen: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
12
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
13
+ readonly open: import("@angular/core").InputSignalWithTransform<boolean | undefined, OptionalBooleanInput>;
14
+ readonly panelRole: import("@angular/core").InputSignal<TngPopoverPanelRole>;
15
+ readonly restoreFocus: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
16
+ readonly side: import("@angular/core").InputSignal<TngPopoverSide>;
8
17
  readonly triggerLabel: import("@angular/core").InputSignal<string>;
9
18
  readonly closed: import("@angular/core").OutputEmitterRef<TngPopoverCloseReason>;
10
19
  readonly openChange: import("@angular/core").OutputEmitterRef<boolean>;
11
- protected readonly panelId: string;
12
- private readonly hostRef;
13
- private readonly injector;
14
- private readonly panelRef;
15
- private readonly instanceId;
16
- private isLayerRegistered;
17
- private readonly openStateEffect;
18
- constructor();
20
+ protected readonly popoverRef: import("@angular/core").Signal<TngPopoverPrimitive>;
19
21
  close(): void;
20
- ngOnDestroy(): void;
21
- onTriggerClick(): void;
22
- private handleOverlayDismiss;
23
- private registerOverlayLayer;
24
- private unregisterOverlayLayer;
25
- private focusInitialElement;
26
- private requestClose;
27
22
  }
28
23
  //# sourceMappingURL=tng-popover.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-popover.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/overlay/popover/tng-popover.component.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAe/C,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,iBAAiB,GACjB,cAAc,GACd,gBAAgB,CAAC;AAsBrB,qBAKa,mBAAoB,YAAW,SAAS;IACnD,SAAgB,SAAS,8CAA4B;IACrD,SAAgB,aAAa,8EAE1B;IACH,SAAgB,qBAAqB,8EAElC;IACH,SAAgB,IAAI,8EAEjB;IACH,SAAgB,YAAY,8CAAmC;IAE/D,SAAgB,MAAM,kEAAmC;IACzD,SAAgB,UAAU,oDAAqB;IAE/C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkD;IAC3E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAQ7B;;IAMI,KAAK,IAAI,IAAI;IAIb,WAAW,IAAI,IAAI;IAKnB,cAAc,IAAI,IAAI;IAS7B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,YAAY;CAIrB"}
1
+ {"version":3,"file":"tng-popover.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/overlay/popover/tng-popover.component.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,UAAU,IAAI,mBAAmB,EAGjC,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,KAAK,oBAAoB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAUhE,qBAMa,mBAAmB;IAC9B,SAAgB,SAAS,8CAA4B;IACrD,SAAgB,YAAY,8DAA2C;IACvE,SAAgB,SAAS,2DAAiD;IAC1E,SAAgB,KAAK,uDAAmC;IACxD,SAAgB,aAAa,8EAE1B;IACH,SAAgB,qBAAqB,8EAElC;IACH,SAAgB,WAAW,8EAExB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,IAAI,8FAEjB;IACH,SAAgB,SAAS,2DAAwC;IACjE,SAAgB,YAAY,8EAEzB;IACH,SAAgB,IAAI,sDAAmC;IACvD,SAAgB,YAAY,8CAAmC;IAE/D,SAAgB,MAAM,kEAAmC;IACzD,SAAgB,UAAU,oDAAqB;IAE/C,SAAS,CAAC,QAAQ,CAAC,UAAU,sDAAyD;IAE/E,KAAK,IAAI,IAAI;CAGrB"}