ngx-com 0.0.5 → 0.0.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-item.mjs","sources":["../../../projects/com/components/item/item.directives.ts","../../../projects/com/components/item/item.variants.ts","../../../projects/com/components/item/item.component.ts","../../../projects/com/components/item/index.ts","../../../projects/com/components/item/ngx-com-components-item.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Marker directive for projecting custom leading content into a com-item.\n *\n * When this directive is present, it completely replaces the default\n * leading visual (which would otherwise be a com-avatar with an icon).\n * Use this for custom avatars (with images or initials), bare icons,\n * custom images, or any other leading visual.\n *\n * @example Custom avatar with image\n * ```html\n * <com-item title=\"Jane Doe\" description=\"jane@example.com\">\n * <ng-template comItemLeading>\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" size=\"sm\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Avatar stack\n * ```html\n * <com-item title=\"3 collaborators\">\n * <ng-template comItemLeading>\n * <div class=\"flex -space-x-2\">\n * <com-avatar name=\"A\" size=\"xs\" variant=\"outline\" />\n * <com-avatar name=\"B\" size=\"xs\" variant=\"outline\" />\n * </div>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemLeading]',\n})\nexport class ComItemLeading {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting custom title content into a com-item.\n *\n * When this directive is present, it replaces the `title` input with\n * rich projected content. Use this when the title needs formatting,\n * links, or other custom markup.\n *\n * @example Title with link\n * ```html\n * <com-item icon=\"link\">\n * <ng-template comItemTitle>\n * <a href=\"/docs/api\" class=\"hover:underline\">API Documentation</a>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemTitle]',\n})\nexport class ComItemTitle {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting inline suffix content after the title.\n *\n * Content appears on the same line as the title, immediately after it.\n * Use this for badges, tags, status indicators, or other inline metadata.\n *\n * @example Badge suffix\n * ```html\n * <com-item title=\"My BP datasource\" description=\"View and manage configuration\">\n * <ng-template comItemSuffix>\n * <span class=\"inline-flex items-center gap-1 rounded-pill border border-primary/30 bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary\">\n * Bluetooth\n * </span>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemSuffix]',\n})\nexport class ComItemSuffix {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting custom description content into a com-item.\n *\n * When this directive is present, it replaces the `description` input\n * with rich projected content. Use this when the description needs\n * formatting, code snippets, or other custom markup.\n *\n * @example Description with code\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemDescription>\n * <code class=\"text-xs font-mono text-muted-foreground\">sk-abc...xyz</code>\n * <span class=\"text-xs text-muted-foreground\"> · Created 3 days ago</span>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemDescription]',\n})\nexport class ComItemDescription {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting trailing content into a com-item.\n *\n * Content appears at the far right edge of the item. Use this for\n * action buttons, navigation chevrons, toggles, timestamps, or\n * any other trailing content.\n *\n * @example Trailing chevron\n * ```html\n * <com-item title=\"Settings\" icon=\"settings\" [interactive]=\"true\">\n * <ng-template comItemTrailing>\n * <com-icon name=\"chevron-right\" size=\"sm\" color=\"muted\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Trailing action button\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemTrailing>\n * <button class=\"text-sm text-primary hover:text-primary-hover\">Revoke</button>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemTrailing]',\n})\nexport class ComItemTrailing {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { AvatarSize } from 'ngx-com/components/avatar';\nimport type { IconSize } from 'ngx-com/components/icon';\n\n/** Item size variants. */\nexport type ItemSize = 'sm' | 'md' | 'lg';\n\n/** Item density variants. */\nexport type ItemDensity = 'compact' | 'default' | 'comfortable';\n\n/**\n * CVA variants for the item container (host element).\n *\n * @tokens `--color-primary-subtle`, `--color-muted`, `--color-ring`\n */\nexport const itemVariants: (props?: {\n size?: ItemSize;\n density?: ItemDensity;\n interactive?: boolean;\n active?: boolean;\n disabled?: boolean;\n}) => string = cva(['com-item', 'flex w-full items-center'], {\n variants: {\n size: {\n sm: 'gap-2.5',\n md: 'gap-3',\n lg: 'gap-3.5',\n },\n density: {\n compact: 'py-1.5',\n default: 'py-2.5',\n comfortable: 'py-4',\n },\n interactive: {\n true: [\n 'cursor-pointer',\n 'rounded-lg',\n 'px-3',\n 'hover:bg-muted/50',\n 'active:bg-muted',\n 'transition-colors duration-150',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n ],\n false: 'cursor-default',\n },\n active: {\n true: 'bg-primary-subtle',\n false: '',\n },\n disabled: {\n true: 'opacity-60 pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n density: 'default',\n interactive: false,\n active: false,\n disabled: false,\n },\n});\n\n/** Title classes keyed by item size. */\nexport const ITEM_TITLE_CLASSES: Record<ItemSize, string> = {\n sm: 'text-sm',\n md: 'text-sm font-medium',\n lg: 'text-xl font-semibold tracking-tight',\n};\n\n/** Description classes keyed by item size. */\nexport const ITEM_DESCRIPTION_CLASSES: Record<ItemSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\n/** Avatar size mapping keyed by item size. */\nexport const ITEM_AVATAR_SIZES: Record<ItemSize, AvatarSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n};\n\n/** Icon size mapping keyed by item size (for icon inside avatar). */\nexport const ITEM_ICON_SIZES: Record<ItemSize, IconSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n};\n\nexport type ItemVariants = VariantProps<typeof itemVariants>;\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComAvatar, ComAvatarCustom } from 'ngx-com/components/avatar';\nimport type { AvatarColor, AvatarSize } from 'ngx-com/components/avatar';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport type { IconSize } from 'ngx-com/components/icon';\nimport {\n ComItemLeading,\n ComItemTitle,\n ComItemSuffix,\n ComItemDescription,\n ComItemTrailing,\n} from './item.directives';\nimport {\n itemVariants,\n ITEM_TITLE_CLASSES,\n ITEM_DESCRIPTION_CLASSES,\n ITEM_AVATAR_SIZES,\n ITEM_ICON_SIZES,\n} from './item.variants';\nimport type { ItemSize, ItemDensity } from './item.variants';\n\n/**\n * Item component — a universal compound display element that shows a leading\n * visual alongside a title, an optional description, and optional trailing content.\n *\n * Works in all these contexts:\n * - List rows (device lists, settings menus, search results)\n * - Page/section headers\n * - Dropdown menu items\n * - Table cells\n * - Card headers\n * - Nav items\n *\n * **Anatomy:**\n * ```\n * ┌─────────────────────────────────────────────────────────┐\n * │ ┌───────┐ │\n * │ │com- │ Title text · [inline suffix] [TRAILING] │\n * │ │avatar │ Description text (secondary) │\n * │ └───────┘ │\n * └─────────────────────────────────────────────────────────┘\n * ```\n *\n * Five content zones:\n * 1. **Leading visual** — optional. Default: `com-avatar` with `shape=\"rounded\"` + `variant=\"soft\"`.\n * Override via `comItemLeading` directive.\n * 2. **Title** — primary text. Required (via input or projection).\n * 3. **Inline suffix** — same line as title, after it. For badges, tags, status dots.\n * 4. **Description** — secondary text below title. Optional.\n * 5. **Trailing** — far-right aligned. Actions, chevrons, timestamps.\n *\n * @tokens `--color-primary-subtle`, `--color-muted`, `--color-muted-foreground`,\n * `--color-foreground`, `--color-ring`\n *\n * @example Simplest — text only, no icon\n * ```html\n * <com-item title=\"Select all\" />\n * ```\n *\n * @example Icon + title + description (most common)\n * ```html\n * <com-item\n * title=\"Dexcom G7\"\n * description=\"109123c2d2194bffe519b03ceb51730d5064f9de46c54c4e...\"\n * icon=\"smartphone\"\n * />\n * ```\n *\n * @example Icon with different color\n * ```html\n * <com-item title=\"Warning detected\" icon=\"alert-triangle\" iconColor=\"warn\" />\n * <com-item title=\"Active\" icon=\"check-circle\" iconColor=\"accent\" />\n * ```\n *\n * @example Page header with badge suffix (size lg)\n * ```html\n * <com-item\n * title=\"My BP datasource\"\n * description=\"View and manage datasource configuration\"\n * size=\"lg\"\n * >\n * <ng-template comItemSuffix>\n * <span class=\"inline-flex items-center gap-1 rounded-pill border border-primary/30 bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary\">\n * <com-icon name=\"bluetooth\" size=\"xs\" /> Bluetooth\n * </span>\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Custom leading — user avatar with image\n * ```html\n * <com-item title=\"Jane Doe\" description=\"jane@example.com\">\n * <ng-template comItemLeading>\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" size=\"sm\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Interactive list item with trailing chevron\n * ```html\n * <com-item\n * title=\"Bluetooth Settings\"\n * description=\"Manage paired devices\"\n * icon=\"bluetooth\"\n * [interactive]=\"true\"\n * (click)=\"openSettings()\"\n * >\n * <ng-template comItemTrailing>\n * <com-icon name=\"chevron-right\" size=\"sm\" color=\"muted\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Compact density — dropdown menu\n * ```html\n * @for (option of options; track option.value) {\n * <com-item\n * [title]=\"option.label\"\n * [icon]=\"option.icon\"\n * density=\"compact\"\n * [interactive]=\"true\"\n * [active]=\"option.value === selected()\"\n * (click)=\"select(option)\"\n * />\n * }\n * ```\n *\n * @example Rich description via projection\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemDescription>\n * <code class=\"text-xs font-mono text-muted-foreground\">sk-abc...xyz</code>\n * <span class=\"text-xs text-muted-foreground\"> · Created 3 days ago</span>\n * </ng-template>\n * <ng-template comItemTrailing>\n * <button class=\"text-sm text-primary hover:text-primary-hover\">Revoke</button>\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Disabled\n * ```html\n * <com-item\n * title=\"Enterprise Features\"\n * description=\"Available on Enterprise plan\"\n * icon=\"crown\"\n * [disabled]=\"true\"\n * />\n * ```\n */\n@Component({\n selector: 'com-item',\n exportAs: 'comItem',\n template: `\n <!-- Leading visual zone -->\n @if (leadingDirective(); as leading) {\n <ng-container [ngTemplateOutlet]=\"leading.templateRef\" />\n } @else if (icon()) {\n <com-avatar\n [size]=\"avatarSize()\"\n shape=\"rounded\"\n variant=\"soft\"\n [color]=\"resolvedIconColor()\"\n >\n <ng-template comAvatarCustom>\n <com-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </ng-template>\n </com-avatar>\n }\n\n <!-- Text zone -->\n <div class=\"flex min-w-0 flex-1 flex-col justify-center\">\n <!-- Title row -->\n <div class=\"flex items-center gap-1.5\">\n @if (titleDirective(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl.templateRef\" />\n } @else if (title()) {\n <span\n class=\"text-foreground\"\n [class]=\"titleClasses()\"\n [class.truncate]=\"truncate()\"\n >\n {{ title() }}\n </span>\n }\n @if (suffixDirective(); as suffix) {\n <ng-container [ngTemplateOutlet]=\"suffix.templateRef\" />\n }\n </div>\n\n <!-- Description row -->\n @if (descriptionDirective(); as descTpl) {\n <ng-container [ngTemplateOutlet]=\"descTpl.templateRef\" />\n } @else if (description()) {\n <span\n class=\"text-muted-foreground\"\n [class]=\"descriptionClasses()\"\n [class.truncate]=\"truncate()\"\n >\n {{ description() }}\n </span>\n }\n </div>\n\n <!-- Trailing zone -->\n @if (trailingDirective(); as trailing) {\n <div class=\"flex shrink-0 items-center\">\n <ng-container [ngTemplateOutlet]=\"trailing.templateRef\" />\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgTemplateOutlet,\n ComAvatar,\n ComAvatarCustom,\n ComIcon,\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.role]': 'interactive() ? \"button\" : null',\n '[attr.tabindex]': 'interactive() && !disabled() ? 0 : null',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.aria-label]': 'title() || null',\n '(keydown.enter)': 'onKeyboardActivate($event)',\n '(keydown.space)': 'onKeyboardActivate($event)',\n },\n})\nexport class ComItem {\n // ─── Content Inputs ───\n\n /** Primary text. Required unless using comItemTitle directive. */\n readonly title: InputSignal<string | undefined> = input<string>();\n\n /** Secondary text below the title. */\n readonly description: InputSignal<string | undefined> = input<string>();\n\n /** Lucide icon name — renders inside a com-avatar container. */\n readonly icon: InputSignal<string | undefined> = input<string>();\n\n /** Color variant passed to the leading com-avatar. */\n readonly iconColor: InputSignal<AvatarColor> = input<AvatarColor>('primary');\n\n // ─── CVA Variant Inputs ───\n\n /** Size variant affecting typography and spacing. */\n readonly size: InputSignal<ItemSize> = input<ItemSize>('md');\n\n /** Density variant affecting vertical padding. */\n readonly density: InputSignal<ItemDensity> = input<ItemDensity>('default');\n\n /** Enables hover/active/focus states. */\n readonly interactive: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Shows selected/active highlight. */\n readonly active: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Dims and disables pointer events. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Truncates title and description text. */\n readonly truncate: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n // ─── Content Projection Queries ───\n\n protected readonly leadingDirective: Signal<ComItemLeading | undefined> =\n contentChild(ComItemLeading);\n\n protected readonly titleDirective: Signal<ComItemTitle | undefined> =\n contentChild(ComItemTitle);\n\n protected readonly suffixDirective: Signal<ComItemSuffix | undefined> =\n contentChild(ComItemSuffix);\n\n protected readonly descriptionDirective: Signal<ComItemDescription | undefined> =\n contentChild(ComItemDescription);\n\n protected readonly trailingDirective: Signal<ComItemTrailing | undefined> =\n contentChild(ComItemTrailing);\n\n // ─── Computed Values ───\n\n /** Resolved icon color (handles 'auto' → 'primary' for items since there's no name). */\n protected readonly resolvedIconColor: Signal<AvatarColor> = computed(() => {\n const color = this.iconColor();\n // For items, 'auto' should default to 'primary' since there's no name to hash\n return color === 'auto' ? 'primary' : color;\n });\n\n /** Avatar size mapped from item size. */\n protected readonly avatarSize: Signal<AvatarSize> = computed(\n () => ITEM_AVATAR_SIZES[this.size()]\n );\n\n /** Icon size mapped from item size. */\n protected readonly iconSize: Signal<IconSize> = computed(\n () => ITEM_ICON_SIZES[this.size()]\n );\n\n /** Title typography classes based on size. */\n protected readonly titleClasses: Signal<string> = computed(\n () => ITEM_TITLE_CLASSES[this.size()]\n );\n\n /** Description typography classes based on size. */\n protected readonly descriptionClasses: Signal<string> = computed(\n () => ITEM_DESCRIPTION_CLASSES[this.size()]\n );\n\n /** Host element classes from CVA. */\n protected readonly hostClasses: Signal<string> = computed(() =>\n itemVariants({\n size: this.size(),\n density: this.density(),\n interactive: this.interactive(),\n active: this.active(),\n disabled: this.disabled(),\n })\n );\n\n // ─── Keyboard Accessibility ───\n\n protected onKeyboardActivate(event: Event): void {\n if (this.interactive() && !this.disabled()) {\n event.preventDefault();\n (event.target as HTMLElement).click();\n }\n }\n}\n","// Public API for the item component\n\n// Main component\nexport { ComItem } from './item.component';\n\n// Directives\nexport {\n ComItemLeading,\n ComItemTitle,\n ComItemSuffix,\n ComItemDescription,\n ComItemTrailing,\n} from './item.directives';\n\n// Variants and utilities\nexport {\n itemVariants,\n ITEM_TITLE_CLASSES,\n ITEM_DESCRIPTION_CLASSES,\n ITEM_AVATAR_SIZES,\n ITEM_ICON_SIZES,\n} from './item.variants';\n\nexport type {\n ItemSize,\n ItemDensity,\n ItemVariants,\n} from './item.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-com-components-item.mjs","sources":["../../../projects/com/components/item/item.directives.ts","../../../projects/com/components/item/item.variants.ts","../../../projects/com/components/item/item.component.ts","../../../projects/com/components/item/index.ts","../../../projects/com/components/item/ngx-com-components-item.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Marker directive for projecting custom leading content into a com-item.\n *\n * When this directive is present, it completely replaces the default\n * leading visual (which would otherwise be a com-avatar with an icon).\n * Use this for custom avatars (with images or initials), bare icons,\n * custom images, or any other leading visual.\n *\n * @example Custom avatar with image\n * ```html\n * <com-item title=\"Jane Doe\" description=\"jane@example.com\">\n * <ng-template comItemLeading>\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" size=\"sm\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Avatar stack\n * ```html\n * <com-item title=\"3 collaborators\">\n * <ng-template comItemLeading>\n * <div class=\"flex -space-x-2\">\n * <com-avatar name=\"A\" size=\"xs\" variant=\"outline\" />\n * <com-avatar name=\"B\" size=\"xs\" variant=\"outline\" />\n * </div>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemLeading]',\n})\nexport class ComItemLeading {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting custom title content into a com-item.\n *\n * When this directive is present, it replaces the `title` input with\n * rich projected content. Use this when the title needs formatting,\n * links, or other custom markup.\n *\n * @example Title with link\n * ```html\n * <com-item icon=\"link\">\n * <ng-template comItemTitle>\n * <a href=\"/docs/api\" class=\"hover:underline\">API Documentation</a>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemTitle]',\n})\nexport class ComItemTitle {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting inline suffix content after the title.\n *\n * Content appears on the same line as the title, immediately after it.\n * Use this for badges, tags, status indicators, or other inline metadata.\n *\n * @example Badge suffix\n * ```html\n * <com-item title=\"My BP datasource\" description=\"View and manage configuration\">\n * <ng-template comItemSuffix>\n * <span class=\"inline-flex items-center gap-1 rounded-pill border border-primary/30 bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary\">\n * Bluetooth\n * </span>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemSuffix]',\n})\nexport class ComItemSuffix {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting custom description content into a com-item.\n *\n * When this directive is present, it replaces the `description` input\n * with rich projected content. Use this when the description needs\n * formatting, code snippets, or other custom markup.\n *\n * @example Description with code\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemDescription>\n * <code class=\"text-xs font-mono text-muted-foreground\">sk-abc...xyz</code>\n * <span class=\"text-xs text-muted-foreground\"> · Created 3 days ago</span>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemDescription]',\n})\nexport class ComItemDescription {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting trailing content into a com-item.\n *\n * Content appears at the far right edge of the item. Use this for\n * action buttons, navigation chevrons, toggles, timestamps, or\n * any other trailing content.\n *\n * @example Trailing chevron\n * ```html\n * <com-item title=\"Settings\" icon=\"settings\" [interactive]=\"true\">\n * <ng-template comItemTrailing>\n * <com-icon name=\"chevron-right\" size=\"sm\" color=\"muted\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Trailing action button\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemTrailing>\n * <button class=\"text-sm text-primary hover:text-primary-hover\">Revoke</button>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemTrailing]',\n})\nexport class ComItemTrailing {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { AvatarSize } from 'ngx-com/components/avatar';\nimport type { IconSize } from 'ngx-com/components/icon';\n\n/** Item size variants. */\nexport type ItemSize = 'sm' | 'md' | 'lg';\n\n/** Item density variants. */\nexport type ItemDensity = 'compact' | 'default' | 'comfortable';\n\n/**\n * CVA variants for the item container (host element).\n *\n * @tokens `--color-primary-subtle`, `--color-muted`, `--color-muted-hover`, `--color-ring`, `--color-disabled-foreground`\n */\nexport const itemVariants: (props?: {\n size?: ItemSize;\n density?: ItemDensity;\n interactive?: boolean;\n active?: boolean;\n disabled?: boolean;\n}) => string = cva(['com-item', 'flex w-full items-center'], {\n variants: {\n size: {\n sm: 'gap-2.5',\n md: 'gap-3',\n lg: 'gap-3.5',\n },\n density: {\n compact: 'py-1.5',\n default: 'py-2.5',\n comfortable: 'py-4',\n },\n interactive: {\n true: [\n 'cursor-pointer',\n 'rounded-lg',\n 'px-3',\n 'hover:bg-muted-hover',\n 'active:bg-muted',\n 'transition-colors duration-150',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n ],\n false: 'cursor-default',\n },\n active: {\n true: 'bg-primary-subtle',\n false: '',\n },\n disabled: {\n true: 'text-disabled-foreground pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n density: 'default',\n interactive: false,\n active: false,\n disabled: false,\n },\n});\n\n/** Title classes keyed by item size. */\nexport const ITEM_TITLE_CLASSES: Record<ItemSize, string> = {\n sm: 'text-sm',\n md: 'text-sm font-medium',\n lg: 'text-xl font-semibold tracking-tight',\n};\n\n/** Description classes keyed by item size. */\nexport const ITEM_DESCRIPTION_CLASSES: Record<ItemSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\n/** Avatar size mapping keyed by item size. */\nexport const ITEM_AVATAR_SIZES: Record<ItemSize, AvatarSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n};\n\n/** Icon size mapping keyed by item size (for icon inside avatar). */\nexport const ITEM_ICON_SIZES: Record<ItemSize, IconSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n};\n\nexport type ItemVariants = VariantProps<typeof itemVariants>;\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComAvatar, ComAvatarCustom } from 'ngx-com/components/avatar';\nimport type { AvatarColor, AvatarSize } from 'ngx-com/components/avatar';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport type { IconSize } from 'ngx-com/components/icon';\nimport {\n ComItemLeading,\n ComItemTitle,\n ComItemSuffix,\n ComItemDescription,\n ComItemTrailing,\n} from './item.directives';\nimport {\n itemVariants,\n ITEM_TITLE_CLASSES,\n ITEM_DESCRIPTION_CLASSES,\n ITEM_AVATAR_SIZES,\n ITEM_ICON_SIZES,\n} from './item.variants';\nimport type { ItemSize, ItemDensity } from './item.variants';\n\n/**\n * Item component — a universal compound display element that shows a leading\n * visual alongside a title, an optional description, and optional trailing content.\n *\n * Works in all these contexts:\n * - List rows (device lists, settings menus, search results)\n * - Page/section headers\n * - Dropdown menu items\n * - Table cells\n * - Card headers\n * - Nav items\n *\n * **Anatomy:**\n * ```\n * ┌─────────────────────────────────────────────────────────┐\n * │ ┌───────┐ │\n * │ │com- │ Title text · [inline suffix] [TRAILING] │\n * │ │avatar │ Description text (secondary) │\n * │ └───────┘ │\n * └─────────────────────────────────────────────────────────┘\n * ```\n *\n * Five content zones:\n * 1. **Leading visual** — optional. Default: `com-avatar` with `shape=\"rounded\"` + `variant=\"soft\"`.\n * Override via `comItemLeading` directive.\n * 2. **Title** — primary text. Required (via input or projection).\n * 3. **Inline suffix** — same line as title, after it. For badges, tags, status dots.\n * 4. **Description** — secondary text below title. Optional.\n * 5. **Trailing** — far-right aligned. Actions, chevrons, timestamps.\n *\n * @tokens `--color-primary-subtle`, `--color-muted`, `--color-muted-foreground`,\n * `--color-foreground`, `--color-ring`\n *\n * @example Simplest — text only, no icon\n * ```html\n * <com-item title=\"Select all\" />\n * ```\n *\n * @example Icon + title + description (most common)\n * ```html\n * <com-item\n * title=\"Dexcom G7\"\n * description=\"109123c2d2194bffe519b03ceb51730d5064f9de46c54c4e...\"\n * icon=\"smartphone\"\n * />\n * ```\n *\n * @example Icon with different color\n * ```html\n * <com-item title=\"Warning detected\" icon=\"alert-triangle\" iconColor=\"warn\" />\n * <com-item title=\"Active\" icon=\"check-circle\" iconColor=\"accent\" />\n * ```\n *\n * @example Page header with badge suffix (size lg)\n * ```html\n * <com-item\n * title=\"My BP datasource\"\n * description=\"View and manage datasource configuration\"\n * size=\"lg\"\n * >\n * <ng-template comItemSuffix>\n * <span class=\"inline-flex items-center gap-1 rounded-pill border border-primary/30 bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary\">\n * <com-icon name=\"bluetooth\" size=\"xs\" /> Bluetooth\n * </span>\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Custom leading — user avatar with image\n * ```html\n * <com-item title=\"Jane Doe\" description=\"jane@example.com\">\n * <ng-template comItemLeading>\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" size=\"sm\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Interactive list item with trailing chevron\n * ```html\n * <com-item\n * title=\"Bluetooth Settings\"\n * description=\"Manage paired devices\"\n * icon=\"bluetooth\"\n * [interactive]=\"true\"\n * (click)=\"openSettings()\"\n * >\n * <ng-template comItemTrailing>\n * <com-icon name=\"chevron-right\" size=\"sm\" color=\"muted\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Compact density — dropdown menu\n * ```html\n * @for (option of options; track option.value) {\n * <com-item\n * [title]=\"option.label\"\n * [icon]=\"option.icon\"\n * density=\"compact\"\n * [interactive]=\"true\"\n * [active]=\"option.value === selected()\"\n * (click)=\"select(option)\"\n * />\n * }\n * ```\n *\n * @example Rich description via projection\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemDescription>\n * <code class=\"text-xs font-mono text-muted-foreground\">sk-abc...xyz</code>\n * <span class=\"text-xs text-muted-foreground\"> · Created 3 days ago</span>\n * </ng-template>\n * <ng-template comItemTrailing>\n * <button class=\"text-sm text-primary hover:text-primary-hover\">Revoke</button>\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Disabled\n * ```html\n * <com-item\n * title=\"Enterprise Features\"\n * description=\"Available on Enterprise plan\"\n * icon=\"crown\"\n * [disabled]=\"true\"\n * />\n * ```\n */\n@Component({\n selector: 'com-item',\n exportAs: 'comItem',\n template: `\n <!-- Leading visual zone -->\n @if (leadingDirective(); as leading) {\n <ng-container [ngTemplateOutlet]=\"leading.templateRef\" />\n } @else if (icon()) {\n <com-avatar\n [size]=\"avatarSize()\"\n shape=\"rounded\"\n variant=\"soft\"\n [color]=\"resolvedIconColor()\"\n >\n <ng-template comAvatarCustom>\n <com-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </ng-template>\n </com-avatar>\n }\n\n <!-- Text zone -->\n <div class=\"flex min-w-0 flex-1 flex-col justify-center\">\n <!-- Title row -->\n <div class=\"flex items-center gap-1.5\">\n @if (titleDirective(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl.templateRef\" />\n } @else if (title()) {\n <span\n class=\"text-foreground\"\n [class]=\"titleClasses()\"\n [class.truncate]=\"truncate()\"\n >\n {{ title() }}\n </span>\n }\n @if (suffixDirective(); as suffix) {\n <ng-container [ngTemplateOutlet]=\"suffix.templateRef\" />\n }\n </div>\n\n <!-- Description row -->\n @if (descriptionDirective(); as descTpl) {\n <ng-container [ngTemplateOutlet]=\"descTpl.templateRef\" />\n } @else if (description()) {\n <span\n class=\"text-muted-foreground\"\n [class]=\"descriptionClasses()\"\n [class.truncate]=\"truncate()\"\n >\n {{ description() }}\n </span>\n }\n </div>\n\n <!-- Trailing zone -->\n @if (trailingDirective(); as trailing) {\n <div class=\"flex shrink-0 items-center\">\n <ng-container [ngTemplateOutlet]=\"trailing.templateRef\" />\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgTemplateOutlet,\n ComAvatar,\n ComAvatarCustom,\n ComIcon,\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.role]': 'interactive() ? \"button\" : null',\n '[attr.tabindex]': 'interactive() && !disabled() ? 0 : null',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.aria-label]': 'title() || null',\n '(keydown.enter)': 'onKeyboardActivate($event)',\n '(keydown.space)': 'onKeyboardActivate($event)',\n },\n})\nexport class ComItem {\n // ─── Content Inputs ───\n\n /** Primary text. Required unless using comItemTitle directive. */\n readonly title: InputSignal<string | undefined> = input<string>();\n\n /** Secondary text below the title. */\n readonly description: InputSignal<string | undefined> = input<string>();\n\n /** Lucide icon name — renders inside a com-avatar container. */\n readonly icon: InputSignal<string | undefined> = input<string>();\n\n /** Color variant passed to the leading com-avatar. */\n readonly iconColor: InputSignal<AvatarColor> = input<AvatarColor>('primary');\n\n // ─── CVA Variant Inputs ───\n\n /** Size variant affecting typography and spacing. */\n readonly size: InputSignal<ItemSize> = input<ItemSize>('md');\n\n /** Density variant affecting vertical padding. */\n readonly density: InputSignal<ItemDensity> = input<ItemDensity>('default');\n\n /** Enables hover/active/focus states. */\n readonly interactive: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Shows selected/active highlight. */\n readonly active: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Dims and disables pointer events. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Truncates title and description text. */\n readonly truncate: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n // ─── Content Projection Queries ───\n\n protected readonly leadingDirective: Signal<ComItemLeading | undefined> =\n contentChild(ComItemLeading);\n\n protected readonly titleDirective: Signal<ComItemTitle | undefined> =\n contentChild(ComItemTitle);\n\n protected readonly suffixDirective: Signal<ComItemSuffix | undefined> =\n contentChild(ComItemSuffix);\n\n protected readonly descriptionDirective: Signal<ComItemDescription | undefined> =\n contentChild(ComItemDescription);\n\n protected readonly trailingDirective: Signal<ComItemTrailing | undefined> =\n contentChild(ComItemTrailing);\n\n // ─── Computed Values ───\n\n /** Resolved icon color (handles 'auto' → 'primary' for items since there's no name). */\n protected readonly resolvedIconColor: Signal<AvatarColor> = computed(() => {\n const color = this.iconColor();\n // For items, 'auto' should default to 'primary' since there's no name to hash\n return color === 'auto' ? 'primary' : color;\n });\n\n /** Avatar size mapped from item size. */\n protected readonly avatarSize: Signal<AvatarSize> = computed(\n () => ITEM_AVATAR_SIZES[this.size()]\n );\n\n /** Icon size mapped from item size. */\n protected readonly iconSize: Signal<IconSize> = computed(\n () => ITEM_ICON_SIZES[this.size()]\n );\n\n /** Title typography classes based on size. */\n protected readonly titleClasses: Signal<string> = computed(\n () => ITEM_TITLE_CLASSES[this.size()]\n );\n\n /** Description typography classes based on size. */\n protected readonly descriptionClasses: Signal<string> = computed(\n () => ITEM_DESCRIPTION_CLASSES[this.size()]\n );\n\n /** Host element classes from CVA. */\n protected readonly hostClasses: Signal<string> = computed(() =>\n itemVariants({\n size: this.size(),\n density: this.density(),\n interactive: this.interactive(),\n active: this.active(),\n disabled: this.disabled(),\n })\n );\n\n // ─── Keyboard Accessibility ───\n\n protected onKeyboardActivate(event: Event): void {\n if (this.interactive() && !this.disabled()) {\n event.preventDefault();\n (event.target as HTMLElement).click();\n }\n }\n}\n","// Public API for the item component\n\n// Main component\nexport { ComItem } from './item.component';\n\n// Directives\nexport {\n ComItemLeading,\n ComItemTitle,\n ComItemSuffix,\n ComItemDescription,\n ComItemTrailing,\n} from './item.directives';\n\n// Variants and utilities\nexport {\n itemVariants,\n ITEM_TITLE_CLASSES,\n ITEM_DESCRIPTION_CLASSES,\n ITEM_AVATAR_SIZES,\n ITEM_ICON_SIZES,\n} from './item.variants';\n\nexport type {\n ItemSize,\n ItemDensity,\n ItemVariants,\n} from './item.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -39,10 +39,10 @@ const sortIconVariants = cva(['inline-flex items-center justify-center', 'shrink
39
39
  lg: 'size-4',
40
40
  },
41
41
  state: {
42
- asc: 'opacity-100 rotate-0',
43
- desc: 'opacity-100 rotate-180',
44
- unsorted: 'opacity-40 rotate-0',
45
- hidden: 'opacity-0 scale-75',
42
+ asc: 'text-foreground rotate-0',
43
+ desc: 'text-foreground rotate-180',
44
+ unsorted: 'text-muted-foreground rotate-0',
45
+ hidden: 'invisible scale-75',
46
46
  },
47
47
  },
48
48
  defaultVariants: {
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-sort.mjs","sources":["../../../projects/com/components/sort/sort.variants.ts","../../../projects/com/components/sort/sort.directive.ts","../../../projects/com/components/sort/sort-icon.component.ts","../../../projects/com/components/sort/sort-header.component.ts","../../../projects/com/components/sort/index.ts","../../../projects/com/components/sort/ngx-com-components-sort.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n// ─── Type Exports ───\n\n/** Sort direction — three states */\nexport type SortDirection = 'asc' | 'desc' | undefined;\n\n/** Configures the three-state sort cycle */\nexport type SortCycle = SortDirection[];\n\n/** Emitted when sort state changes */\nexport interface SortEvent {\n /** The active column id, or undefined if unsorted */\n active: string | undefined;\n /** The sort direction */\n direction: SortDirection;\n}\n\n// ─── Sort Header Variants ───\n\n/**\n * @tokens `--color-foreground`, `--color-muted-foreground`\n */\nexport const sortHeaderVariants: (props?: {\n sortable?: boolean;\n active?: boolean;\n disabled?: boolean;\n}) => string = cva(\n ['inline-flex items-center gap-1.5', 'select-none', 'transition-colors duration-150'],\n {\n variants: {\n sortable: {\n true: 'cursor-pointer hover:text-foreground',\n false: 'cursor-default',\n },\n active: {\n true: 'text-foreground',\n false: 'text-muted-foreground',\n },\n disabled: {\n true: 'text-disabled-foreground cursor-not-allowed pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n sortable: true,\n active: false,\n disabled: false,\n },\n }\n);\n\n// ─── Sort Icon Variants ───\n\n/**\n * @tokens `--color-foreground`, `--color-muted-foreground`\n */\nexport const sortIconVariants: (props?: {\n size?: 'sm' | 'md' | 'lg';\n state?: 'asc' | 'desc' | 'unsorted' | 'hidden';\n}) => string = cva(\n ['inline-flex items-center justify-center', 'shrink-0', 'transition-all duration-200 ease-out'],\n {\n variants: {\n size: {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n },\n state: {\n asc: 'opacity-100 rotate-0',\n desc: 'opacity-100 rotate-180',\n unsorted: 'opacity-40 rotate-0',\n hidden: 'opacity-0 scale-75',\n },\n },\n defaultVariants: {\n size: 'md',\n state: 'hidden',\n },\n }\n);\n","import { booleanAttribute, Directive, input, model, output } from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n} from '@angular/core';\nimport type { SortDirection, SortCycle, SortEvent } from './sort.variants';\nimport type { SortHeaderComponent } from './sort-header.component';\n\nconst DEFAULT_SORT_CYCLE: SortCycle = ['asc', 'desc', undefined];\n\n/**\n * Parent directive that manages sort state for a group of sortable headers.\n *\n * Apply to a container element (e.g., `<tr>`, `<div>`) that contains `[uiSortHeader]` children.\n * Children inject this directive via DI and read its signals directly.\n *\n * @tokens `--color-foreground`, `--color-muted-foreground`\n *\n * @example Basic usage\n * ```html\n * <tr comSort (sortChange)=\"onSort($event)\">\n * <th comSortHeader=\"name\">Name</th>\n * <th comSortHeader=\"age\">Age</th>\n * </tr>\n * ```\n *\n * @example Two-way binding\n * ```html\n * <tr comSort [(sortActive)]=\"column\" [(sortDirection)]=\"direction\">\n * <th comSortHeader=\"name\">Name</th>\n * </tr>\n * ```\n */\n@Directive({\n selector: '[comSort]',\n exportAs: 'comSort',\n host: {\n class: 'contents',\n },\n})\nexport class SortDirective {\n // ─── Inputs ───\n\n /** Currently active sort column id — two-way via model() */\n readonly sortActive: ModelSignal<string | undefined> = model<string | undefined>(undefined);\n\n /** Current sort direction — two-way via model() */\n readonly sortDirection: ModelSignal<SortDirection> = model<SortDirection>(undefined);\n\n /** Disables all sorting in this container */\n readonly sortDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Customize the click cycle (e.g., ['asc', 'desc'] to skip unsorted) */\n readonly sortCycle: InputSignal<SortCycle> = input<SortCycle>(DEFAULT_SORT_CYCLE);\n\n /** Show a muted arrow on unsorted headers */\n readonly sortShowIndicator: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n // ─── Outputs ───\n\n /** Emitted when active column or direction changes */\n readonly sortChange: OutputEmitterRef<SortEvent> = output<SortEvent>();\n\n // ─── Registration ───\n\n private readonly headers: Map<string, SortHeaderComponent> = new Map<string, SortHeaderComponent>();\n\n /** Register a sort header with this parent */\n register(header: SortHeaderComponent): void {\n this.headers.set(header.id(), header);\n }\n\n /** Deregister a sort header */\n deregister(id: string): void {\n this.headers.delete(id);\n }\n\n // ─── Public API ───\n\n /** Programmatically sort by a column */\n sort(id: string): void {\n if (this.sortDisabled()) return;\n\n const cycle = this.sortCycle();\n\n if (this.sortActive() !== id) {\n // New column — start at first direction in cycle\n this.sortActive.set(id);\n this.sortDirection.set(cycle[0]);\n } else {\n // Same column — advance cycle\n const currentIndex = cycle.indexOf(this.sortDirection());\n const nextIndex = (currentIndex + 1) % cycle.length;\n const nextDir = cycle[nextIndex];\n this.sortDirection.set(nextDir);\n\n // If direction is undefined, clear active\n if (nextDir === undefined) {\n this.sortActive.set(undefined);\n }\n }\n\n this.sortChange.emit({\n active: this.sortActive(),\n direction: this.sortDirection(),\n });\n }\n\n /** Returns the next direction in the cycle for a given column */\n getNextDirection(id: string): SortDirection {\n const cycle = this.sortCycle();\n\n if (this.sortActive() !== id) {\n return cycle[0];\n }\n\n const currentIndex = cycle.indexOf(this.sortDirection());\n const nextIndex = (currentIndex + 1) % cycle.length;\n return cycle[nextIndex];\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { sortIconVariants } from './sort.variants';\nimport type { SortDirection } from './sort.variants';\n\n/**\n * Internal animated SVG arrow indicator for sort headers.\n * Not exported — used only inside SortHeaderComponent.\n *\n * @tokens `--color-foreground`, `--color-muted-foreground`\n */\n@Component({\n selector: 'com-sort-icon',\n template: `\n <span [class]=\"iconClasses()\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"size-full\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 19V5\" />\n <path d=\"M5 12l7-7 7 7\" />\n </svg>\n </span>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SortIconComponent {\n /** Current sort direction */\n readonly direction: InputSignal<SortDirection> = input<SortDirection>(undefined);\n\n /** Whether the column is actively sorted */\n readonly isSorted: InputSignal<boolean> = input(false);\n\n /** Show a muted indicator when not sorted */\n readonly showWhenUnsorted: InputSignal<boolean> = input(false);\n\n /** Compute the icon state for CVA */\n private readonly iconState: Signal<'asc' | 'desc' | 'unsorted' | 'hidden'> = computed(() => {\n if (this.isSorted()) {\n return this.direction() === 'asc' ? 'asc' : 'desc';\n }\n if (this.showWhenUnsorted()) {\n return 'unsorted';\n }\n return 'hidden';\n });\n\n /** CVA-generated classes for the icon container */\n readonly iconClasses: Signal<string> = computed(() =>\n sortIconVariants({\n size: 'md',\n state: this.iconState(),\n })\n );\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n Signal,\n} from '@angular/core';\nimport { SortDirective } from './sort.directive';\nimport { SortIconComponent } from './sort-icon.component';\nimport { sortHeaderVariants } from './sort.variants';\nimport type { SortDirection } from './sort.variants';\n\n/**\n * Sortable header component — child of [uiSort] directive.\n *\n * Apply to table headers, div columns, or any clickable element that should trigger sorting.\n *\n * @tokens `--color-foreground`, `--color-muted-foreground`, `--color-disabled-foreground`\n *\n * @example Basic usage\n * ```html\n * <tr comSort (sortChange)=\"onSort($event)\">\n * <th comSortHeader=\"name\">Name</th>\n * <th comSortHeader=\"age\">Age</th>\n * </tr>\n * ```\n *\n * @example Arrow placement\n * ```html\n * <th comSortHeader=\"name\" comSortHeaderArrowPosition=\"before\">Name</th>\n * ```\n */\n@Component({\n selector: '[comSortHeader]',\n template: `\n @if (sortHeaderArrowPosition() === 'before') {\n <com-sort-icon\n [direction]=\"direction()\"\n [isSorted]=\"isSorted()\"\n [showWhenUnsorted]=\"showUnsortedIndicator()\"\n />\n }\n\n <ng-content />\n\n @if (sortHeaderArrowPosition() === 'after') {\n <com-sort-icon\n [direction]=\"direction()\"\n [isSorted]=\"isSorted()\"\n [showWhenUnsorted]=\"showUnsortedIndicator()\"\n />\n }\n `,\n imports: [SortIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.aria-sort]': 'ariaSort()',\n '[attr.role]': '\"columnheader\"',\n '[attr.tabindex]': 'isDisabled() ? -1 : 0',\n '[attr.aria-disabled]': 'isDisabled() || null',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onClick()',\n '(keydown.space)': '$event.preventDefault(); onClick()',\n },\n})\nexport class SortHeaderComponent implements OnInit {\n private readonly sort: SortDirective | null = inject(SortDirective, { optional: true });\n private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n // ─── Inputs ───\n\n /** The column id — aliased from the selector */\n readonly id: InputSignal<string> = input.required<string>({ alias: 'comSortHeader' });\n\n /** Disable sorting for this specific header */\n readonly sortHeaderDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Override parent's sortShowIndicator for this header */\n readonly sortHeaderShowIndicator: InputSignal<boolean | undefined> = input<boolean | undefined>(\n undefined\n );\n\n /** Arrow placement relative to content */\n readonly sortHeaderArrowPosition: InputSignal<'before' | 'after'> = input<'before' | 'after'>(\n 'after',\n { alias: 'comSortHeaderArrowPosition' }\n );\n\n // ─── Computed State (from parent signals) ───\n\n /** Whether this header is the currently active sort column */\n readonly isActive: Signal<boolean> = computed(() => this.sort?.sortActive() === this.id());\n\n /** Current direction if active, undefined otherwise */\n readonly direction: Signal<SortDirection> = computed(() =>\n this.isActive() ? this.sort?.sortDirection() : undefined\n );\n\n /** Whether this header is sorted (active + has direction) */\n readonly isSorted: Signal<boolean> = computed(\n () => this.isActive() && this.sort?.sortDirection() !== undefined\n );\n\n /** Whether to show the muted indicator when unsorted */\n readonly showUnsortedIndicator: Signal<boolean> = computed(\n () => this.sortHeaderShowIndicator() ?? this.sort?.sortShowIndicator() ?? false\n );\n\n /** Whether sorting is disabled for this header */\n readonly isDisabled: Signal<boolean> = computed(\n () => this.sortHeaderDisabled() || this.sort?.sortDisabled() || false\n );\n\n /** aria-sort attribute value */\n readonly ariaSort: Signal<'ascending' | 'descending' | 'none'> = computed(() => {\n if (!this.isSorted()) return 'none';\n return this.direction() === 'asc' ? 'ascending' : 'descending';\n });\n\n /** CVA-generated host classes */\n readonly hostClasses: Signal<string> = computed(() =>\n sortHeaderVariants({\n sortable: !this.isDisabled(),\n active: this.isSorted(),\n disabled: this.isDisabled(),\n })\n );\n\n constructor() {\n if (!this.sort) {\n throw new Error('comSortHeader must be placed inside a [comSort] container.');\n }\n\n this.destroyRef.onDestroy(() => {\n this.sort?.deregister(this.id());\n });\n }\n\n ngOnInit(): void {\n this.sort!.register(this);\n }\n\n // ─── Event Handlers ───\n\n protected onClick(): void {\n if (this.isDisabled()) return;\n this.sort!.sort(this.id());\n }\n}\n","// Public API for the sort component\n\n// Types & Variants\nexport {\n sortHeaderVariants,\n sortIconVariants,\n type SortDirection,\n type SortCycle,\n type SortEvent,\n} from './sort.variants';\n\n// Directives & Components\nexport { SortDirective } from './sort.directive';\nexport { SortHeaderComponent } from './sort-header.component';\n\n// NOT exported: SortIconComponent (internal)\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-com-components-sort.mjs","sources":["../../../projects/com/components/sort/sort.variants.ts","../../../projects/com/components/sort/sort.directive.ts","../../../projects/com/components/sort/sort-icon.component.ts","../../../projects/com/components/sort/sort-header.component.ts","../../../projects/com/components/sort/index.ts","../../../projects/com/components/sort/ngx-com-components-sort.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\n\n// ─── Type Exports ───\n\n/** Sort direction — three states */\nexport type SortDirection = 'asc' | 'desc' | undefined;\n\n/** Configures the three-state sort cycle */\nexport type SortCycle = SortDirection[];\n\n/** Emitted when sort state changes */\nexport interface SortEvent {\n /** The active column id, or undefined if unsorted */\n active: string | undefined;\n /** The sort direction */\n direction: SortDirection;\n}\n\n// ─── Sort Header Variants ───\n\n/**\n * @tokens `--color-foreground`, `--color-muted-foreground`\n */\nexport const sortHeaderVariants: (props?: {\n sortable?: boolean;\n active?: boolean;\n disabled?: boolean;\n}) => string = cva(\n ['inline-flex items-center gap-1.5', 'select-none', 'transition-colors duration-150'],\n {\n variants: {\n sortable: {\n true: 'cursor-pointer hover:text-foreground',\n false: 'cursor-default',\n },\n active: {\n true: 'text-foreground',\n false: 'text-muted-foreground',\n },\n disabled: {\n true: 'text-disabled-foreground cursor-not-allowed pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n sortable: true,\n active: false,\n disabled: false,\n },\n }\n);\n\n// ─── Sort Icon Variants ───\n\n/**\n * @tokens `--color-foreground`, `--color-muted-foreground`\n */\nexport const sortIconVariants: (props?: {\n size?: 'sm' | 'md' | 'lg';\n state?: 'asc' | 'desc' | 'unsorted' | 'hidden';\n}) => string = cva(\n ['inline-flex items-center justify-center', 'shrink-0', 'transition-all duration-200 ease-out'],\n {\n variants: {\n size: {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n },\n state: {\n asc: 'text-foreground rotate-0',\n desc: 'text-foreground rotate-180',\n unsorted: 'text-muted-foreground rotate-0',\n hidden: 'invisible scale-75',\n },\n },\n defaultVariants: {\n size: 'md',\n state: 'hidden',\n },\n }\n);\n","import { booleanAttribute, Directive, input, model, output } from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n} from '@angular/core';\nimport type { SortDirection, SortCycle, SortEvent } from './sort.variants';\nimport type { SortHeaderComponent } from './sort-header.component';\n\nconst DEFAULT_SORT_CYCLE: SortCycle = ['asc', 'desc', undefined];\n\n/**\n * Parent directive that manages sort state for a group of sortable headers.\n *\n * Apply to a container element (e.g., `<tr>`, `<div>`) that contains `[uiSortHeader]` children.\n * Children inject this directive via DI and read its signals directly.\n *\n * @tokens `--color-foreground`, `--color-muted-foreground`\n *\n * @example Basic usage\n * ```html\n * <tr comSort (sortChange)=\"onSort($event)\">\n * <th comSortHeader=\"name\">Name</th>\n * <th comSortHeader=\"age\">Age</th>\n * </tr>\n * ```\n *\n * @example Two-way binding\n * ```html\n * <tr comSort [(sortActive)]=\"column\" [(sortDirection)]=\"direction\">\n * <th comSortHeader=\"name\">Name</th>\n * </tr>\n * ```\n */\n@Directive({\n selector: '[comSort]',\n exportAs: 'comSort',\n host: {\n class: 'contents',\n },\n})\nexport class SortDirective {\n // ─── Inputs ───\n\n /** Currently active sort column id — two-way via model() */\n readonly sortActive: ModelSignal<string | undefined> = model<string | undefined>(undefined);\n\n /** Current sort direction — two-way via model() */\n readonly sortDirection: ModelSignal<SortDirection> = model<SortDirection>(undefined);\n\n /** Disables all sorting in this container */\n readonly sortDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Customize the click cycle (e.g., ['asc', 'desc'] to skip unsorted) */\n readonly sortCycle: InputSignal<SortCycle> = input<SortCycle>(DEFAULT_SORT_CYCLE);\n\n /** Show a muted arrow on unsorted headers */\n readonly sortShowIndicator: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n // ─── Outputs ───\n\n /** Emitted when active column or direction changes */\n readonly sortChange: OutputEmitterRef<SortEvent> = output<SortEvent>();\n\n // ─── Registration ───\n\n private readonly headers: Map<string, SortHeaderComponent> = new Map<string, SortHeaderComponent>();\n\n /** Register a sort header with this parent */\n register(header: SortHeaderComponent): void {\n this.headers.set(header.id(), header);\n }\n\n /** Deregister a sort header */\n deregister(id: string): void {\n this.headers.delete(id);\n }\n\n // ─── Public API ───\n\n /** Programmatically sort by a column */\n sort(id: string): void {\n if (this.sortDisabled()) return;\n\n const cycle = this.sortCycle();\n\n if (this.sortActive() !== id) {\n // New column — start at first direction in cycle\n this.sortActive.set(id);\n this.sortDirection.set(cycle[0]);\n } else {\n // Same column — advance cycle\n const currentIndex = cycle.indexOf(this.sortDirection());\n const nextIndex = (currentIndex + 1) % cycle.length;\n const nextDir = cycle[nextIndex];\n this.sortDirection.set(nextDir);\n\n // If direction is undefined, clear active\n if (nextDir === undefined) {\n this.sortActive.set(undefined);\n }\n }\n\n this.sortChange.emit({\n active: this.sortActive(),\n direction: this.sortDirection(),\n });\n }\n\n /** Returns the next direction in the cycle for a given column */\n getNextDirection(id: string): SortDirection {\n const cycle = this.sortCycle();\n\n if (this.sortActive() !== id) {\n return cycle[0];\n }\n\n const currentIndex = cycle.indexOf(this.sortDirection());\n const nextIndex = (currentIndex + 1) % cycle.length;\n return cycle[nextIndex];\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { sortIconVariants } from './sort.variants';\nimport type { SortDirection } from './sort.variants';\n\n/**\n * Internal animated SVG arrow indicator for sort headers.\n * Not exported — used only inside SortHeaderComponent.\n *\n * @tokens `--color-foreground`, `--color-muted-foreground`\n */\n@Component({\n selector: 'com-sort-icon',\n template: `\n <span [class]=\"iconClasses()\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"size-full\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 19V5\" />\n <path d=\"M5 12l7-7 7 7\" />\n </svg>\n </span>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SortIconComponent {\n /** Current sort direction */\n readonly direction: InputSignal<SortDirection> = input<SortDirection>(undefined);\n\n /** Whether the column is actively sorted */\n readonly isSorted: InputSignal<boolean> = input(false);\n\n /** Show a muted indicator when not sorted */\n readonly showWhenUnsorted: InputSignal<boolean> = input(false);\n\n /** Compute the icon state for CVA */\n private readonly iconState: Signal<'asc' | 'desc' | 'unsorted' | 'hidden'> = computed(() => {\n if (this.isSorted()) {\n return this.direction() === 'asc' ? 'asc' : 'desc';\n }\n if (this.showWhenUnsorted()) {\n return 'unsorted';\n }\n return 'hidden';\n });\n\n /** CVA-generated classes for the icon container */\n readonly iconClasses: Signal<string> = computed(() =>\n sortIconVariants({\n size: 'md',\n state: this.iconState(),\n })\n );\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n} from '@angular/core';\nimport type {\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n Signal,\n} from '@angular/core';\nimport { SortDirective } from './sort.directive';\nimport { SortIconComponent } from './sort-icon.component';\nimport { sortHeaderVariants } from './sort.variants';\nimport type { SortDirection } from './sort.variants';\n\n/**\n * Sortable header component — child of [uiSort] directive.\n *\n * Apply to table headers, div columns, or any clickable element that should trigger sorting.\n *\n * @tokens `--color-foreground`, `--color-muted-foreground`, `--color-disabled-foreground`\n *\n * @example Basic usage\n * ```html\n * <tr comSort (sortChange)=\"onSort($event)\">\n * <th comSortHeader=\"name\">Name</th>\n * <th comSortHeader=\"age\">Age</th>\n * </tr>\n * ```\n *\n * @example Arrow placement\n * ```html\n * <th comSortHeader=\"name\" comSortHeaderArrowPosition=\"before\">Name</th>\n * ```\n */\n@Component({\n selector: '[comSortHeader]',\n template: `\n @if (sortHeaderArrowPosition() === 'before') {\n <com-sort-icon\n [direction]=\"direction()\"\n [isSorted]=\"isSorted()\"\n [showWhenUnsorted]=\"showUnsortedIndicator()\"\n />\n }\n\n <ng-content />\n\n @if (sortHeaderArrowPosition() === 'after') {\n <com-sort-icon\n [direction]=\"direction()\"\n [isSorted]=\"isSorted()\"\n [showWhenUnsorted]=\"showUnsortedIndicator()\"\n />\n }\n `,\n imports: [SortIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.aria-sort]': 'ariaSort()',\n '[attr.role]': '\"columnheader\"',\n '[attr.tabindex]': 'isDisabled() ? -1 : 0',\n '[attr.aria-disabled]': 'isDisabled() || null',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onClick()',\n '(keydown.space)': '$event.preventDefault(); onClick()',\n },\n})\nexport class SortHeaderComponent implements OnInit {\n private readonly sort: SortDirective | null = inject(SortDirective, { optional: true });\n private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n // ─── Inputs ───\n\n /** The column id — aliased from the selector */\n readonly id: InputSignal<string> = input.required<string>({ alias: 'comSortHeader' });\n\n /** Disable sorting for this specific header */\n readonly sortHeaderDisabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Override parent's sortShowIndicator for this header */\n readonly sortHeaderShowIndicator: InputSignal<boolean | undefined> = input<boolean | undefined>(\n undefined\n );\n\n /** Arrow placement relative to content */\n readonly sortHeaderArrowPosition: InputSignal<'before' | 'after'> = input<'before' | 'after'>(\n 'after',\n { alias: 'comSortHeaderArrowPosition' }\n );\n\n // ─── Computed State (from parent signals) ───\n\n /** Whether this header is the currently active sort column */\n readonly isActive: Signal<boolean> = computed(() => this.sort?.sortActive() === this.id());\n\n /** Current direction if active, undefined otherwise */\n readonly direction: Signal<SortDirection> = computed(() =>\n this.isActive() ? this.sort?.sortDirection() : undefined\n );\n\n /** Whether this header is sorted (active + has direction) */\n readonly isSorted: Signal<boolean> = computed(\n () => this.isActive() && this.sort?.sortDirection() !== undefined\n );\n\n /** Whether to show the muted indicator when unsorted */\n readonly showUnsortedIndicator: Signal<boolean> = computed(\n () => this.sortHeaderShowIndicator() ?? this.sort?.sortShowIndicator() ?? false\n );\n\n /** Whether sorting is disabled for this header */\n readonly isDisabled: Signal<boolean> = computed(\n () => this.sortHeaderDisabled() || this.sort?.sortDisabled() || false\n );\n\n /** aria-sort attribute value */\n readonly ariaSort: Signal<'ascending' | 'descending' | 'none'> = computed(() => {\n if (!this.isSorted()) return 'none';\n return this.direction() === 'asc' ? 'ascending' : 'descending';\n });\n\n /** CVA-generated host classes */\n readonly hostClasses: Signal<string> = computed(() =>\n sortHeaderVariants({\n sortable: !this.isDisabled(),\n active: this.isSorted(),\n disabled: this.isDisabled(),\n })\n );\n\n constructor() {\n if (!this.sort) {\n throw new Error('comSortHeader must be placed inside a [comSort] container.');\n }\n\n this.destroyRef.onDestroy(() => {\n this.sort?.deregister(this.id());\n });\n }\n\n ngOnInit(): void {\n this.sort!.register(this);\n }\n\n // ─── Event Handlers ───\n\n protected onClick(): void {\n if (this.isDisabled()) return;\n this.sort!.sort(this.id());\n }\n}\n","// Public API for the sort component\n\n// Types & Variants\nexport {\n sortHeaderVariants,\n sortIconVariants,\n type SortDirection,\n type SortCycle,\n type SortEvent,\n} from './sort.variants';\n\n// Directives & Components\nexport { SortDirective } from './sort.directive';\nexport { SortHeaderComponent } from './sort-header.component';\n\n// NOT exported: SortIconComponent (internal)\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -192,10 +192,13 @@ const tabScrollButtonVariants = cva([
192
192
  },
193
193
  });
194
194
  // ─── Close Button on Closable Tabs ───
195
+ /**
196
+ * @tokens `--color-muted-foreground`, `--color-foreground`, `--color-ring`, `--radius-interactive-sm`
197
+ */
195
198
  const tabCloseButtonVariants = cva([
196
199
  'inline-flex items-center justify-center rounded-interactive-sm',
197
- 'text-current opacity-60 hover:opacity-100',
198
- 'transition-opacity duration-100',
200
+ 'text-muted-foreground hover:text-foreground',
201
+ 'transition-colors duration-100',
199
202
  'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ring',
200
203
  ], {
201
204
  variants: {