@frame-kit/ui-ng 0.2.5 → 0.2.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.
@@ -93,11 +93,11 @@ class IconListComponent {
93
93
  return this.classes();
94
94
  }
95
95
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: IconListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
96
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: IconListComponent, isStandalone: true, selector: "fk-icon-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass" } }, providers: [{ provide: ICON_LIST_PARENT, useExisting: IconListComponent }], ngImport: i0, template: "<div\n class=\"fk-icon-list__list\"\n role=\"list\"\n [id]=\"id() ?? undefined\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-icon-list-item [icon]=\"row.icon ?? null\">\n {{ row.label }}\n </fk-icon-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n", styles: [":host{display:block;margin-top:var(--fk-icon-list-margin-top, var(--fk-rhythm-4, 1rem))}.fk-icon-list__list{display:flex;flex-direction:column;gap:var(--fk-icon-list-row-gap, var(--fk-rhythm-2, .5rem))}\n"], dependencies: [{ kind: "component", type: IconListItemComponent, selector: "fk-icon-list-item", inputs: ["icon", "variant", "size", "className", "id", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
96
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: IconListComponent, isStandalone: true, selector: "fk-icon-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass" } }, providers: [{ provide: ICON_LIST_PARENT, useExisting: IconListComponent }], ngImport: i0, template: "<div\n class=\"fk-icon-list__list\"\n role=\"list\"\n [attr.id]=\"id()\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-icon-list-item [icon]=\"row.icon ?? null\">\n {{ row.label }}\n </fk-icon-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n", styles: [":host{display:block;margin-top:var(--fk-icon-list-margin-top, var(--fk-rhythm-4, 1rem))}.fk-icon-list__list{display:flex;flex-direction:column;gap:var(--fk-icon-list-row-gap, var(--fk-rhythm-2, .5rem))}\n"], dependencies: [{ kind: "component", type: IconListItemComponent, selector: "fk-icon-list-item", inputs: ["icon", "variant", "size", "className", "id", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
97
97
  }
98
98
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: IconListComponent, decorators: [{
99
99
  type: Component,
100
- args: [{ selector: 'fk-icon-list', standalone: true, imports: [IconListItemComponent], providers: [{ provide: ICON_LIST_PARENT, useExisting: IconListComponent }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"fk-icon-list__list\"\n role=\"list\"\n [id]=\"id() ?? undefined\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-icon-list-item [icon]=\"row.icon ?? null\">\n {{ row.label }}\n </fk-icon-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n", styles: [":host{display:block;margin-top:var(--fk-icon-list-margin-top, var(--fk-rhythm-4, 1rem))}.fk-icon-list__list{display:flex;flex-direction:column;gap:var(--fk-icon-list-row-gap, var(--fk-rhythm-2, .5rem))}\n"] }]
100
+ args: [{ selector: 'fk-icon-list', standalone: true, imports: [IconListItemComponent], providers: [{ provide: ICON_LIST_PARENT, useExisting: IconListComponent }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"fk-icon-list__list\"\n role=\"list\"\n [attr.id]=\"id()\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-icon-list-item [icon]=\"row.icon ?? null\">\n {{ row.label }}\n </fk-icon-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n", styles: [":host{display:block;margin-top:var(--fk-icon-list-margin-top, var(--fk-rhythm-4, 1rem))}.fk-icon-list__list{display:flex;flex-direction:column;gap:var(--fk-icon-list-row-gap, var(--fk-rhythm-2, .5rem))}\n"] }]
101
101
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hostClass: [{
102
102
  type: HostBinding,
103
103
  args: ['class']
@@ -1 +1 @@
1
- {"version":3,"file":"frame-kit-ui-ng-ui-icon-list.mjs","sources":["../../../../packages/ui-ng/ui/icon-list/icon-list.token.ts","../../../../packages/ui-ng/ui/icon-list/icon-list-item.component.ts","../../../../packages/ui-ng/ui/icon-list/icon-list-item.component.html","../../../../packages/ui-ng/ui/icon-list/icon-list.component.ts","../../../../packages/ui-ng/ui/icon-list/icon-list.component.html","../../../../packages/ui-ng/ui/icon-list/frame-kit-ui-ng-ui-icon-list.ts"],"sourcesContent":["import { InjectionToken, type Signal } from '@angular/core';\n\nimport type { IconListSize, IconListVariant } from './icon-list.types';\n\n/**\n * Parent contract exposed by `fk-icon-list` to `fk-icon-list-item` children.\n * Lives in its own file so the two components can reference it without the\n * circular ES-module import that a direct `IconListComponent` type import\n * would create (item -> list -> item).\n */\nexport interface IconListParent {\n readonly icon: Signal<string | null>;\n readonly variant: Signal<IconListVariant>;\n readonly size: Signal<IconListSize>;\n}\n\nexport const ICON_LIST_PARENT = new InjectionToken<IconListParent>(\n 'ICON_LIST_PARENT',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { ICON_LIST_PARENT } from './icon-list.token';\nimport type { IconListSize, IconListVariant } from './icon-list.types';\n\n@Component({\n selector: 'fk-icon-list-item',\n standalone: true,\n imports: [IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './icon-list-item.component.html',\n styleUrl: './icon-list-item.component.scss',\n})\nexport class IconListItemComponent {\n // When rendered inside an `fk-icon-list`, we look up the parent via its\n // `ICON_LIST_PARENT` token and treat its inputs as defaults for items that\n // don't override them. Outside a list, the item stands alone with its own\n // defaults. The token indirection is what breaks the circular ES-module\n // import that a direct `IconListComponent` type reference would create.\n private readonly parent = inject(ICON_LIST_PARENT, { optional: true });\n\n // ===== INPUTS =====\n /** Icon name for this item; falls back to the parent list's `icon` when null. */\n readonly icon = input<string | null>(null);\n /** Color variant for this item's icon; falls back to the parent list's `variant` when null. */\n readonly variant = input<IconListVariant | null>(null);\n /** Size for this item; falls back to the parent list's `size` when null. */\n readonly size = input<IconListSize | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n protected readonly resolvedIcon = computed<string | null>(\n () => this.icon() ?? this.parent?.icon() ?? null,\n );\n\n protected readonly resolvedVariant = computed<IconListVariant>(\n () => this.variant() ?? this.parent?.variant() ?? 'default',\n );\n\n protected readonly resolvedSize = computed<IconListSize>(\n () => this.size() ?? this.parent?.size() ?? 'md',\n );\n\n readonly classes = computed(() => {\n return [\n 'fk-icon-list-item',\n `fk-icon-list-item--${this.resolvedVariant()}`,\n `fk-icon-list-item--${this.resolvedSize()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n // Only carry `role=\"listitem\"` when we're actually inside a list container.\n // Outside a list the item is presentational and should not advertise list\n // semantics — screen readers would otherwise announce an orphan listitem.\n @HostBinding('attr.role')\n get hostRole(): string | null {\n return this.parent ? 'listitem' : null;\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (resolvedIcon(); as iconName) {\n <fk-icon\n class=\"fk-icon-list-item__icon\"\n [name]=\"iconName\"\n [size]=\"resolvedSize()\"\n />\n}\n\n<span class=\"fk-icon-list-item__label\">\n <ng-content />\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport { ICON_LIST_PARENT, type IconListParent } from './icon-list.token';\nimport type {\n IconListItem,\n IconListSize,\n IconListVariant,\n} from './icon-list.types';\nimport { IconListItemComponent } from './icon-list-item.component';\n\n@Component({\n selector: 'fk-icon-list',\n standalone: true,\n imports: [IconListItemComponent],\n providers: [{ provide: ICON_LIST_PARENT, useExisting: IconListComponent }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './icon-list.component.html',\n styleUrl: './icon-list.component.scss',\n})\nexport class IconListComponent implements IconListParent {\n // ===== INPUTS =====\n /** Optional array of items to render declaratively; when null, projected `fk-icon-list-item` elements are used. */\n readonly items = input<readonly IconListItem[] | null>(null);\n /** Default icon name inherited by all child items that don't specify their own. */\n readonly icon = input<string | null>(null);\n /** Color variant applied to the icon in each list item. */\n readonly variant = input<IconListVariant>('default');\n /** Size applied to the icon and text in each list item. */\n readonly size = input<IconListSize>('md');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return ['fk-icon-list', this.className()].filter(Boolean).join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n}\n","<div\n class=\"fk-icon-list__list\"\n role=\"list\"\n [id]=\"id() ?? undefined\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-icon-list-item [icon]=\"row.icon ?? null\">\n {{ row.label }}\n </fk-icon-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-kit-ui-ng-ui-icon-list.mjs","sources":["../../../../packages/ui-ng/ui/icon-list/icon-list.token.ts","../../../../packages/ui-ng/ui/icon-list/icon-list-item.component.ts","../../../../packages/ui-ng/ui/icon-list/icon-list-item.component.html","../../../../packages/ui-ng/ui/icon-list/icon-list.component.ts","../../../../packages/ui-ng/ui/icon-list/icon-list.component.html","../../../../packages/ui-ng/ui/icon-list/frame-kit-ui-ng-ui-icon-list.ts"],"sourcesContent":["import { InjectionToken, type Signal } from '@angular/core';\n\nimport type { IconListSize, IconListVariant } from './icon-list.types';\n\n/**\n * Parent contract exposed by `fk-icon-list` to `fk-icon-list-item` children.\n * Lives in its own file so the two components can reference it without the\n * circular ES-module import that a direct `IconListComponent` type import\n * would create (item -> list -> item).\n */\nexport interface IconListParent {\n readonly icon: Signal<string | null>;\n readonly variant: Signal<IconListVariant>;\n readonly size: Signal<IconListSize>;\n}\n\nexport const ICON_LIST_PARENT = new InjectionToken<IconListParent>(\n 'ICON_LIST_PARENT',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport { ICON_LIST_PARENT } from './icon-list.token';\nimport type { IconListSize, IconListVariant } from './icon-list.types';\n\n@Component({\n selector: 'fk-icon-list-item',\n standalone: true,\n imports: [IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './icon-list-item.component.html',\n styleUrl: './icon-list-item.component.scss',\n})\nexport class IconListItemComponent {\n // When rendered inside an `fk-icon-list`, we look up the parent via its\n // `ICON_LIST_PARENT` token and treat its inputs as defaults for items that\n // don't override them. Outside a list, the item stands alone with its own\n // defaults. The token indirection is what breaks the circular ES-module\n // import that a direct `IconListComponent` type reference would create.\n private readonly parent = inject(ICON_LIST_PARENT, { optional: true });\n\n // ===== INPUTS =====\n /** Icon name for this item; falls back to the parent list's `icon` when null. */\n readonly icon = input<string | null>(null);\n /** Color variant for this item's icon; falls back to the parent list's `variant` when null. */\n readonly variant = input<IconListVariant | null>(null);\n /** Size for this item; falls back to the parent list's `size` when null. */\n readonly size = input<IconListSize | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n protected readonly resolvedIcon = computed<string | null>(\n () => this.icon() ?? this.parent?.icon() ?? null,\n );\n\n protected readonly resolvedVariant = computed<IconListVariant>(\n () => this.variant() ?? this.parent?.variant() ?? 'default',\n );\n\n protected readonly resolvedSize = computed<IconListSize>(\n () => this.size() ?? this.parent?.size() ?? 'md',\n );\n\n readonly classes = computed(() => {\n return [\n 'fk-icon-list-item',\n `fk-icon-list-item--${this.resolvedVariant()}`,\n `fk-icon-list-item--${this.resolvedSize()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n // Only carry `role=\"listitem\"` when we're actually inside a list container.\n // Outside a list the item is presentational and should not advertise list\n // semantics — screen readers would otherwise announce an orphan listitem.\n @HostBinding('attr.role')\n get hostRole(): string | null {\n return this.parent ? 'listitem' : null;\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","@if (resolvedIcon(); as iconName) {\n <fk-icon\n class=\"fk-icon-list-item__icon\"\n [name]=\"iconName\"\n [size]=\"resolvedSize()\"\n />\n}\n\n<span class=\"fk-icon-list-item__label\">\n <ng-content />\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport { ICON_LIST_PARENT, type IconListParent } from './icon-list.token';\nimport type {\n IconListItem,\n IconListSize,\n IconListVariant,\n} from './icon-list.types';\nimport { IconListItemComponent } from './icon-list-item.component';\n\n@Component({\n selector: 'fk-icon-list',\n standalone: true,\n imports: [IconListItemComponent],\n providers: [{ provide: ICON_LIST_PARENT, useExisting: IconListComponent }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './icon-list.component.html',\n styleUrl: './icon-list.component.scss',\n})\nexport class IconListComponent implements IconListParent {\n // ===== INPUTS =====\n /** Optional array of items to render declaratively; when null, projected `fk-icon-list-item` elements are used. */\n readonly items = input<readonly IconListItem[] | null>(null);\n /** Default icon name inherited by all child items that don't specify their own. */\n readonly icon = input<string | null>(null);\n /** Color variant applied to the icon in each list item. */\n readonly variant = input<IconListVariant>('default');\n /** Size applied to the icon and text in each list item. */\n readonly size = input<IconListSize>('md');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return ['fk-icon-list', this.className()].filter(Boolean).join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n}\n","<div\n class=\"fk-icon-list__list\"\n role=\"list\"\n [attr.id]=\"id()\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-icon-list-item [icon]=\"row.icon ?? null\">\n {{ row.label }}\n </fk-icon-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -85,13 +85,13 @@ class NumberedListComponent {
85
85
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NumberedListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
86
86
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NumberedListComponent, isStandalone: true, selector: "fk-numbered-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass" } }, providers: [
87
87
  { provide: NUMBERED_LIST_PARENT, useExisting: NumberedListComponent },
88
- ], ngImport: i0, template: "<div\n class=\"fk-numbered-list__list\"\n role=\"list\"\n [id]=\"id() ?? undefined\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-numbered-list-item>\n {{ row.label }}\n </fk-numbered-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n", styles: [":host{display:block;margin-top:var(--fk-numbered-list-margin-top, var(--fk-rhythm-4, 1rem))}.fk-numbered-list__list{counter-reset:fk-numbered-list-counter;display:flex;flex-direction:column;gap:var(--fk-numbered-list-row-gap, var(--fk-rhythm-3, .75rem))}\n"], dependencies: [{ kind: "component", type: NumberedListItemComponent, selector: "fk-numbered-list-item", inputs: ["size", "className", "id", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
88
+ ], ngImport: i0, template: "<div\n class=\"fk-numbered-list__list\"\n role=\"list\"\n [attr.id]=\"id()\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-numbered-list-item>\n {{ row.label }}\n </fk-numbered-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n", styles: [":host{display:block;margin-top:var(--fk-numbered-list-margin-top, var(--fk-rhythm-4, 1rem))}.fk-numbered-list__list{counter-reset:fk-numbered-list-counter;display:flex;flex-direction:column;gap:var(--fk-numbered-list-row-gap, var(--fk-rhythm-3, .75rem))}\n"], dependencies: [{ kind: "component", type: NumberedListItemComponent, selector: "fk-numbered-list-item", inputs: ["size", "className", "id", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
89
89
  }
90
90
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NumberedListComponent, decorators: [{
91
91
  type: Component,
92
92
  args: [{ selector: 'fk-numbered-list', standalone: true, imports: [NumberedListItemComponent], providers: [
93
93
  { provide: NUMBERED_LIST_PARENT, useExisting: NumberedListComponent },
94
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"fk-numbered-list__list\"\n role=\"list\"\n [id]=\"id() ?? undefined\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-numbered-list-item>\n {{ row.label }}\n </fk-numbered-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n", styles: [":host{display:block;margin-top:var(--fk-numbered-list-margin-top, var(--fk-rhythm-4, 1rem))}.fk-numbered-list__list{counter-reset:fk-numbered-list-counter;display:flex;flex-direction:column;gap:var(--fk-numbered-list-row-gap, var(--fk-rhythm-3, .75rem))}\n"] }]
94
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"fk-numbered-list__list\"\n role=\"list\"\n [attr.id]=\"id()\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-numbered-list-item>\n {{ row.label }}\n </fk-numbered-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n", styles: [":host{display:block;margin-top:var(--fk-numbered-list-margin-top, var(--fk-rhythm-4, 1rem))}.fk-numbered-list__list{counter-reset:fk-numbered-list-counter;display:flex;flex-direction:column;gap:var(--fk-numbered-list-row-gap, var(--fk-rhythm-3, .75rem))}\n"] }]
95
95
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hostClass: [{
96
96
  type: HostBinding,
97
97
  args: ['class']
@@ -1 +1 @@
1
- {"version":3,"file":"frame-kit-ui-ng-ui-numbered-list.mjs","sources":["../../../../packages/ui-ng/ui/numbered-list/numbered-list.token.ts","../../../../packages/ui-ng/ui/numbered-list/numbered-list-item.component.ts","../../../../packages/ui-ng/ui/numbered-list/numbered-list-item.component.html","../../../../packages/ui-ng/ui/numbered-list/numbered-list.component.ts","../../../../packages/ui-ng/ui/numbered-list/numbered-list.component.html","../../../../packages/ui-ng/ui/numbered-list/frame-kit-ui-ng-ui-numbered-list.ts"],"sourcesContent":["import { InjectionToken, type Signal } from '@angular/core';\n\nimport type { NumberedListSize } from './numbered-list.types';\n\n/**\n * Parent contract exposed by `fk-numbered-list` to `fk-numbered-list-item`\n * children. Lives in its own file so the two components can reference it\n * without the circular ES-module import that a direct\n * `NumberedListComponent` type import would create (item -> list -> item).\n */\nexport interface NumberedListParent {\n readonly size: Signal<NumberedListSize>;\n}\n\nexport const NUMBERED_LIST_PARENT = new InjectionToken<NumberedListParent>(\n 'NUMBERED_LIST_PARENT',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n} from '@angular/core';\n\nimport { NUMBERED_LIST_PARENT } from './numbered-list.token';\nimport type { NumberedListSize } from './numbered-list.types';\n\n@Component({\n selector: 'fk-numbered-list-item',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './numbered-list-item.component.html',\n styleUrl: './numbered-list-item.component.scss',\n})\nexport class NumberedListItemComponent {\n // When rendered inside an `fk-numbered-list`, we look up the parent\n // via its `NUMBERED_LIST_PARENT` token and treat its inputs as\n // defaults for items that don't override them. Outside a list, the\n // item stands alone with its own defaults. The token indirection\n // breaks the circular ES-module import that a direct\n // `NumberedListComponent` type reference would create.\n private readonly parent = inject(NUMBERED_LIST_PARENT, { optional: true });\n\n // ===== INPUTS =====\n /** Size for this item; falls back to the parent numbered-list's `size` when null. */\n readonly size = input<NumberedListSize | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n protected readonly resolvedSize = computed<NumberedListSize>(\n () => this.size() ?? this.parent?.size() ?? 'md',\n );\n\n readonly classes = computed(() => {\n return [\n 'fk-numbered-list-item',\n `fk-numbered-list-item--${this.resolvedSize()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n // Only carry `role=\"listitem\"` when we're actually inside a list\n // container. Outside a list the item is presentational and should\n // not advertise list semantics — screen readers would otherwise\n // announce an orphan listitem.\n @HostBinding('attr.role')\n get hostRole(): string | null {\n return this.parent ? 'listitem' : null;\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","<span class=\"fk-numbered-list-item__badge\" aria-hidden=\"true\"></span>\n<span class=\"fk-numbered-list-item__label\">\n <ng-content />\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport {\n NUMBERED_LIST_PARENT,\n type NumberedListParent,\n} from './numbered-list.token';\nimport type { NumberedListItem, NumberedListSize } from './numbered-list.types';\nimport { NumberedListItemComponent } from './numbered-list-item.component';\n\n@Component({\n selector: 'fk-numbered-list',\n standalone: true,\n imports: [NumberedListItemComponent],\n providers: [\n { provide: NUMBERED_LIST_PARENT, useExisting: NumberedListComponent },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './numbered-list.component.html',\n styleUrl: './numbered-list.component.scss',\n})\nexport class NumberedListComponent implements NumberedListParent {\n // ===== INPUTS =====\n /** Optional array of items to render declaratively; when null, projected `fk-numbered-list-item` elements are used. */\n readonly items = input<readonly NumberedListItem[] | null>(null);\n /** Size applied to every item in the list. */\n readonly size = input<NumberedListSize>('md');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return ['fk-numbered-list', this.className()].filter(Boolean).join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n}\n","<div\n class=\"fk-numbered-list__list\"\n role=\"list\"\n [id]=\"id() ?? undefined\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-numbered-list-item>\n {{ row.label }}\n </fk-numbered-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-kit-ui-ng-ui-numbered-list.mjs","sources":["../../../../packages/ui-ng/ui/numbered-list/numbered-list.token.ts","../../../../packages/ui-ng/ui/numbered-list/numbered-list-item.component.ts","../../../../packages/ui-ng/ui/numbered-list/numbered-list-item.component.html","../../../../packages/ui-ng/ui/numbered-list/numbered-list.component.ts","../../../../packages/ui-ng/ui/numbered-list/numbered-list.component.html","../../../../packages/ui-ng/ui/numbered-list/frame-kit-ui-ng-ui-numbered-list.ts"],"sourcesContent":["import { InjectionToken, type Signal } from '@angular/core';\n\nimport type { NumberedListSize } from './numbered-list.types';\n\n/**\n * Parent contract exposed by `fk-numbered-list` to `fk-numbered-list-item`\n * children. Lives in its own file so the two components can reference it\n * without the circular ES-module import that a direct\n * `NumberedListComponent` type import would create (item -> list -> item).\n */\nexport interface NumberedListParent {\n readonly size: Signal<NumberedListSize>;\n}\n\nexport const NUMBERED_LIST_PARENT = new InjectionToken<NumberedListParent>(\n 'NUMBERED_LIST_PARENT',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n} from '@angular/core';\n\nimport { NUMBERED_LIST_PARENT } from './numbered-list.token';\nimport type { NumberedListSize } from './numbered-list.types';\n\n@Component({\n selector: 'fk-numbered-list-item',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './numbered-list-item.component.html',\n styleUrl: './numbered-list-item.component.scss',\n})\nexport class NumberedListItemComponent {\n // When rendered inside an `fk-numbered-list`, we look up the parent\n // via its `NUMBERED_LIST_PARENT` token and treat its inputs as\n // defaults for items that don't override them. Outside a list, the\n // item stands alone with its own defaults. The token indirection\n // breaks the circular ES-module import that a direct\n // `NumberedListComponent` type reference would create.\n private readonly parent = inject(NUMBERED_LIST_PARENT, { optional: true });\n\n // ===== INPUTS =====\n /** Size for this item; falls back to the parent numbered-list's `size` when null. */\n readonly size = input<NumberedListSize | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n protected readonly resolvedSize = computed<NumberedListSize>(\n () => this.size() ?? this.parent?.size() ?? 'md',\n );\n\n readonly classes = computed(() => {\n return [\n 'fk-numbered-list-item',\n `fk-numbered-list-item--${this.resolvedSize()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n // Only carry `role=\"listitem\"` when we're actually inside a list\n // container. Outside a list the item is presentational and should\n // not advertise list semantics — screen readers would otherwise\n // announce an orphan listitem.\n @HostBinding('attr.role')\n get hostRole(): string | null {\n return this.parent ? 'listitem' : null;\n }\n\n @HostBinding('attr.id')\n get hostId(): string | null {\n return this.id();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string | null {\n return this.ariaLabel();\n }\n}\n","<span class=\"fk-numbered-list-item__badge\" aria-hidden=\"true\"></span>\n<span class=\"fk-numbered-list-item__label\">\n <ng-content />\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport {\n NUMBERED_LIST_PARENT,\n type NumberedListParent,\n} from './numbered-list.token';\nimport type { NumberedListItem, NumberedListSize } from './numbered-list.types';\nimport { NumberedListItemComponent } from './numbered-list-item.component';\n\n@Component({\n selector: 'fk-numbered-list',\n standalone: true,\n imports: [NumberedListItemComponent],\n providers: [\n { provide: NUMBERED_LIST_PARENT, useExisting: NumberedListComponent },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './numbered-list.component.html',\n styleUrl: './numbered-list.component.scss',\n})\nexport class NumberedListComponent implements NumberedListParent {\n // ===== INPUTS =====\n /** Optional array of items to render declaratively; when null, projected `fk-numbered-list-item` elements are used. */\n readonly items = input<readonly NumberedListItem[] | null>(null);\n /** Size applied to every item in the list. */\n readonly size = input<NumberedListSize>('md');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return ['fk-numbered-list', this.className()].filter(Boolean).join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n}\n","<div\n class=\"fk-numbered-list__list\"\n role=\"list\"\n [attr.id]=\"id()\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (items(); as rows) {\n @for (row of rows; track $index) {\n <fk-numbered-list-item>\n {{ row.label }}\n </fk-numbered-list-item>\n }\n } @else {\n <ng-content />\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frame-kit/ui-ng",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Style-agnostic, token-driven Angular UI component library for FrameKit.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -309,10 +309,7 @@ declare class DataTableComponent<T = unknown> {
309
309
  */
310
310
  private readonly groupCoordinator;
311
311
  constructor();
312
- /**
313
- * The group heading to emit before a row, or null when the row continues the
314
- * group above it. The first row always opens its group.
315
- */
312
+ /** The group heading to open before this row, if it starts a new group. */
316
313
  groupHeadingFor(row: T, index: number): string | null;
317
314
  /** Resolves the display value for a cell given its column definition and row data. */
318
315
  getCellValue(column: ColumnDef<T>, row: T): unknown;
@@ -478,6 +475,14 @@ declare class DataTableStackComponent<T = unknown> {
478
475
  readonly config: _angular_core.InputSignal<TableConfig<T> | null>;
479
476
  /** TrackBy function used by the `@for` loop over rows. */
480
477
  readonly trackByFn: _angular_core.InputSignal<(index: number, row: T) => unknown>;
478
+ /**
479
+ * Template rendered inside a group heading. Mirrors the semantic-table path
480
+ * so a grouped table looks grouped at every viewport.
481
+ */
482
+ readonly groupHeadingRenderer: _angular_core.InputSignal<TemplateRef<{
483
+ $implicit: string;
484
+ row: T;
485
+ }> | null>;
481
486
  /** Mirrors the host table's `rowSelection` input to show checkboxes on each card. */
482
487
  readonly rowSelection: _angular_core.InputSignal<boolean>;
483
488
  /** Currently selected row keys forwarded from the host table engine. */
@@ -488,6 +493,8 @@ declare class DataTableStackComponent<T = unknown> {
488
493
  readonly selectionDisabled: _angular_core.InputSignal<SelectionDisabled<T>>;
489
494
  /** Accessible label for each card's selection checkbox. */
490
495
  readonly selectionLabel: _angular_core.InputSignal<string>;
496
+ /** The group heading to open before this card, if it starts a new group. */
497
+ groupHeadingFor(row: T, index: number): string | null;
491
498
  /** Fires when the user clicks a card row, emitting the row context. */
492
499
  readonly rowClick: _angular_core.OutputEmitterRef<TableRowContext<T>>;
493
500
  /** Fires when the user toggles a card's selection checkbox, bubbling up to the host. */
@@ -507,7 +514,7 @@ declare class DataTableStackComponent<T = unknown> {
507
514
  isRowSelectionDisabled(row: T): boolean;
508
515
  private getSelectionKey;
509
516
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataTableStackComponent<any>, never>;
510
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataTableStackComponent<any>, "fk-data-table-stack", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; "rowSelection": { "alias": "rowSelection"; "required": false; "isSignal": true; }; "selectedKeys": { "alias": "selectedKeys"; "required": false; "isSignal": true; }; "getRowId": { "alias": "getRowId"; "required": false; "isSignal": true; }; "selectionDisabled": { "alias": "selectionDisabled"; "required": false; "isSignal": true; }; "selectionLabel": { "alias": "selectionLabel"; "required": false; "isSignal": true; }; }, { "rowClick": "rowClick"; "toggleRow": "toggleRow"; }, never, never, true, never>;
517
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataTableStackComponent<any>, "fk-data-table-stack", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; "groupHeadingRenderer": { "alias": "groupHeadingRenderer"; "required": false; "isSignal": true; }; "rowSelection": { "alias": "rowSelection"; "required": false; "isSignal": true; }; "selectedKeys": { "alias": "selectedKeys"; "required": false; "isSignal": true; }; "getRowId": { "alias": "getRowId"; "required": false; "isSignal": true; }; "selectionDisabled": { "alias": "selectionDisabled"; "required": false; "isSignal": true; }; "selectionLabel": { "alias": "selectionLabel"; "required": false; "isSignal": true; }; }, { "rowClick": "rowClick"; "toggleRow": "toggleRow"; }, never, never, true, never>;
511
518
  }
512
519
 
513
520
  export { ColumnResizeDirective, DEFAULT_TABLE_CONFIG, DataTableComponent, DataTableGroupComponent, DataTableGroupCoordinator, DataTableStackComponent, ResponsiveStrategyService, TableEngineService, VirtualizationEngineService };
@@ -262,6 +262,9 @@ For a heading richer than the key, pass a template:
262
262
  <ng-template #dayHeading let-key let-row="row"> {{ key }} <span class="muted">{{ row.created_at | date }}</span> </ng-template>
263
263
  ```
264
264
 
265
+ Headings render on both the semantic-table and stack (small-viewport) paths, so
266
+ a grouped table stays grouped at every width.
267
+
265
268
  > **Grouping and virtualization are mutually exclusive.** Virtual scrolling
266
269
  > positions rows by multiplying an index by `rowHeight`, and a heading is not
267
270
  > that tall. Setting `groupBy` turns virtualization off rather than misplacing