@cdevhub/ngx-tw 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +264 -49
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
  7. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
  9. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
  11. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
  13. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
  15. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
  17. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  34. package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  40. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  44. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
  45. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
  47. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
  49. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
  51. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
  53. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
  55. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
  57. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
  59. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
  61. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
  62. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
  63. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
  65. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
  67. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  68. package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
  69. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
  71. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
  73. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
  75. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
  77. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
  79. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
  81. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
  83. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  84. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
  85. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
  86. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
  87. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  88. package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
  89. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  90. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
  91. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
  93. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
  95. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
  97. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
  99. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
  101. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
  102. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
  103. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
  105. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
  107. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
  109. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
  111. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  112. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
  113. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
  115. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
  116. package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
  117. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
  118. package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
  119. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
  120. package/package.json +45 -20
  121. package/theme/index.css +10 -2
  122. package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
  123. package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
  124. package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
  125. package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
  126. package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
  127. package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
  128. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
  129. package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
  130. package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
  131. package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
  132. package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
  133. package/types/cdevhub-ngx-tw-table.d.ts +30 -1
  134. package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
  135. package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
  136. package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
  137. package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
  138. package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
  139. package/types/cdevhub-ngx-tw.d.ts +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdevhub-ngx-tw-file-upload.mjs","sources":["../../../projects/ngx-tw/file-upload/file-upload.ts","../../../projects/ngx-tw/file-upload/file-upload.html","../../../projects/ngx-tw/file-upload/cdevhub-ngx-tw-file-upload.ts"],"sourcesContent":["/**\n * `tw-file-upload` — selects one or more files via button / click / drag-and-drop.\n *\n * Surfaces the selected files as a `File[]` value through `ControlValueAccessor`\n * so the component works identically with template-driven `ngModel`, reactive\n * `[formControl]`, and signal-based `[formField]` strategies. Integrates with\n * `<tw-form-field>` for label / hint / error chrome.\n *\n * Built-in validation (`accept`, `maxSize`, `maxFiles`) rejects files at the\n * UI layer and surfaces them via the `fileRejected` output and `LiveAnnouncer`.\n * These rejections do NOT flow through `NgControl.errors`, so they cannot be\n * matched with `[twError match=\"size\"]`. Use Angular `Validator`s on the bound\n * `NgControl` for error-key-driven UI (cross-field or async validation).\n *\n * The component does NOT issue HTTP requests. Consumers own the upload pipeline\n * and push progress / status back into the component via `setItemProgress` and\n * `setItemStatus`.\n */\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n input,\n isDevMode,\n type OnInit,\n output,\n signal,\n type Signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n type ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { FocusMonitor, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { isObservable, merge } from 'rxjs';\nimport { tv } from 'tailwind-variants';\nimport {\n type ErrorStateMatcher,\n TW_ERROR_STATE_MATCHER,\n type TwFormSubmitted,\n type TwSize,\n} from '@cdevhub/ngx-tw/core';\nimport { FormFieldControl, TW_FORM_FIELD_CONTROL } from '@cdevhub/ngx-tw/form-field';\nimport { ButtonDirective } from '@cdevhub/ngx-tw/button';\nimport { IconComponent } from '@cdevhub/ngx-tw/icon';\nimport { ProgressBarComponent } from '@cdevhub/ngx-tw/progress-bar';\n\n/** Lifecycle status of a single selected file. */\nexport type FileUploadStatus = 'pending' | 'uploading' | 'success' | 'error';\n\n/** Visual variant of the drop zone container. */\nexport type FileUploadVariant = 'outline' | 'soft';\n\n/** Reason a file was rejected during validation. */\nexport type FileUploadRejectionReason = 'accept' | 'size' | 'count';\n\n/** A single tracked entry in the file-upload's internal state. */\nexport interface FileUploadItem {\n /** Stable opaque id for this entry. Generated by the component on add. Use as the key when calling `setItemProgress` / `setItemStatus`. */\n readonly id: string;\n /** The underlying `File` object as provided by the browser (or by `writeValue`). */\n readonly file: File;\n /** Current upload progress, integer 0–100. `0` when no progress has been reported. */\n readonly progress: number;\n /** Current lifecycle status. Defaults to `'pending'`. */\n readonly status: FileUploadStatus;\n /** Optional error message attached when `status === 'error'`. Displayed in the file row and announced via `LiveAnnouncer`. */\n readonly error?: string;\n}\n\n/** Payload emitted on `fileRejected`. */\nexport interface FileUploadRejection {\n /** The browser-supplied `File` that was rejected. */\n readonly file: File;\n /** Why the file was rejected. */\n readonly reason: FileUploadRejectionReason;\n /** Human-readable message suitable for assistive-tech announcement and inline display. */\n readonly message: string;\n}\n\n// ── Structural slot directive ────────────────────────────────────\n\n/**\n * Structural directive that captures a template used to render each item row.\n * Apply with `*twFileUploadItem=\"let item\"` to override the default row layout.\n *\n * The template context exposes the current `FileUploadItem` as both `$implicit`\n * and `item`, so both `let-item` and `let-item=\"item\"` work.\n */\n@Directive({ selector: 'ng-template[twFileUploadItem]' })\nexport class FileUploadItemDirective {\n /** @internal Reference to the captured template — read by the host component. */\n readonly templateRef = inject<TemplateRef<{ $implicit: FileUploadItem; item: FileUploadItem }>>(\n TemplateRef,\n );\n}\n\n// ── tv() config ──────────────────────────────────────────────────\n\nconst fileUploadVariants = tv(\n {\n slots: {\n // `relative` scopes the hidden `<input type=\"file\" class=\"sr-only\">` —\n // its `position: absolute` + `margin: -1px` would otherwise resolve\n // against the nearest positioned ancestor (often `<body>`), extending\n // the document and producing runaway horizontal/vertical scroll.\n root: 'relative flex flex-col gap-3 w-full',\n // 2px dashed border on the outline variant is the dropzone's defining\n // affordance — codified deviation from CLAUDE.md's \"2px = active state\n // indicator only\" rule. The empty dropzone IS an awaiting-input affordance.\n dropzone:\n 'relative rounded-lg transition-[border-color,background-color,transform] duration-200 motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 cursor-pointer',\n dropzoneInner: 'flex flex-col items-center justify-center text-center gap-3',\n illustration: 'text-fg-subtle shrink-0',\n headline: 'font-semibold text-fg empty:hidden',\n description: 'text-fg-muted empty:hidden',\n list: 'flex flex-col gap-1 m-0 p-0 list-none empty:hidden',\n item: 'flex items-start gap-3 px-3 py-2 rounded-md hover:bg-surface-muted transition-colors duration-200 motion-reduce:transition-none',\n itemIcon: 'shrink-0 text-fg-muted mt-0.5',\n itemBody: 'flex-1 min-w-0 flex flex-col gap-1',\n itemName: 'text-sm font-medium text-fg truncate',\n itemMeta: 'text-xs text-fg-muted',\n itemProgress: 'mt-1',\n itemActions: 'flex items-center gap-1 shrink-0',\n },\n variants: {\n variant: {\n outline: { dropzone: 'border-2 border-dashed border-border bg-transparent' },\n soft: { dropzone: 'border border-border bg-surface-muted' },\n },\n size: {\n xs: { dropzone: 'p-2', headline: 'text-xs', description: 'text-2xs' },\n sm: { dropzone: 'p-3', headline: 'text-sm', description: 'text-xs' },\n md: { dropzone: 'p-4', headline: 'text-sm', description: 'text-xs' },\n lg: { dropzone: 'p-6', headline: 'text-sm', description: 'text-xs' },\n xl: { dropzone: 'p-8', headline: 'text-sm', description: 'text-xs' },\n },\n state: {\n idle: {},\n // 1% scale-up — below Tailwind's smallest `scale-95` step but visually\n // correct for a subtle drag-over lift; the alternative is no lift.\n draggingValid: {\n dropzone:\n 'border-primary-500 bg-primary-50 dark:bg-primary-900/20 scale-[1.01]',\n },\n draggingInvalid: {\n dropzone: 'border-error-500 bg-error-50 dark:bg-error-900/20',\n },\n error: { dropzone: 'border-error-500' },\n },\n disabled: {\n true: { dropzone: 'opacity-50 pointer-events-none cursor-not-allowed' },\n false: {},\n },\n },\n defaultVariants: {\n variant: 'outline',\n size: 'md',\n state: 'idle',\n disabled: false,\n },\n },\n { twMerge: true },\n);\n\n// ── Module-level counters & helpers ─────────────────────────────\n\nlet nextHostId = 0;\nlet nextItemSeq = 0;\n\nconst BYTE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB'] as const;\n\nfunction formatBytes(n: number): string {\n if (!Number.isFinite(n) || n < 0) return '0 B';\n if (n < 1024) return `${n} B`;\n let v = n;\n let i = 0;\n while (v >= 1024 && i < BYTE_UNITS.length - 1) {\n v /= 1024;\n i += 1;\n }\n return `${v < 10 ? v.toFixed(1) : Math.round(v)} ${BYTE_UNITS[i]}`;\n}\n\nfunction parseAcceptList(accept: string | undefined): string[] {\n if (!accept) return [];\n return accept\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n}\n\nfunction matchesAccept(file: File, patterns: readonly string[]): boolean {\n if (patterns.length === 0) return true;\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n for (const pattern of patterns) {\n if (pattern.startsWith('.')) {\n if (name.endsWith(pattern)) return true;\n } else if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -1);\n if (type.startsWith(prefix)) return true;\n } else if (type === pattern) {\n return true;\n }\n }\n return false;\n}\n\nfunction iconNameFor(file: File): string {\n const type = file.type.toLowerCase();\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf') return 'file-text';\n if (type.startsWith('text/')) return 'file-text';\n return 'file';\n}\n\nfunction clampPercent(n: number): number {\n if (!Number.isFinite(n)) return 0;\n if (n < 0) return 0;\n if (n > 100) return 100;\n return Math.round(n);\n}\n\n// ── FileUploadComponent ─────────────────────────────────────────\n\n@Component({\n selector: 'tw-file-upload',\n exportAs: 'twFileUpload',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, ButtonDirective, IconComponent, ProgressBarComponent],\n providers: [\n {\n provide: TW_FORM_FIELD_CONTROL,\n useExisting: forwardRef(() => FileUploadComponent),\n },\n ],\n templateUrl: './file-upload.html',\n host: {\n 'role': 'group',\n '[id]': 'id()',\n '[class]': 'rootClasses()',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.aria-labelledby]': 'effectiveAriaLabelledby() || null',\n '[attr.aria-describedby]': 'effectiveAriaDescribedby() || null',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.aria-required]': 'required() || null',\n '[attr.aria-invalid]': 'errorState() || null',\n },\n})\nexport class FileUploadComponent\n extends FormFieldControl<File[]>\n implements ControlValueAccessor, OnInit\n{\n // ── Inputs ──\n\n /** When true, the user can select more than one file. Mirrors to the hidden `<input multiple>` attribute. Defaults to `false`. */\n readonly multiple = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Comma-separated list of accepted file types using the native `<input accept>` syntax (e.g., `'image/*,.pdf'`). Forwarded to the hidden input and used to reject dropped files that do not match. Defaults to `undefined` (accept any). */\n readonly accept = input<string | undefined>(undefined);\n\n /** Maximum size per file, in bytes. Files exceeding this are rejected with reason `'size'` and never reach `value`. Defaults to `undefined` (no limit). */\n readonly maxSize = input<number | undefined>(undefined);\n\n /** Maximum total file count. Drops that would push the count over this limit are rejected with reason `'count'`. Ignored when `multiple` is `false` (the limit is always 1). Defaults to `undefined` (no limit). */\n readonly maxFiles = input<number | undefined>(undefined);\n\n /** Visual style of the drop zone. `'outline'` renders a dashed-bordered transparent region; `'soft'` renders a filled muted background. Defaults to `'outline'`. */\n readonly variant = input<FileUploadVariant>('outline');\n\n /** Controls overall density: drop-zone padding, icon scale, headline typography. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, blocks file selection (button, click, drop, keyboard) and applies muted styling. Reactive forms also propagate `disabled` via `setDisabledState`. Defaults to `false`. */\n readonly disabledInput = input<boolean, unknown>(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n /** Marks the control as required. Mirrors to `aria-required`. Also inferred from `Validators.required` on a bound `NgControl`. Defaults to `false`. */\n readonly requiredInput = input<boolean, unknown>(false, {\n alias: 'required',\n transform: booleanAttribute,\n });\n\n /** Headline text rendered inside the drop zone (e.g., `'Drag files here'`). Projected `[twFileUploadHeadline]` content takes precedence over this input. */\n readonly label = input<string | undefined>(undefined);\n\n /** Secondary text rendered under the label (e.g., `'PDF up to 10MB'`). Projected `[twFileUploadDescription]` content takes precedence. */\n readonly description = input<string | undefined>(undefined);\n\n /** Label rendered inside the trigger button. Defaults to `'Choose files'`. Use `'Choose file'` when `multiple` is `false` (consumer responsibility). */\n readonly triggerLabel = input<string>('Choose files');\n\n /** Accessible name applied to the host when no visible label is projected. Mirrored to `aria-label`. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** ID of an external element that labels the control. Mirrored to `aria-labelledby`. */\n readonly ariaLabelledby = input<string | undefined>(undefined, {\n alias: 'aria-labelledby',\n });\n\n /** ID of an external element that describes the control. Form-field merges its hint/error ids alongside. */\n readonly ariaDescribedby = input<string | undefined>(undefined, {\n alias: 'aria-describedby',\n });\n\n /** Optional `name` attribute on the hidden `<input type=\"file\">` for native form submissions. */\n readonly name = input<string | undefined>(undefined);\n\n /** Id on the host element. Auto-generated as `tw-file-upload-N` when not provided. Used by the form-field's `<label for>` attribute. */\n readonly idInput = input<string | undefined>(undefined, { alias: 'id' });\n\n /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the component uses the `TW_ERROR_STATE_MATCHER` token's value. */\n readonly errorStateMatcher = input<ErrorStateMatcher | undefined>(undefined);\n\n // ── Outputs ──\n\n /** Fires once per add operation with the items that were accepted and appended. Does not fire for rejected files (see `fileRejected`). Does not fire on `writeValue`. */\n readonly filesAdded = output<FileUploadItem[]>();\n\n /** Fires when a file is removed via the remove button or programmatic `remove()`. Does not fire on `writeValue`. */\n readonly fileRemoved = output<FileUploadItem>();\n\n /** Fires for each file that failed validation during add. Payload includes a human-readable message suitable for assistive-tech announcement. */\n readonly fileRejected = output<FileUploadRejection>();\n\n /** Fires when all files are cleared at once via programmatic `clear()`. Does not fire on `writeValue`, even when the new value is empty. */\n readonly cleared = output<void>();\n\n // ── Injections ──\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly destroyRef = inject(DestroyRef);\n private readonly ngControl = inject(NgControl, { optional: true, self: true });\n private readonly parentForm = inject(NgForm, { optional: true });\n private readonly parentFormGroup = inject(FormGroupDirective, { optional: true });\n private readonly defaultMatcher = inject(TW_ERROR_STATE_MATCHER);\n\n // ── Internal mutable state ──\n\n private readonly itemsSignal = signal<readonly FileUploadItem[]>([]);\n private readonly cvaDisabled = signal(false);\n private readonly isDraggingSignal = signal(false);\n private readonly dragHasInvalidFilesSignal = signal(false);\n private readonly _focused = signal(false);\n private readonly _ngControlRev = signal(0);\n private readonly _formSubmitRev = signal(0);\n private readonly describedByIdsSignal = signal<readonly string[]>([]);\n private readonly labelledByIdsSignal = signal<readonly string[]>([]);\n\n private dragCounter = 0;\n\n private onChange: (value: File[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n // ── Template refs ──\n\n /** @internal Captured custom-item template (from `*twFileUploadItem`). When absent, the default row template renders. */\n readonly itemSlot = contentChild(FileUploadItemDirective);\n\n /** @internal Dropzone wrapper — used to scope the form-field container-click guard. */\n private readonly dropzoneRef = viewChild<ElementRef<HTMLElement>>('dropzone');\n\n /** @internal The visible trigger button — the keyboard-operable control that receives focus on container click and after the last item is removed. */\n private readonly triggerRef = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n /** @internal Hidden native input — used as the OS picker trigger. */\n private readonly hiddenInputRef = viewChild<ElementRef<HTMLInputElement>>('hiddenInput');\n\n // ── Ids ──\n\n private readonly uid = nextHostId++;\n /** @internal Auto-generated host id used when `[id]` is not supplied. */\n readonly hostId = `tw-file-upload-${this.uid}`;\n /** @internal */\n readonly headlineId = `${this.hostId}-headline`;\n /** @internal */\n readonly descriptionId = `${this.hostId}-description`;\n /** @internal */\n readonly hiddenInputId = `${this.hostId}-input`;\n\n // ── Public readonly signals ──\n\n /** Current items with their progress and status. Snapshot of internal state. */\n readonly items: Signal<readonly FileUploadItem[]> = this.itemsSignal.asReadonly();\n\n /** True while a valid file drag is over the drop zone. */\n readonly isDragging: Signal<boolean> = this.isDraggingSignal.asReadonly();\n\n /** Convenience alias for `items().length`. Useful for counter hints. */\n readonly valueLength: Signal<number> = computed(() => this.itemsSignal().length);\n\n // ── FormFieldControl signals ──\n\n /** @internal */\n readonly id: Signal<string> = computed(() => this.idInput() ?? this.hostId);\n\n /** @internal */\n readonly value: Signal<File[] | null> = computed(() => {\n const list = this.itemsSignal();\n return list.length ? list.map((i) => i.file) : null;\n });\n\n /** @internal */\n readonly focused: Signal<boolean> = this._focused.asReadonly();\n\n /** @internal */\n readonly empty: Signal<boolean> = computed(() => this.itemsSignal().length === 0);\n\n /** @internal */\n readonly disabled: Signal<boolean> = computed(() => {\n this._ngControlRev();\n return this.disabledInput() || this.cvaDisabled() || !!this.ngControl?.disabled;\n });\n\n /** @internal */\n readonly required: Signal<boolean> = computed(() => {\n this._ngControlRev();\n if (this.requiredInput()) return true;\n const ctrl = this.ngControl?.control;\n return !!ctrl?.hasValidator(Validators.required);\n });\n\n /** @internal */\n readonly errorState: Signal<boolean> = computed(() => {\n this._ngControlRev();\n this._formSubmitRev();\n this._focused();\n const matcher = this.errorStateMatcher() ?? this.defaultMatcher;\n const form: TwFormSubmitted | null =\n (this.parentFormGroup as TwFormSubmitted | null) ??\n (this.parentForm as TwFormSubmitted | null);\n return matcher.isErrorState(this.ngControl?.control ?? null, form);\n });\n\n /** @internal Validation errors map from the bound `NgControl`. */\n override readonly errors = computed<Record<string, unknown> | null>(() => {\n this._ngControlRev();\n return (this.ngControl?.control?.errors as Record<string, unknown> | null) ?? null;\n });\n\n /** @internal */\n readonly controlType = 'file-upload';\n\n /** @internal */\n readonly userAriaDescribedBy: Signal<string | undefined> = computed(() =>\n this.ariaDescribedby(),\n );\n\n /** @internal */\n override readonly userAriaLabelledby: Signal<string | undefined> = computed(() =>\n this.ariaLabelledby(),\n );\n\n // ── Effective ARIA ──\n //\n // When wrapped by `<tw-form-field>`, the form-field calls `setDescribedByIds`\n // / `setLabelledByIds` with the FULLY MERGED id list (hint/error/label + the\n // consumer's `aria-*by` ids). In that case the pushed ids alone are the\n // source of truth. When standalone, fall back to the consumer-supplied\n // `aria-*by` input and the internal description id.\n\n /** @internal */\n readonly effectiveAriaLabelledby = computed(() => {\n const pushed = this.labelledByIdsSignal();\n if (pushed.length) return pushed.join(' ');\n return this.ariaLabelledby() || undefined;\n });\n\n /** @internal */\n readonly effectiveAriaDescribedby = computed(() => {\n const pushed = this.describedByIdsSignal();\n if (pushed.length) return pushed.join(' ');\n const merged: string[] = [];\n const external = this.ariaDescribedby();\n if (external) {\n for (const id of external.split(/\\s+/).filter(Boolean)) merged.push(id);\n }\n if (this.description()) merged.push(this.descriptionId);\n return merged.length ? merged.join(' ') : undefined;\n });\n\n // ── Variant computeds ──\n\n private readonly stateVariant = computed<'idle' | 'draggingValid' | 'draggingInvalid' | 'error'>(\n () => {\n if (this.disabled()) return 'idle';\n if (this.isDraggingSignal()) {\n return this.dragHasInvalidFilesSignal() ? 'draggingInvalid' : 'draggingValid';\n }\n if (this.errorState()) return 'error';\n return 'idle';\n },\n );\n\n private readonly variantResult = computed(() =>\n fileUploadVariants({\n variant: this.variant(),\n size: this.size(),\n state: this.stateVariant(),\n disabled: this.disabled(),\n }),\n );\n\n /** @internal */\n readonly rootClasses = computed(() => this.variantResult().root());\n /** @internal */\n readonly dropzoneClasses = computed(() => this.variantResult().dropzone());\n /** @internal */\n readonly dropzoneInnerClasses = computed(() => this.variantResult().dropzoneInner());\n /** @internal */\n readonly illustrationClasses = computed(() => this.variantResult().illustration());\n /** @internal */\n readonly headlineClasses = computed(() => this.variantResult().headline());\n /** @internal */\n readonly descriptionClasses = computed(() => this.variantResult().description());\n /** @internal */\n readonly listClasses = computed(() => this.variantResult().list());\n /** @internal */\n readonly itemClasses = computed(() => this.variantResult().item());\n /** @internal */\n readonly itemIconClasses = computed(() => this.variantResult().itemIcon());\n /** @internal */\n readonly itemBodyClasses = computed(() => this.variantResult().itemBody());\n /** @internal */\n readonly itemNameClasses = computed(() => this.variantResult().itemName());\n /** @internal */\n readonly itemMetaClasses = computed(() => this.variantResult().itemMeta());\n /** @internal */\n readonly itemProgressClasses = computed(() => this.variantResult().itemProgress());\n /** @internal */\n readonly itemActionsClasses = computed(() => this.variantResult().itemActions());\n\n /** @internal Mapping component size → icon size for the illustration. */\n readonly iconSize = computed<TwSize>(() => {\n const s = this.size();\n if (s === 'xs') return 'sm';\n if (s === 'sm') return 'md';\n if (s === 'md') return 'lg';\n return 'xl';\n });\n\n // ── Construction ──\n\n constructor() {\n super();\n // Runtime CVA wiring — incompatible with a static NG_VALUE_ACCESSOR provider\n // because `inject(NgControl, { self: true })` for matcher integration would\n // create a circular DI on the same element.\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n afterNextRender(() => {\n if (isDevMode() && !this.hasAccessibleNameHint()) {\n console.warn(\n '[tw-file-upload] The file-upload has no accessible name. Provide a `label`, project label content, or set `aria-label` / `aria-labelledby`.',\n );\n }\n });\n }\n\n // ── Public API ──\n\n /** Programmatically opens the OS file picker. No-op when disabled. */\n open(): void {\n if (this.disabled()) return;\n const input = this.hiddenInputRef()?.nativeElement;\n if (input) input.click();\n }\n\n /** Removes the item with the given id. Emits `fileRemoved`. No-op when the id is unknown or the component is disabled. */\n remove(id: string): void {\n if (this.disabled()) return;\n const current = this.itemsSignal();\n const idx = current.findIndex((i) => i.id === id);\n if (idx === -1) return;\n const removed = current[idx];\n const next = current.slice(0, idx).concat(current.slice(idx + 1));\n this.itemsSignal.set(next);\n this.emitChange();\n this.fileRemoved.emit(removed);\n this.liveAnnouncer.announce(`${removed.file.name} removed.`, 'polite');\n // Move focus to the next remove button, or to the trigger button when none remain.\n queueMicrotask(() => {\n const host = this.elementRef.nativeElement as HTMLElement;\n const nextButtons = host.querySelectorAll('[data-tw-file-upload-remove]');\n if (nextButtons.length === 0) {\n this.triggerRef()?.nativeElement.focus();\n } else {\n const fallback = nextButtons[Math.min(idx, nextButtons.length - 1)] as\n | HTMLButtonElement\n | undefined;\n fallback?.focus();\n }\n });\n }\n\n /** Removes all items. Emits `cleared` and calls `onChange([])`. No-op when already empty or disabled. */\n clear(): void {\n if (this.disabled()) return;\n if (this.itemsSignal().length === 0) return;\n this.itemsSignal.set([]);\n this.emitChange();\n this.cleared.emit();\n this.liveAnnouncer.announce('All files removed.', 'polite');\n }\n\n /** Updates the per-item progress (0–100, clamped). Does not change status. No-op when the id is unknown. */\n setItemProgress(id: string, percent: number): void {\n const clamped = clampPercent(percent);\n let found = false;\n const next = this.itemsSignal().map((item) => {\n if (item.id !== id) return item;\n found = true;\n if (item.progress === clamped) return item;\n return { ...item, progress: clamped };\n });\n if (found) this.itemsSignal.set(next);\n }\n\n /** Updates the per-item status and (optionally) the error message. Announces status transitions via `LiveAnnouncer`. No-op when the id is unknown. */\n setItemStatus(id: string, status: FileUploadStatus, error?: string): void {\n let target: FileUploadItem | undefined;\n let changed = false;\n const next = this.itemsSignal().map((item) => {\n if (item.id !== id) return item;\n target = item;\n const nextError = error !== undefined ? error : item.error;\n if (item.status === status && item.error === nextError) return item;\n changed = true;\n return { ...item, status, error: nextError };\n });\n if (!target) return;\n if (changed) this.itemsSignal.set(next);\n const name = target.file.name;\n if (status === 'success') {\n this.liveAnnouncer.announce(`${name} upload complete.`, 'polite');\n } else if (status === 'error') {\n this.liveAnnouncer.announce(\n error ? `${name} upload failed: ${error}.` : `${name} upload failed.`,\n 'polite',\n );\n } else if (status === 'uploading') {\n this.liveAnnouncer.announce(`${name} uploading.`, 'polite');\n }\n }\n\n // ── Drag-drop handlers ──\n\n /** @internal */\n onDragEnter(event: DragEvent): void {\n if (this.disabled()) return;\n if (!this.isFileDrag(event)) return;\n event.preventDefault();\n this.dragCounter += 1;\n if (this.dragCounter === 1) {\n this.dragHasInvalidFilesSignal.set(this.computeDragInvalid(event));\n this.isDraggingSignal.set(true);\n }\n }\n\n /** @internal */\n onDragOver(event: DragEvent): void {\n if (this.disabled()) return;\n if (!this.isFileDrag(event)) return;\n // Required to enable `drop` — browsers reject drops by default.\n event.preventDefault();\n }\n\n /** @internal */\n onDragLeave(event: DragEvent): void {\n if (this.disabled()) return;\n if (!this.isFileDrag(event)) return;\n if (this.dragCounter > 0) this.dragCounter -= 1;\n if (this.dragCounter === 0) {\n this.isDraggingSignal.set(false);\n this.dragHasInvalidFilesSignal.set(false);\n }\n }\n\n /** @internal */\n onDrop(event: DragEvent): void {\n if (this.disabled()) return;\n event.preventDefault();\n this.dragCounter = 0;\n this.isDraggingSignal.set(false);\n this.dragHasInvalidFilesSignal.set(false);\n const files = event.dataTransfer?.files;\n if (files && files.length) {\n this.addFiles(files);\n }\n }\n\n /** @internal */\n onTriggerClick(event: MouseEvent): void {\n event.stopPropagation();\n this.open();\n }\n\n /** @internal Called by the hidden `<input type=\"file\">` `change` event. */\n onNativeChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n const files = target.files;\n if (files && files.length) this.addFiles(files);\n // Reset so re-selecting the same file re-fires `change`.\n target.value = '';\n }\n\n // ── Add files (validation + commit) ──\n\n private addFiles(files: FileList | readonly File[]): void {\n if (this.disabled()) return;\n const incoming: File[] = Array.from(files);\n if (incoming.length === 0) return;\n\n // Single-file mode: replace existing entry with the latest file dropped/selected.\n if (!this.multiple()) {\n const file = incoming[0];\n if (!file) return;\n const patterns = parseAcceptList(this.accept());\n if (!matchesAccept(file, patterns)) {\n this.reject(file, 'accept');\n return;\n }\n const maxSize = this.maxSize();\n if (maxSize !== undefined && file.size > maxSize) {\n this.reject(file, 'size');\n return;\n }\n const newItem = this.wrapFile(file);\n this.itemsSignal.set([newItem]);\n this.emitChange();\n this.filesAdded.emit([newItem]);\n this.liveAnnouncer.announce('1 file added.', 'polite');\n return;\n }\n\n const patterns = parseAcceptList(this.accept());\n const maxSize = this.maxSize();\n const maxFiles = this.maxFiles();\n const accepted: FileUploadItem[] = [];\n const currentCount = this.itemsSignal().length;\n\n for (const file of incoming) {\n if (!matchesAccept(file, patterns)) {\n this.reject(file, 'accept');\n continue;\n }\n if (maxSize !== undefined && file.size > maxSize) {\n this.reject(file, 'size');\n continue;\n }\n if (maxFiles !== undefined && currentCount + accepted.length >= maxFiles) {\n this.reject(file, 'count');\n continue;\n }\n accepted.push(this.wrapFile(file));\n }\n\n if (accepted.length === 0) return;\n\n this.itemsSignal.set([...this.itemsSignal(), ...accepted]);\n this.emitChange();\n this.filesAdded.emit(accepted);\n this.liveAnnouncer.announce(\n `${accepted.length} file${accepted.length === 1 ? '' : 's'} added.`,\n 'polite',\n );\n }\n\n private wrapFile(file: File): FileUploadItem {\n return {\n id: `tw-file-upload-item-${nextItemSeq++}`,\n file,\n progress: 0,\n status: 'pending',\n };\n }\n\n private reject(file: File, reason: FileUploadRejectionReason): void {\n const message = this.rejectionMessage(file, reason);\n // Sequence per-file announcements so a batch of rejections is announced cleanly.\n setTimeout(() => this.liveAnnouncer.announce(message, 'polite'));\n this.fileRejected.emit({ file, reason, message });\n }\n\n private rejectionMessage(file: File, reason: FileUploadRejectionReason): string {\n if (reason === 'accept') return `${file.name} was rejected: file type not allowed.`;\n if (reason === 'size') {\n const max = this.maxSize();\n const limit = max !== undefined ? formatBytes(max) : 'allowed size';\n return `${file.name} was rejected: exceeds ${limit}.`;\n }\n return `${file.name} was rejected: maximum file count reached.`;\n }\n\n // ── Drag inspection ──\n\n private isFileDrag(event: DragEvent): boolean {\n const dt = event.dataTransfer;\n if (!dt) return false;\n // `types` includes 'Files' when files are being dragged from the OS.\n return Array.from(dt.types).includes('Files');\n }\n\n private computeDragInvalid(event: DragEvent): boolean {\n const patterns = parseAcceptList(this.accept());\n if (patterns.length === 0) return false;\n const items = event.dataTransfer?.items;\n if (!items || items.length === 0) return false;\n // During drag, filenames are not exposed — only MIME types via `items[i].type`.\n // Extension-only patterns (`.pdf`) can't be confirmed mid-drag, so we treat\n // the drag as potentially valid if ANY item could match by MIME or if the\n // accept list contains any extension-only pattern.\n const hasExtensionPattern = patterns.some((p) => p.startsWith('.'));\n if (hasExtensionPattern) return false;\n for (const item of Array.from(items)) {\n if (item.kind !== 'file') continue;\n const type = item.type.toLowerCase();\n for (const pattern of patterns) {\n if (pattern.endsWith('/*')) {\n if (type.startsWith(pattern.slice(0, -1))) return false;\n } else if (type === pattern) {\n return false;\n }\n }\n }\n return true;\n }\n\n // ── ControlValueAccessor ──\n\n writeValue(value: File[] | File | null | undefined): void {\n if (value === null || value === undefined) {\n if (this.itemsSignal().length === 0) return;\n this.itemsSignal.set([]);\n return;\n }\n const list: File[] = Array.isArray(value) ? value : [value];\n if (list.length === 0) {\n if (this.itemsSignal().length === 0) return;\n this.itemsSignal.set([]);\n return;\n }\n const current = this.itemsSignal();\n if (\n current.length === list.length &&\n current.every((item, idx) => item.file === list[idx])\n ) {\n return;\n }\n this.itemsSignal.set(list.map((file) => this.wrapFile(file)));\n }\n\n registerOnChange(fn: (value: File[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n private emitChange(): void {\n const files = this.itemsSignal().map((i) => i.file);\n this.onChange(files);\n }\n\n // ── FormFieldControl methods ──\n\n /** @internal */\n setDescribedByIds(ids: string[]): void {\n this.describedByIdsSignal.set([...ids]);\n }\n\n /** @internal */\n override setLabelledByIds(ids: string[]): void {\n this.labelledByIdsSignal.set([...ids]);\n }\n\n /** @internal */\n onContainerClick(event: MouseEvent): void {\n if (this.disabled()) return;\n if (event.defaultPrevented) return;\n const dropzone = this.dropzoneRef()?.nativeElement;\n if (!dropzone) return;\n const target = event.target as Node | null;\n if (target && dropzone.contains(target)) return;\n this.triggerRef()?.nativeElement.focus();\n }\n\n // ── Rendering helpers ──\n\n /** @internal */\n iconNameFor(item: FileUploadItem): string {\n return iconNameFor(item.file);\n }\n\n /** @internal */\n shouldShowProgress(item: FileUploadItem): boolean {\n if (item.status === 'pending' && item.progress === 0) return false;\n return true;\n }\n\n /** @internal */\n progressColorFor(item: FileUploadItem): 'primary' | 'success' | 'error' {\n if (item.status === 'error') return 'error';\n if (item.status === 'success' || item.progress >= 100) return 'success';\n return 'primary';\n }\n\n /** @internal */\n metaTextFor(item: FileUploadItem): string {\n const size = formatBytes(item.file.size);\n if (item.status === 'pending') return size;\n if (item.status === 'uploading') return `${size} · Uploading`;\n if (item.status === 'success') return `${size} · Done`;\n if (item.error) return `${size} · Failed — ${item.error}`;\n return `${size} · Failed`;\n }\n\n // ── Lifecycle ──\n\n ngOnInit(): void {\n const monitor$ = this.focusMonitor.monitor(this.elementRef, true);\n if (isObservable(monitor$)) {\n monitor$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((origin) => {\n const wasFocused = this._focused();\n this._focused.set(!!origin);\n if (wasFocused && !origin) {\n this.onTouched();\n this._ngControlRev.update((n) => n + 1);\n }\n });\n }\n this.destroyRef.onDestroy(() => {\n this.focusMonitor.stopMonitoring(this.elementRef);\n });\n\n const ctrl = this.ngControl?.control;\n if (ctrl) {\n const streams = [ctrl.statusChanges, ctrl.valueChanges].filter(\n (s): s is NonNullable<typeof s> => !!s,\n );\n if (streams.length) {\n merge(...streams)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._ngControlRev.update((n) => n + 1));\n }\n }\n\n const submit = this.parentFormGroup?.ngSubmit ?? this.parentForm?.ngSubmit;\n if (submit) {\n submit\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._formSubmitRev.update((n) => n + 1));\n }\n }\n\n // ── Helpers ──\n\n private hasAccessibleNameHint(): boolean {\n if (this.label() || this.ariaLabel() || this.ariaLabelledby()) return true;\n const host = this.elementRef.nativeElement;\n return !!host.textContent && host.textContent.trim().length > 0;\n }\n}\n","<input\n #hiddenInput\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n [id]=\"hiddenInputId\"\n [attr.aria-label]=\"ariaLabel() ?? label() ?? triggerLabel()\"\n [attr.name]=\"name() || null\"\n [attr.accept]=\"accept() || null\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n (change)=\"onNativeChange($event)\"\n/>\n\n<!-- The dropzone is a mouse click/drop convenience target, intentionally NOT a\n focusable control: the inner trigger <button> owns keyboard operability, so\n adding tabindex/keydown here would create a nested-interactive structure.\n No keyboard user is locked out, so the rules' concern does not apply. -->\n<!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n<div\n #dropzone\n [class]=\"dropzoneClasses()\"\n (click)=\"open()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <div [class]=\"dropzoneInnerClasses()\">\n <div [class]=\"illustrationClasses()\">\n <ng-content select=\"[twFileUploadIcon]\">\n <tw-icon name=\"upload-cloud\" [size]=\"iconSize()\" aria-hidden=\"true\" />\n </ng-content>\n </div>\n\n <span [id]=\"headlineId\" [class]=\"headlineClasses()\">\n <ng-content select=\"[twFileUploadHeadline]\">\n @if (label(); as l) {\n {{ l }}\n } @else {\n Drag files here or click to browse\n }\n </ng-content>\n </span>\n\n <span [id]=\"descriptionId\" [class]=\"descriptionClasses()\">\n <ng-content select=\"[twFileUploadDescription]\">\n @if (description(); as d) {\n {{ d }}\n }\n </ng-content>\n </span>\n\n <button\n #trigger\n type=\"button\"\n twButton\n variant=\"outline\"\n color=\"neutral\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [attr.aria-describedby]=\"effectiveAriaDescribedby() || null\"\n (click)=\"onTriggerClick($event)\"\n >\n {{ triggerLabel() }}\n </button>\n </div>\n</div>\n\n<ul [class]=\"listClasses()\" role=\"list\">\n @for (item of items(); track item.id) {\n <li>\n @if (itemSlot(); as slot) {\n <ng-container\n [ngTemplateOutlet]=\"slot.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item, item: item }\"\n />\n } @else {\n <div [class]=\"itemClasses()\">\n <tw-icon\n [name]=\"iconNameFor(item)\"\n size=\"md\"\n [class]=\"itemIconClasses()\"\n aria-hidden=\"true\"\n />\n <div [class]=\"itemBodyClasses()\">\n <span [class]=\"itemNameClasses()\">{{ item.file.name }}</span>\n <span [class]=\"itemMetaClasses()\">{{ metaTextFor(item) }}</span>\n @if (shouldShowProgress(item)) {\n <tw-progress-bar\n [class]=\"itemProgressClasses()\"\n [value]=\"item.progress\"\n size=\"sm\"\n [color]=\"progressColorFor(item)\"\n />\n }\n </div>\n <div [class]=\"itemActionsClasses()\">\n <button\n type=\"button\"\n twButton\n variant=\"ghost\"\n color=\"neutral\"\n size=\"sm\"\n data-tw-file-upload-remove\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"remove(item.id)\"\n >\n <tw-icon twButtonIcon name=\"x\" />\n </button>\n </div>\n </div>\n }\n </li>\n }\n</ul>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -77,15 +77,19 @@ class FlipCardComponent {
77
77
  * Defaults to `'outlined'` (vs `tw-card`'s `'elevated'` default) so the flip
78
78
  * animation reads more clearly without a baseline shadow underneath.
79
79
  */
80
- variant = input('outlined', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
80
+ variant = input('outlined', /* @ts-ignore */
81
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
81
82
  /** Axis of rotation. `'horizontal'` rotates around the Y axis (left/right flip); `'vertical'` rotates around the X axis (top/bottom flip). Defaults to `'horizontal'`. */
82
- direction = input('horizontal', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
83
+ direction = input('horizontal', /* @ts-ignore */
84
+ ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
83
85
  /** Which user action flips the card. `'both'` enables click and hover. `'manual'` disables all triggers and defers control to the `flipped` model. Defaults to `'both'`. */
84
- trigger = input('both', ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
86
+ trigger = input('both', /* @ts-ignore */
87
+ ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
85
88
  /** When true, all triggers and keyboard handling are disabled; the current face stays visible. Defaults to `false`. */
86
89
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
87
90
  /** Whether the back face is currently visible. Two-way bindable via `[(flipped)]`. Defaults to `false`. The `flippedChange` event fires on every toggle. */
88
- flipped = model(false, ...(ngDevMode ? [{ debugName: "flipped" }] : /* istanbul ignore next */ []));
91
+ flipped = model(false, /* @ts-ignore */
92
+ ...(ngDevMode ? [{ debugName: "flipped" }] : /* istanbul ignore next */ []));
89
93
  /**
90
94
  * Accessible name for the host element. Required when `trigger` is
91
95
  * `'manual'` (the host renders as `role="region"`, which AXE requires to
@@ -94,51 +98,70 @@ class FlipCardComponent {
94
98
  * name is normally derived from the visible face's content — set this
95
99
  * input to override.
96
100
  */
97
- ariaLabel = input(undefined, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
101
+ ariaLabel = input(undefined, /* @ts-ignore */
102
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
98
103
  liveAnnouncer = inject(LiveAnnouncer);
99
104
  destroyRef = inject(DestroyRef);
100
- backWrapper = viewChild('backWrapper', ...(ngDevMode ? [{ debugName: "backWrapper" }] : /* istanbul ignore next */ []));
101
- _hasBack = signal(false, ...(ngDevMode ? [{ debugName: "_hasBack" }] : /* istanbul ignore next */ []));
105
+ backWrapper = viewChild('backWrapper', /* @ts-ignore */
106
+ ...(ngDevMode ? [{ debugName: "backWrapper" }] : /* istanbul ignore next */ []));
107
+ _hasBack = signal(false, /* @ts-ignore */
108
+ ...(ngDevMode ? [{ debugName: "_hasBack" }] : /* istanbul ignore next */ []));
102
109
  /** @internal */
103
110
  hasBack = this._hasBack.asReadonly();
104
111
  /** @internal */
105
- interactive = computed(() => this.trigger() !== 'manual' && !this.disabled() && this.hasBack(), ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
112
+ interactive = computed(() => this.trigger() !== 'manual' && !this.disabled() && this.hasBack(), /* @ts-ignore */
113
+ ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
106
114
  /** @internal */
107
- hostRole = computed(() => this.trigger() === 'manual' ? 'region' : 'button', ...(ngDevMode ? [{ debugName: "hostRole" }] : /* istanbul ignore next */ []));
115
+ hostRole = computed(() => this.trigger() === 'manual' ? 'region' : 'button', /* @ts-ignore */
116
+ ...(ngDevMode ? [{ debugName: "hostRole" }] : /* istanbul ignore next */ []));
108
117
  /** @internal */
109
- hostTabindex = computed(() => (this.interactive() ? 0 : null), ...(ngDevMode ? [{ debugName: "hostTabindex" }] : /* istanbul ignore next */ []));
118
+ hostTabindex = computed(() => (this.interactive() ? 0 : null), /* @ts-ignore */
119
+ ...(ngDevMode ? [{ debugName: "hostTabindex" }] : /* istanbul ignore next */ []));
110
120
  /** @internal */
111
- ariaPressed = computed(() => this.interactive() ? String(this.flipped()) : null, ...(ngDevMode ? [{ debugName: "ariaPressed" }] : /* istanbul ignore next */ []));
121
+ ariaPressed = computed(() => this.interactive() ? String(this.flipped()) : null, /* @ts-ignore */
122
+ ...(ngDevMode ? [{ debugName: "ariaPressed" }] : /* istanbul ignore next */ []));
112
123
  /** @internal */
113
- ariaLive = computed(() => this.trigger() === 'manual' ? 'polite' : null, ...(ngDevMode ? [{ debugName: "ariaLive" }] : /* istanbul ignore next */ []));
124
+ ariaLive = computed(() => this.trigger() === 'manual' ? 'polite' : null, /* @ts-ignore */
125
+ ...(ngDevMode ? [{ debugName: "ariaLive" }] : /* istanbul ignore next */ []));
114
126
  /** @internal */
115
- ariaDisabled = computed(() => this.disabled() ? 'true' : null, ...(ngDevMode ? [{ debugName: "ariaDisabled" }] : /* istanbul ignore next */ []));
127
+ ariaDisabled = computed(() => this.disabled() ? 'true' : null, /* @ts-ignore */
128
+ ...(ngDevMode ? [{ debugName: "ariaDisabled" }] : /* istanbul ignore next */ []));
116
129
  /** @internal */
117
130
  hostAriaLabel = computed(() => {
118
131
  const explicit = this.ariaLabel();
119
132
  if (explicit !== undefined && explicit !== '')
120
133
  return explicit;
121
134
  return this.trigger() === 'manual' ? 'Flip card' : null;
122
- }, ...(ngDevMode ? [{ debugName: "hostAriaLabel" }] : /* istanbul ignore next */ []));
135
+ }, /* @ts-ignore */
136
+ ...(ngDevMode ? [{ debugName: "hostAriaLabel" }] : /* istanbul ignore next */ []));
123
137
  /** @internal */
124
- frontAriaHidden = computed(() => this.hasBack() && this.flipped() ? 'true' : null, ...(ngDevMode ? [{ debugName: "frontAriaHidden" }] : /* istanbul ignore next */ []));
138
+ frontAriaHidden = computed(() => this.hasBack() && this.flipped() ? 'true' : null, /* @ts-ignore */
139
+ ...(ngDevMode ? [{ debugName: "frontAriaHidden" }] : /* istanbul ignore next */ []));
125
140
  /** @internal */
126
- backAriaHidden = computed(() => !this.hasBack() || !this.flipped() ? 'true' : null, ...(ngDevMode ? [{ debugName: "backAriaHidden" }] : /* istanbul ignore next */ []));
141
+ backAriaHidden = computed(() => !this.hasBack() || !this.flipped() ? 'true' : null, /* @ts-ignore */
142
+ ...(ngDevMode ? [{ debugName: "backAriaHidden" }] : /* istanbul ignore next */ []));
127
143
  /** @internal */
128
- frontInert = computed(() => this.hasBack() && this.flipped() ? '' : null, ...(ngDevMode ? [{ debugName: "frontInert" }] : /* istanbul ignore next */ []));
144
+ frontInert = computed(() => this.hasBack() && this.flipped() ? '' : null, /* @ts-ignore */
145
+ ...(ngDevMode ? [{ debugName: "frontInert" }] : /* istanbul ignore next */ []));
129
146
  /** @internal */
130
- backInert = computed(() => !this.hasBack() || !this.flipped() ? '' : null, ...(ngDevMode ? [{ debugName: "backInert" }] : /* istanbul ignore next */ []));
147
+ backInert = computed(() => !this.hasBack() || !this.flipped() ? '' : null, /* @ts-ignore */
148
+ ...(ngDevMode ? [{ debugName: "backInert" }] : /* istanbul ignore next */ []));
131
149
  variantResult = computed(() => flipCardVariants({
132
150
  variant: this.variant(),
133
151
  direction: this.direction(),
134
152
  flipped: this.flipped(),
135
153
  interactive: this.interactive(),
136
154
  disabled: this.disabled(),
137
- }), ...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
138
- rootClasses = computed(() => this.variantResult().root(), ...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
139
- innerClasses = computed(() => this.variantResult().inner(), ...(ngDevMode ? [{ debugName: "innerClasses" }] : /* istanbul ignore next */ []));
140
- frontClasses = computed(() => `${this.variantResult().face()} ${this.variantResult().front()}`, ...(ngDevMode ? [{ debugName: "frontClasses" }] : /* istanbul ignore next */ []));
141
- backClasses = computed(() => `${this.variantResult().face()} ${this.variantResult().back()}`, ...(ngDevMode ? [{ debugName: "backClasses" }] : /* istanbul ignore next */ []));
155
+ }), /* @ts-ignore */
156
+ ...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
157
+ rootClasses = computed(() => this.variantResult().root(), /* @ts-ignore */
158
+ ...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
159
+ innerClasses = computed(() => this.variantResult().inner(), /* @ts-ignore */
160
+ ...(ngDevMode ? [{ debugName: "innerClasses" }] : /* istanbul ignore next */ []));
161
+ frontClasses = computed(() => `${this.variantResult().face()} ${this.variantResult().front()}`, /* @ts-ignore */
162
+ ...(ngDevMode ? [{ debugName: "frontClasses" }] : /* istanbul ignore next */ []));
163
+ backClasses = computed(() => `${this.variantResult().face()} ${this.variantResult().back()}`, /* @ts-ignore */
164
+ ...(ngDevMode ? [{ debugName: "backClasses" }] : /* istanbul ignore next */ []));
142
165
  constructor() {
143
166
  // `MutationObserver` (not `contentChild`) because the spec exercises
144
167
  // *dynamic* projection toggled by an `@if` in the host template
@@ -218,8 +241,8 @@ class FlipCardComponent {
218
241
  return;
219
242
  this.flipped.set(next);
220
243
  }
221
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: FlipCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
222
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.14", type: FlipCardComponent, isStandalone: true, selector: "tw-flip-card", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, flipped: { classPropertyName: "flipped", publicName: "flipped", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { flipped: "flippedChange" }, host: { listeners: { "click": "onClick()", "keydown": "onKeydown($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" }, properties: { "class": "rootClasses()", "attr.role": "hostRole()", "attr.tabindex": "hostTabindex()", "attr.aria-pressed": "ariaPressed()", "attr.aria-live": "ariaLive()", "attr.aria-disabled": "ariaDisabled()", "attr.aria-label": "hostAriaLabel()" } }, viewQueries: [{ propertyName: "backWrapper", first: true, predicate: ["backWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: `
244
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: FlipCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
245
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.7", type: FlipCardComponent, isStandalone: true, selector: "tw-flip-card", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, flipped: { classPropertyName: "flipped", publicName: "flipped", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { flipped: "flippedChange" }, host: { listeners: { "click": "onClick()", "keydown": "onKeydown($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" }, properties: { "class": "rootClasses()", "attr.role": "hostRole()", "attr.tabindex": "hostTabindex()", "attr.aria-pressed": "ariaPressed()", "attr.aria-live": "ariaLive()", "attr.aria-disabled": "ariaDisabled()", "attr.aria-label": "hostAriaLabel()" } }, viewQueries: [{ propertyName: "backWrapper", first: true, predicate: ["backWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: `
223
246
  <div [class]="innerClasses()">
224
247
  <div
225
248
  [class]="frontClasses()"
@@ -240,7 +263,7 @@ class FlipCardComponent {
240
263
  </div>
241
264
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
242
265
  }
243
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: FlipCardComponent, decorators: [{
266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: FlipCardComponent, decorators: [{
244
267
  type: Component,
245
268
  args: [{
246
269
  selector: 'tw-flip-card',
@@ -1 +1 @@
1
- {"version":3,"file":"cdevhub-ngx-tw-flip-card.mjs","sources":["../../../projects/ngx-tw/flip-card/flip-card.ts","../../../projects/ngx-tw/flip-card/cdevhub-ngx-tw-flip-card.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n type ElementRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\n\n/** Visual style of the flip card chrome. Mirrors `tw-card`. */\nexport type FlipCardVariant = 'outlined' | 'elevated' | 'ghost';\n\n/** Axis of rotation for the flip animation. */\nexport type FlipCardDirection = 'horizontal' | 'vertical';\n\n/** Which user interaction flips the card. */\nexport type FlipCardTrigger = 'hover' | 'click' | 'manual' | 'both';\n\n// ── tv() config ──\n\nconst flipCardVariants = tv(\n {\n slots: {\n root:\n 'relative block rounded-lg transition-shadow duration-normal motion-reduce:transition-none tw-flip-perspective',\n inner:\n 'relative h-full w-full tw-flip-inner transition-transform duration-300 ease-in-out motion-reduce:transition-none',\n face:\n 'absolute inset-0 h-full w-full rounded-lg overflow-hidden tw-flip-face',\n front: '',\n back: 'tw-flip-back-face',\n },\n variants: {\n variant: {\n outlined: {\n face: 'bg-surface border border-border text-fg',\n },\n elevated: {\n face: 'bg-surface-raised shadow text-fg',\n root: 'hover:shadow-md',\n },\n ghost: {\n face: 'bg-transparent text-fg',\n },\n },\n direction: {\n horizontal: {\n inner: 'tw-flip-axis-y',\n back: 'tw-flip-back-y',\n },\n vertical: {\n inner: 'tw-flip-axis-x',\n back: 'tw-flip-back-x',\n },\n },\n flipped: {\n true: { inner: 'tw-flip-rotated' },\n false: {},\n },\n interactive: {\n true: {\n root:\n 'cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n false: {},\n },\n disabled: {\n true: { root: 'opacity-50 cursor-not-allowed' },\n false: {},\n },\n },\n defaultVariants: {\n variant: 'outlined',\n direction: 'horizontal',\n flipped: false,\n interactive: true,\n disabled: false,\n },\n },\n { twMerge: true },\n);\n\n/**\n * Two-faced card with a CSS 3D-perspective flip animation.\n *\n * @remarks\n * **Hard theme dependency.** The flip animation is driven by helper classes\n * (`tw-flip-perspective`, `tw-flip-inner`, `tw-flip-face`, `tw-flip-back-face`,\n * `tw-flip-axis-x`, `tw-flip-axis-y`, `tw-flip-rotated`, `tw-flip-back-x`,\n * `tw-flip-back-y`) declared in `projects/ngx-tw/theme/_base.css` and re-exported\n * via `ngx-tw/theme/default.css`. Consumers MUST import the theme stylesheet —\n * without it the card renders as two stacked faces with no perspective and no\n * rotation, and there is no run-time fallback. `prefers-reduced-motion: reduce`\n * is handled in the theme CSS, not here.\n */\n@Component({\n selector: 'tw-flip-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n '[attr.role]': 'hostRole()',\n '[attr.tabindex]': 'hostTabindex()',\n '[attr.aria-pressed]': 'ariaPressed()',\n '[attr.aria-live]': 'ariaLive()',\n '[attr.aria-disabled]': 'ariaDisabled()',\n '[attr.aria-label]': 'hostAriaLabel()',\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n template: `\n <div [class]=\"innerClasses()\">\n <div\n [class]=\"frontClasses()\"\n [attr.aria-hidden]=\"frontAriaHidden()\"\n [attr.inert]=\"frontInert()\"\n >\n <ng-content select=\"[slot='front']\" />\n </div>\n <div\n #backWrapper\n [class]=\"backClasses()\"\n [class.hidden]=\"!hasBack()\"\n [attr.aria-hidden]=\"backAriaHidden()\"\n [attr.inert]=\"backInert()\"\n >\n <ng-content select=\"[slot='back']\" />\n </div>\n </div>\n `,\n})\nexport class FlipCardComponent {\n /**\n * Visual style of the card chrome. Mirrors `tw-card`'s variant vocabulary.\n * Defaults to `'outlined'` (vs `tw-card`'s `'elevated'` default) so the flip\n * animation reads more clearly without a baseline shadow underneath.\n */\n readonly variant = input<FlipCardVariant>('outlined');\n\n /** Axis of rotation. `'horizontal'` rotates around the Y axis (left/right flip); `'vertical'` rotates around the X axis (top/bottom flip). Defaults to `'horizontal'`. */\n readonly direction = input<FlipCardDirection>('horizontal');\n\n /** Which user action flips the card. `'both'` enables click and hover. `'manual'` disables all triggers and defers control to the `flipped` model. Defaults to `'both'`. */\n readonly trigger = input<FlipCardTrigger>('both');\n\n /** When true, all triggers and keyboard handling are disabled; the current face stays visible. Defaults to `false`. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Whether the back face is currently visible. Two-way bindable via `[(flipped)]`. Defaults to `false`. The `flippedChange` event fires on every toggle. */\n readonly flipped = model(false);\n\n /**\n * Accessible name for the host element. Required when `trigger` is\n * `'manual'` (the host renders as `role=\"region\"`, which AXE requires to\n * have an accessible name); a default of `'Flip card'` is used in that\n * mode if no value is provided. In interactive modes the host's accessible\n * name is normally derived from the visible face's content — set this\n * input to override.\n */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly destroyRef = inject(DestroyRef);\n private readonly backWrapper = viewChild<ElementRef<HTMLElement>>('backWrapper');\n\n private readonly _hasBack = signal(false);\n /** @internal */\n readonly hasBack = this._hasBack.asReadonly();\n\n /** @internal */\n readonly interactive = computed(\n () => this.trigger() !== 'manual' && !this.disabled() && this.hasBack(),\n );\n\n /** @internal */\n readonly hostRole = computed(() =>\n this.trigger() === 'manual' ? 'region' : 'button',\n );\n\n /** @internal */\n readonly hostTabindex = computed(() => (this.interactive() ? 0 : null));\n\n /** @internal */\n readonly ariaPressed = computed(() =>\n this.interactive() ? String(this.flipped()) : null,\n );\n\n /** @internal */\n readonly ariaLive = computed(() =>\n this.trigger() === 'manual' ? 'polite' : null,\n );\n\n /** @internal */\n readonly ariaDisabled = computed(() =>\n this.disabled() ? 'true' : null,\n );\n\n /** @internal */\n readonly hostAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit !== undefined && explicit !== '') return explicit;\n return this.trigger() === 'manual' ? 'Flip card' : null;\n });\n\n /** @internal */\n readonly frontAriaHidden = computed(() =>\n this.hasBack() && this.flipped() ? 'true' : null,\n );\n\n /** @internal */\n readonly backAriaHidden = computed(() =>\n !this.hasBack() || !this.flipped() ? 'true' : null,\n );\n\n /** @internal */\n readonly frontInert = computed(() =>\n this.hasBack() && this.flipped() ? '' : null,\n );\n\n /** @internal */\n readonly backInert = computed(() =>\n !this.hasBack() || !this.flipped() ? '' : null,\n );\n\n private readonly variantResult = computed(() =>\n flipCardVariants({\n variant: this.variant(),\n direction: this.direction(),\n flipped: this.flipped(),\n interactive: this.interactive(),\n disabled: this.disabled(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly innerClasses = computed(() => this.variantResult().inner());\n readonly frontClasses = computed(\n () => `${this.variantResult().face()} ${this.variantResult().front()}`,\n );\n readonly backClasses = computed(\n () => `${this.variantResult().face()} ${this.variantResult().back()}`,\n );\n\n constructor() {\n // `MutationObserver` (not `contentChild`) because the spec exercises\n // *dynamic* projection toggled by an `@if` in the host template\n // (see `DynamicBackHost` in flip-card.spec.ts). `contentChild` resolves\n // the parent's own content children — it does NOT see elements projected\n // *through* the host via `<ng-content select=\"[slot='back']\" />`. The\n // observer is single-target and listens only for `childList` on the back\n // wrapper, so the cost is bounded and the disconnect runs on destroy.\n afterNextRender(() => {\n const el = this.backWrapper()?.nativeElement;\n if (!el) return;\n const update = () => this._hasBack.set(el.childElementCount > 0);\n update();\n const observer = new MutationObserver(update);\n observer.observe(el, { childList: true });\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n\n let firstRun = true;\n effect(() => {\n const isFlipped = this.flipped();\n if (firstRun) {\n firstRun = false;\n return;\n }\n // Announce in any mode that exposes a flippable back face. Manual mode\n // historically owned this because it sets `aria-live='polite'` on the\n // host; interactive modes (hover, click, both) still need an explicit\n // `LiveAnnouncer.announce` so screen-reader users hear the transition\n // when triggering the card via keyboard or pointer.\n if (this.hasBack()) {\n this.liveAnnouncer.announce(\n isFlipped ? 'Back face visible' : 'Front face visible',\n );\n }\n });\n }\n\n /** @internal */\n onClick(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t === 'manual') return;\n this.toggle();\n }\n\n /** @internal */\n onKeydown(event: KeyboardEvent): void {\n if (!this.interactive()) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggle();\n }\n }\n\n /** @internal */\n onMouseEnter(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t !== 'hover' && t !== 'both') return;\n this.setFlipped(true);\n }\n\n /** @internal */\n onMouseLeave(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t !== 'hover' && t !== 'both') return;\n this.setFlipped(false);\n }\n\n private toggle(): void {\n this.setFlipped(!this.flipped());\n }\n\n private setFlipped(next: boolean): void {\n if (this.flipped() === next) return;\n this.flipped.set(next);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AA2BA;AAEA,MAAM,gBAAgB,GAAG,EAAE,CACzB;AACE,IAAA,KAAK,EAAE;AACL,QAAA,IAAI,EACF,+GAA+G;AACjH,QAAA,KAAK,EACH,kHAAkH;AACpH,QAAA,IAAI,EACF,wEAAwE;AAC1E,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,IAAI,EAAE,mBAAmB;AAC1B,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,QAAQ,EAAE;AACR,gBAAA,IAAI,EAAE,yCAAyC;AAChD,aAAA;AACD,YAAA,QAAQ,EAAE;AACR,gBAAA,IAAI,EAAE,kCAAkC;AACxC,gBAAA,IAAI,EAAE,iBAAiB;AACxB,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE,wBAAwB;AAC/B,aAAA;AACF,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,UAAU,EAAE;AACV,gBAAA,KAAK,EAAE,gBAAgB;AACvB,gBAAA,IAAI,EAAE,gBAAgB;AACvB,aAAA;AACD,YAAA,QAAQ,EAAE;AACR,gBAAA,KAAK,EAAE,gBAAgB;AACvB,gBAAA,IAAI,EAAE,gBAAgB;AACvB,aAAA;AACF,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE;AAClC,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACD,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE;AACJ,gBAAA,IAAI,EACF,yGAAyG;AAC5G,aAAA;AACD,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE;AAC/C,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACF,CAAA,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;AAED;;;;;;;;;;;;AAYG;MAsCU,iBAAiB,CAAA;AAC5B;;;;AAIG;AACM,IAAA,OAAO,GAAG,KAAK,CAAkB,UAAU,8EAAC;;AAG5C,IAAA,SAAS,GAAG,KAAK,CAAoB,YAAY,gFAAC;;AAGlD,IAAA,OAAO,GAAG,KAAK,CAAkB,MAAM,8EAAC;;IAGxC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAGxD,IAAA,OAAO,GAAG,KAAK,CAAC,KAAK,8EAAC;AAE/B;;;;;;;AAOG;AACM,IAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,gFAAC;AAExC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,WAAW,GAAG,SAAS,CAA0B,aAAa,kFAAC;AAE/D,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;;AAEhC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;IAGpC,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACxE;;IAGQ,QAAQ,GAAG,QAAQ,CAAC,MAC3B,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAClD;;IAGQ,YAAY,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;IAG9D,WAAW,GAAG,QAAQ,CAAC,MAC9B,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACnD;;IAGQ,QAAQ,GAAG,QAAQ,CAAC,MAC3B,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,GAAG,QAAQ,GAAG,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC9C;;AAGQ,IAAA,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,GAAG,IAAI,mFAChC;;AAGQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE;AACjC,QAAA,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;AAAE,YAAA,OAAO,QAAQ;AAC9D,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,GAAG,WAAW,GAAG,IAAI;AACzD,IAAA,CAAC,oFAAC;;IAGO,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACjD;;IAGQ,cAAc,GAAG,QAAQ,CAAC,MACjC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACnD;;IAGQ,UAAU,GAAG,QAAQ,CAAC,MAC7B,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC7C;;IAGQ,SAAS,GAAG,QAAQ,CAAC,MAC5B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC/C;AAEgB,IAAA,aAAa,GAAG,QAAQ,CAAC,MACxC,gBAAgB,CAAC;AACf,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,QAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,QAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,KAAA,CAAC,oFACH;AAEQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,kFAAC;AACzD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,mFAAC;IAC3D,YAAY,GAAG,QAAQ,CAC9B,MAAM,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,CAAA,CAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACvE;IACQ,WAAW,GAAG,QAAQ,CAC7B,MAAM,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAA,CAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtE;AAED,IAAA,WAAA,GAAA;;;;;;;;QAQE,eAAe,CAAC,MAAK;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa;AAC5C,YAAA,IAAI,CAAC,EAAE;gBAAE;AACT,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAChE,YAAA,MAAM,EAAE;AACR,YAAA,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC;YAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACzC,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;AACxD,QAAA,CAAC,CAAC;QAEF,IAAI,QAAQ,GAAG,IAAI;QACnB,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE;YAChC,IAAI,QAAQ,EAAE;gBACZ,QAAQ,GAAG,KAAK;gBAChB;YACF;;;;;;AAMA,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClB,gBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CACzB,SAAS,GAAG,mBAAmB,GAAG,oBAAoB,CACvD;YACH;AACF,QAAA,CAAC,CAAC;IACJ;;IAGA,OAAO,GAAA;QACL,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACxC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,IAAI,CAAC,KAAK,QAAQ;YAAE;QACpB,IAAI,CAAC,MAAM,EAAE;IACf;;AAGA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;AACzB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,MAAM,EAAE;QACf;IACF;;IAGA,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACxC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,MAAM;YAAE;AACnC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IACvB;;IAGA,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACxC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,MAAM;YAAE;AACnC,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IACxB;IAEQ,MAAM,GAAA;QACZ,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC;AAEQ,IAAA,UAAU,CAAC,IAAa,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI;YAAE;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;wGA9LW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,WAAA,EAAA,YAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArBlB;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBArC7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;oBACxB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,aAAa,EAAE,YAAY;AAC3B,wBAAA,iBAAiB,EAAE,gBAAgB;AACnC,wBAAA,qBAAqB,EAAE,eAAe;AACtC,wBAAA,kBAAkB,EAAE,YAAY;AAChC,wBAAA,sBAAsB,EAAE,gBAAgB;AACxC,wBAAA,mBAAmB,EAAE,iBAAiB;AACtC,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,cAAc,EAAE,gBAAgB;AACjC,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA;AACF,iBAAA;+sBAiCmE,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC7KjF;;AAEG;;;;"}
1
+ {"version":3,"file":"cdevhub-ngx-tw-flip-card.mjs","sources":["../../../projects/ngx-tw/flip-card/flip-card.ts","../../../projects/ngx-tw/flip-card/cdevhub-ngx-tw-flip-card.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n type ElementRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\n\n/** Visual style of the flip card chrome. Mirrors `tw-card`. */\nexport type FlipCardVariant = 'outlined' | 'elevated' | 'ghost';\n\n/** Axis of rotation for the flip animation. */\nexport type FlipCardDirection = 'horizontal' | 'vertical';\n\n/** Which user interaction flips the card. */\nexport type FlipCardTrigger = 'hover' | 'click' | 'manual' | 'both';\n\n// ── tv() config ──\n\nconst flipCardVariants = tv(\n {\n slots: {\n root:\n 'relative block rounded-lg transition-shadow duration-normal motion-reduce:transition-none tw-flip-perspective',\n inner:\n 'relative h-full w-full tw-flip-inner transition-transform duration-300 ease-in-out motion-reduce:transition-none',\n face:\n 'absolute inset-0 h-full w-full rounded-lg overflow-hidden tw-flip-face',\n front: '',\n back: 'tw-flip-back-face',\n },\n variants: {\n variant: {\n outlined: {\n face: 'bg-surface border border-border text-fg',\n },\n elevated: {\n face: 'bg-surface-raised shadow text-fg',\n root: 'hover:shadow-md',\n },\n ghost: {\n face: 'bg-transparent text-fg',\n },\n },\n direction: {\n horizontal: {\n inner: 'tw-flip-axis-y',\n back: 'tw-flip-back-y',\n },\n vertical: {\n inner: 'tw-flip-axis-x',\n back: 'tw-flip-back-x',\n },\n },\n flipped: {\n true: { inner: 'tw-flip-rotated' },\n false: {},\n },\n interactive: {\n true: {\n root:\n 'cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n false: {},\n },\n disabled: {\n true: { root: 'opacity-50 cursor-not-allowed' },\n false: {},\n },\n },\n defaultVariants: {\n variant: 'outlined',\n direction: 'horizontal',\n flipped: false,\n interactive: true,\n disabled: false,\n },\n },\n { twMerge: true },\n);\n\n/**\n * Two-faced card with a CSS 3D-perspective flip animation.\n *\n * @remarks\n * **Hard theme dependency.** The flip animation is driven by helper classes\n * (`tw-flip-perspective`, `tw-flip-inner`, `tw-flip-face`, `tw-flip-back-face`,\n * `tw-flip-axis-x`, `tw-flip-axis-y`, `tw-flip-rotated`, `tw-flip-back-x`,\n * `tw-flip-back-y`) declared in `projects/ngx-tw/theme/_base.css` and re-exported\n * via `ngx-tw/theme/default.css`. Consumers MUST import the theme stylesheet —\n * without it the card renders as two stacked faces with no perspective and no\n * rotation, and there is no run-time fallback. `prefers-reduced-motion: reduce`\n * is handled in the theme CSS, not here.\n */\n@Component({\n selector: 'tw-flip-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n '[attr.role]': 'hostRole()',\n '[attr.tabindex]': 'hostTabindex()',\n '[attr.aria-pressed]': 'ariaPressed()',\n '[attr.aria-live]': 'ariaLive()',\n '[attr.aria-disabled]': 'ariaDisabled()',\n '[attr.aria-label]': 'hostAriaLabel()',\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n template: `\n <div [class]=\"innerClasses()\">\n <div\n [class]=\"frontClasses()\"\n [attr.aria-hidden]=\"frontAriaHidden()\"\n [attr.inert]=\"frontInert()\"\n >\n <ng-content select=\"[slot='front']\" />\n </div>\n <div\n #backWrapper\n [class]=\"backClasses()\"\n [class.hidden]=\"!hasBack()\"\n [attr.aria-hidden]=\"backAriaHidden()\"\n [attr.inert]=\"backInert()\"\n >\n <ng-content select=\"[slot='back']\" />\n </div>\n </div>\n `,\n})\nexport class FlipCardComponent {\n /**\n * Visual style of the card chrome. Mirrors `tw-card`'s variant vocabulary.\n * Defaults to `'outlined'` (vs `tw-card`'s `'elevated'` default) so the flip\n * animation reads more clearly without a baseline shadow underneath.\n */\n readonly variant = input<FlipCardVariant>('outlined');\n\n /** Axis of rotation. `'horizontal'` rotates around the Y axis (left/right flip); `'vertical'` rotates around the X axis (top/bottom flip). Defaults to `'horizontal'`. */\n readonly direction = input<FlipCardDirection>('horizontal');\n\n /** Which user action flips the card. `'both'` enables click and hover. `'manual'` disables all triggers and defers control to the `flipped` model. Defaults to `'both'`. */\n readonly trigger = input<FlipCardTrigger>('both');\n\n /** When true, all triggers and keyboard handling are disabled; the current face stays visible. Defaults to `false`. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Whether the back face is currently visible. Two-way bindable via `[(flipped)]`. Defaults to `false`. The `flippedChange` event fires on every toggle. */\n readonly flipped = model(false);\n\n /**\n * Accessible name for the host element. Required when `trigger` is\n * `'manual'` (the host renders as `role=\"region\"`, which AXE requires to\n * have an accessible name); a default of `'Flip card'` is used in that\n * mode if no value is provided. In interactive modes the host's accessible\n * name is normally derived from the visible face's content — set this\n * input to override.\n */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly destroyRef = inject(DestroyRef);\n private readonly backWrapper = viewChild<ElementRef<HTMLElement>>('backWrapper');\n\n private readonly _hasBack = signal(false);\n /** @internal */\n readonly hasBack = this._hasBack.asReadonly();\n\n /** @internal */\n readonly interactive = computed(\n () => this.trigger() !== 'manual' && !this.disabled() && this.hasBack(),\n );\n\n /** @internal */\n readonly hostRole = computed(() =>\n this.trigger() === 'manual' ? 'region' : 'button',\n );\n\n /** @internal */\n readonly hostTabindex = computed(() => (this.interactive() ? 0 : null));\n\n /** @internal */\n readonly ariaPressed = computed(() =>\n this.interactive() ? String(this.flipped()) : null,\n );\n\n /** @internal */\n readonly ariaLive = computed(() =>\n this.trigger() === 'manual' ? 'polite' : null,\n );\n\n /** @internal */\n readonly ariaDisabled = computed(() =>\n this.disabled() ? 'true' : null,\n );\n\n /** @internal */\n readonly hostAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit !== undefined && explicit !== '') return explicit;\n return this.trigger() === 'manual' ? 'Flip card' : null;\n });\n\n /** @internal */\n readonly frontAriaHidden = computed(() =>\n this.hasBack() && this.flipped() ? 'true' : null,\n );\n\n /** @internal */\n readonly backAriaHidden = computed(() =>\n !this.hasBack() || !this.flipped() ? 'true' : null,\n );\n\n /** @internal */\n readonly frontInert = computed(() =>\n this.hasBack() && this.flipped() ? '' : null,\n );\n\n /** @internal */\n readonly backInert = computed(() =>\n !this.hasBack() || !this.flipped() ? '' : null,\n );\n\n private readonly variantResult = computed(() =>\n flipCardVariants({\n variant: this.variant(),\n direction: this.direction(),\n flipped: this.flipped(),\n interactive: this.interactive(),\n disabled: this.disabled(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly innerClasses = computed(() => this.variantResult().inner());\n readonly frontClasses = computed(\n () => `${this.variantResult().face()} ${this.variantResult().front()}`,\n );\n readonly backClasses = computed(\n () => `${this.variantResult().face()} ${this.variantResult().back()}`,\n );\n\n constructor() {\n // `MutationObserver` (not `contentChild`) because the spec exercises\n // *dynamic* projection toggled by an `@if` in the host template\n // (see `DynamicBackHost` in flip-card.spec.ts). `contentChild` resolves\n // the parent's own content children — it does NOT see elements projected\n // *through* the host via `<ng-content select=\"[slot='back']\" />`. The\n // observer is single-target and listens only for `childList` on the back\n // wrapper, so the cost is bounded and the disconnect runs on destroy.\n afterNextRender(() => {\n const el = this.backWrapper()?.nativeElement;\n if (!el) return;\n const update = () => this._hasBack.set(el.childElementCount > 0);\n update();\n const observer = new MutationObserver(update);\n observer.observe(el, { childList: true });\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n\n let firstRun = true;\n effect(() => {\n const isFlipped = this.flipped();\n if (firstRun) {\n firstRun = false;\n return;\n }\n // Announce in any mode that exposes a flippable back face. Manual mode\n // historically owned this because it sets `aria-live='polite'` on the\n // host; interactive modes (hover, click, both) still need an explicit\n // `LiveAnnouncer.announce` so screen-reader users hear the transition\n // when triggering the card via keyboard or pointer.\n if (this.hasBack()) {\n this.liveAnnouncer.announce(\n isFlipped ? 'Back face visible' : 'Front face visible',\n );\n }\n });\n }\n\n /** @internal */\n onClick(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t === 'manual') return;\n this.toggle();\n }\n\n /** @internal */\n onKeydown(event: KeyboardEvent): void {\n if (!this.interactive()) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggle();\n }\n }\n\n /** @internal */\n onMouseEnter(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t !== 'hover' && t !== 'both') return;\n this.setFlipped(true);\n }\n\n /** @internal */\n onMouseLeave(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t !== 'hover' && t !== 'both') return;\n this.setFlipped(false);\n }\n\n private toggle(): void {\n this.setFlipped(!this.flipped());\n }\n\n private setFlipped(next: boolean): void {\n if (this.flipped() === next) return;\n this.flipped.set(next);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AA2BA;AAEA,MAAM,gBAAgB,GAAG,EAAE,CACzB;AACE,IAAA,KAAK,EAAE;AACL,QAAA,IAAI,EACF,+GAA+G;AACjH,QAAA,KAAK,EACH,kHAAkH;AACpH,QAAA,IAAI,EACF,wEAAwE;AAC1E,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,IAAI,EAAE,mBAAmB;AAC1B,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,QAAQ,EAAE;AACR,gBAAA,IAAI,EAAE,yCAAyC;AAChD,aAAA;AACD,YAAA,QAAQ,EAAE;AACR,gBAAA,IAAI,EAAE,kCAAkC;AACxC,gBAAA,IAAI,EAAE,iBAAiB;AACxB,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE,wBAAwB;AAC/B,aAAA;AACF,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,UAAU,EAAE;AACV,gBAAA,KAAK,EAAE,gBAAgB;AACvB,gBAAA,IAAI,EAAE,gBAAgB;AACvB,aAAA;AACD,YAAA,QAAQ,EAAE;AACR,gBAAA,KAAK,EAAE,gBAAgB;AACvB,gBAAA,IAAI,EAAE,gBAAgB;AACvB,aAAA;AACF,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE;AAClC,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACD,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE;AACJ,gBAAA,IAAI,EACF,yGAAyG;AAC5G,aAAA;AACD,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE;AAC/C,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACF,CAAA,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;AAED;;;;;;;;;;;;AAYG;MAsCU,iBAAiB,CAAA;AAC5B;;;;AAIG;IACM,OAAO,GAAG,KAAK,CAAkB,UAAU;gFAAC;;IAG5C,SAAS,GAAG,KAAK,CAAoB,YAAY;kFAAC;;IAGlD,OAAO,GAAG,KAAK,CAAkB,MAAM;gFAAC;;IAGxC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGxD,OAAO,GAAG,KAAK,CAAC,KAAK;gFAAC;AAE/B;;;;;;;AAOG;IACM,SAAS,GAAG,KAAK,CAAqB,SAAS;kFAAC;AAExC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/B,WAAW,GAAG,SAAS,CAA0B,aAAa;oFAAC;IAE/D,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;;AAEhC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;IAGpC,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;oFACxE;;AAGQ,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAC3B,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ;iFAClD;;AAGQ,IAAA,YAAY,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;qFAAC;;IAG9D,WAAW,GAAG,QAAQ,CAAC,MAC9B,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI;oFACnD;;AAGQ,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAC3B,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,GAAG,QAAQ,GAAG,IAAI;iFAC9C;;AAGQ,IAAA,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,GAAG,IAAI;qFAChC;;AAGQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE;AACjC,QAAA,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;AAAE,YAAA,OAAO,QAAQ;AAC9D,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,GAAG,WAAW,GAAG,IAAI;IACzD,CAAC;sFAAC;;IAGO,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI;wFACjD;;IAGQ,cAAc,GAAG,QAAQ,CAAC,MACjC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI;uFACnD;;IAGQ,UAAU,GAAG,QAAQ,CAAC,MAC7B,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI;mFAC7C;;IAGQ,SAAS,GAAG,QAAQ,CAAC,MAC5B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI;kFAC/C;AAEgB,IAAA,aAAa,GAAG,QAAQ,CAAC,MACxC,gBAAgB,CAAC;AACf,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,QAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,QAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;KAC1B,CAAC;sFACH;AAEQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE;oFAAC;AACzD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE;qFAAC;IAC3D,YAAY,GAAG,QAAQ,CAC9B,MAAM,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,CAAA,CAAE;qFACvE;IACQ,WAAW,GAAG,QAAQ,CAC7B,MAAM,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAA,CAAE;oFACtE;AAED,IAAA,WAAA,GAAA;;;;;;;;QAQE,eAAe,CAAC,MAAK;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa;AAC5C,YAAA,IAAI,CAAC,EAAE;gBAAE;AACT,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAChE,YAAA,MAAM,EAAE;AACR,YAAA,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC;YAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACzC,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;AACxD,QAAA,CAAC,CAAC;QAEF,IAAI,QAAQ,GAAG,IAAI;QACnB,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE;YAChC,IAAI,QAAQ,EAAE;gBACZ,QAAQ,GAAG,KAAK;gBAChB;YACF;;;;;;AAMA,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClB,gBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CACzB,SAAS,GAAG,mBAAmB,GAAG,oBAAoB,CACvD;YACH;AACF,QAAA,CAAC,CAAC;IACJ;;IAGA,OAAO,GAAA;QACL,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACxC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,IAAI,CAAC,KAAK,QAAQ;YAAE;QACpB,IAAI,CAAC,MAAM,EAAE;IACf;;AAGA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;AACzB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,MAAM,EAAE;QACf;IACF;;IAGA,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACxC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,MAAM;YAAE;AACnC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IACvB;;IAGA,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACxC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,MAAM;YAAE;AACnC,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IACxB;IAEQ,MAAM,GAAA;QACZ,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC;AAEQ,IAAA,UAAU,CAAC,IAAa,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI;YAAE;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;uGA9LW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,WAAA,EAAA,YAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArBlB;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBArC7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;oBACxB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,aAAa,EAAE,YAAY;AAC3B,wBAAA,iBAAiB,EAAE,gBAAgB;AACnC,wBAAA,qBAAqB,EAAE,eAAe;AACtC,wBAAA,kBAAkB,EAAE,YAAY;AAChC,wBAAA,sBAAsB,EAAE,gBAAgB;AACxC,wBAAA,mBAAmB,EAAE,iBAAiB;AACtC,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,cAAc,EAAE,gBAAgB;AACjC,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA;AACF,iBAAA;+sBAiCmE,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC7KjF;;AAEG;;;;"}