@tailng-ui/components 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/lib/feedback/empty/tng-empty.component.d.ts.map +1 -1
- package/src/lib/feedback/empty/tng-empty.component.js +0 -5
- package/src/lib/feedback/empty/tng-empty.component.js.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.js +0 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.js.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js +0 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.component.js +0 -1
- package/src/lib/feedback/skeleton/tng-skeleton.component.js.map +1 -1
- package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -1
- package/src/lib/feedback/toast/tng-toast.component.js +0 -1
- package/src/lib/feedback/toast/tng-toast.component.js.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.component.js +0 -1
- package/src/lib/form/autocomplete/tng-autocomplete.component.js.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.js +0 -1
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.js.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle.component.js +0 -1
- package/src/lib/form/button-toggle/tng-button-toggle.component.js.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.component.d.ts.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.component.js +0 -1
- package/src/lib/form/checkbox/tng-checkbox.component.js.map +1 -1
- package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -1
- package/src/lib/form/chips/tng-chips.component.js +0 -1
- package/src/lib/form/chips/tng-chips.component.js.map +1 -1
- package/src/lib/form/combobox/tng-combobox.component.d.ts.map +1 -1
- package/src/lib/form/combobox/tng-combobox.component.js +0 -1
- package/src/lib/form/combobox/tng-combobox.component.js.map +1 -1
- package/src/lib/form/input/tng-input.component.d.ts.map +1 -1
- package/src/lib/form/input/tng-input.component.js +0 -1
- package/src/lib/form/input/tng-input.component.js.map +1 -1
- package/src/lib/form/input-otp/tng-input-otp.component.d.ts.map +1 -1
- package/src/lib/form/input-otp/tng-input-otp.component.js +0 -1
- package/src/lib/form/input-otp/tng-input-otp.component.js.map +1 -1
- package/src/lib/form/label/tng-label.component.d.ts.map +1 -1
- package/src/lib/form/label/tng-label.component.js +0 -1
- package/src/lib/form/label/tng-label.component.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js +0 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js.map +1 -1
- package/src/lib/form/multiselect/tng-multiselect.component.d.ts.map +1 -1
- package/src/lib/form/multiselect/tng-multiselect.component.js +0 -1
- package/src/lib/form/multiselect/tng-multiselect.component.js.map +1 -1
- package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -1
- package/src/lib/form/radio/tng-radio.component.js +0 -1
- package/src/lib/form/radio/tng-radio.component.js.map +1 -1
- package/src/lib/form/select/tng-select.component.d.ts.map +1 -1
- package/src/lib/form/select/tng-select.component.js +0 -1
- package/src/lib/form/select/tng-select.component.js.map +1 -1
- package/src/lib/form/select/tng-select.slots.d.ts.map +1 -1
- package/src/lib/form/select/tng-select.slots.js +0 -2
- package/src/lib/form/select/tng-select.slots.js.map +1 -1
- package/src/lib/form/slider/tng-slider.component.d.ts.map +1 -1
- package/src/lib/form/slider/tng-slider.component.js +0 -1
- package/src/lib/form/slider/tng-slider.component.js.map +1 -1
- package/src/lib/form/switch/tng-switch.component.d.ts.map +1 -1
- package/src/lib/form/switch/tng-switch.component.js +0 -1
- package/src/lib/form/switch/tng-switch.component.js.map +1 -1
- package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -1
- package/src/lib/form/textarea/tng-textarea.component.js +0 -1
- package/src/lib/form/textarea/tng-textarea.component.js.map +1 -1
- package/src/lib/form/toggle/tng-toggle.component.d.ts.map +1 -1
- package/src/lib/form/toggle/tng-toggle.component.js +0 -1
- package/src/lib/form/toggle/tng-toggle.component.js.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.component.js +0 -1
- package/src/lib/form/toggle-group/tng-toggle-group.component.js.map +1 -1
- package/src/lib/layout/accordion/tng-accordion.component.d.ts.map +1 -1
- package/src/lib/layout/accordion/tng-accordion.component.js +0 -4
- package/src/lib/layout/accordion/tng-accordion.component.js.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js +0 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js.map +1 -1
- package/src/lib/layout/card/tng-card.component.d.ts.map +1 -1
- package/src/lib/layout/card/tng-card.component.js +0 -10
- package/src/lib/layout/card/tng-card.component.js.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.component.d.ts.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.component.js +0 -1
- package/src/lib/layout/collapsible/tng-collapsible.component.js.map +1 -1
- package/src/lib/layout/drawer/tng-drawer.component.d.ts.map +1 -1
- package/src/lib/layout/drawer/tng-drawer.component.js +0 -1
- package/src/lib/layout/drawer/tng-drawer.component.js.map +1 -1
- package/src/lib/layout/grid/tng-grid.component.d.ts.map +1 -1
- package/src/lib/layout/grid/tng-grid.component.js +0 -1
- package/src/lib/layout/grid/tng-grid.component.js.map +1 -1
- package/src/lib/layout/separator/tng-separator.component.d.ts.map +1 -1
- package/src/lib/layout/separator/tng-separator.component.js +0 -1
- package/src/lib/layout/separator/tng-separator.component.js.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.component.d.ts.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.component.js +0 -1
- package/src/lib/layout/stepper/tng-stepper.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +0 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js +0 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js +0 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js +0 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js +0 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js +0 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js.map +1 -1
- package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/context-menu/tng-context-menu.component.js +0 -1
- package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js +0 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js.map +1 -1
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts.map +1 -1
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js +0 -1
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js.map +1 -1
- package/src/lib/navigation/menu/tng-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/menu/tng-menu.component.js +0 -1
- package/src/lib/navigation/menu/tng-menu.component.js.map +1 -1
- package/src/lib/navigation/menubar/tng-menubar.component.d.ts.map +1 -1
- package/src/lib/navigation/menubar/tng-menubar.component.js +0 -1
- package/src/lib/navigation/menubar/tng-menubar.component.js.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js +0 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js.map +1 -1
- package/src/lib/navigation/tabs/tng-tabs.component.d.ts.map +1 -1
- package/src/lib/navigation/tabs/tng-tabs.component.js +0 -1
- package/src/lib/navigation/tabs/tng-tabs.component.js.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.component.js +0 -1
- package/src/lib/navigation/toolbar/tng-toolbar.component.js.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.component.d.ts.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.component.js +0 -1
- package/src/lib/overlay/dialog/tng-dialog.component.js.map +1 -1
- package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -1
- package/src/lib/overlay/popover/tng-popover.component.js +0 -1
- package/src/lib/overlay/popover/tng-popover.component.js.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.component.js +0 -1
- package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.component.js +0 -1
- package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -1
- package/src/lib/utility/badge/tng-badge.component.d.ts.map +1 -1
- package/src/lib/utility/badge/tng-badge.component.js +0 -1
- package/src/lib/utility/badge/tng-badge.component.js.map +1 -1
- package/src/lib/utility/button/tng-button.component.d.ts.map +1 -1
- package/src/lib/utility/button/tng-button.component.js +0 -1
- package/src/lib/utility/button/tng-button.component.js.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.component.d.ts.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.component.js +0 -1
- package/src/lib/utility/code-block/tng-code-block.component.js.map +1 -1
- package/src/lib/utility/copy-button/tng-copy-button.component.d.ts.map +1 -1
- package/src/lib/utility/copy-button/tng-copy-button.component.js +0 -1
- package/src/lib/utility/copy-button/tng-copy-button.component.js.map +1 -1
- package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -1
- package/src/lib/utility/tag/tng-tag.component.js +0 -1
- package/src/lib/utility/tag/tng-tag.component.js.map +1 -1
- package/src/lib/utility/tree/tng-tree.component.d.ts.map +1 -1
- package/src/lib/utility/tree/tng-tree.component.js +0 -1
- package/src/lib/utility/tree/tng-tree.component.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-code-block.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/code-block/tng-code-block.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n booleanAttribute,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n type OnDestroy,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport {\n TngCodeBlock as TngCodeBlockPrimitive,\n TngCodeBlockBody as TngCodeBlockBodyPrimitive,\n TngCodeBlockCode as TngCodeBlockCodePrimitive,\n TngCodeBlockGutter as TngCodeBlockGutterPrimitive,\n TngCodeBlockHeader as TngCodeBlockHeaderPrimitive,\n TngCopy,\n} from '@tailng-ui/primitives';\nimport type { TngCopyErrorEvent, TngCopyEvent, TngCopySuccessEvent } from '@tailng-ui/primitives';\nimport {\n escapeTngCodeHtml,\n normalizeTngCodeLanguage,\n resolveTngCodeHighlightResult,\n TNG_CODE_HIGHLIGHTING_CONFIG,\n type TngCodeHighlightToken,\n type TngCodeHighlightTokenLine,\n type TngCodeHighlightRequest,\n type TngNormalizedCodeHighlightResult,\n type TngResolvedCodeHighlightingConfig,\n} from './highlighting';\n\nexport type TngCodeBlockCopyMode = boolean | 'auto';\nexport type TngCodeBlockHighlightLineInput = number | readonly [number, number];\nexport type TngCodeBlockHighlightMode = 'auto' | 'off' | 'on';\nexport type TngCodeBlockLineNumbersMode = boolean | 'auto';\nexport type TngCodeBlockRenderState = 'error' | 'highlighted' | 'highlighting' | 'idle';\nexport type TngCodeBlockSanitizeHtml = boolean | 'auto';\nexport type TngCodeBlockVariant = 'compact' | 'default' | 'ghost';\n\nexport interface TngCodeBlockCopyContext {\n code: string;\n language: string | null;\n theme: string | null;\n}\n\nexport interface TngCodeBlockRenderStateChange {\n error?: unknown;\n state: TngCodeBlockRenderState;\n}\n\ntype TngCodeBlockCopyState = 'copied' | 'error' | 'idle';\n\ntype TngCodeBlockRenderRequest = Readonly<{\n adapter: string | null;\n code: string;\n includeLineWrappers: boolean;\n language: string | null;\n theme: string | null;\n}>;\n\ntype TngCodeBlockRenderedLine = Readonly<{\n dimmed: boolean;\n highlighted: boolean;\n html: SafeHtml | string;\n lineNumber: number;\n}>;\n\nconst defaultCopyResetDuration = 1500;\nconst highlightModeSet = new Set<TngCodeBlockHighlightMode>(['auto', 'off', 'on']);\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toRoundedPositiveNumber(value: number): number {\n return Math.max(0, Math.round(value));\n}\n\nfunction coerceOptionalBoolean(value: boolean | string | null | undefined): boolean | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n return booleanAttribute(value);\n}\n\nfunction coercePositiveInteger(value: number | string, fallback: number): number {\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return fallback;\n }\n\n return Math.max(1, Math.round(numericValue));\n}\n\nfunction coerceOptionalPositiveNumber(value: number | string | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return undefined;\n }\n\n return toRoundedPositiveNumber(numericValue);\n}\n\nfunction coerceTngCodeBlockCopyMode(\n value: TngCodeBlockCopyMode | boolean | string | null | undefined,\n): TngCodeBlockCopyMode {\n if (value === 'auto' || value === undefined || value === null) {\n return 'auto';\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return 'auto';\n}\n\nfunction coerceTngCodeBlockLineNumbersMode(\n value: TngCodeBlockLineNumbersMode | boolean | string | null | undefined,\n): TngCodeBlockLineNumbersMode {\n if (value === 'auto') {\n return 'auto';\n }\n\n if (value === undefined || value === null) {\n return false;\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return false;\n}\n\nfunction coerceTngCodeBlockSanitizeHtml(\n value: TngCodeBlockSanitizeHtml | string | null | undefined,\n): TngCodeBlockSanitizeHtml {\n if (value === undefined || value === null || value === 'auto') {\n return 'auto';\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return 'auto';\n}\n\nfunction normalizeHighlightLineNumber(value: number): number | null {\n if (!Number.isFinite(value)) {\n return null;\n }\n\n const normalized = Math.round(value);\n return normalized > 0 ? normalized : null;\n}\n\nfunction toNormalizedHighlightLineSet(\n value: readonly TngCodeBlockHighlightLineInput[] | null | undefined,\n): ReadonlySet<number> {\n if (value === undefined || value === null || value.length === 0) {\n return new Set<number>();\n }\n\n const normalizedValues = new Set<number>();\n\n for (const entry of value) {\n if (typeof entry === 'number') {\n const normalized = normalizeHighlightLineNumber(entry);\n if (normalized !== null) {\n normalizedValues.add(normalized);\n }\n continue;\n }\n\n const [start, end] = entry;\n const normalizedStart = normalizeHighlightLineNumber(start);\n const normalizedEnd = normalizeHighlightLineNumber(end);\n if (normalizedStart === null || normalizedEnd === null) {\n continue;\n }\n\n const from = Math.min(normalizedStart, normalizedEnd);\n const to = Math.max(normalizedStart, normalizedEnd);\n for (let current = from; current <= to; current += 1) {\n normalizedValues.add(current);\n }\n }\n\n return normalizedValues;\n}\n\nfunction tokenClassNameToAttributeValue(className: string | null | undefined): string {\n if (className === null || className === undefined) {\n return '';\n }\n\n return className\n .trim()\n .split(/\\s+/)\n .filter((token) => token.length > 0)\n .join(' ');\n}\n\nfunction renderToken(token: TngCodeHighlightToken): string {\n const escapedContent = escapeTngCodeHtml(token.content);\n const normalizedClassName = tokenClassNameToAttributeValue(token.className);\n if (normalizedClassName.length === 0) {\n return escapedContent;\n }\n\n return `<span class=\"${escapeTngCodeHtml(normalizedClassName)}\">${escapedContent}</span>`;\n}\n\nfunction renderTokenLine(line: TngCodeHighlightTokenLine): string {\n return line.map((token) => renderToken(token)).join('');\n}\n\nfunction splitCodeLines(code: string): readonly string[] {\n if (code.length === 0) {\n return [''];\n }\n\n const lines = code.split('\\n');\n if (lines.length > 1 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction toNormalizedCopyError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n if (typeof value === 'object' && value !== null && 'error' in value) {\n const nestedError = (value as { error: unknown }).error;\n if (nestedError instanceof Error) {\n return nestedError;\n }\n }\n\n return new Error('Copy failed.');\n}\n\nfunction toCssSizeValue(value: number | string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n return null;\n }\n\n return `${Math.max(0, value)}px`;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction shouldHighlight(mode: TngCodeBlockHighlightMode): boolean {\n return mode === 'auto' || mode === 'on';\n}\n\nexport function coerceTngCodeBlockHighlightMode(value: string): TngCodeBlockHighlightMode {\n if (highlightModeSet.has(value as TngCodeBlockHighlightMode)) {\n return value as TngCodeBlockHighlightMode;\n }\n\n return 'auto';\n}\n\nexport function coerceTngCodeBlockCopyResetDuration(value: number | string): number {\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return defaultCopyResetDuration;\n }\n\n return toRoundedPositiveNumber(numericValue);\n}\n\nexport function coerceTngCodeBlockStartingLineNumber(value: number | string): number {\n return coercePositiveInteger(value, 1);\n}\n\nexport function normalizeTngCodeBlockCode(value: string | null | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return value.replace(/\\r\\n?/g, '\\n');\n}\n\nexport function toTngCodeBlockLineNumbers(\n code: string,\n startingLineNumber = 1,\n): readonly number[] {\n const normalizedStart = Math.max(1, Math.round(startingLineNumber));\n return splitCodeLines(code).map((_, index) => normalizedStart + index);\n}\n\n@Component({\n standalone: true,\n selector: 'tng-code-block',\n imports: [\n TngCodeBlockPrimitive,\n TngCodeBlockHeaderPrimitive,\n TngCodeBlockBodyPrimitive,\n TngCodeBlockGutterPrimitive,\n TngCodeBlockCodePrimitive,\n TngCopy,\n ],\n templateUrl: './tng-code-block.component.html',\n styleUrl: './tng-code-block.component.css',\n})\nexport class TngCodeBlockComponent implements OnDestroy {\n public readonly adapter = input<string | null>(null);\n public readonly caption = input<string | null>(null);\n public readonly code = input<string>('');\n public readonly copyMode = input<TngCodeBlockCopyMode, TngCodeBlockCopyMode | boolean | string | null | undefined>(\n 'auto',\n {\n alias: 'copy',\n transform: coerceTngCodeBlockCopyMode,\n },\n );\n public readonly copyLabel = input<string>('Copy code');\n public readonly copiedLabel = input<string>('Copied');\n public readonly copyResetDuration = input<number, number | string>(defaultCopyResetDuration, {\n transform: coerceTngCodeBlockCopyResetDuration,\n });\n public readonly copySuccessDurationMs = input<number | undefined, number | string | undefined>(\n undefined,\n {\n transform: coerceOptionalPositiveNumber,\n },\n );\n public readonly copyText = input<string | ((ctx: TngCodeBlockCopyContext) => string) | null>(null);\n public readonly errorLabel = input<string>('Copy failed');\n public readonly focusLines = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly highlight = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly highlightDebounceMs = input<number, number | string>(0, {\n transform: coerceTngCodeBlockCopyResetDuration,\n });\n public readonly highlightLines = input<readonly TngCodeBlockHighlightLineInput[] | null>(null);\n public readonly highlightMode = input<TngCodeBlockHighlightMode, string>('auto', {\n transform: coerceTngCodeBlockHighlightMode,\n });\n public readonly language = input<string | null>(null);\n public readonly lineNumbersMode = input<\n TngCodeBlockLineNumbersMode,\n TngCodeBlockLineNumbersMode | boolean | string | null | undefined\n >(false, {\n alias: 'lineNumbers',\n transform: coerceTngCodeBlockLineNumbersMode,\n });\n public readonly maxHeight = input<string | number | null>(null);\n public readonly sanitizeHtml = input<\n TngCodeBlockSanitizeHtml,\n TngCodeBlockSanitizeHtml | string | null | undefined\n >('auto', {\n transform: coerceTngCodeBlockSanitizeHtml,\n });\n public readonly showHeader = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly showLanguageBadge = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly showLineNumbers = input<boolean | undefined, boolean | string | null | undefined>(\n undefined,\n {\n transform: coerceOptionalBoolean,\n },\n );\n public readonly startingLineNumber = input<number, number | string>(1, {\n transform: coerceTngCodeBlockStartingLineNumber,\n });\n public readonly theme = input<string | null>(null);\n public readonly title = input<string | null>(null);\n public readonly variant = input<TngCodeBlockVariant>('default');\n public readonly wrap = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly copy = output<TngCopyEvent>();\n public readonly copyError = output<TngCopyErrorEvent>();\n public readonly copySuccess = output<TngCopySuccessEvent>();\n public readonly renderStateChange = output<TngCodeBlockRenderStateChange>();\n\n public readonly tngCopied = output<string>();\n public readonly tngCopyError = output<Error>();\n\n protected readonly copyButtonLabel = computed((): string => {\n const state = this.copyState();\n if (state === 'copied') {\n return this.copiedLabel();\n }\n\n if (state === 'error') {\n return this.errorLabel();\n }\n\n return this.copyLabel();\n });\n\n protected readonly copyPayload = computed((): string => {\n const value = this.copyText();\n if (typeof value === 'function') {\n try {\n return value({\n code: this.normalizedCode(),\n language: this.languageForBadge(),\n theme: normalizeTngCodeLanguage(this.theme()),\n });\n } catch {\n return this.normalizedCode();\n }\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n return this.normalizedCode();\n });\n\n protected readonly dataHasCopy = computed((): 'false' | 'true' =>\n this.shouldShowCopyAction() ? 'true' : 'false',\n );\n\n protected readonly dataHasTitle = computed((): 'false' | 'true' =>\n this.titleText() === null ? 'false' : 'true',\n );\n\n protected readonly dataHighlighted = computed((): 'false' | 'true' =>\n this.renderState() === 'highlighted' ? 'true' : 'false',\n );\n\n protected readonly dataWrap = computed((): 'false' | 'true' => (this.wrap() ? 'true' : 'false'));\n\n protected readonly effectiveCopyResetDuration = computed((): number => {\n return this.copySuccessDurationMs() ?? this.copyResetDuration();\n });\n\n protected readonly effectiveLineNumbers = computed((): boolean => {\n const legacyValue = this.showLineNumbers();\n if (legacyValue !== undefined) {\n return legacyValue;\n }\n\n const mode = this.lineNumbersMode();\n if (mode === 'auto') {\n return splitCodeLines(this.normalizedCode()).length > 1;\n }\n\n return mode;\n });\n\n protected readonly hasHeaderContent = computed((): boolean => {\n return this.titleText() !== null || this.hasLanguageBadge() || this.shouldShowCopyAction();\n });\n\n protected readonly hasLanguageBadge = computed((): boolean => {\n return this.showLanguageBadge() && this.languageForBadge() !== null;\n });\n\n protected readonly highlightLineSet = computed((): ReadonlySet<number> =>\n toNormalizedHighlightLineSet(this.highlightLines()),\n );\n\n protected readonly isHighlighting = computed((): boolean => this.renderState() === 'highlighting');\n\n protected readonly languageForBadge = computed((): string | null => {\n return this.resolvedLanguage() ?? this.normalizedLanguage();\n });\n\n protected readonly languageLabel = computed((): string => {\n return this.languageForBadge() ?? 'text';\n });\n\n protected readonly lineNumbers = computed((): readonly number[] => {\n return this.renderedLines().map((line) => line.lineNumber);\n });\n\n protected readonly maxHeightCssValue = computed((): string | null => toCssSizeValue(this.maxHeight()));\n\n protected readonly normalizedCode = computed((): string => normalizeTngCodeBlockCode(this.code()));\n\n protected readonly renderState = signal<TngCodeBlockRenderState>('idle');\n\n protected readonly renderedLines = computed((): readonly TngCodeBlockRenderedLine[] => {\n const baseLines = this.baseLineHtml();\n const start = this.startingLineNumber();\n const highlightSet = this.highlightLineSet();\n const shouldDim = this.focusLines() && highlightSet.size > 0;\n\n return baseLines.map((html, index) => {\n const lineNumber = start + index;\n const highlighted = highlightSet.has(lineNumber);\n\n return {\n dimmed: shouldDim && !highlighted,\n highlighted,\n html,\n lineNumber,\n };\n });\n });\n\n protected readonly shouldRenderBodyLineNumbers = computed((): boolean => this.effectiveLineNumbers());\n\n protected readonly shouldRenderHeader = computed((): boolean => {\n return this.showHeader() && this.hasHeaderContent();\n });\n\n protected readonly shouldShowCopyAction = computed((): boolean => {\n const mode = this.copyMode();\n if (mode === 'auto') {\n return this.normalizedCode().length > 0;\n }\n\n return mode;\n });\n\n protected readonly titleText = computed((): string | null => normalizeOptionalString(this.title()));\n\n private readonly baseLineHtml = signal<readonly (SafeHtml | string)[]>(['']);\n private readonly copyState = signal<TngCodeBlockCopyState>('idle');\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly highlightingConfig = inject<TngResolvedCodeHighlightingConfig>(\n TNG_CODE_HIGHLIGHTING_CONFIG,\n );\n private readonly normalizedLanguage = computed((): string | null => normalizeTngCodeLanguage(this.language()));\n private readonly resolvedLanguage = signal<string | null>(null);\n\n private copyResetTimer: ReturnType<typeof setTimeout> | null = null;\n private destroyed = false;\n private highlightDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n private highlightRequestId = 0;\n private lastEmittedRenderState: TngCodeBlockRenderState = 'idle';\n private readonly renderCache = new Map<string, TngNormalizedCodeHighlightResult | null>();\n\n public constructor() {\n effect((): void => {\n const request: TngCodeBlockRenderRequest = {\n adapter: normalizeTngCodeLanguage(this.adapter()),\n code: this.normalizedCode(),\n includeLineWrappers: this.shouldIncludeLineWrappers(),\n language: this.normalizedLanguage(),\n theme: normalizeTngCodeLanguage(this.theme()),\n };\n\n this.enqueueRenderRequest({\n request,\n shouldHighlight: this.shouldHighlightCode(),\n });\n });\n }\n\n public ngOnDestroy(): void {\n this.destroyed = true;\n this.highlightRequestId += 1;\n this.clearCopyResetTimer();\n this.clearHighlightDebounceTimer();\n }\n\n protected onPrimitiveCopy(...args: readonly unknown[]): void {\n const [event] = args;\n if (\n typeof event === 'object' &&\n event !== null &&\n 'text' in event &&\n 'trigger' in event &&\n typeof (event as { text: unknown }).text === 'string' &&\n typeof (event as { trigger: unknown }).trigger === 'string'\n ) {\n this.copy.emit(event as TngCopyEvent);\n }\n }\n\n protected onPrimitiveCopyError(...args: readonly unknown[]): void {\n const [event] = args;\n const normalizedError = toNormalizedCopyError(event);\n\n this.copyState.set('error');\n this.tngCopyError.emit(normalizedError);\n\n if (typeof event === 'object' && event !== null && 'error' in event) {\n this.copyError.emit(event as TngCopyErrorEvent);\n } else {\n this.copyError.emit({ error: normalizedError });\n }\n\n this.scheduleCopyStateReset();\n }\n\n protected onPrimitiveCopySuccess(...args: readonly unknown[]): void {\n const [event] = args;\n if (\n typeof event !== 'object' ||\n event === null ||\n !('text' in event) ||\n !('method' in event) ||\n typeof (event as { text: unknown }).text !== 'string' ||\n typeof (event as { method: unknown }).method !== 'string'\n ) {\n return;\n }\n\n const payload = event as TngCopySuccessEvent;\n this.copyState.set('copied');\n this.copySuccess.emit(payload);\n this.tngCopied.emit(payload.text);\n this.scheduleCopyStateReset();\n }\n\n private applyPlainText(code: string, language: string | null): void {\n this.resolvedLanguage.set(language);\n this.baseLineHtml.set(splitCodeLines(code).map((line) => escapeTngCodeHtml(line)));\n }\n\n private applyResolvedHighlightResult(\n result: TngNormalizedCodeHighlightResult,\n request: TngCodeBlockRenderRequest,\n ): boolean {\n this.resolvedLanguage.set(result.language ?? request.language);\n\n if (result.kind === 'tokens') {\n if (result.tokens.length === 0) {\n return false;\n }\n\n this.baseLineHtml.set(result.tokens.map((line) => renderTokenLine(line)));\n return true;\n }\n\n const htmlLines = result.html.split('\\n');\n if (htmlLines.length === 0 || (htmlLines.length === 1 && htmlLines[0].length === 0)) {\n return false;\n }\n\n const shouldBypassSanitization = this.sanitizeHtml() === false && result.trustedHtml;\n if (shouldBypassSanitization) {\n this.baseLineHtml.set(\n htmlLines.map((line) => this.domSanitizer.bypassSecurityTrustHtml(line)),\n );\n return true;\n }\n\n this.baseLineHtml.set(htmlLines);\n return true;\n }\n\n private buildCacheKey(request: TngCodeBlockRenderRequest): string {\n return [\n request.adapter ?? '',\n request.language ?? '',\n request.theme ?? '',\n request.includeLineWrappers ? '1' : '0',\n request.code,\n ].join('\\u241f');\n }\n\n private clearCopyResetTimer(): void {\n if (this.copyResetTimer === null) {\n return;\n }\n\n clearTimeout(this.copyResetTimer);\n this.copyResetTimer = null;\n }\n\n private clearHighlightDebounceTimer(): void {\n if (this.highlightDebounceTimer === null) {\n return;\n }\n\n clearTimeout(this.highlightDebounceTimer);\n this.highlightDebounceTimer = null;\n }\n\n private enqueueRenderRequest(input: Readonly<{ request: TngCodeBlockRenderRequest; shouldHighlight: boolean }>): void {\n this.clearHighlightDebounceTimer();\n\n const debounceMs = this.highlightDebounceMs();\n if (debounceMs <= 0) {\n void this.renderRequest(input);\n return;\n }\n\n this.highlightDebounceTimer = setTimeout((): void => {\n this.highlightDebounceTimer = null;\n void this.renderRequest(input);\n }, debounceMs);\n }\n\n private isStaleRequest(requestId: number): boolean {\n return this.destroyed || requestId !== this.highlightRequestId;\n }\n\n private scheduleCopyStateReset(): void {\n this.clearCopyResetTimer();\n this.copyResetTimer = setTimeout((): void => {\n this.copyState.set('idle');\n this.copyResetTimer = null;\n }, this.effectiveCopyResetDuration());\n }\n\n private setRenderState(state: TngCodeBlockRenderState, error?: unknown): void {\n this.renderState.set(state);\n\n if (this.lastEmittedRenderState === state) {\n return;\n }\n\n this.lastEmittedRenderState = state;\n if (state === 'error') {\n this.renderStateChange.emit({ error, state });\n return;\n }\n\n this.renderStateChange.emit({ state });\n }\n\n private shouldHighlightCode(): boolean {\n if (!this.highlight()) {\n return false;\n }\n\n return shouldHighlight(this.highlightMode());\n }\n\n private shouldIncludeLineWrappers(): boolean {\n return this.effectiveLineNumbers() || this.highlightLineSet().size > 0 || this.focusLines();\n }\n\n private toHighlightRequest(request: TngCodeBlockRenderRequest): TngCodeHighlightRequest {\n return {\n adapter: request.adapter,\n code: request.code,\n includeLineWrappers: request.includeLineWrappers,\n language: request.language,\n theme: request.theme,\n };\n }\n\n private async renderRequest(input: Readonly<{ request: TngCodeBlockRenderRequest; shouldHighlight: boolean }>): Promise<void> {\n const requestId = this.highlightRequestId + 1;\n this.highlightRequestId = requestId;\n\n if (!input.shouldHighlight) {\n this.applyPlainText(input.request.code, input.request.language);\n this.setRenderState('idle');\n return;\n }\n\n this.setRenderState('highlighting');\n\n try {\n const cacheKey = this.buildCacheKey(input.request);\n let resolvedResult = this.renderCache.get(cacheKey);\n if (resolvedResult === undefined) {\n resolvedResult = await resolveTngCodeHighlightResult(\n this.toHighlightRequest(input.request),\n this.highlightingConfig,\n );\n this.renderCache.set(cacheKey, resolvedResult);\n }\n\n if (this.isStaleRequest(requestId)) {\n return;\n }\n\n if (resolvedResult === null) {\n this.applyPlainText(input.request.code, input.request.language);\n this.setRenderState('highlighted');\n return;\n }\n\n const didRenderHighlight = this.applyResolvedHighlightResult(resolvedResult, input.request);\n if (!didRenderHighlight) {\n this.applyPlainText(input.request.code, input.request.language);\n }\n\n this.setRenderState('highlighted');\n } catch (error) {\n if (this.isStaleRequest(requestId)) {\n return;\n }\n\n this.applyPlainText(input.request.code, input.request.language);\n this.setRenderState('error', error);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-code-block.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/code-block/tng-code-block.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n booleanAttribute,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n type OnDestroy,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport {\n TngCodeBlock as TngCodeBlockPrimitive,\n TngCodeBlockBody as TngCodeBlockBodyPrimitive,\n TngCodeBlockCode as TngCodeBlockCodePrimitive,\n TngCodeBlockGutter as TngCodeBlockGutterPrimitive,\n TngCodeBlockHeader as TngCodeBlockHeaderPrimitive,\n TngCopy,\n} from '@tailng-ui/primitives';\nimport type { TngCopyErrorEvent, TngCopyEvent, TngCopySuccessEvent } from '@tailng-ui/primitives';\nimport {\n escapeTngCodeHtml,\n normalizeTngCodeLanguage,\n resolveTngCodeHighlightResult,\n TNG_CODE_HIGHLIGHTING_CONFIG,\n type TngCodeHighlightToken,\n type TngCodeHighlightTokenLine,\n type TngCodeHighlightRequest,\n type TngNormalizedCodeHighlightResult,\n type TngResolvedCodeHighlightingConfig,\n} from './highlighting';\n\nexport type TngCodeBlockCopyMode = boolean | 'auto';\nexport type TngCodeBlockHighlightLineInput = number | readonly [number, number];\nexport type TngCodeBlockHighlightMode = 'auto' | 'off' | 'on';\nexport type TngCodeBlockLineNumbersMode = boolean | 'auto';\nexport type TngCodeBlockRenderState = 'error' | 'highlighted' | 'highlighting' | 'idle';\nexport type TngCodeBlockSanitizeHtml = boolean | 'auto';\nexport type TngCodeBlockVariant = 'compact' | 'default' | 'ghost';\n\nexport interface TngCodeBlockCopyContext {\n code: string;\n language: string | null;\n theme: string | null;\n}\n\nexport interface TngCodeBlockRenderStateChange {\n error?: unknown;\n state: TngCodeBlockRenderState;\n}\n\ntype TngCodeBlockCopyState = 'copied' | 'error' | 'idle';\n\ntype TngCodeBlockRenderRequest = Readonly<{\n adapter: string | null;\n code: string;\n includeLineWrappers: boolean;\n language: string | null;\n theme: string | null;\n}>;\n\ntype TngCodeBlockRenderedLine = Readonly<{\n dimmed: boolean;\n highlighted: boolean;\n html: SafeHtml | string;\n lineNumber: number;\n}>;\n\nconst defaultCopyResetDuration = 1500;\nconst highlightModeSet = new Set<TngCodeBlockHighlightMode>(['auto', 'off', 'on']);\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toRoundedPositiveNumber(value: number): number {\n return Math.max(0, Math.round(value));\n}\n\nfunction coerceOptionalBoolean(value: boolean | string | null | undefined): boolean | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n return booleanAttribute(value);\n}\n\nfunction coercePositiveInteger(value: number | string, fallback: number): number {\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return fallback;\n }\n\n return Math.max(1, Math.round(numericValue));\n}\n\nfunction coerceOptionalPositiveNumber(value: number | string | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return undefined;\n }\n\n return toRoundedPositiveNumber(numericValue);\n}\n\nfunction coerceTngCodeBlockCopyMode(\n value: TngCodeBlockCopyMode | boolean | string | null | undefined,\n): TngCodeBlockCopyMode {\n if (value === 'auto' || value === undefined || value === null) {\n return 'auto';\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return 'auto';\n}\n\nfunction coerceTngCodeBlockLineNumbersMode(\n value: TngCodeBlockLineNumbersMode | boolean | string | null | undefined,\n): TngCodeBlockLineNumbersMode {\n if (value === 'auto') {\n return 'auto';\n }\n\n if (value === undefined || value === null) {\n return false;\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return false;\n}\n\nfunction coerceTngCodeBlockSanitizeHtml(\n value: TngCodeBlockSanitizeHtml | string | null | undefined,\n): TngCodeBlockSanitizeHtml {\n if (value === undefined || value === null || value === 'auto') {\n return 'auto';\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return 'auto';\n}\n\nfunction normalizeHighlightLineNumber(value: number): number | null {\n if (!Number.isFinite(value)) {\n return null;\n }\n\n const normalized = Math.round(value);\n return normalized > 0 ? normalized : null;\n}\n\nfunction toNormalizedHighlightLineSet(\n value: readonly TngCodeBlockHighlightLineInput[] | null | undefined,\n): ReadonlySet<number> {\n if (value === undefined || value === null || value.length === 0) {\n return new Set<number>();\n }\n\n const normalizedValues = new Set<number>();\n\n for (const entry of value) {\n if (typeof entry === 'number') {\n const normalized = normalizeHighlightLineNumber(entry);\n if (normalized !== null) {\n normalizedValues.add(normalized);\n }\n continue;\n }\n\n const [start, end] = entry;\n const normalizedStart = normalizeHighlightLineNumber(start);\n const normalizedEnd = normalizeHighlightLineNumber(end);\n if (normalizedStart === null || normalizedEnd === null) {\n continue;\n }\n\n const from = Math.min(normalizedStart, normalizedEnd);\n const to = Math.max(normalizedStart, normalizedEnd);\n for (let current = from; current <= to; current += 1) {\n normalizedValues.add(current);\n }\n }\n\n return normalizedValues;\n}\n\nfunction tokenClassNameToAttributeValue(className: string | null | undefined): string {\n if (className === null || className === undefined) {\n return '';\n }\n\n return className\n .trim()\n .split(/\\s+/)\n .filter((token) => token.length > 0)\n .join(' ');\n}\n\nfunction renderToken(token: TngCodeHighlightToken): string {\n const escapedContent = escapeTngCodeHtml(token.content);\n const normalizedClassName = tokenClassNameToAttributeValue(token.className);\n if (normalizedClassName.length === 0) {\n return escapedContent;\n }\n\n return `<span class=\"${escapeTngCodeHtml(normalizedClassName)}\">${escapedContent}</span>`;\n}\n\nfunction renderTokenLine(line: TngCodeHighlightTokenLine): string {\n return line.map((token) => renderToken(token)).join('');\n}\n\nfunction splitCodeLines(code: string): readonly string[] {\n if (code.length === 0) {\n return [''];\n }\n\n const lines = code.split('\\n');\n if (lines.length > 1 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction toNormalizedCopyError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n if (typeof value === 'object' && value !== null && 'error' in value) {\n const nestedError = (value as { error: unknown }).error;\n if (nestedError instanceof Error) {\n return nestedError;\n }\n }\n\n return new Error('Copy failed.');\n}\n\nfunction toCssSizeValue(value: number | string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n return null;\n }\n\n return `${Math.max(0, value)}px`;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction shouldHighlight(mode: TngCodeBlockHighlightMode): boolean {\n return mode === 'auto' || mode === 'on';\n}\n\nexport function coerceTngCodeBlockHighlightMode(value: string): TngCodeBlockHighlightMode {\n if (highlightModeSet.has(value as TngCodeBlockHighlightMode)) {\n return value as TngCodeBlockHighlightMode;\n }\n\n return 'auto';\n}\n\nexport function coerceTngCodeBlockCopyResetDuration(value: number | string): number {\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return defaultCopyResetDuration;\n }\n\n return toRoundedPositiveNumber(numericValue);\n}\n\nexport function coerceTngCodeBlockStartingLineNumber(value: number | string): number {\n return coercePositiveInteger(value, 1);\n}\n\nexport function normalizeTngCodeBlockCode(value: string | null | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return value.replace(/\\r\\n?/g, '\\n');\n}\n\nexport function toTngCodeBlockLineNumbers(\n code: string,\n startingLineNumber = 1,\n): readonly number[] {\n const normalizedStart = Math.max(1, Math.round(startingLineNumber));\n return splitCodeLines(code).map((_, index) => normalizedStart + index);\n}\n\n@Component({\n selector: 'tng-code-block',\n imports: [\n TngCodeBlockPrimitive,\n TngCodeBlockHeaderPrimitive,\n TngCodeBlockBodyPrimitive,\n TngCodeBlockGutterPrimitive,\n TngCodeBlockCodePrimitive,\n TngCopy,\n ],\n templateUrl: './tng-code-block.component.html',\n styleUrl: './tng-code-block.component.css',\n})\nexport class TngCodeBlockComponent implements OnDestroy {\n public readonly adapter = input<string | null>(null);\n public readonly caption = input<string | null>(null);\n public readonly code = input<string>('');\n public readonly copyMode = input<TngCodeBlockCopyMode, TngCodeBlockCopyMode | boolean | string | null | undefined>(\n 'auto',\n {\n alias: 'copy',\n transform: coerceTngCodeBlockCopyMode,\n },\n );\n public readonly copyLabel = input<string>('Copy code');\n public readonly copiedLabel = input<string>('Copied');\n public readonly copyResetDuration = input<number, number | string>(defaultCopyResetDuration, {\n transform: coerceTngCodeBlockCopyResetDuration,\n });\n public readonly copySuccessDurationMs = input<number | undefined, number | string | undefined>(\n undefined,\n {\n transform: coerceOptionalPositiveNumber,\n },\n );\n public readonly copyText = input<string | ((ctx: TngCodeBlockCopyContext) => string) | null>(null);\n public readonly errorLabel = input<string>('Copy failed');\n public readonly focusLines = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly highlight = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly highlightDebounceMs = input<number, number | string>(0, {\n transform: coerceTngCodeBlockCopyResetDuration,\n });\n public readonly highlightLines = input<readonly TngCodeBlockHighlightLineInput[] | null>(null);\n public readonly highlightMode = input<TngCodeBlockHighlightMode, string>('auto', {\n transform: coerceTngCodeBlockHighlightMode,\n });\n public readonly language = input<string | null>(null);\n public readonly lineNumbersMode = input<\n TngCodeBlockLineNumbersMode,\n TngCodeBlockLineNumbersMode | boolean | string | null | undefined\n >(false, {\n alias: 'lineNumbers',\n transform: coerceTngCodeBlockLineNumbersMode,\n });\n public readonly maxHeight = input<string | number | null>(null);\n public readonly sanitizeHtml = input<\n TngCodeBlockSanitizeHtml,\n TngCodeBlockSanitizeHtml | string | null | undefined\n >('auto', {\n transform: coerceTngCodeBlockSanitizeHtml,\n });\n public readonly showHeader = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly showLanguageBadge = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly showLineNumbers = input<boolean | undefined, boolean | string | null | undefined>(\n undefined,\n {\n transform: coerceOptionalBoolean,\n },\n );\n public readonly startingLineNumber = input<number, number | string>(1, {\n transform: coerceTngCodeBlockStartingLineNumber,\n });\n public readonly theme = input<string | null>(null);\n public readonly title = input<string | null>(null);\n public readonly variant = input<TngCodeBlockVariant>('default');\n public readonly wrap = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly copy = output<TngCopyEvent>();\n public readonly copyError = output<TngCopyErrorEvent>();\n public readonly copySuccess = output<TngCopySuccessEvent>();\n public readonly renderStateChange = output<TngCodeBlockRenderStateChange>();\n\n public readonly tngCopied = output<string>();\n public readonly tngCopyError = output<Error>();\n\n protected readonly copyButtonLabel = computed((): string => {\n const state = this.copyState();\n if (state === 'copied') {\n return this.copiedLabel();\n }\n\n if (state === 'error') {\n return this.errorLabel();\n }\n\n return this.copyLabel();\n });\n\n protected readonly copyPayload = computed((): string => {\n const value = this.copyText();\n if (typeof value === 'function') {\n try {\n return value({\n code: this.normalizedCode(),\n language: this.languageForBadge(),\n theme: normalizeTngCodeLanguage(this.theme()),\n });\n } catch {\n return this.normalizedCode();\n }\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n return this.normalizedCode();\n });\n\n protected readonly dataHasCopy = computed((): 'false' | 'true' =>\n this.shouldShowCopyAction() ? 'true' : 'false',\n );\n\n protected readonly dataHasTitle = computed((): 'false' | 'true' =>\n this.titleText() === null ? 'false' : 'true',\n );\n\n protected readonly dataHighlighted = computed((): 'false' | 'true' =>\n this.renderState() === 'highlighted' ? 'true' : 'false',\n );\n\n protected readonly dataWrap = computed((): 'false' | 'true' => (this.wrap() ? 'true' : 'false'));\n\n protected readonly effectiveCopyResetDuration = computed((): number => {\n return this.copySuccessDurationMs() ?? this.copyResetDuration();\n });\n\n protected readonly effectiveLineNumbers = computed((): boolean => {\n const legacyValue = this.showLineNumbers();\n if (legacyValue !== undefined) {\n return legacyValue;\n }\n\n const mode = this.lineNumbersMode();\n if (mode === 'auto') {\n return splitCodeLines(this.normalizedCode()).length > 1;\n }\n\n return mode;\n });\n\n protected readonly hasHeaderContent = computed((): boolean => {\n return this.titleText() !== null || this.hasLanguageBadge() || this.shouldShowCopyAction();\n });\n\n protected readonly hasLanguageBadge = computed((): boolean => {\n return this.showLanguageBadge() && this.languageForBadge() !== null;\n });\n\n protected readonly highlightLineSet = computed((): ReadonlySet<number> =>\n toNormalizedHighlightLineSet(this.highlightLines()),\n );\n\n protected readonly isHighlighting = computed((): boolean => this.renderState() === 'highlighting');\n\n protected readonly languageForBadge = computed((): string | null => {\n return this.resolvedLanguage() ?? this.normalizedLanguage();\n });\n\n protected readonly languageLabel = computed((): string => {\n return this.languageForBadge() ?? 'text';\n });\n\n protected readonly lineNumbers = computed((): readonly number[] => {\n return this.renderedLines().map((line) => line.lineNumber);\n });\n\n protected readonly maxHeightCssValue = computed((): string | null => toCssSizeValue(this.maxHeight()));\n\n protected readonly normalizedCode = computed((): string => normalizeTngCodeBlockCode(this.code()));\n\n protected readonly renderState = signal<TngCodeBlockRenderState>('idle');\n\n protected readonly renderedLines = computed((): readonly TngCodeBlockRenderedLine[] => {\n const baseLines = this.baseLineHtml();\n const start = this.startingLineNumber();\n const highlightSet = this.highlightLineSet();\n const shouldDim = this.focusLines() && highlightSet.size > 0;\n\n return baseLines.map((html, index) => {\n const lineNumber = start + index;\n const highlighted = highlightSet.has(lineNumber);\n\n return {\n dimmed: shouldDim && !highlighted,\n highlighted,\n html,\n lineNumber,\n };\n });\n });\n\n protected readonly shouldRenderBodyLineNumbers = computed((): boolean => this.effectiveLineNumbers());\n\n protected readonly shouldRenderHeader = computed((): boolean => {\n return this.showHeader() && this.hasHeaderContent();\n });\n\n protected readonly shouldShowCopyAction = computed((): boolean => {\n const mode = this.copyMode();\n if (mode === 'auto') {\n return this.normalizedCode().length > 0;\n }\n\n return mode;\n });\n\n protected readonly titleText = computed((): string | null => normalizeOptionalString(this.title()));\n\n private readonly baseLineHtml = signal<readonly (SafeHtml | string)[]>(['']);\n private readonly copyState = signal<TngCodeBlockCopyState>('idle');\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly highlightingConfig = inject<TngResolvedCodeHighlightingConfig>(\n TNG_CODE_HIGHLIGHTING_CONFIG,\n );\n private readonly normalizedLanguage = computed((): string | null => normalizeTngCodeLanguage(this.language()));\n private readonly resolvedLanguage = signal<string | null>(null);\n\n private copyResetTimer: ReturnType<typeof setTimeout> | null = null;\n private destroyed = false;\n private highlightDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n private highlightRequestId = 0;\n private lastEmittedRenderState: TngCodeBlockRenderState = 'idle';\n private readonly renderCache = new Map<string, TngNormalizedCodeHighlightResult | null>();\n\n public constructor() {\n effect((): void => {\n const request: TngCodeBlockRenderRequest = {\n adapter: normalizeTngCodeLanguage(this.adapter()),\n code: this.normalizedCode(),\n includeLineWrappers: this.shouldIncludeLineWrappers(),\n language: this.normalizedLanguage(),\n theme: normalizeTngCodeLanguage(this.theme()),\n };\n\n this.enqueueRenderRequest({\n request,\n shouldHighlight: this.shouldHighlightCode(),\n });\n });\n }\n\n public ngOnDestroy(): void {\n this.destroyed = true;\n this.highlightRequestId += 1;\n this.clearCopyResetTimer();\n this.clearHighlightDebounceTimer();\n }\n\n protected onPrimitiveCopy(...args: readonly unknown[]): void {\n const [event] = args;\n if (\n typeof event === 'object' &&\n event !== null &&\n 'text' in event &&\n 'trigger' in event &&\n typeof (event as { text: unknown }).text === 'string' &&\n typeof (event as { trigger: unknown }).trigger === 'string'\n ) {\n this.copy.emit(event as TngCopyEvent);\n }\n }\n\n protected onPrimitiveCopyError(...args: readonly unknown[]): void {\n const [event] = args;\n const normalizedError = toNormalizedCopyError(event);\n\n this.copyState.set('error');\n this.tngCopyError.emit(normalizedError);\n\n if (typeof event === 'object' && event !== null && 'error' in event) {\n this.copyError.emit(event as TngCopyErrorEvent);\n } else {\n this.copyError.emit({ error: normalizedError });\n }\n\n this.scheduleCopyStateReset();\n }\n\n protected onPrimitiveCopySuccess(...args: readonly unknown[]): void {\n const [event] = args;\n if (\n typeof event !== 'object' ||\n event === null ||\n !('text' in event) ||\n !('method' in event) ||\n typeof (event as { text: unknown }).text !== 'string' ||\n typeof (event as { method: unknown }).method !== 'string'\n ) {\n return;\n }\n\n const payload = event as TngCopySuccessEvent;\n this.copyState.set('copied');\n this.copySuccess.emit(payload);\n this.tngCopied.emit(payload.text);\n this.scheduleCopyStateReset();\n }\n\n private applyPlainText(code: string, language: string | null): void {\n this.resolvedLanguage.set(language);\n this.baseLineHtml.set(splitCodeLines(code).map((line) => escapeTngCodeHtml(line)));\n }\n\n private applyResolvedHighlightResult(\n result: TngNormalizedCodeHighlightResult,\n request: TngCodeBlockRenderRequest,\n ): boolean {\n this.resolvedLanguage.set(result.language ?? request.language);\n\n if (result.kind === 'tokens') {\n if (result.tokens.length === 0) {\n return false;\n }\n\n this.baseLineHtml.set(result.tokens.map((line) => renderTokenLine(line)));\n return true;\n }\n\n const htmlLines = result.html.split('\\n');\n if (htmlLines.length === 0 || (htmlLines.length === 1 && htmlLines[0].length === 0)) {\n return false;\n }\n\n const shouldBypassSanitization = this.sanitizeHtml() === false && result.trustedHtml;\n if (shouldBypassSanitization) {\n this.baseLineHtml.set(\n htmlLines.map((line) => this.domSanitizer.bypassSecurityTrustHtml(line)),\n );\n return true;\n }\n\n this.baseLineHtml.set(htmlLines);\n return true;\n }\n\n private buildCacheKey(request: TngCodeBlockRenderRequest): string {\n return [\n request.adapter ?? '',\n request.language ?? '',\n request.theme ?? '',\n request.includeLineWrappers ? '1' : '0',\n request.code,\n ].join('\\u241f');\n }\n\n private clearCopyResetTimer(): void {\n if (this.copyResetTimer === null) {\n return;\n }\n\n clearTimeout(this.copyResetTimer);\n this.copyResetTimer = null;\n }\n\n private clearHighlightDebounceTimer(): void {\n if (this.highlightDebounceTimer === null) {\n return;\n }\n\n clearTimeout(this.highlightDebounceTimer);\n this.highlightDebounceTimer = null;\n }\n\n private enqueueRenderRequest(input: Readonly<{ request: TngCodeBlockRenderRequest; shouldHighlight: boolean }>): void {\n this.clearHighlightDebounceTimer();\n\n const debounceMs = this.highlightDebounceMs();\n if (debounceMs <= 0) {\n void this.renderRequest(input);\n return;\n }\n\n this.highlightDebounceTimer = setTimeout((): void => {\n this.highlightDebounceTimer = null;\n void this.renderRequest(input);\n }, debounceMs);\n }\n\n private isStaleRequest(requestId: number): boolean {\n return this.destroyed || requestId !== this.highlightRequestId;\n }\n\n private scheduleCopyStateReset(): void {\n this.clearCopyResetTimer();\n this.copyResetTimer = setTimeout((): void => {\n this.copyState.set('idle');\n this.copyResetTimer = null;\n }, this.effectiveCopyResetDuration());\n }\n\n private setRenderState(state: TngCodeBlockRenderState, error?: unknown): void {\n this.renderState.set(state);\n\n if (this.lastEmittedRenderState === state) {\n return;\n }\n\n this.lastEmittedRenderState = state;\n if (state === 'error') {\n this.renderStateChange.emit({ error, state });\n return;\n }\n\n this.renderStateChange.emit({ state });\n }\n\n private shouldHighlightCode(): boolean {\n if (!this.highlight()) {\n return false;\n }\n\n return shouldHighlight(this.highlightMode());\n }\n\n private shouldIncludeLineWrappers(): boolean {\n return this.effectiveLineNumbers() || this.highlightLineSet().size > 0 || this.focusLines();\n }\n\n private toHighlightRequest(request: TngCodeBlockRenderRequest): TngCodeHighlightRequest {\n return {\n adapter: request.adapter,\n code: request.code,\n includeLineWrappers: request.includeLineWrappers,\n language: request.language,\n theme: request.theme,\n };\n }\n\n private async renderRequest(input: Readonly<{ request: TngCodeBlockRenderRequest; shouldHighlight: boolean }>): Promise<void> {\n const requestId = this.highlightRequestId + 1;\n this.highlightRequestId = requestId;\n\n if (!input.shouldHighlight) {\n this.applyPlainText(input.request.code, input.request.language);\n this.setRenderState('idle');\n return;\n }\n\n this.setRenderState('highlighting');\n\n try {\n const cacheKey = this.buildCacheKey(input.request);\n let resolvedResult = this.renderCache.get(cacheKey);\n if (resolvedResult === undefined) {\n resolvedResult = await resolveTngCodeHighlightResult(\n this.toHighlightRequest(input.request),\n this.highlightingConfig,\n );\n this.renderCache.set(cacheKey, resolvedResult);\n }\n\n if (this.isStaleRequest(requestId)) {\n return;\n }\n\n if (resolvedResult === null) {\n this.applyPlainText(input.request.code, input.request.language);\n this.setRenderState('highlighted');\n return;\n }\n\n const didRenderHighlight = this.applyResolvedHighlightResult(resolvedResult, input.request);\n if (!didRenderHighlight) {\n this.applyPlainText(input.request.code, input.request.language);\n }\n\n this.setRenderState('highlighted');\n } catch (error) {\n if (this.isStaleRequest(requestId)) {\n return;\n }\n\n this.applyPlainText(input.request.code, input.request.language);\n this.setRenderState('error', error);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-copy-button.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/copy-button/tng-copy-button.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAI5F,KAAK,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAClE,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,KAAK,sBAAsB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAqBhD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAO5E;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,kBAAkB,GAAG,sBAAsB,CAM/F;AAED,
|
|
1
|
+
{"version":3,"file":"tng-copy-button.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/copy-button/tng-copy-button.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAI5F,KAAK,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAClE,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,KAAK,sBAAsB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAqBhD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAO5E;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,kBAAkB,GAAG,sBAAsB,CAM/F;AAED,qBAMa,sBAAuB,YAAW,SAAS;IACtD,SAAgB,UAAU,+DAA6C;IACvE,SAAgB,cAAc,8CAAsB;IACpD,SAAgB,SAAS,8CAAyB;IAClD,SAAgB,YAAY,8CAAsB;IAClD,SAAgB,WAAW,8CAA2B;IACtD,SAAgB,YAAY,8CAA+B;IAC3D,SAAgB,QAAQ,8EAErB;IACH,SAAgB,UAAU,8CAAgC;IAC1D,SAAgB,IAAI,yDAAkC;IACtD,SAAgB,eAAe,mEAA4C;IAC3E,SAAgB,UAAU,4EAEvB;IACH,SAAgB,IAAI,yDAAkC;IACtD,SAAgB,QAAQ,8EAErB;IACH,SAAgB,IAAI,iEAA+C;IAEnE,SAAgB,SAAS,mDAAoB;IAC7C,SAAgB,YAAY,kDAAmB;IAE/C,SAAS,CAAC,QAAQ,CAAC,WAAW,yCAW3B;IAEH,SAAS,CAAC,QAAQ,CAAC,KAAK,yCAerB;IAEH,SAAS,CAAC,QAAQ,CAAC,SAAS,yDAE1B;IAEF,SAAS,CAAC,QAAQ,CAAC,KAAK,6DAAsC;IAE9D,OAAO,CAAC,UAAU,CAA8C;IAEzD,WAAW,IAAI,IAAI;IAI1B,SAAS,CAAC,WAAW,IAAI,IAAI;IAQ7B,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMlD,SAAS,CAAC,oBAAoB,CAAC,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IAQjE,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,aAAa;CAOtB"}
|
|
@@ -117,7 +117,6 @@ let TngCopyButtonComponent = class TngCopyButtonComponent {
|
|
|
117
117
|
};
|
|
118
118
|
TngCopyButtonComponent = __decorate([
|
|
119
119
|
Component({
|
|
120
|
-
standalone: true,
|
|
121
120
|
selector: 'tng-copy-button',
|
|
122
121
|
imports: [TngCopy],
|
|
123
122
|
templateUrl: './tng-copy-button.component.html',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-copy-button.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/copy-button/tng-copy-button.component.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EACL,MAAM,EACN,MAAM,GAEP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAO/B,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QACpE,MAAM,MAAM,GAAI,KAA4B,CAAC,KAAK,CAAC;QACnD,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAsB;IAClE,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,OAAO,uBAAuB,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAyB;IACrE,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;
|
|
1
|
+
{"version":3,"file":"tng-copy-button.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/copy-button/tng-copy-button.component.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EACL,MAAM,EACN,MAAM,GAEP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAO/B,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QACpE,MAAM,MAAM,GAAI,KAA4B,CAAC,KAAK,CAAC;QACnD,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAsB;IAClE,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,OAAO,uBAAuB,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAyB;IACrE,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAQM,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjB,UAAU,GAAG,KAAK,CAA0B,SAAS,CAAC,CAAC;IACvD,cAAc,GAAG,KAAK,CAAS,GAAG,CAAC,CAAC;IACpC,SAAS,GAAG,KAAK,CAAS,MAAM,CAAC,CAAC;IAClC,YAAY,GAAG,KAAK,CAAS,GAAG,CAAC,CAAC;IAClC,WAAW,GAAG,KAAK,CAAS,QAAQ,CAAC,CAAC;IACtC,YAAY,GAAG,KAAK,CAAS,YAAY,CAAC,CAAC;IAC3C,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,UAAU,GAAG,KAAK,CAAS,aAAa,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,CAAoB,IAAI,CAAC,CAAC;IACtC,eAAe,GAAG,KAAK,CAA8B,IAAI,CAAC,CAAC;IAC3D,UAAU,GAAG,KAAK,CAA0B,iBAAiB,EAAE;QAC7E,SAAS,EAAE,6BAA6B;KACzC,CAAC,CAAC;IACa,IAAI,GAAG,KAAK,CAAoB,IAAI,CAAC,CAAC;IACtC,QAAQ,GAAG,KAAK,CAA4B,IAAI,EAAE;QAChE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,IAAI,GAAG,KAAK,CAA4B,SAAS,CAAC,CAAC;IAEnD,SAAS,GAAG,MAAM,EAAU,CAAC;IAC7B,YAAY,GAAG,MAAM,EAAS,CAAC;IAE5B,WAAW,GAAG,QAAQ,CAAC,GAAW,EAAE;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEgB,KAAK,GAAG,QAAQ,CAAC,GAAW,EAAE;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEgB,SAAS,GAAG,QAAQ,CAAyB,GAAG,EAAE,CACnE,6BAA6B,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAC5C,CAAC;IAEiB,KAAK,GAAG,MAAM,CAAqB,MAAM,CAAC,CAAC;IAEtD,UAAU,GAAyC,IAAI,CAAC;IAEzD,WAAW;QAChB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAES,WAAW;QACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAES,iBAAiB,CAAC,OAAe;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAES,oBAAoB,CAAC,GAAG,IAAwB;QACxD,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACrB,MAAM,eAAe,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAS,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACxB,CAAC;CACF,CAAA;AAzGY,sBAAsB;IANlC,SAAS,CAAC;QACT,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,WAAW,EAAE,kCAAkC;QAC/C,QAAQ,EAAE,iCAAiC;KAC5C,CAAC;GACW,sBAAsB,CAyGlC","sourcesContent":["import {\n booleanAttribute,\n Component,\n computed,\n input,\n output,\n signal,\n type OnDestroy,\n} from '@angular/core';\nimport { TngCopy } from '@tailng-ui/primitives';\nimport type { TngCopyFromTarget, TngCopyIgnoreSelectorsInput } from '@tailng-ui/primitives';\n\nconst defaultResetDelay = 1500;\n\ntype TngCopyButtonState = 'copied' | 'copying' | 'error' | 'idle';\nexport type TngCopyButtonAppearance = 'ghost' | 'outline' | 'solid';\nexport type TngCopyButtonSize = 'md' | 'sm';\ntype TngCopyButtonIconState = 'copied' | 'copy';\n\nfunction toNormalizedCopyError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n if (typeof value === 'object' && value !== null && 'error' in value) {\n const nested = (value as { error: unknown }).error;\n if (nested instanceof Error) {\n return nested;\n }\n }\n\n return new Error('Copy failed.');\n}\n\nfunction toRoundedPositiveNumber(value: number): number {\n return Math.max(0, Math.round(value));\n}\n\nexport function coerceTngCopyButtonResetDelay(value: number | string): number {\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return defaultResetDelay;\n }\n\n return toRoundedPositiveNumber(numericValue);\n}\n\nexport function resolveTngCopyButtonIconState(state: TngCopyButtonState): TngCopyButtonIconState {\n if (state === 'copied') {\n return 'copied';\n }\n\n return 'copy';\n}\n\n@Component({\n selector: 'tng-copy-button',\n imports: [TngCopy],\n templateUrl: './tng-copy-button.component.html',\n styleUrl: './tng-copy-button.component.css',\n})\nexport class TngCopyButtonComponent implements OnDestroy {\n public readonly appearance = input<TngCopyButtonAppearance>('outline');\n public readonly copiedIconText = input<string>('✓');\n public readonly copyLabel = input<string>('Copy');\n public readonly copyIconText = input<string>('⧉');\n public readonly copiedLabel = input<string>('Copied');\n public readonly copyingLabel = input<string>('Copying...');\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly errorLabel = input<string>('Copy failed');\n public readonly from = input<TngCopyFromTarget>(null);\n public readonly ignoreSelectors = input<TngCopyIgnoreSelectorsInput>(null);\n public readonly resetDelay = input<number, number | string>(defaultResetDelay, {\n transform: coerceTngCopyButtonResetDelay,\n });\n public readonly size = input<TngCopyButtonSize>('md');\n public readonly showIcon = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n public readonly text = input<string | null | undefined>(undefined);\n\n public readonly tngCopied = output<string>();\n public readonly tngCopyError = output<Error>();\n\n protected readonly liveMessage = computed((): string => {\n const state = this.state();\n if (state === 'copied') {\n return this.copiedLabel();\n }\n\n if (state === 'error') {\n return this.errorLabel();\n }\n\n return '';\n });\n\n protected readonly label = computed((): string => {\n const state = this.state();\n if (state === 'copying') {\n return this.copyingLabel();\n }\n\n if (state === 'copied') {\n return this.copiedLabel();\n }\n\n if (state === 'error') {\n return this.errorLabel();\n }\n\n return this.copyLabel();\n });\n\n protected readonly iconState = computed<TngCopyButtonIconState>(() =>\n resolveTngCopyButtonIconState(this.state()),\n );\n\n protected readonly state = signal<TngCopyButtonState>('idle');\n\n private resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n public ngOnDestroy(): void {\n this.clearResetTimer();\n }\n\n protected onHostClick(): void {\n if (this.disabled()) {\n return;\n }\n\n this.state.set('copying');\n }\n\n protected onPrimitiveCopied(payload: string): void {\n this.state.set('copied');\n this.tngCopied.emit(payload);\n this.scheduleReset();\n }\n\n protected onPrimitiveCopyError(...args: readonly unknown[]): void {\n const [error] = args;\n const normalizedError = toNormalizedCopyError(error);\n this.state.set('error');\n this.tngCopyError.emit(normalizedError);\n this.scheduleReset();\n }\n\n private clearResetTimer(): void {\n if (this.resetTimer === null) {\n return;\n }\n\n clearTimeout(this.resetTimer);\n this.resetTimer = null;\n }\n\n private scheduleReset(): void {\n this.clearResetTimer();\n this.resetTimer = setTimeout((): void => {\n this.state.set('idle');\n this.resetTimer = null;\n }, this.resetDelay());\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-tag.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tag/tng-tag.component.ts"],"names":[],"mappings":"AAMA,KAAK,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AACrD,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACtC,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9B,KAAK,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAExE,
|
|
1
|
+
{"version":3,"file":"tng-tag.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tag/tng-tag.component.ts"],"names":[],"mappings":"AAMA,KAAK,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AACrD,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACtC,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9B,KAAK,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAExE,qBAMa,eAAe;IAC1B,SAAgB,UAAU,wDAAmC;IAC7D,SAAgB,cAAc,qDAA8B;IAC5D,SAAgB,QAAQ,8EAErB;IACH,SAAgB,KAAK,qDAA8B;IACnD,SAAgB,SAAS,8EAEtB;IACH,SAAgB,KAAK,mDAA8B;IACnD,SAAgB,IAAI,kDAA2B;IAC/C,SAAgB,IAAI,kDAAgC;IAEpD,SAAgB,OAAO,iDAAkB;IAElC,SAAS,IAAI,IAAI;CAGzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-tag.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tag/tng-tag.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,MAAM,IAAI,eAAe,EACzB,WAAW,IAAI,oBAAoB,GACpC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"tng-tag.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tag/tng-tag.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,MAAM,IAAI,eAAe,EACzB,WAAW,IAAI,oBAAoB,GACpC,MAAM,uBAAuB,CAAC;AAaxB,IAAM,eAAe,GAArB,MAAM,eAAe;IACV,UAAU,GAAG,KAAK,CAAmB,MAAM,CAAC,CAAC;IAC7C,cAAc,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAC5C,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,KAAK,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IACnC,SAAS,GAAG,KAAK,CAA4B,KAAK,EAAE;QAClE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,KAAK,GAAG,KAAK,CAAc,MAAM,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,CAAa,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAa,SAAS,CAAC,CAAC;IAEpC,OAAO,GAAG,MAAM,EAAQ,CAAC;IAElC,SAAS;QACd,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAA;AAnBY,eAAe;IAN3B,SAAS,CAAC;QACT,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,CAAC,eAAe,EAAE,oBAAoB,CAAC;QAChD,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,yBAAyB;KACpC,CAAC;GACW,eAAe,CAmB3B","sourcesContent":["import { booleanAttribute, Component, input, output } from '@angular/core';\nimport {\n TngTag as TngTagPrimitive,\n TngTagClose as TngTagClosePrimitive,\n} from '@tailng-ui/primitives';\n\ntype TngTagAppearance = 'outline' | 'soft' | 'solid';\ntype TngTagShape = 'pill' | 'rounded';\ntype TngTagSize = 'md' | 'sm';\ntype TngTagTone = 'danger' | 'info' | 'neutral' | 'success' | 'warning';\n\n@Component({\n selector: 'tng-tag',\n imports: [TngTagPrimitive, TngTagClosePrimitive],\n templateUrl: './tng-tag.component.html',\n styleUrl: './tng-tag.component.css',\n})\nexport class TngTagComponent {\n public readonly appearance = input<TngTagAppearance>('soft');\n public readonly closeAriaLabel = input<string | null>(null);\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly label = input<string | null>(null);\n public readonly removable = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly shape = input<TngTagShape>('pill');\n public readonly size = input<TngTagSize>('md');\n public readonly tone = input<TngTagTone>('neutral');\n\n public readonly removed = output<void>();\n\n public onRemoved(): void {\n this.removed.emit();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-tree.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tree/tng-tree.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AAiB3D,KAAK,oBAAoB,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B,CAAC,CAAC;AAEH,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC,CAAC;AA6BH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC,CAAC;AAiKH,
|
|
1
|
+
{"version":3,"file":"tng-tree.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tree/tng-tree.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AAiB3D,KAAK,oBAAoB,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B,CAAC,CAAC;AAEH,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC,CAAC;AA6BH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC,CAAC;AAiKH,qBAMa,gBAAiB,YAAW,SAAS;IAChD,SAAgB,SAAS,8CAAyB;IAClD,SAAgB,kBAAkB,yDAAgC;IAClE,SAAgB,iBAAiB,qDAA8B;IAC/D,SAAgB,KAAK;sBAhLP,MAAM,GAAG,IAAI;mBAChB,OAAO;YACd,MAAM;eACH,MAAM;mBACF,MAAM,GAAG,IAAI;UA4KkC;IAE1D,SAAgB,gBAAgB,0DAA2B;IAE3D,SAAS,CAAC,QAAQ,CAAC,kBAAkB,gDAOlC;IACH,SAAS,CAAC,QAAQ,CAAC,UAAU,wDAA+B;IAC5D,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAkB;IAC3C,SAAS,CAAC,QAAQ,CAAC,WAAW;eAzMvB,MAAM;qBACA,MAAM,GAAG,IAAI;kBAChB,OAAO;qBACJ,OAAO;YAChB,MAAM;eACH,MAAM;UAoMqF;IAElG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiD;IACzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgD;IAE3E,OAAO,CAAC,KAAK,CAAgD;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoE;IAE9F,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAS7B;IAEL,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAE9B;IAEI,WAAW,IAAI,IAAI;IAInB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAY/D,WAAW,IAAI,IAAI;IAMnB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAWrC,aAAa,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAiBvD,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI7C,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI7C,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-tree.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tree/tng-tree.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, computed, effect, input, output, signal, viewChild } from '@angular/core';\nimport type { ElementRef, OnDestroy } from '@angular/core';\nimport { createTngIdFactory } from '@tailng-ui/cdk';\nimport {\n createTreeModel,\n createTypeaheadController,\n type TngTreeModel,\n type TngTreeModelState,\n type TngTreeNode,\n type TngTypeaheadController,\n type TngTypeaheadItem,\n} from '@tailng-ui/cdk';\nimport { TngTree as TngTreePrimitive } from '@tailng-ui/primitives';\n\nconst createTreeId = createTngIdFactory('tng-tree');\n\ntype TngTreeBoundary = 'first' | 'last';\n\ntype TngTreeKeyboardEvent = Readonly<{\n altKey: boolean;\n key: string;\n metaKey: boolean;\n preventDefault: () => void;\n}>;\n\ntype TngTreePointerEvent = Readonly<{\n preventDefault: () => void;\n stopPropagation: () => void;\n}>;\n\ntype TngTreeKeyAction =\n | 'collapse-or-parent'\n | 'expand-or-child'\n | 'move-next'\n | 'move-prev'\n | 'noop'\n | 'select'\n | 'to-end'\n | 'to-start'\n | 'typeahead';\n\ntype TngTreeLookup = Readonly<{\n byId: ReadonlyMap<string, TngTreeItem>;\n childrenByParent: ReadonlyMap<string, readonly string[]>;\n}>;\n\ntype TngTreeRow = Readonly<{\n depth: number;\n description: string | null;\n disabled: boolean;\n hasChildren: boolean;\n id: string;\n label: string;\n}>;\n\ntype TngTreeRunnableAction = Exclude<TngTreeKeyAction, 'noop' | 'typeahead'>;\n\nexport type TngTreeItem = Readonly<{\n description?: string | null;\n disabled?: boolean;\n id: string;\n label: string;\n parentId?: string | null;\n}>;\n\nconst actionByKey: Readonly<Record<string, TngTreeKeyAction>> = Object.freeze({\n ArrowDown: 'move-next',\n ArrowLeft: 'collapse-or-parent',\n ArrowRight: 'expand-or-child',\n ArrowUp: 'move-prev',\n End: 'to-end',\n Home: 'to-start',\n});\n\nfunction toReadonlyArray<T>(values: readonly T[]): readonly T[] {\n return Object.freeze([...values]);\n}\n\nfunction toTreeModelNodes(items: readonly TngTreeItem[]): readonly TngTreeNode[] {\n return items.map((item) => ({\n disabled: item.disabled,\n id: item.id,\n parentId: item.parentId,\n }));\n}\n\nfunction createTreeLookup(items: readonly TngTreeItem[]): TngTreeLookup {\n const byId = new Map<string, TngTreeItem>();\n const childrenByParent = new Map<string, string[]>();\n\n for (const item of items) {\n byId.set(item.id, item);\n }\n\n for (const item of items) {\n const parentId = item.parentId ?? null;\n if (parentId === null || !byId.has(parentId)) {\n continue;\n }\n\n const children = childrenByParent.get(parentId) ?? [];\n children.push(item.id);\n childrenByParent.set(parentId, children);\n }\n\n const readonlyChildrenByParent = new Map<string, readonly string[]>();\n for (const [parentId, children] of childrenByParent.entries()) {\n readonlyChildrenByParent.set(parentId, toReadonlyArray(children));\n }\n\n return Object.freeze({\n byId,\n childrenByParent: readonlyChildrenByParent,\n });\n}\n\nfunction resolveDepth(\n nodeId: string,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): number {\n let depth = 0;\n let parentId = byId.get(nodeId)?.parentId ?? null;\n const visited = new Set<string>();\n\n while (parentId !== null && byId.has(parentId) && !visited.has(parentId)) {\n visited.add(parentId);\n depth += 1;\n parentId = byId.get(parentId)?.parentId ?? null;\n }\n\n return depth;\n}\n\nfunction toTypeaheadItems(\n visibleIds: readonly string[],\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): readonly TngTypeaheadItem[] {\n return visibleIds\n .map((id) => byId.get(id))\n .filter((item): item is TngTreeItem => item !== undefined)\n .map((item) => ({\n disabled: item.disabled,\n id: item.id,\n text: item.label,\n }));\n}\n\nfunction toTreeItemDomId(treeId: string, nodeId: string): string {\n return `${treeId}-item-${nodeId}`;\n}\n\nfunction isPrintableTreeKey(key: string): boolean {\n return key.length === 1 && key.trim().length > 0;\n}\n\nfunction resolveSelectableId(\n candidateId: string | null,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n if (candidateId === null) {\n return null;\n }\n\n const candidate = byId.get(candidateId);\n if (candidate === undefined || candidate.disabled === true) {\n return null;\n }\n\n return candidate.id;\n}\n\nfunction resolveFirstSelectableChildId(\n parentId: string,\n childrenByParent: Readonly<ReadonlyMap<string, readonly string[]>>,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n const childIds = childrenByParent.get(parentId) ?? [];\n for (const childId of childIds) {\n if (resolveSelectableId(childId, byId) !== null) {\n return childId;\n }\n }\n\n return null;\n}\n\nfunction resolveSelectableAncestorId(\n nodeId: string,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n let parentId = byId.get(nodeId)?.parentId ?? null;\n\n while (parentId !== null) {\n const candidate = byId.get(parentId);\n if (candidate === undefined) {\n return null;\n }\n\n if (candidate.disabled !== true) {\n return candidate.id;\n }\n\n parentId = candidate.parentId ?? null;\n }\n\n return null;\n}\n\nfunction resolveTreeKeyAction(event: TngTreeKeyboardEvent): TngTreeKeyAction {\n if (event.altKey || event.metaKey) {\n return 'noop';\n }\n\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n return 'select';\n }\n\n return actionByKey[event.key] ?? 'typeahead';\n}\n\nfunction shouldPreventDefault(action: TngTreeKeyAction): boolean {\n return action !== 'noop' && action !== 'typeahead';\n}\n\n@Component({\n standalone: true,\n selector: 'tng-tree',\n imports: [TngTreePrimitive],\n templateUrl: './tng-tree.component.html',\n styleUrl: './tng-tree.component.css',\n})\nexport class TngTreeComponent implements OnDestroy {\n public readonly ariaLabel = input<string>('Tree');\n public readonly defaultExpandedIds = input<readonly string[]>([]);\n public readonly defaultSelectedId = input<string | null>(null);\n public readonly nodes = input<readonly TngTreeItem[]>([]);\n\n public readonly selectedIdChange = output<string | null>();\n\n protected readonly activeDescendantId = computed((): string | null => {\n const activeId = this.activeId();\n if (activeId === null) {\n return null;\n }\n\n return this.toItemDomId(activeId);\n });\n protected readonly selectedId = signal<string | null>(null);\n protected readonly treeId = createTreeId();\n protected readonly visibleRows = computed((): readonly TngTreeRow[] => this.resolveVisibleRows());\n\n private readonly activeId = signal<string | null>(null);\n private readonly expandedIds = signal<readonly string[]>(Object.freeze([]));\n private readonly lookup = signal<TngTreeLookup>(createTreeLookup([]));\n private readonly rootRef = viewChild<ElementRef<HTMLElement>>('rootRef');\n private readonly visibleIds = signal<readonly string[]>(Object.freeze([]));\n\n private model: TngTreeModel = createTreeModel({ nodes: [] });\n private readonly typeahead: TngTypeaheadController = createTypeaheadController({ items: [] });\n\n private readonly keyActionHandlers: Readonly<Record<TngTreeRunnableAction, () => void>> =\n Object.freeze({\n 'collapse-or-parent': (): void => this.handleArrowLeft(),\n 'expand-or-child': (): void => this.handleArrowRight(),\n 'move-next': (): void => this.applyState(this.model.moveNext()),\n 'move-prev': (): void => this.applyState(this.model.movePrev()),\n select: (): void => this.selectActiveNode(),\n 'to-end': (): void => this.moveToBoundary('last'),\n 'to-start': (): void => this.moveToBoundary('first'),\n });\n\n private readonly syncInputsEffect = effect((): void => {\n this.rebuildFromInputs(this.nodes(), this.defaultExpandedIds(), this.defaultSelectedId());\n });\n\n public ngOnDestroy(): void {\n this.syncInputsEffect.destroy();\n }\n\n public onToggleClick(nodeId: string, event: TngTreePointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.hasChildren(nodeId)) {\n return;\n }\n\n this.focusRoot();\n this.applyState(this.model.toggle(nodeId));\n this.applyState(this.model.setActiveId(nodeId));\n }\n\n public onTreeFocus(): void {\n if (this.activeId() === null) {\n this.moveToBoundary('first');\n }\n }\n\n public onTreeItemClick(nodeId: string): void {\n const selectableId = resolveSelectableId(nodeId, this.lookup().byId);\n if (selectableId === null) {\n return;\n }\n\n this.focusRoot();\n this.applyState(this.model.setActiveId(selectableId));\n this.selectNode(selectableId);\n }\n\n public onTreeKeydown(event: TngTreeKeyboardEvent): void {\n const action = resolveTreeKeyAction(event);\n if (action === 'noop') {\n return;\n }\n\n if (action === 'typeahead') {\n this.handleTypeahead(event);\n return;\n }\n\n this.runKeyAction(action);\n if (shouldPreventDefault(action)) {\n event.preventDefault();\n }\n }\n\n protected isExpanded(nodeId: string): boolean {\n return this.expandedIds().includes(nodeId);\n }\n\n protected toItemDomId(nodeId: string): string {\n return toTreeItemDomId(this.treeId, nodeId);\n }\n\n private applyState(state: TngTreeModelState): void {\n this.activeId.set(state.activeId);\n this.expandedIds.set(state.expandedIds);\n this.visibleIds.set(state.visibleIds);\n this.typeahead.setItems(toTypeaheadItems(state.visibleIds, this.lookup().byId));\n this.typeahead.setActiveId(state.activeId);\n }\n\n private focusRoot(): void {\n this.rootRef()?.nativeElement.focus();\n }\n\n private handleArrowLeft(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n return;\n }\n\n if (this.hasChildren(activeId) && this.isExpanded(activeId)) {\n this.applyState(this.model.collapse(activeId));\n return;\n }\n\n const ancestorId = resolveSelectableAncestorId(activeId, this.lookup().byId);\n if (ancestorId !== null) {\n this.applyState(this.model.setActiveId(ancestorId));\n }\n }\n\n private handleArrowRight(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n this.moveToBoundary('first');\n return;\n }\n\n if (!this.hasChildren(activeId)) {\n return;\n }\n\n if (!this.isExpanded(activeId)) {\n this.applyState(this.model.expand(activeId));\n return;\n }\n\n const childId = resolveFirstSelectableChildId(\n activeId,\n this.lookup().childrenByParent,\n this.lookup().byId,\n );\n if (childId !== null) {\n this.applyState(this.model.setActiveId(childId));\n }\n }\n\n private handleTypeahead(event: TngTreeKeyboardEvent): void {\n if (!isPrintableTreeKey(event.key)) {\n return;\n }\n\n const state = this.typeahead.handleKey(event.key);\n if (state.activeId === null || state.activeId === this.activeId()) {\n return;\n }\n\n this.applyState(this.model.setActiveId(state.activeId));\n event.preventDefault();\n }\n\n private hasChildren(nodeId: string): boolean {\n return (this.lookup().childrenByParent.get(nodeId)?.length ?? 0) > 0;\n }\n\n private moveToBoundary(boundary: TngTreeBoundary): void {\n const ids = this.visibleIds();\n const byId = this.lookup().byId;\n const orderedIds = boundary === 'first' ? ids : [...ids].reverse();\n\n for (const candidateId of orderedIds) {\n const selectableId = resolveSelectableId(candidateId, byId);\n if (selectableId !== null) {\n this.applyState(this.model.setActiveId(selectableId));\n return;\n }\n }\n }\n\n private rebuildFromInputs(\n nodes: readonly TngTreeItem[],\n expandedIds: readonly string[],\n selectedId: string | null,\n ): void {\n const normalizedNodes = toReadonlyArray(nodes);\n const lookup = createTreeLookup(normalizedNodes);\n this.lookup.set(lookup);\n\n this.model = createTreeModel({\n expandedIds,\n nodes: toTreeModelNodes(normalizedNodes),\n });\n this.applyState(this.model.getState());\n\n const nextSelectedId = resolveSelectableId(selectedId, lookup.byId);\n this.selectedId.set(nextSelectedId);\n if (nextSelectedId !== null) {\n this.applyState(this.model.setActiveId(nextSelectedId));\n }\n }\n\n private resolveVisibleRows(): readonly TngTreeRow[] {\n const byId = this.lookup().byId;\n const childrenByParent = this.lookup().childrenByParent;\n const rows: TngTreeRow[] = [];\n\n for (const nodeId of this.visibleIds()) {\n const node = byId.get(nodeId);\n if (node === undefined) {\n continue;\n }\n\n rows.push(\n Object.freeze({\n depth: resolveDepth(node.id, byId),\n description: node.description ?? null,\n disabled: node.disabled === true,\n hasChildren: (childrenByParent.get(node.id)?.length ?? 0) > 0,\n id: node.id,\n label: node.label,\n }),\n );\n }\n\n return toReadonlyArray(rows);\n }\n\n private runKeyAction(action: TngTreeKeyAction): void {\n if (action === 'noop' || action === 'typeahead') {\n return;\n }\n\n this.keyActionHandlers[action]();\n }\n\n private selectActiveNode(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n return;\n }\n\n const selectableId = resolveSelectableId(activeId, this.lookup().byId);\n if (selectableId !== null) {\n this.selectNode(selectableId);\n }\n }\n\n private selectNode(nodeId: string): void {\n this.selectedId.set(nodeId);\n this.selectedIdChange.emit(nodeId);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-tree.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/tree/tng-tree.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, computed, effect, input, output, signal, viewChild } from '@angular/core';\nimport type { ElementRef, OnDestroy } from '@angular/core';\nimport { createTngIdFactory } from '@tailng-ui/cdk';\nimport {\n createTreeModel,\n createTypeaheadController,\n type TngTreeModel,\n type TngTreeModelState,\n type TngTreeNode,\n type TngTypeaheadController,\n type TngTypeaheadItem,\n} from '@tailng-ui/cdk';\nimport { TngTree as TngTreePrimitive } from '@tailng-ui/primitives';\n\nconst createTreeId = createTngIdFactory('tng-tree');\n\ntype TngTreeBoundary = 'first' | 'last';\n\ntype TngTreeKeyboardEvent = Readonly<{\n altKey: boolean;\n key: string;\n metaKey: boolean;\n preventDefault: () => void;\n}>;\n\ntype TngTreePointerEvent = Readonly<{\n preventDefault: () => void;\n stopPropagation: () => void;\n}>;\n\ntype TngTreeKeyAction =\n | 'collapse-or-parent'\n | 'expand-or-child'\n | 'move-next'\n | 'move-prev'\n | 'noop'\n | 'select'\n | 'to-end'\n | 'to-start'\n | 'typeahead';\n\ntype TngTreeLookup = Readonly<{\n byId: ReadonlyMap<string, TngTreeItem>;\n childrenByParent: ReadonlyMap<string, readonly string[]>;\n}>;\n\ntype TngTreeRow = Readonly<{\n depth: number;\n description: string | null;\n disabled: boolean;\n hasChildren: boolean;\n id: string;\n label: string;\n}>;\n\ntype TngTreeRunnableAction = Exclude<TngTreeKeyAction, 'noop' | 'typeahead'>;\n\nexport type TngTreeItem = Readonly<{\n description?: string | null;\n disabled?: boolean;\n id: string;\n label: string;\n parentId?: string | null;\n}>;\n\nconst actionByKey: Readonly<Record<string, TngTreeKeyAction>> = Object.freeze({\n ArrowDown: 'move-next',\n ArrowLeft: 'collapse-or-parent',\n ArrowRight: 'expand-or-child',\n ArrowUp: 'move-prev',\n End: 'to-end',\n Home: 'to-start',\n});\n\nfunction toReadonlyArray<T>(values: readonly T[]): readonly T[] {\n return Object.freeze([...values]);\n}\n\nfunction toTreeModelNodes(items: readonly TngTreeItem[]): readonly TngTreeNode[] {\n return items.map((item) => ({\n disabled: item.disabled,\n id: item.id,\n parentId: item.parentId,\n }));\n}\n\nfunction createTreeLookup(items: readonly TngTreeItem[]): TngTreeLookup {\n const byId = new Map<string, TngTreeItem>();\n const childrenByParent = new Map<string, string[]>();\n\n for (const item of items) {\n byId.set(item.id, item);\n }\n\n for (const item of items) {\n const parentId = item.parentId ?? null;\n if (parentId === null || !byId.has(parentId)) {\n continue;\n }\n\n const children = childrenByParent.get(parentId) ?? [];\n children.push(item.id);\n childrenByParent.set(parentId, children);\n }\n\n const readonlyChildrenByParent = new Map<string, readonly string[]>();\n for (const [parentId, children] of childrenByParent.entries()) {\n readonlyChildrenByParent.set(parentId, toReadonlyArray(children));\n }\n\n return Object.freeze({\n byId,\n childrenByParent: readonlyChildrenByParent,\n });\n}\n\nfunction resolveDepth(\n nodeId: string,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): number {\n let depth = 0;\n let parentId = byId.get(nodeId)?.parentId ?? null;\n const visited = new Set<string>();\n\n while (parentId !== null && byId.has(parentId) && !visited.has(parentId)) {\n visited.add(parentId);\n depth += 1;\n parentId = byId.get(parentId)?.parentId ?? null;\n }\n\n return depth;\n}\n\nfunction toTypeaheadItems(\n visibleIds: readonly string[],\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): readonly TngTypeaheadItem[] {\n return visibleIds\n .map((id) => byId.get(id))\n .filter((item): item is TngTreeItem => item !== undefined)\n .map((item) => ({\n disabled: item.disabled,\n id: item.id,\n text: item.label,\n }));\n}\n\nfunction toTreeItemDomId(treeId: string, nodeId: string): string {\n return `${treeId}-item-${nodeId}`;\n}\n\nfunction isPrintableTreeKey(key: string): boolean {\n return key.length === 1 && key.trim().length > 0;\n}\n\nfunction resolveSelectableId(\n candidateId: string | null,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n if (candidateId === null) {\n return null;\n }\n\n const candidate = byId.get(candidateId);\n if (candidate === undefined || candidate.disabled === true) {\n return null;\n }\n\n return candidate.id;\n}\n\nfunction resolveFirstSelectableChildId(\n parentId: string,\n childrenByParent: Readonly<ReadonlyMap<string, readonly string[]>>,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n const childIds = childrenByParent.get(parentId) ?? [];\n for (const childId of childIds) {\n if (resolveSelectableId(childId, byId) !== null) {\n return childId;\n }\n }\n\n return null;\n}\n\nfunction resolveSelectableAncestorId(\n nodeId: string,\n byId: Readonly<ReadonlyMap<string, TngTreeItem>>,\n): string | null {\n let parentId = byId.get(nodeId)?.parentId ?? null;\n\n while (parentId !== null) {\n const candidate = byId.get(parentId);\n if (candidate === undefined) {\n return null;\n }\n\n if (candidate.disabled !== true) {\n return candidate.id;\n }\n\n parentId = candidate.parentId ?? null;\n }\n\n return null;\n}\n\nfunction resolveTreeKeyAction(event: TngTreeKeyboardEvent): TngTreeKeyAction {\n if (event.altKey || event.metaKey) {\n return 'noop';\n }\n\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n return 'select';\n }\n\n return actionByKey[event.key] ?? 'typeahead';\n}\n\nfunction shouldPreventDefault(action: TngTreeKeyAction): boolean {\n return action !== 'noop' && action !== 'typeahead';\n}\n\n@Component({\n selector: 'tng-tree',\n imports: [TngTreePrimitive],\n templateUrl: './tng-tree.component.html',\n styleUrl: './tng-tree.component.css',\n})\nexport class TngTreeComponent implements OnDestroy {\n public readonly ariaLabel = input<string>('Tree');\n public readonly defaultExpandedIds = input<readonly string[]>([]);\n public readonly defaultSelectedId = input<string | null>(null);\n public readonly nodes = input<readonly TngTreeItem[]>([]);\n\n public readonly selectedIdChange = output<string | null>();\n\n protected readonly activeDescendantId = computed((): string | null => {\n const activeId = this.activeId();\n if (activeId === null) {\n return null;\n }\n\n return this.toItemDomId(activeId);\n });\n protected readonly selectedId = signal<string | null>(null);\n protected readonly treeId = createTreeId();\n protected readonly visibleRows = computed((): readonly TngTreeRow[] => this.resolveVisibleRows());\n\n private readonly activeId = signal<string | null>(null);\n private readonly expandedIds = signal<readonly string[]>(Object.freeze([]));\n private readonly lookup = signal<TngTreeLookup>(createTreeLookup([]));\n private readonly rootRef = viewChild<ElementRef<HTMLElement>>('rootRef');\n private readonly visibleIds = signal<readonly string[]>(Object.freeze([]));\n\n private model: TngTreeModel = createTreeModel({ nodes: [] });\n private readonly typeahead: TngTypeaheadController = createTypeaheadController({ items: [] });\n\n private readonly keyActionHandlers: Readonly<Record<TngTreeRunnableAction, () => void>> =\n Object.freeze({\n 'collapse-or-parent': (): void => this.handleArrowLeft(),\n 'expand-or-child': (): void => this.handleArrowRight(),\n 'move-next': (): void => this.applyState(this.model.moveNext()),\n 'move-prev': (): void => this.applyState(this.model.movePrev()),\n select: (): void => this.selectActiveNode(),\n 'to-end': (): void => this.moveToBoundary('last'),\n 'to-start': (): void => this.moveToBoundary('first'),\n });\n\n private readonly syncInputsEffect = effect((): void => {\n this.rebuildFromInputs(this.nodes(), this.defaultExpandedIds(), this.defaultSelectedId());\n });\n\n public ngOnDestroy(): void {\n this.syncInputsEffect.destroy();\n }\n\n public onToggleClick(nodeId: string, event: TngTreePointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.hasChildren(nodeId)) {\n return;\n }\n\n this.focusRoot();\n this.applyState(this.model.toggle(nodeId));\n this.applyState(this.model.setActiveId(nodeId));\n }\n\n public onTreeFocus(): void {\n if (this.activeId() === null) {\n this.moveToBoundary('first');\n }\n }\n\n public onTreeItemClick(nodeId: string): void {\n const selectableId = resolveSelectableId(nodeId, this.lookup().byId);\n if (selectableId === null) {\n return;\n }\n\n this.focusRoot();\n this.applyState(this.model.setActiveId(selectableId));\n this.selectNode(selectableId);\n }\n\n public onTreeKeydown(event: TngTreeKeyboardEvent): void {\n const action = resolveTreeKeyAction(event);\n if (action === 'noop') {\n return;\n }\n\n if (action === 'typeahead') {\n this.handleTypeahead(event);\n return;\n }\n\n this.runKeyAction(action);\n if (shouldPreventDefault(action)) {\n event.preventDefault();\n }\n }\n\n protected isExpanded(nodeId: string): boolean {\n return this.expandedIds().includes(nodeId);\n }\n\n protected toItemDomId(nodeId: string): string {\n return toTreeItemDomId(this.treeId, nodeId);\n }\n\n private applyState(state: TngTreeModelState): void {\n this.activeId.set(state.activeId);\n this.expandedIds.set(state.expandedIds);\n this.visibleIds.set(state.visibleIds);\n this.typeahead.setItems(toTypeaheadItems(state.visibleIds, this.lookup().byId));\n this.typeahead.setActiveId(state.activeId);\n }\n\n private focusRoot(): void {\n this.rootRef()?.nativeElement.focus();\n }\n\n private handleArrowLeft(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n return;\n }\n\n if (this.hasChildren(activeId) && this.isExpanded(activeId)) {\n this.applyState(this.model.collapse(activeId));\n return;\n }\n\n const ancestorId = resolveSelectableAncestorId(activeId, this.lookup().byId);\n if (ancestorId !== null) {\n this.applyState(this.model.setActiveId(ancestorId));\n }\n }\n\n private handleArrowRight(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n this.moveToBoundary('first');\n return;\n }\n\n if (!this.hasChildren(activeId)) {\n return;\n }\n\n if (!this.isExpanded(activeId)) {\n this.applyState(this.model.expand(activeId));\n return;\n }\n\n const childId = resolveFirstSelectableChildId(\n activeId,\n this.lookup().childrenByParent,\n this.lookup().byId,\n );\n if (childId !== null) {\n this.applyState(this.model.setActiveId(childId));\n }\n }\n\n private handleTypeahead(event: TngTreeKeyboardEvent): void {\n if (!isPrintableTreeKey(event.key)) {\n return;\n }\n\n const state = this.typeahead.handleKey(event.key);\n if (state.activeId === null || state.activeId === this.activeId()) {\n return;\n }\n\n this.applyState(this.model.setActiveId(state.activeId));\n event.preventDefault();\n }\n\n private hasChildren(nodeId: string): boolean {\n return (this.lookup().childrenByParent.get(nodeId)?.length ?? 0) > 0;\n }\n\n private moveToBoundary(boundary: TngTreeBoundary): void {\n const ids = this.visibleIds();\n const byId = this.lookup().byId;\n const orderedIds = boundary === 'first' ? ids : [...ids].reverse();\n\n for (const candidateId of orderedIds) {\n const selectableId = resolveSelectableId(candidateId, byId);\n if (selectableId !== null) {\n this.applyState(this.model.setActiveId(selectableId));\n return;\n }\n }\n }\n\n private rebuildFromInputs(\n nodes: readonly TngTreeItem[],\n expandedIds: readonly string[],\n selectedId: string | null,\n ): void {\n const normalizedNodes = toReadonlyArray(nodes);\n const lookup = createTreeLookup(normalizedNodes);\n this.lookup.set(lookup);\n\n this.model = createTreeModel({\n expandedIds,\n nodes: toTreeModelNodes(normalizedNodes),\n });\n this.applyState(this.model.getState());\n\n const nextSelectedId = resolveSelectableId(selectedId, lookup.byId);\n this.selectedId.set(nextSelectedId);\n if (nextSelectedId !== null) {\n this.applyState(this.model.setActiveId(nextSelectedId));\n }\n }\n\n private resolveVisibleRows(): readonly TngTreeRow[] {\n const byId = this.lookup().byId;\n const childrenByParent = this.lookup().childrenByParent;\n const rows: TngTreeRow[] = [];\n\n for (const nodeId of this.visibleIds()) {\n const node = byId.get(nodeId);\n if (node === undefined) {\n continue;\n }\n\n rows.push(\n Object.freeze({\n depth: resolveDepth(node.id, byId),\n description: node.description ?? null,\n disabled: node.disabled === true,\n hasChildren: (childrenByParent.get(node.id)?.length ?? 0) > 0,\n id: node.id,\n label: node.label,\n }),\n );\n }\n\n return toReadonlyArray(rows);\n }\n\n private runKeyAction(action: TngTreeKeyAction): void {\n if (action === 'noop' || action === 'typeahead') {\n return;\n }\n\n this.keyActionHandlers[action]();\n }\n\n private selectActiveNode(): void {\n const activeId = this.activeId();\n if (activeId === null) {\n return;\n }\n\n const selectableId = resolveSelectableId(activeId, this.lookup().byId);\n if (selectableId !== null) {\n this.selectNode(selectableId);\n }\n }\n\n private selectNode(nodeId: string): void {\n this.selectedId.set(nodeId);\n this.selectedIdChange.emit(nodeId);\n }\n}\n"]}
|