ngx-com 0.0.1 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-com-components-avatar.mjs +772 -0
- package/fesm2022/ngx-com-components-avatar.mjs.map +1 -0
- package/fesm2022/ngx-com-components-badge.mjs +138 -0
- package/fesm2022/ngx-com-components-badge.mjs.map +1 -0
- package/fesm2022/ngx-com-components-button.mjs +146 -0
- package/fesm2022/ngx-com-components-button.mjs.map +1 -0
- package/fesm2022/ngx-com-components-calendar.mjs +5046 -0
- package/fesm2022/ngx-com-components-calendar.mjs.map +1 -0
- package/fesm2022/ngx-com-components-card.mjs +590 -0
- package/fesm2022/ngx-com-components-card.mjs.map +1 -0
- package/fesm2022/ngx-com-components-checkbox.mjs +344 -0
- package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -0
- package/fesm2022/ngx-com-components-collapsible.mjs +612 -0
- package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -0
- package/fesm2022/ngx-com-components-confirm.mjs +562 -0
- package/fesm2022/ngx-com-components-confirm.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dropdown-testing.mjs +255 -0
- package/fesm2022/ngx-com-components-dropdown-testing.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dropdown.mjs +2692 -0
- package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -0
- package/fesm2022/ngx-com-components-empty-state.mjs +382 -0
- package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -0
- package/fesm2022/ngx-com-components-form-field.mjs +924 -0
- package/fesm2022/ngx-com-components-form-field.mjs.map +1 -0
- package/fesm2022/ngx-com-components-icon.mjs +183 -0
- package/fesm2022/ngx-com-components-icon.mjs.map +1 -0
- package/fesm2022/ngx-com-components-item.mjs +578 -0
- package/fesm2022/ngx-com-components-item.mjs.map +1 -0
- package/fesm2022/ngx-com-components-menu.mjs +1200 -0
- package/fesm2022/ngx-com-components-menu.mjs.map +1 -0
- package/fesm2022/ngx-com-components-paginator.mjs +823 -0
- package/fesm2022/ngx-com-components-paginator.mjs.map +1 -0
- package/fesm2022/ngx-com-components-popover.mjs +901 -0
- package/fesm2022/ngx-com-components-popover.mjs.map +1 -0
- package/fesm2022/ngx-com-components-radio.mjs +621 -0
- package/fesm2022/ngx-com-components-radio.mjs.map +1 -0
- package/fesm2022/ngx-com-components-segmented-control.mjs +538 -0
- package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -0
- package/fesm2022/ngx-com-components-sort.mjs +368 -0
- package/fesm2022/ngx-com-components-sort.mjs.map +1 -0
- package/fesm2022/ngx-com-components-spinner.mjs +189 -0
- package/fesm2022/ngx-com-components-spinner.mjs.map +1 -0
- package/fesm2022/ngx-com-components-tabs.mjs +1522 -0
- package/fesm2022/ngx-com-components-tabs.mjs.map +1 -0
- package/fesm2022/ngx-com-components-tooltip.mjs +625 -0
- package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -0
- package/fesm2022/ngx-com-components.mjs +17 -0
- package/fesm2022/ngx-com-components.mjs.map +1 -0
- package/fesm2022/ngx-com-tokens.mjs +12 -0
- package/fesm2022/ngx-com-tokens.mjs.map +1 -0
- package/fesm2022/ngx-com-utils.mjs +601 -0
- package/fesm2022/ngx-com-utils.mjs.map +1 -0
- package/fesm2022/ngx-com.mjs +9 -23
- package/fesm2022/ngx-com.mjs.map +1 -1
- package/package.json +105 -1
- package/types/ngx-com-components-avatar.d.ts +409 -0
- package/types/ngx-com-components-badge.d.ts +97 -0
- package/types/ngx-com-components-button.d.ts +69 -0
- package/types/ngx-com-components-calendar.d.ts +1665 -0
- package/types/ngx-com-components-card.d.ts +373 -0
- package/types/ngx-com-components-checkbox.d.ts +116 -0
- package/types/ngx-com-components-collapsible.d.ts +379 -0
- package/types/ngx-com-components-confirm.d.ts +160 -0
- package/types/ngx-com-components-dropdown-testing.d.ts +116 -0
- package/types/ngx-com-components-dropdown.d.ts +938 -0
- package/types/ngx-com-components-empty-state.d.ts +269 -0
- package/types/ngx-com-components-form-field.d.ts +531 -0
- package/types/ngx-com-components-icon.d.ts +94 -0
- package/types/ngx-com-components-item.d.ts +336 -0
- package/types/ngx-com-components-menu.d.ts +479 -0
- package/types/ngx-com-components-paginator.d.ts +265 -0
- package/types/ngx-com-components-popover.d.ts +309 -0
- package/types/ngx-com-components-radio.d.ts +258 -0
- package/types/ngx-com-components-segmented-control.d.ts +274 -0
- package/types/ngx-com-components-sort.d.ts +133 -0
- package/types/ngx-com-components-spinner.d.ts +120 -0
- package/types/ngx-com-components-tabs.d.ts +396 -0
- package/types/ngx-com-components-tooltip.d.ts +200 -0
- package/types/ngx-com-components.d.ts +12 -0
- package/types/ngx-com-tokens.d.ts +7 -0
- package/types/ngx-com-utils.d.ts +424 -0
- package/types/ngx-com.d.ts +10 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-com-components-card.mjs","sources":["../../../projects/com/components/card/card.variants.ts","../../../projects/com/components/card/card.component.ts","../../../projects/com/components/card/card-header.directive.ts","../../../projects/com/components/card/card-title.directive.ts","../../../projects/com/components/card/card-subtitle.directive.ts","../../../projects/com/components/card/card-content.directive.ts","../../../projects/com/components/card/card-footer.directive.ts","../../../projects/com/components/card/card-actions.directive.ts","../../../projects/com/components/card/card-media.directive.ts","../../../projects/com/components/card/card-divider.directive.ts","../../../projects/com/components/card/card-accent.directive.ts","../../../projects/com/components/card/card-badge.directive.ts","../../../projects/com/components/card/index.ts","../../../projects/com/components/card/ngx-com-components-card.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\n// Card container types\nexport type CardVariant = 'elevated' | 'outlined' | 'filled' | 'ghost';\nexport type CardPadding = 'none' | 'sm' | 'md' | 'lg';\nexport type CardRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\n// Card footer / actions alignment\nexport type CardAlign = 'start' | 'end' | 'center' | 'between';\n\n// Card actions direction\nexport type CardActionsDirection = 'row' | 'column';\n\n// Card media position\nexport type CardMediaPosition = 'top' | 'bottom' | 'inset';\n\n// Card accent types\nexport type CardAccentColor = 'primary' | 'accent' | 'warn' | 'success' | 'muted';\nexport type CardAccentPosition = 'top' | 'left';\n\n// Card badge types\nexport type CardBadgeColor = 'primary' | 'accent' | 'warn' | 'success' | 'muted';\nexport type CardBadgePosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n/**\n * CVA variants for the card container.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-muted`, `--color-muted-hover`,\n * `--color-foreground`, `--color-border`, `--color-primary`, `--color-ring`\n */\nexport const cardVariants: (props?: {\n variant?: CardVariant;\n padding?: CardPadding;\n radius?: CardRadius;\n interactive?: boolean;\n}) => string = cva('relative flex flex-col overflow-hidden', {\n variants: {\n variant: {\n elevated: 'bg-popover text-popover-foreground shadow-md',\n outlined: 'bg-popover text-popover-foreground border border-border',\n filled: 'bg-muted text-foreground',\n ghost: 'bg-transparent text-foreground',\n },\n padding: {\n none: '',\n sm: 'p-3',\n md: 'p-5',\n lg: 'p-7',\n },\n radius: {\n none: 'rounded-none',\n sm: 'rounded-[var(--radius-sm)]',\n md: 'rounded-[var(--radius-md)]',\n lg: 'rounded-card',\n xl: 'rounded-[var(--radius-xl)]',\n },\n interactive: {\n true: 'cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n false: '',\n },\n },\n compoundVariants: [\n { interactive: true, variant: 'elevated', class: 'hover:shadow-lg active:shadow-sm transition-shadow duration-150' },\n { interactive: true, variant: 'outlined', class: 'hover:border-primary hover:shadow-sm transition-all duration-150' },\n { interactive: true, variant: 'filled', class: 'hover:bg-muted-hover transition-colors duration-150' },\n { interactive: true, variant: 'ghost', class: 'hover:bg-muted transition-colors duration-150' },\n ],\n defaultVariants: {\n variant: 'elevated',\n padding: 'none',\n radius: 'lg',\n interactive: false,\n },\n});\n\nexport type CardVariants = VariantProps<typeof cardVariants>;\n\n/**\n * CVA variants for card footer alignment.\n */\nexport const cardFooterVariants: (props?: {\n align?: CardAlign;\n}) => string = cva('flex items-center gap-2 px-5 pt-0 pb-5', {\n variants: {\n align: {\n start: 'justify-start',\n end: 'justify-end',\n center: 'justify-center',\n between: 'justify-between',\n },\n },\n defaultVariants: {\n align: 'end',\n },\n});\n\nexport type CardFooterVariants = VariantProps<typeof cardFooterVariants>;\n\n/**\n * CVA variants for card actions.\n */\nexport const cardActionsVariants: (props?: {\n align?: CardAlign;\n direction?: CardActionsDirection;\n}) => string = cva('flex gap-2 px-5 py-3', {\n variants: {\n align: {\n start: 'justify-start',\n end: 'justify-end',\n center: 'justify-center',\n between: 'justify-between',\n },\n direction: {\n row: 'flex-row items-center',\n column: 'flex-col items-stretch',\n },\n },\n defaultVariants: {\n align: 'end',\n direction: 'row',\n },\n});\n\nexport type CardActionsVariants = VariantProps<typeof cardActionsVariants>;\n\n/**\n * CVA variants for card media positioning.\n */\nexport const cardMediaVariants: (props?: {\n position?: CardMediaPosition;\n}) => string = cva('block w-full overflow-hidden object-cover', {\n variants: {\n position: {\n top: '',\n bottom: '',\n inset: 'mx-5 mt-5 rounded-media',\n },\n },\n defaultVariants: {\n position: 'top',\n },\n});\n\nexport type CardMediaVariants = VariantProps<typeof cardMediaVariants>;\n\n/**\n * CVA variants for card accent strip.\n *\n * @tokens `--color-primary`, `--color-accent`, `--color-warn`, `--color-success`, `--color-muted`\n */\nexport const cardAccentVariants: (props?: {\n color?: CardAccentColor;\n position?: CardAccentPosition;\n}) => string = cva('block shrink-0', {\n variants: {\n color: {\n primary: 'bg-primary',\n accent: 'bg-accent',\n warn: 'bg-warn',\n success: 'bg-success',\n muted: 'bg-muted',\n },\n position: {\n top: 'h-1 w-full',\n left: 'w-1 h-full absolute left-0 top-0',\n },\n },\n defaultVariants: {\n color: 'primary',\n position: 'top',\n },\n});\n\nexport type CardAccentVariants = VariantProps<typeof cardAccentVariants>;\n\n/**\n * CVA variants for card badge overlay.\n *\n * @tokens `--color-primary`, `--color-primary-foreground`, `--color-accent`, `--color-accent-foreground`,\n * `--color-warn`, `--color-warn-foreground`, `--color-success`, `--color-success-foreground`,\n * `--color-muted`, `--color-muted-foreground`, `--radius-card`, `--radius-media`, `--radius-pill`\n */\nexport const cardBadgeVariants: (props?: {\n position?: CardBadgePosition;\n color?: CardBadgeColor;\n}) => string = cva(\n 'absolute z-10 inline-flex items-center rounded-pill px-2.5 py-0.5 text-xs font-semibold',\n {\n variants: {\n position: {\n 'top-left': 'top-3 left-3',\n 'top-right': 'top-3 right-3',\n 'bottom-left': 'bottom-3 left-3',\n 'bottom-right': 'bottom-3 right-3',\n },\n color: {\n primary: 'bg-primary text-primary-foreground',\n accent: 'bg-accent text-accent-foreground',\n warn: 'bg-warn text-warn-foreground',\n success: 'bg-success text-success-foreground',\n muted: 'bg-muted text-muted-foreground',\n },\n },\n defaultVariants: {\n position: 'top-right',\n color: 'primary',\n },\n }\n);\n\nexport type CardBadgeVariants = VariantProps<typeof cardBadgeVariants>;\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { mergeClasses } from './card.utils';\nimport { cardVariants } from './card.variants';\nimport type { CardVariant, CardPadding, CardRadius } from './card.variants';\n\n/**\n * Card container component - a styled surface for content.\n *\n * The card is a pure container with no imposed structure.\n * Use card directives (comCardHeader, comCardContent, etc.) to compose layouts.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-muted`, `--color-muted-hover`,\n * `--color-foreground`, `--color-border`, `--color-primary`, `--color-ring`\n *\n * @example Basic card\n * ```html\n * <com-card>\n * <div comCardContent>Simple content</div>\n * </com-card>\n * ```\n *\n * @example Interactive card\n * ```html\n * <com-card [interactive]=\"true\" (click)=\"onCardClick()\">\n * <div comCardContent>Clickable card</div>\n * </com-card>\n * ```\n *\n * @example Outlined variant with custom padding\n * ```html\n * <com-card variant=\"outlined\" padding=\"md\">\n * <p>Outlined card with medium padding</p>\n * </com-card>\n * ```\n */\n@Component({\n selector: 'com-card',\n exportAs: 'comCard',\n template: `<ng-content />`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'computedClass()',\n },\n})\nexport class ComCard {\n /** Visual treatment of the card surface. */\n readonly variant: InputSignal<CardVariant> = input<CardVariant>('elevated');\n\n /** Inner spacing. Default 'none' - sub-parts manage their own padding. */\n readonly padding: InputSignal<CardPadding> = input<CardPadding>('none');\n\n /** Border radius. */\n readonly radius: InputSignal<CardRadius> = input<CardRadius>('lg');\n\n /** When true, adds hover/active states and cursor-pointer. */\n readonly interactive: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Consumer CSS classes - merged with variant classes. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n cardVariants({\n variant: this.variant(),\n padding: this.padding(),\n radius: this.radius(),\n interactive: this.interactive(),\n }),\n this.userClass()\n )\n );\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Card header directive - top section for title and actions.\n *\n * Uses justify-between so it naturally supports a title group on the left\n * and an action element (icon button, menu trigger) on the right.\n *\n * @example Header with title\n * ```html\n * <div comCardHeader>\n * <h3 comCardTitle>Card Title</h3>\n * </div>\n * ```\n *\n * @example Header with title and action\n * ```html\n * <div comCardHeader>\n * <div>\n * <h3 comCardTitle>Title</h3>\n * <p comCardSubtitle>Subtitle</p>\n * </div>\n * <button comButton variant=\"ghost\" size=\"icon\" aria-label=\"More\">...</button>\n * </div>\n * ```\n *\n * @tokens None - uses only layout utilities\n */\n@Directive({\n selector: '[comCardHeader]',\n exportAs: 'comCardHeader',\n host: {\n class: 'flex items-start justify-between gap-3 px-5 pt-5 pb-0',\n },\n})\nexport class ComCardHeader {}\n","import { Directive } from '@angular/core';\n\n/**\n * Card title directive - styled heading text.\n *\n * Apply to any heading element. Consumer picks the semantic level (h2, h3, etc.).\n *\n * @example\n * ```html\n * <h3 comCardTitle>Project Alpha</h3>\n * ```\n *\n * @tokens `--color-foreground`\n */\n@Directive({\n selector: '[comCardTitle]',\n exportAs: 'comCardTitle',\n host: {\n class: 'font-heading text-lg font-semibold tracking-tight text-foreground',\n },\n})\nexport class ComCardTitle {}\n","import { Directive } from '@angular/core';\n\n/**\n * Card subtitle directive - secondary text styling.\n *\n * @example\n * ```html\n * <p comCardSubtitle>Last updated 2 hours ago</p>\n * ```\n *\n * @tokens `--color-muted-foreground`\n */\n@Directive({\n selector: '[comCardSubtitle]',\n exportAs: 'comCardSubtitle',\n host: {\n class: 'text-sm text-muted-foreground',\n },\n})\nexport class ComCardSubtitle {}\n","import { Directive } from '@angular/core';\n\n/**\n * Card content directive - main body area with consistent padding.\n *\n * @example\n * ```html\n * <div comCardContent>\n * <p>Card body content goes here.</p>\n * </div>\n * ```\n *\n * @tokens None - uses only layout utilities\n */\n@Directive({\n selector: '[comCardContent]',\n exportAs: 'comCardContent',\n host: {\n class: 'flex-1 px-5 py-4 text-sm',\n },\n})\nexport class ComCardContent {}\n","import { computed, Directive, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { cardFooterVariants } from './card.variants';\nimport type { CardAlign } from './card.variants';\n\n/**\n * Card footer directive - bottom section for metadata or secondary actions.\n *\n * @example Footer with alignment\n * ```html\n * <div comCardFooter align=\"between\">\n * <span class=\"text-sm text-muted-foreground\">Updated 3m ago</span>\n * <a comButton variant=\"link\" size=\"sm\">View details</a>\n * </div>\n * ```\n *\n * @tokens None - uses only layout utilities\n */\n@Directive({\n selector: '[comCardFooter]',\n exportAs: 'comCardFooter',\n host: {\n '[class]': 'computedClass()',\n },\n})\nexport class ComCardFooter {\n /** Horizontal alignment of footer content. */\n readonly align: InputSignal<CardAlign> = input<CardAlign>('end');\n\n protected readonly computedClass: Signal<string> = computed(() =>\n cardFooterVariants({ align: this.align() })\n );\n}\n","import { computed, Directive, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { cardActionsVariants } from './card.variants';\nimport type { CardAlign, CardActionsDirection } from './card.variants';\n\n/**\n * Card actions directive - dedicated button row for primary card actions.\n *\n * Separate from footer because actions and footer metadata serve different purposes.\n *\n * @example Actions with alignment\n * ```html\n * <div comCardActions>\n * <button comButton variant=\"ghost\" size=\"sm\">Cancel</button>\n * <button comButton size=\"sm\">Confirm</button>\n * </div>\n * ```\n *\n * @example Stacked column layout\n * ```html\n * <div comCardActions direction=\"column\" align=\"start\">\n * <button comButton fullWidth>Primary Action</button>\n * <button comButton variant=\"outline\" fullWidth>Secondary</button>\n * </div>\n * ```\n *\n * @tokens None - uses only layout utilities\n */\n@Directive({\n selector: '[comCardActions]',\n exportAs: 'comCardActions',\n host: {\n '[class]': 'computedClass()',\n },\n})\nexport class ComCardActions {\n /** Horizontal alignment of actions. */\n readonly align: InputSignal<CardAlign> = input<CardAlign>('end');\n\n /** Layout direction - row or column. */\n readonly direction: InputSignal<CardActionsDirection> = input<CardActionsDirection>('row');\n\n protected readonly computedClass: Signal<string> = computed(() =>\n cardActionsVariants({\n align: this.align(),\n direction: this.direction(),\n })\n );\n}\n","import { computed, Directive, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { cardMediaVariants } from './card.variants';\nimport type { CardMediaPosition } from './card.variants';\n\n/**\n * Card media directive - image/video slot with aspect ratio handling.\n *\n * Apply to <img>, <video>, <picture>, or a wrapper <div>.\n *\n * @example Top media (bleeds to edge)\n * ```html\n * <img comCardMedia src=\"/hero.jpg\" alt=\"Hero image\" />\n * ```\n *\n * @example Inset media (padded with rounded corners)\n * ```html\n * <img comCardMedia position=\"inset\" src=\"/preview.jpg\" alt=\"Preview\" />\n * ```\n *\n * @tokens None - uses only layout utilities\n */\n@Directive({\n selector: '[comCardMedia]',\n exportAs: 'comCardMedia',\n host: {\n '[class]': 'computedClass()',\n },\n})\nexport class ComCardMedia {\n /** Media positioning within the card. */\n readonly position: InputSignal<CardMediaPosition> = input<CardMediaPosition>('top');\n\n protected readonly computedClass: Signal<string> = computed(() =>\n cardMediaVariants({ position: this.position() })\n );\n}\n","import { booleanAttribute, computed, Directive, input } from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { mergeClasses } from './card.utils';\n\n/**\n * Card divider directive - horizontal rule between card sections.\n *\n * @example Standard divider (with side margins)\n * ```html\n * <hr comCardDivider />\n * ```\n *\n * @example Full-width divider (edge to edge)\n * ```html\n * <hr comCardDivider [inset]=\"true\" />\n * ```\n *\n * @tokens `--color-border`\n */\n@Directive({\n selector: '[comCardDivider]',\n exportAs: 'comCardDivider',\n host: {\n '[class]': 'computedClass()',\n },\n})\nexport class ComCardDivider {\n /** When true, divider spans full card width (no horizontal margin). */\n readonly inset: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Consumer CSS classes. */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n 'block border-t border-border',\n this.inset() ? 'mx-0' : 'mx-5',\n this.userClass()\n )\n );\n}\n","import { computed, Directive, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { cardAccentVariants } from './card.variants';\nimport type { CardAccentColor, CardAccentPosition } from './card.variants';\n\n/**\n * Card accent directive - colored strip for status or category indication.\n *\n * Place as the first child of the card for top accent, or use position=\"left\"\n * for a left-edge strip (requires adding left padding to content).\n *\n * @tokens `--color-primary`, `--color-accent`, `--color-warn`, `--color-success`, `--color-muted`\n *\n * @example Top accent strip\n * ```html\n * <com-card>\n * <div comCardAccent color=\"warn\"></div>\n * <div comCardContent>Warning content</div>\n * </com-card>\n * ```\n *\n * @example Left accent strip\n * ```html\n * <com-card>\n * <div comCardAccent color=\"success\" position=\"left\"></div>\n * <div comCardContent class=\"pl-5\">Content with left padding</div>\n * </com-card>\n * ```\n */\n@Directive({\n selector: '[comCardAccent]',\n exportAs: 'comCardAccent',\n host: {\n '[class]': 'computedClass()',\n },\n})\nexport class ComCardAccent {\n /** Accent color. */\n readonly color: InputSignal<CardAccentColor> = input<CardAccentColor>('primary');\n\n /** Position of the accent strip. */\n readonly position: InputSignal<CardAccentPosition> = input<CardAccentPosition>('top');\n\n protected readonly computedClass: Signal<string> = computed(() =>\n cardAccentVariants({\n color: this.color(),\n position: this.position(),\n })\n );\n}\n","import { computed, Directive, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { cardBadgeVariants } from './card.variants';\nimport type { CardBadgeColor, CardBadgePosition } from './card.variants';\n\n/**\n * Card badge directive - positioned overlay for labels, tags, or status indicators.\n *\n * Floats over the card content (e.g., \"NEW\", \"SALE\", \"Featured\").\n *\n * @tokens `--color-primary`, `--color-primary-foreground`, `--color-accent`, `--color-accent-foreground`,\n * `--color-warn`, `--color-warn-foreground`, `--color-success`, `--color-success-foreground`,\n * `--color-muted`, `--color-muted-foreground`, `--radius-pill`\n *\n * @example Badge in top-right corner\n * ```html\n * <com-card>\n * <span comCardBadge>NEW</span>\n * <img comCardMedia src=\"/product.jpg\" alt=\"Product\" />\n * </com-card>\n * ```\n *\n * @example Badge with custom position and color\n * ```html\n * <com-card>\n * <span comCardBadge position=\"top-left\" color=\"warn\">SALE</span>\n * <div comCardContent>Product details</div>\n * </com-card>\n * ```\n */\n@Directive({\n selector: '[comCardBadge]',\n exportAs: 'comCardBadge',\n host: {\n '[class]': 'computedClass()',\n },\n})\nexport class ComCardBadge {\n /** Badge position within the card. */\n readonly position: InputSignal<CardBadgePosition> = input<CardBadgePosition>('top-right');\n\n /** Badge color. */\n readonly color: InputSignal<CardBadgeColor> = input<CardBadgeColor>('primary');\n\n protected readonly computedClass: Signal<string> = computed(() =>\n cardBadgeVariants({\n position: this.position(),\n color: this.color(),\n })\n );\n}\n","// Public API for the card component system\n\n// Main component\nexport { ComCard } from './card.component';\n\n// Directives\nexport { ComCardHeader } from './card-header.directive';\nexport { ComCardTitle } from './card-title.directive';\nexport { ComCardSubtitle } from './card-subtitle.directive';\nexport { ComCardContent } from './card-content.directive';\nexport { ComCardFooter } from './card-footer.directive';\nexport { ComCardActions } from './card-actions.directive';\nexport { ComCardMedia } from './card-media.directive';\nexport { ComCardDivider } from './card-divider.directive';\nexport { ComCardAccent } from './card-accent.directive';\nexport { ComCardBadge } from './card-badge.directive';\n\n// Variants (for advanced customization)\nexport {\n cardVariants,\n cardFooterVariants,\n cardActionsVariants,\n cardMediaVariants,\n cardAccentVariants,\n cardBadgeVariants,\n} from './card.variants';\n\nexport type {\n CardVariant,\n CardPadding,\n CardRadius,\n CardAlign,\n CardActionsDirection,\n CardMediaPosition,\n CardAccentColor,\n CardAccentPosition,\n CardBadgeColor,\n CardBadgePosition,\n CardVariants,\n CardFooterVariants,\n CardActionsVariants,\n CardMediaVariants,\n CardAccentVariants,\n CardBadgeVariants,\n} from './card.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, viewChild, input, model, output, computed, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { NgControl } from '@angular/forms';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* CVA variants for the visual checkbox box.
|
|
8
|
+
*
|
|
9
|
+
* Uses `peer` selectors to style based on native input state:
|
|
10
|
+
* - `peer-checked:` for checked state
|
|
11
|
+
* - `peer-indeterminate:` for indeterminate state
|
|
12
|
+
* - `peer-focus-visible:` for keyboard focus
|
|
13
|
+
* - `peer-disabled:` for disabled state
|
|
14
|
+
*
|
|
15
|
+
* @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,
|
|
16
|
+
* `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,
|
|
17
|
+
* `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,
|
|
18
|
+
* `--color-disabled`, `--color-disabled-foreground`, `--color-ring`, `--radius-interactive-sm`
|
|
19
|
+
*/
|
|
20
|
+
const checkboxBoxVariants = cva([
|
|
21
|
+
'com-checkbox__box',
|
|
22
|
+
'inline-flex shrink-0 items-center justify-center',
|
|
23
|
+
'rounded-interactive-sm border-2 border-border',
|
|
24
|
+
'transition-colors duration-150',
|
|
25
|
+
'peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring',
|
|
26
|
+
'peer-disabled:cursor-not-allowed peer-disabled:border-disabled peer-disabled:bg-disabled peer-disabled:text-disabled-foreground',
|
|
27
|
+
], {
|
|
28
|
+
variants: {
|
|
29
|
+
variant: {
|
|
30
|
+
primary: [
|
|
31
|
+
'peer-checked:border-primary peer-checked:bg-primary peer-checked:text-primary-foreground',
|
|
32
|
+
'peer-indeterminate:border-primary peer-indeterminate:bg-primary peer-indeterminate:text-primary-foreground',
|
|
33
|
+
'group-hover:border-primary-hover',
|
|
34
|
+
'peer-checked:group-hover:bg-primary-hover peer-checked:group-hover:border-primary-hover',
|
|
35
|
+
'peer-indeterminate:group-hover:bg-primary-hover peer-indeterminate:group-hover:border-primary-hover',
|
|
36
|
+
],
|
|
37
|
+
accent: [
|
|
38
|
+
'peer-checked:border-accent peer-checked:bg-accent peer-checked:text-accent-foreground',
|
|
39
|
+
'peer-indeterminate:border-accent peer-indeterminate:bg-accent peer-indeterminate:text-accent-foreground',
|
|
40
|
+
'group-hover:border-accent-hover',
|
|
41
|
+
'peer-checked:group-hover:bg-accent-hover peer-checked:group-hover:border-accent-hover',
|
|
42
|
+
'peer-indeterminate:group-hover:bg-accent-hover peer-indeterminate:group-hover:border-accent-hover',
|
|
43
|
+
],
|
|
44
|
+
warn: [
|
|
45
|
+
'peer-checked:border-warn peer-checked:bg-warn peer-checked:text-warn-foreground',
|
|
46
|
+
'peer-indeterminate:border-warn peer-indeterminate:bg-warn peer-indeterminate:text-warn-foreground',
|
|
47
|
+
'group-hover:border-warn-hover',
|
|
48
|
+
'peer-checked:group-hover:bg-warn-hover peer-checked:group-hover:border-warn-hover',
|
|
49
|
+
'peer-indeterminate:group-hover:bg-warn-hover peer-indeterminate:group-hover:border-warn-hover',
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
size: {
|
|
53
|
+
sm: 'size-4',
|
|
54
|
+
md: 'size-5',
|
|
55
|
+
lg: 'size-6',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
defaultVariants: {
|
|
59
|
+
variant: 'primary',
|
|
60
|
+
size: 'md',
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
/** Size-based classes for the checkmark SVG icon. */
|
|
64
|
+
const CHECKBOX_ICON_SIZES = {
|
|
65
|
+
sm: 'size-3',
|
|
66
|
+
md: 'size-3.5',
|
|
67
|
+
lg: 'size-4',
|
|
68
|
+
};
|
|
69
|
+
/** Size-based classes for the label content. */
|
|
70
|
+
const CHECKBOX_LABEL_SIZES = {
|
|
71
|
+
sm: 'text-sm ms-2',
|
|
72
|
+
md: 'text-base ms-2.5',
|
|
73
|
+
lg: 'text-lg ms-3',
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/** Auto-incrementing ID counter for unique checkbox IDs. */
|
|
77
|
+
let nextId = 0;
|
|
78
|
+
/**
|
|
79
|
+
* Production-grade checkbox component with full accessibility support.
|
|
80
|
+
*
|
|
81
|
+
* Uses a native `<input type="checkbox">` for built-in keyboard handling,
|
|
82
|
+
* `:checked` and `:indeterminate` pseudo-classes, and screen reader support.
|
|
83
|
+
*
|
|
84
|
+
* Implements `ControlValueAccessor` for Reactive Forms integration via
|
|
85
|
+
* `NgControl` injection pattern (no `NG_VALUE_ACCESSOR` provider).
|
|
86
|
+
*
|
|
87
|
+
* @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,
|
|
88
|
+
* `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,
|
|
89
|
+
* `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,
|
|
90
|
+
* `--color-disabled`, `--color-disabled-foreground`, `--color-ring`
|
|
91
|
+
*
|
|
92
|
+
* @example Basic usage
|
|
93
|
+
* ```html
|
|
94
|
+
* <com-checkbox [(checked)]="isActive">Enable feature</com-checkbox>
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* @example With reactive forms
|
|
98
|
+
* ```html
|
|
99
|
+
* <com-checkbox formControlName="acceptTerms">
|
|
100
|
+
* I accept the <a href="/terms">terms and conditions</a>
|
|
101
|
+
* </com-checkbox>
|
|
102
|
+
* ```
|
|
103
|
+
*
|
|
104
|
+
* @example Indeterminate state
|
|
105
|
+
* ```html
|
|
106
|
+
* <com-checkbox [(indeterminate)]="hasPartialSelection" (changed)="onSelectAll($event)">
|
|
107
|
+
* Select all
|
|
108
|
+
* </com-checkbox>
|
|
109
|
+
* ```
|
|
110
|
+
*
|
|
111
|
+
* @example Variants and sizes
|
|
112
|
+
* ```html
|
|
113
|
+
* <com-checkbox variant="accent" size="lg">Large accent checkbox</com-checkbox>
|
|
114
|
+
* <com-checkbox variant="warn" size="sm">Small warning checkbox</com-checkbox>
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
class ComCheckbox {
|
|
118
|
+
/** Optional NgControl for reactive forms integration. */
|
|
119
|
+
ngControl = inject(NgControl, { optional: true, self: true });
|
|
120
|
+
/** Reference to the native input element. */
|
|
121
|
+
inputRef = viewChild('inputElement', ...(ngDevMode ? [{ debugName: "inputRef" }] : []));
|
|
122
|
+
/** Unique ID for this checkbox instance. */
|
|
123
|
+
uniqueId = `com-checkbox-${nextId++}`;
|
|
124
|
+
// Inputs
|
|
125
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
|
|
126
|
+
variant = input('primary', ...(ngDevMode ? [{ debugName: "variant" }] : []));
|
|
127
|
+
checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
|
|
128
|
+
indeterminate = model(false, ...(ngDevMode ? [{ debugName: "indeterminate" }] : []));
|
|
129
|
+
disabled = model(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
|
|
130
|
+
value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
|
|
131
|
+
name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
|
|
132
|
+
id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : []));
|
|
133
|
+
ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : {}), alias: 'aria-label' });
|
|
134
|
+
ariaLabelledby = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : {}), alias: 'aria-labelledby' });
|
|
135
|
+
ariaDescribedby = input(null, { ...(ngDevMode ? { debugName: "ariaDescribedby" } : {}), alias: 'aria-describedby' });
|
|
136
|
+
// Outputs
|
|
137
|
+
changed = output();
|
|
138
|
+
// Computed state
|
|
139
|
+
inputId = computed(() => this.id() ?? this.uniqueId, ...(ngDevMode ? [{ debugName: "inputId" }] : []));
|
|
140
|
+
boxClasses = computed(() => checkboxBoxVariants({ variant: this.variant(), size: this.size() }), ...(ngDevMode ? [{ debugName: "boxClasses" }] : []));
|
|
141
|
+
iconSizeClass = computed(() => CHECKBOX_ICON_SIZES[this.size()], ...(ngDevMode ? [{ debugName: "iconSizeClass" }] : []));
|
|
142
|
+
labelSizeClass = computed(() => CHECKBOX_LABEL_SIZES[this.size()], ...(ngDevMode ? [{ debugName: "labelSizeClass" }] : []));
|
|
143
|
+
// CVA callbacks
|
|
144
|
+
onChange = () => { };
|
|
145
|
+
onTouched = () => { };
|
|
146
|
+
constructor() {
|
|
147
|
+
if (this.ngControl) {
|
|
148
|
+
this.ngControl.valueAccessor = this;
|
|
149
|
+
}
|
|
150
|
+
// Sync indeterminate state to DOM (needed because [indeterminate] is a property, not attribute)
|
|
151
|
+
effect(() => {
|
|
152
|
+
const isIndeterminate = this.indeterminate();
|
|
153
|
+
const inputEl = this.inputRef()?.nativeElement;
|
|
154
|
+
if (inputEl) {
|
|
155
|
+
inputEl.indeterminate = isIndeterminate;
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// ControlValueAccessor implementation
|
|
160
|
+
writeValue(value) {
|
|
161
|
+
this.checked.set(value ?? false);
|
|
162
|
+
}
|
|
163
|
+
registerOnChange(fn) {
|
|
164
|
+
this.onChange = fn;
|
|
165
|
+
}
|
|
166
|
+
registerOnTouched(fn) {
|
|
167
|
+
this.onTouched = fn;
|
|
168
|
+
}
|
|
169
|
+
setDisabledState(isDisabled) {
|
|
170
|
+
this.disabled.set(isDisabled);
|
|
171
|
+
}
|
|
172
|
+
// Event handlers
|
|
173
|
+
onInputChange(event) {
|
|
174
|
+
const input = event.target;
|
|
175
|
+
const newChecked = input.checked;
|
|
176
|
+
// Clear indeterminate on user interaction
|
|
177
|
+
if (this.indeterminate()) {
|
|
178
|
+
this.indeterminate.set(false);
|
|
179
|
+
input.indeterminate = false;
|
|
180
|
+
}
|
|
181
|
+
this.checked.set(newChecked);
|
|
182
|
+
this.onChange(newChecked);
|
|
183
|
+
this.changed.emit({ checked: newChecked, source: this });
|
|
184
|
+
}
|
|
185
|
+
// Public API
|
|
186
|
+
/** Focuses this checkbox's input element. */
|
|
187
|
+
focus() {
|
|
188
|
+
this.inputRef()?.nativeElement.focus();
|
|
189
|
+
}
|
|
190
|
+
/** Toggles the checkbox state programmatically. */
|
|
191
|
+
toggle() {
|
|
192
|
+
if (this.disabled()) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const newChecked = !this.checked();
|
|
196
|
+
this.checked.set(newChecked);
|
|
197
|
+
this.indeterminate.set(false);
|
|
198
|
+
this.onChange(newChecked);
|
|
199
|
+
this.changed.emit({ checked: newChecked, source: this });
|
|
200
|
+
}
|
|
201
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
202
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComCheckbox, isStandalone: true, selector: "com-checkbox", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange", indeterminate: "indeterminateChange", disabled: "disabledChange", changed: "changed" }, host: { properties: { "class.com-checkbox--disabled": "disabled()", "class.com-checkbox--checked": "checked()", "class.com-checkbox--indeterminate": "indeterminate()" }, classAttribute: "com-checkbox inline-block align-middle" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputElement"], descendants: true, isSignal: true }], exportAs: ["comCheckbox"], ngImport: i0, template: `
|
|
203
|
+
<label
|
|
204
|
+
class="group relative inline-flex items-center"
|
|
205
|
+
[class.cursor-pointer]="!disabled()"
|
|
206
|
+
[class.cursor-not-allowed]="disabled()"
|
|
207
|
+
>
|
|
208
|
+
<span><input
|
|
209
|
+
#inputElement
|
|
210
|
+
type="checkbox"
|
|
211
|
+
class="peer sr-only"
|
|
212
|
+
[id]="inputId()"
|
|
213
|
+
[checked]="checked()"
|
|
214
|
+
[disabled]="disabled()"
|
|
215
|
+
[attr.name]="name()"
|
|
216
|
+
[attr.value]="value()"
|
|
217
|
+
[attr.aria-label]="ariaLabel()"
|
|
218
|
+
[attr.aria-labelledby]="ariaLabelledby()"
|
|
219
|
+
[attr.aria-describedby]="ariaDescribedby()"
|
|
220
|
+
(change)="onInputChange($event)"
|
|
221
|
+
(blur)="onTouched()"
|
|
222
|
+
/></span>
|
|
223
|
+
<span [class]="boxClasses()">
|
|
224
|
+
@if (checked() && !indeterminate()) {
|
|
225
|
+
<svg
|
|
226
|
+
class="pointer-events-none"
|
|
227
|
+
[class]="iconSizeClass()"
|
|
228
|
+
viewBox="0 0 24 24"
|
|
229
|
+
fill="none"
|
|
230
|
+
stroke="currentColor"
|
|
231
|
+
stroke-width="3"
|
|
232
|
+
stroke-linecap="round"
|
|
233
|
+
stroke-linejoin="round"
|
|
234
|
+
aria-hidden="true"
|
|
235
|
+
focusable="false"
|
|
236
|
+
>
|
|
237
|
+
<polyline points="4 12 9 17 20 6" />
|
|
238
|
+
</svg>
|
|
239
|
+
}
|
|
240
|
+
@if (indeterminate()) {
|
|
241
|
+
<svg
|
|
242
|
+
class="pointer-events-none"
|
|
243
|
+
[class]="iconSizeClass()"
|
|
244
|
+
viewBox="0 0 24 24"
|
|
245
|
+
fill="none"
|
|
246
|
+
stroke="currentColor"
|
|
247
|
+
stroke-width="3"
|
|
248
|
+
stroke-linecap="round"
|
|
249
|
+
aria-hidden="true"
|
|
250
|
+
focusable="false"
|
|
251
|
+
>
|
|
252
|
+
<line x1="5" y1="12" x2="19" y2="12" />
|
|
253
|
+
</svg>
|
|
254
|
+
}
|
|
255
|
+
</span>
|
|
256
|
+
<span
|
|
257
|
+
class="com-checkbox__label select-none peer-disabled:cursor-not-allowed peer-disabled:text-disabled-foreground"
|
|
258
|
+
[class]="labelSizeClass()"
|
|
259
|
+
>
|
|
260
|
+
<ng-content />
|
|
261
|
+
</span>
|
|
262
|
+
</label>
|
|
263
|
+
`, isInline: true, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
264
|
+
}
|
|
265
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComCheckbox, decorators: [{
|
|
266
|
+
type: Component,
|
|
267
|
+
args: [{ selector: 'com-checkbox', exportAs: 'comCheckbox', template: `
|
|
268
|
+
<label
|
|
269
|
+
class="group relative inline-flex items-center"
|
|
270
|
+
[class.cursor-pointer]="!disabled()"
|
|
271
|
+
[class.cursor-not-allowed]="disabled()"
|
|
272
|
+
>
|
|
273
|
+
<span><input
|
|
274
|
+
#inputElement
|
|
275
|
+
type="checkbox"
|
|
276
|
+
class="peer sr-only"
|
|
277
|
+
[id]="inputId()"
|
|
278
|
+
[checked]="checked()"
|
|
279
|
+
[disabled]="disabled()"
|
|
280
|
+
[attr.name]="name()"
|
|
281
|
+
[attr.value]="value()"
|
|
282
|
+
[attr.aria-label]="ariaLabel()"
|
|
283
|
+
[attr.aria-labelledby]="ariaLabelledby()"
|
|
284
|
+
[attr.aria-describedby]="ariaDescribedby()"
|
|
285
|
+
(change)="onInputChange($event)"
|
|
286
|
+
(blur)="onTouched()"
|
|
287
|
+
/></span>
|
|
288
|
+
<span [class]="boxClasses()">
|
|
289
|
+
@if (checked() && !indeterminate()) {
|
|
290
|
+
<svg
|
|
291
|
+
class="pointer-events-none"
|
|
292
|
+
[class]="iconSizeClass()"
|
|
293
|
+
viewBox="0 0 24 24"
|
|
294
|
+
fill="none"
|
|
295
|
+
stroke="currentColor"
|
|
296
|
+
stroke-width="3"
|
|
297
|
+
stroke-linecap="round"
|
|
298
|
+
stroke-linejoin="round"
|
|
299
|
+
aria-hidden="true"
|
|
300
|
+
focusable="false"
|
|
301
|
+
>
|
|
302
|
+
<polyline points="4 12 9 17 20 6" />
|
|
303
|
+
</svg>
|
|
304
|
+
}
|
|
305
|
+
@if (indeterminate()) {
|
|
306
|
+
<svg
|
|
307
|
+
class="pointer-events-none"
|
|
308
|
+
[class]="iconSizeClass()"
|
|
309
|
+
viewBox="0 0 24 24"
|
|
310
|
+
fill="none"
|
|
311
|
+
stroke="currentColor"
|
|
312
|
+
stroke-width="3"
|
|
313
|
+
stroke-linecap="round"
|
|
314
|
+
aria-hidden="true"
|
|
315
|
+
focusable="false"
|
|
316
|
+
>
|
|
317
|
+
<line x1="5" y1="12" x2="19" y2="12" />
|
|
318
|
+
</svg>
|
|
319
|
+
}
|
|
320
|
+
</span>
|
|
321
|
+
<span
|
|
322
|
+
class="com-checkbox__label select-none peer-disabled:cursor-not-allowed peer-disabled:text-disabled-foreground"
|
|
323
|
+
[class]="labelSizeClass()"
|
|
324
|
+
>
|
|
325
|
+
<ng-content />
|
|
326
|
+
</span>
|
|
327
|
+
</label>
|
|
328
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
329
|
+
class: 'com-checkbox inline-block align-middle',
|
|
330
|
+
'[class.com-checkbox--disabled]': 'disabled()',
|
|
331
|
+
'[class.com-checkbox--checked]': 'checked()',
|
|
332
|
+
'[class.com-checkbox--indeterminate]': 'indeterminate()',
|
|
333
|
+
}, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
|
|
334
|
+
}], ctorParameters: () => [], propDecorators: { inputRef: [{ type: i0.ViewChild, args: ['inputElement', { isSignal: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }, { type: i0.Output, args: ["indeterminateChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
|
|
335
|
+
|
|
336
|
+
// Public API for the checkbox component
|
|
337
|
+
// Main component
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Generated bundle index. Do not edit.
|
|
341
|
+
*/
|
|
342
|
+
|
|
343
|
+
export { CHECKBOX_ICON_SIZES, CHECKBOX_LABEL_SIZES, ComCheckbox, checkboxBoxVariants };
|
|
344
|
+
//# sourceMappingURL=ngx-com-components-checkbox.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-com-components-checkbox.mjs","sources":["../../../projects/com/components/checkbox/checkbox.variants.ts","../../../projects/com/components/checkbox/checkbox.component.ts","../../../projects/com/components/checkbox/index.ts","../../../projects/com/components/checkbox/ngx-com-components-checkbox.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n/** Checkbox size variants. */\nexport type CheckboxSize = 'sm' | 'md' | 'lg';\n\n/** Checkbox color variants. */\nexport type CheckboxVariant = 'primary' | 'accent' | 'warn';\n\n/**\n * CVA variants for the visual checkbox box.\n *\n * Uses `peer` selectors to style based on native input state:\n * - `peer-checked:` for checked state\n * - `peer-indeterminate:` for indeterminate state\n * - `peer-focus-visible:` for keyboard focus\n * - `peer-disabled:` for disabled state\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`, `--radius-interactive-sm`\n */\nexport const checkboxBoxVariants: (props?: {\n variant?: CheckboxVariant;\n size?: CheckboxSize;\n}) => string = cva(\n [\n 'com-checkbox__box',\n 'inline-flex shrink-0 items-center justify-center',\n 'rounded-interactive-sm border-2 border-border',\n 'transition-colors duration-150',\n 'peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring',\n 'peer-disabled:cursor-not-allowed peer-disabled:border-disabled peer-disabled:bg-disabled peer-disabled:text-disabled-foreground',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'peer-checked:border-primary peer-checked:bg-primary peer-checked:text-primary-foreground',\n 'peer-indeterminate:border-primary peer-indeterminate:bg-primary peer-indeterminate:text-primary-foreground',\n 'group-hover:border-primary-hover',\n 'peer-checked:group-hover:bg-primary-hover peer-checked:group-hover:border-primary-hover',\n 'peer-indeterminate:group-hover:bg-primary-hover peer-indeterminate:group-hover:border-primary-hover',\n ],\n accent: [\n 'peer-checked:border-accent peer-checked:bg-accent peer-checked:text-accent-foreground',\n 'peer-indeterminate:border-accent peer-indeterminate:bg-accent peer-indeterminate:text-accent-foreground',\n 'group-hover:border-accent-hover',\n 'peer-checked:group-hover:bg-accent-hover peer-checked:group-hover:border-accent-hover',\n 'peer-indeterminate:group-hover:bg-accent-hover peer-indeterminate:group-hover:border-accent-hover',\n ],\n warn: [\n 'peer-checked:border-warn peer-checked:bg-warn peer-checked:text-warn-foreground',\n 'peer-indeterminate:border-warn peer-indeterminate:bg-warn peer-indeterminate:text-warn-foreground',\n 'group-hover:border-warn-hover',\n 'peer-checked:group-hover:bg-warn-hover peer-checked:group-hover:border-warn-hover',\n 'peer-indeterminate:group-hover:bg-warn-hover peer-indeterminate:group-hover:border-warn-hover',\n ],\n },\n size: {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n }\n);\n\n/** Size-based classes for the checkmark SVG icon. */\nexport const CHECKBOX_ICON_SIZES: Record<CheckboxSize, string> = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n};\n\n/** Size-based classes for the label content. */\nexport const CHECKBOX_LABEL_SIZES: Record<CheckboxSize, string> = {\n sm: 'text-sm ms-2',\n md: 'text-base ms-2.5',\n lg: 'text-lg ms-3',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n model,\n output,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n InputSignal,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport type { ControlValueAccessor } from '@angular/forms';\nimport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\nimport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n\n/** Event emitted when checkbox state changes. */\nexport interface CheckboxChange {\n checked: boolean;\n source: ComCheckbox;\n}\n\n/** Auto-incrementing ID counter for unique checkbox IDs. */\nlet nextId = 0;\n\n/**\n * Production-grade checkbox component with full accessibility support.\n *\n * Uses a native `<input type=\"checkbox\">` for built-in keyboard handling,\n * `:checked` and `:indeterminate` pseudo-classes, and screen reader support.\n *\n * Implements `ControlValueAccessor` for Reactive Forms integration via\n * `NgControl` injection pattern (no `NG_VALUE_ACCESSOR` provider).\n *\n * @tokens `--color-border`, `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`,\n * `--color-disabled`, `--color-disabled-foreground`, `--color-ring`\n *\n * @example Basic usage\n * ```html\n * <com-checkbox [(checked)]=\"isActive\">Enable feature</com-checkbox>\n * ```\n *\n * @example With reactive forms\n * ```html\n * <com-checkbox formControlName=\"acceptTerms\">\n * I accept the <a href=\"/terms\">terms and conditions</a>\n * </com-checkbox>\n * ```\n *\n * @example Indeterminate state\n * ```html\n * <com-checkbox [(indeterminate)]=\"hasPartialSelection\" (changed)=\"onSelectAll($event)\">\n * Select all\n * </com-checkbox>\n * ```\n *\n * @example Variants and sizes\n * ```html\n * <com-checkbox variant=\"accent\" size=\"lg\">Large accent checkbox</com-checkbox>\n * <com-checkbox variant=\"warn\" size=\"sm\">Small warning checkbox</com-checkbox>\n * ```\n */\n@Component({\n selector: 'com-checkbox',\n exportAs: 'comCheckbox',\n template: `\n <label\n class=\"group relative inline-flex items-center\"\n [class.cursor-pointer]=\"!disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n >\n <span><input\n #inputElement\n type=\"checkbox\"\n class=\"peer sr-only\"\n [id]=\"inputId()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.name]=\"name()\"\n [attr.value]=\"value()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n /></span>\n <span [class]=\"boxClasses()\">\n @if (checked() && !indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <polyline points=\"4 12 9 17 20 6\" />\n </svg>\n }\n @if (indeterminate()) {\n <svg\n class=\"pointer-events-none\"\n [class]=\"iconSizeClass()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n }\n </span>\n <span\n class=\"com-checkbox__label select-none peer-disabled:cursor-not-allowed peer-disabled:text-disabled-foreground\"\n [class]=\"labelSizeClass()\"\n >\n <ng-content />\n </span>\n </label>\n `,\n styles: `\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'com-checkbox inline-block align-middle',\n '[class.com-checkbox--disabled]': 'disabled()',\n '[class.com-checkbox--checked]': 'checked()',\n '[class.com-checkbox--indeterminate]': 'indeterminate()',\n },\n})\nexport class ComCheckbox implements ControlValueAccessor {\n /** Optional NgControl for reactive forms integration. */\n readonly ngControl: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n /** Reference to the native input element. */\n readonly inputRef: Signal<ElementRef<HTMLInputElement> | undefined> =\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n /** Unique ID for this checkbox instance. */\n private readonly uniqueId: string = `com-checkbox-${nextId++}`;\n\n // Inputs\n readonly size: InputSignal<CheckboxSize> = input<CheckboxSize>('md');\n readonly variant: InputSignal<CheckboxVariant> = input<CheckboxVariant>('primary');\n readonly checked: ModelSignal<boolean> = model<boolean>(false);\n readonly indeterminate: ModelSignal<boolean> = model<boolean>(false);\n readonly disabled: ModelSignal<boolean> = model<boolean>(false);\n readonly value: InputSignal<string | undefined> = input<string>();\n readonly name: InputSignal<string | undefined> = input<string>();\n readonly id: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelledby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-labelledby' });\n readonly ariaDescribedby: InputSignal<string | null> = input<string | null>(null, { alias: 'aria-describedby' });\n\n // Outputs\n readonly changed: OutputEmitterRef<CheckboxChange> = output<CheckboxChange>();\n\n // Computed state\n readonly inputId: Signal<string> = computed(() => this.id() ?? this.uniqueId);\n\n protected readonly boxClasses: Signal<string> = computed(() =>\n checkboxBoxVariants({ variant: this.variant(), size: this.size() })\n );\n\n protected readonly iconSizeClass: Signal<string> = computed(() => CHECKBOX_ICON_SIZES[this.size()]);\n protected readonly labelSizeClass: Signal<string> = computed(() => CHECKBOX_LABEL_SIZES[this.size()]);\n\n // CVA callbacks\n private onChange: (value: boolean) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n // Sync indeterminate state to DOM (needed because [indeterminate] is a property, not attribute)\n effect(() => {\n const isIndeterminate = this.indeterminate();\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl) {\n inputEl.indeterminate = isIndeterminate;\n }\n });\n }\n\n // ControlValueAccessor implementation\n writeValue(value: boolean): void {\n this.checked.set(value ?? false);\n }\n\n registerOnChange(fn: (value: boolean) => 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.disabled.set(isDisabled);\n }\n\n // Event handlers\n protected onInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const newChecked = input.checked;\n\n // Clear indeterminate on user interaction\n if (this.indeterminate()) {\n this.indeterminate.set(false);\n input.indeterminate = false;\n }\n\n this.checked.set(newChecked);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n\n // Public API\n /** Focuses this checkbox's input element. */\n focus(): void {\n this.inputRef()?.nativeElement.focus();\n }\n\n /** Toggles the checkbox state programmatically. */\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n\n const newChecked = !this.checked();\n this.checked.set(newChecked);\n this.indeterminate.set(false);\n this.onChange(newChecked);\n this.changed.emit({ checked: newChecked, source: this });\n }\n}\n","// Public API for the checkbox component\n\n// Main component\nexport { ComCheckbox } from './checkbox.component';\n\n// Types\nexport type { CheckboxChange } from './checkbox.component';\n\n// Variants (for advanced customization)\nexport {\n checkboxBoxVariants,\n CHECKBOX_ICON_SIZES,\n CHECKBOX_LABEL_SIZES,\n} from './checkbox.variants';\n\nexport type { CheckboxSize, CheckboxVariant } from './checkbox.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAQA;;;;;;;;;;;;;AAaG;AACI,MAAM,mBAAmB,GAGjB,GAAG,CAChB;IACE,mBAAmB;IACnB,kDAAkD;IAClD,+CAA+C;IAC/C,gCAAgC;IAChC,kGAAkG;IAClG,iIAAiI;CAClI,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE;gBACP,0FAA0F;gBAC1F,4GAA4G;gBAC5G,kCAAkC;gBAClC,yFAAyF;gBACzF,qGAAqG;AACtG,aAAA;AACD,YAAA,MAAM,EAAE;gBACN,uFAAuF;gBACvF,yGAAyG;gBACzG,iCAAiC;gBACjC,uFAAuF;gBACvF,mGAAmG;AACpG,aAAA;AACD,YAAA,IAAI,EAAE;gBACJ,iFAAiF;gBACjF,mGAAmG;gBACnG,+BAA+B;gBAC/B,mFAAmF;gBACnF,+FAA+F;AAChG,aAAA;AACF,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,QAAQ;AACZ,YAAA,EAAE,EAAE,QAAQ;AACZ,YAAA,EAAE,EAAE,QAAQ;AACb,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AAGH;AACO,MAAM,mBAAmB,GAAiC;AAC/D,IAAA,EAAE,EAAE,QAAQ;AACZ,IAAA,EAAE,EAAE,UAAU;AACd,IAAA,EAAE,EAAE,QAAQ;;AAGd;AACO,MAAM,oBAAoB,GAAiC;AAChE,IAAA,EAAE,EAAE,cAAc;AAClB,IAAA,EAAE,EAAE,kBAAkB;AACtB,IAAA,EAAE,EAAE,cAAc;;;ACjDpB;AACA,IAAI,MAAM,GAAG,CAAC;AAEd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;MAwFU,WAAW,CAAA;;AAEb,IAAA,SAAS,GAAqB,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;AAG/E,IAAA,QAAQ,GACf,SAAS,CAA+B,cAAc,oDAAC;;AAGxC,IAAA,QAAQ,GAAW,CAAA,aAAA,EAAgB,MAAM,EAAE,EAAE;;AAGrD,IAAA,IAAI,GAA8B,KAAK,CAAe,IAAI,gDAAC;AAC3D,IAAA,OAAO,GAAiC,KAAK,CAAkB,SAAS,mDAAC;AACzE,IAAA,OAAO,GAAyB,KAAK,CAAU,KAAK,mDAAC;AACrD,IAAA,aAAa,GAAyB,KAAK,CAAU,KAAK,yDAAC;AAC3D,IAAA,QAAQ,GAAyB,KAAK,CAAU,KAAK,oDAAC;IACtD,KAAK,GAAoC,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACxD,IAAI,GAAoC,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACvD,EAAE,GAAoC,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACrD,SAAS,GAA+B,KAAK,CAAgB,IAAI,sDAAI,KAAK,EAAE,YAAY,EAAA,CAAG;IAC3F,cAAc,GAA+B,KAAK,CAAgB,IAAI,2DAAI,KAAK,EAAE,iBAAiB,EAAA,CAAG;IACrG,eAAe,GAA+B,KAAK,CAAgB,IAAI,4DAAI,KAAK,EAAE,kBAAkB,EAAA,CAAG;;IAGvG,OAAO,GAAqC,MAAM,EAAkB;;AAGpE,IAAA,OAAO,GAAmB,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,QAAQ,mDAAC;IAE1D,UAAU,GAAmB,QAAQ,CAAC,MACvD,mBAAmB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACpE;AAEkB,IAAA,aAAa,GAAmB,QAAQ,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,yDAAC;AAChF,IAAA,cAAc,GAAmB,QAAQ,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,0DAAC;;AAG7F,IAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC3C,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAE1C,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;;QAGA,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;YAC9C,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,aAAa,GAAG,eAAe;YACzC;AACF,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,UAAU,CAAC,KAAc,EAAA;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC;IAClC;AAEA,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B;;AAGU,IAAA,aAAa,CAAC,KAAY,EAAA;AAClC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO;;AAGhC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,YAAA,KAAK,CAAC,aAAa,GAAG,KAAK;QAC7B;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1D;;;IAIA,KAAK,GAAA;QACH,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACxC;;IAGA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;AAClC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1D;uGA1GW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,8BAAA,EAAA,YAAA,EAAA,6BAAA,EAAA,WAAA,EAAA,mCAAA,EAAA,iBAAA,EAAA,EAAA,cAAA,EAAA,wCAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApFZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yIAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAuBU,WAAW,EAAA,UAAA,EAAA,CAAA;kBAvFvB,SAAS;+BACE,cAAc,EAAA,QAAA,EACd,aAAa,EAAA,QAAA,EACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DT,EAAA,CAAA,EAAA,eAAA,EAcgB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,wCAAwC;AAC/C,wBAAA,gCAAgC,EAAE,YAAY;AAC9C,wBAAA,+BAA+B,EAAE,WAAW;AAC5C,wBAAA,qCAAqC,EAAE,iBAAiB;AACzD,qBAAA,EAAA,MAAA,EAAA,CAAA,yIAAA,CAAA,EAAA;gGAQyC,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACzK1D;AAEA;;ACFA;;AAEG;;;;"}
|