@radix-ng/primitives 0.7.2 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/accordion/README.md +1 -0
  2. package/accordion/index.d.ts +5 -0
  3. package/accordion/src/accordion-content.directive.d.ts +64 -0
  4. package/accordion/src/accordion-header.directive.d.ts +23 -0
  5. package/accordion/src/accordion-item.directive.d.ts +36 -0
  6. package/accordion/src/accordion-root.directive.d.ts +57 -0
  7. package/accordion/src/accordion-trigger.directive.d.ts +31 -0
  8. package/dropdown-menu/README.md +1 -0
  9. package/dropdown-menu/index.d.ts +5 -0
  10. package/dropdown-menu/src/dropdown-menu-content.directive.d.ts +6 -0
  11. package/dropdown-menu/src/dropdown-menu-item.directive.d.ts +8 -0
  12. package/dropdown-menu/src/dropdown-menu-label.directive.d.ts +5 -0
  13. package/dropdown-menu/src/dropdown-menu-separator.directive.d.ts +6 -0
  14. package/dropdown-menu/src/dropdown-menu-trigger.directive.d.ts +11 -0
  15. package/esm2022/accordion/index.mjs +6 -0
  16. package/esm2022/accordion/radix-ng-primitives-accordion.mjs +5 -0
  17. package/esm2022/accordion/src/accordion-content.directive.mjs +139 -0
  18. package/esm2022/accordion/src/accordion-header.directive.mjs +44 -0
  19. package/esm2022/accordion/src/accordion-item.directive.mjs +75 -0
  20. package/esm2022/accordion/src/accordion-root.directive.mjs +120 -0
  21. package/esm2022/accordion/src/accordion-trigger.directive.mjs +61 -0
  22. package/esm2022/dropdown-menu/index.mjs +6 -0
  23. package/esm2022/dropdown-menu/radix-ng-primitives-dropdown-menu.mjs +5 -0
  24. package/esm2022/dropdown-menu/src/dropdown-menu-content.directive.mjs +17 -0
  25. package/esm2022/dropdown-menu/src/dropdown-menu-item.directive.mjs +23 -0
  26. package/esm2022/dropdown-menu/src/dropdown-menu-label.directive.mjs +14 -0
  27. package/esm2022/dropdown-menu/src/dropdown-menu-separator.directive.mjs +21 -0
  28. package/esm2022/dropdown-menu/src/dropdown-menu-trigger.directive.mjs +46 -0
  29. package/esm2022/menu/src/menu-item.directive.mjs +10 -4
  30. package/esm2022/menubar/src/menubar-trigger.directive.mjs +3 -3
  31. package/esm2022/radio/src/radio-item.directive.mjs +1 -2
  32. package/esm2022/tabs/index.mjs +38 -0
  33. package/esm2022/tabs/radix-ng-primitives-tabs.mjs +5 -0
  34. package/esm2022/tabs/src/tabs-content.directive.mjs +27 -0
  35. package/esm2022/tabs/src/tabs-context.service.mjs +43 -0
  36. package/esm2022/tabs/src/tabs-list.directive.mjs +23 -0
  37. package/esm2022/tabs/src/tabs-root.directive.mjs +54 -0
  38. package/esm2022/tabs/src/tabs-trigger.directive.mjs +52 -0
  39. package/fesm2022/radix-ng-primitives-accordion.mjs +431 -0
  40. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -0
  41. package/fesm2022/radix-ng-primitives-dropdown-menu.mjs +116 -0
  42. package/fesm2022/radix-ng-primitives-dropdown-menu.mjs.map +1 -0
  43. package/fesm2022/radix-ng-primitives-menu.mjs +9 -3
  44. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  45. package/fesm2022/radix-ng-primitives-menubar.mjs +2 -2
  46. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  47. package/fesm2022/radix-ng-primitives-radio.mjs +0 -1
  48. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  49. package/fesm2022/radix-ng-primitives-tabs.mjs +220 -0
  50. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -0
  51. package/menu/README.md +1 -0
  52. package/menu/src/menu-item.directive.d.ts +2 -1
  53. package/package.json +19 -1
  54. package/tabs/index.d.ts +15 -0
  55. package/tabs/src/tabs-content.directive.d.ts +8 -0
  56. package/tabs/src/tabs-context.service.d.ts +22 -0
  57. package/tabs/src/tabs-list.directive.d.ts +6 -0
  58. package/tabs/src/tabs-root.directive.d.ts +37 -0
  59. package/tabs/src/tabs-trigger.directive.d.ts +19 -0
@@ -0,0 +1,43 @@
1
+ import { computed, Injectable, InjectionToken, signal } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export const TABS_CONTEXT_TOKEN = new InjectionToken('TabsContext');
4
+ export class RdxTabsContextService {
5
+ constructor() {
6
+ this.baseId = this.generateId();
7
+ this.value = signal(undefined);
8
+ this.orientation = signal('horizontal');
9
+ this.dir = signal(undefined);
10
+ this.activationMode = signal('automatic');
11
+ this.value$ = computed(() => this.value());
12
+ this.orientation$ = computed(() => this.orientation());
13
+ this.dir$ = computed(() => this.dir());
14
+ this.activationMode$ = computed(() => this.activationMode());
15
+ }
16
+ setValue(value) {
17
+ this.value.set(value);
18
+ }
19
+ setOrientation(orientation) {
20
+ this.orientation.set(orientation);
21
+ }
22
+ setDir(dir) {
23
+ this.dir.set(dir);
24
+ }
25
+ setActivationMode(mode) {
26
+ this.activationMode.set(mode);
27
+ }
28
+ getBaseId() {
29
+ return this.baseId;
30
+ }
31
+ generateId() {
32
+ return `tabs-${Math.random().toString(36).substr(2, 9)}`;
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
35
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsContextService, providedIn: 'root' }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsContextService, decorators: [{
38
+ type: Injectable,
39
+ args: [{
40
+ providedIn: 'root'
41
+ }]
42
+ }] });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wcmltaXRpdmVzL3RhYnMvc3JjL3RhYnMtY29udGV4dC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTdFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUF3QixhQUFhLENBQUMsQ0FBQztBQUszRixNQUFNLE9BQU8scUJBQXFCO0lBSGxDO1FBSVksV0FBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQixVQUFLLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztRQUM5QyxnQkFBVyxHQUFHLE1BQU0sQ0FBUyxZQUFZLENBQUMsQ0FBQztRQUMzQyxRQUFHLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztRQUM1QyxtQkFBYyxHQUFHLE1BQU0sQ0FBUyxXQUFXLENBQUMsQ0FBQztRQUU1QyxXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELFNBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEMsb0JBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7S0F5QnBFO0lBdkJHLFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxjQUFjLENBQUMsV0FBbUI7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXO1FBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQVk7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVPLFVBQVU7UUFDZCxPQUFPLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDN0QsQ0FBQzs4R0FsQ1EscUJBQXFCO2tIQUFyQixxQkFBcUIsY0FGbEIsTUFBTTs7MkZBRVQscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBUQUJTX0NPTlRFWFRfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48UmR4VGFic0NvbnRleHRTZXJ2aWNlPignVGFic0NvbnRleHQnKTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSZHhUYWJzQ29udGV4dFNlcnZpY2Uge1xuICAgIHByaXZhdGUgYmFzZUlkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XG4gICAgcHJpdmF0ZSB2YWx1ZSA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgcHJpdmF0ZSBvcmllbnRhdGlvbiA9IHNpZ25hbDxzdHJpbmc+KCdob3Jpem9udGFsJyk7XG4gICAgcHJpdmF0ZSBkaXIgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHByaXZhdGUgYWN0aXZhdGlvbk1vZGUgPSBzaWduYWw8c3RyaW5nPignYXV0b21hdGljJyk7XG5cbiAgICByZWFkb25seSB2YWx1ZSQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZhbHVlKCkpO1xuICAgIHJlYWRvbmx5IG9yaWVudGF0aW9uJCA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3JpZW50YXRpb24oKSk7XG4gICAgcmVhZG9ubHkgZGlyJCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGlyKCkpO1xuICAgIHJlYWRvbmx5IGFjdGl2YXRpb25Nb2RlJCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYWN0aXZhdGlvbk1vZGUoKSk7XG5cbiAgICBzZXRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXRPcmllbnRhdGlvbihvcmllbnRhdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMub3JpZW50YXRpb24uc2V0KG9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICBzZXREaXIoZGlyOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kaXIuc2V0KGRpcik7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZhdGlvbk1vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGlvbk1vZGUuc2V0KG1vZGUpO1xuICAgIH1cblxuICAgIGdldEJhc2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIGB0YWJzLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWA7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,23 @@
1
+ import { Directive, inject } from '@angular/core';
2
+ import { TABS_CONTEXT_TOKEN } from './tabs-context.service';
3
+ import * as i0 from "@angular/core";
4
+ export class RdxTabsListDirective {
5
+ constructor() {
6
+ this.tabsContext = inject(TABS_CONTEXT_TOKEN);
7
+ }
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
9
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: RdxTabsListDirective, isStandalone: true, selector: "[TabsList]", host: { attributes: { "role": "tablist" }, properties: { "attr.aria-orientation": "tabsContext.orientation$()", "attr.data-orientation": "tabsContext.orientation$()" } }, ngImport: i0 }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsListDirective, decorators: [{
12
+ type: Directive,
13
+ args: [{
14
+ selector: '[TabsList]',
15
+ standalone: true,
16
+ host: {
17
+ role: 'tablist',
18
+ '[attr.aria-orientation]': 'tabsContext.orientation$()',
19
+ '[attr.data-orientation]': 'tabsContext.orientation$()'
20
+ }
21
+ }]
22
+ }] });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy1saXN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3ByaW1pdGl2ZXMvdGFicy9zcmMvdGFicy1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFnQjVELE1BQU0sT0FBTyxvQkFBb0I7SUFUakM7UUFVdUIsZ0JBQVcsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztLQUMvRDs4R0FGWSxvQkFBb0I7a0dBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFUaEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLElBQUksRUFBRTt3QkFDRixJQUFJLEVBQUUsU0FBUzt3QkFDZix5QkFBeUIsRUFBRSw0QkFBNEI7d0JBQ3ZELHlCQUF5QixFQUFFLDRCQUE0QjtxQkFDMUQ7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBUQUJTX0NPTlRFWFRfVE9LRU4gfSBmcm9tICcuL3RhYnMtY29udGV4dC5zZXJ2aWNlJztcblxuaW50ZXJmYWNlIFRhYnNMaXN0UHJvcHMge1xuICAgIC8vIFdoZW4gdHJ1ZSwga2V5Ym9hcmQgbmF2aWdhdGlvbiB3aWxsIGxvb3AgZnJvbSBsYXN0IHRhYiB0byBmaXJzdCwgYW5kIHZpY2UgdmVyc2EuXG4gICAgbG9vcD86IGJvb2xlYW47XG59XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW1RhYnNMaXN0XScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBob3N0OiB7XG4gICAgICAgIHJvbGU6ICd0YWJsaXN0JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtb3JpZW50YXRpb25dJzogJ3RhYnNDb250ZXh0Lm9yaWVudGF0aW9uJCgpJyxcbiAgICAgICAgJ1thdHRyLmRhdGEtb3JpZW50YXRpb25dJzogJ3RhYnNDb250ZXh0Lm9yaWVudGF0aW9uJCgpJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgUmR4VGFic0xpc3REaXJlY3RpdmUge1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0YWJzQ29udGV4dCA9IGluamVjdChUQUJTX0NPTlRFWFRfVE9LRU4pO1xufVxuIl19
@@ -0,0 +1,54 @@
1
+ import { Directive, effect, EventEmitter, inject, Input, Output } from '@angular/core';
2
+ import { RdxTabsContextService, TABS_CONTEXT_TOKEN } from './tabs-context.service';
3
+ import * as i0 from "@angular/core";
4
+ export class RdxTabsRootDirective {
5
+ constructor() {
6
+ this.tabsContext = inject(TABS_CONTEXT_TOKEN);
7
+ this.orientation = 'horizontal';
8
+ // Event handler called when the value changes.
9
+ this.onValueChange = new EventEmitter();
10
+ effect(() => {
11
+ const value = this.tabsContext.value$();
12
+ if (value !== undefined) {
13
+ this.onValueChange.emit(value);
14
+ }
15
+ });
16
+ }
17
+ ngOnInit() {
18
+ this.tabsContext.setOrientation(this.orientation);
19
+ if (this.dir) {
20
+ this.tabsContext.setDir(this.dir);
21
+ }
22
+ if (this.value) {
23
+ this.tabsContext.setValue(this.value);
24
+ }
25
+ else if (this.defaultValue) {
26
+ this.tabsContext.setValue(this.defaultValue);
27
+ }
28
+ }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsRootDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
30
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: RdxTabsRootDirective, isStandalone: true, selector: "[TabsRoot]", inputs: { value: "value", defaultValue: "defaultValue", orientation: "orientation", dir: "dir" }, outputs: { onValueChange: "onValueChange" }, host: { properties: { "attr.data-orientation": "orientation", "attr.dir": "dir" } }, providers: [{ provide: TABS_CONTEXT_TOKEN, useExisting: RdxTabsContextService }], ngImport: i0 }); }
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsRootDirective, decorators: [{
33
+ type: Directive,
34
+ args: [{
35
+ selector: '[TabsRoot]',
36
+ standalone: true,
37
+ providers: [{ provide: TABS_CONTEXT_TOKEN, useExisting: RdxTabsContextService }],
38
+ host: {
39
+ '[attr.data-orientation]': 'orientation',
40
+ '[attr.dir]': 'dir'
41
+ }
42
+ }]
43
+ }], ctorParameters: () => [], propDecorators: { value: [{
44
+ type: Input
45
+ }], defaultValue: [{
46
+ type: Input
47
+ }], orientation: [{
48
+ type: Input
49
+ }], dir: [{
50
+ type: Input
51
+ }], onValueChange: [{
52
+ type: Output
53
+ }] } });
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy1yb290LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3ByaW1pdGl2ZXMvdGFicy9zcmMvdGFicy1yb290LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBbUNuRixNQUFNLE9BQU8sb0JBQW9CO0lBVzdCO1FBVmlCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFJakQsZ0JBQVcsR0FBRyxZQUFZLENBQUM7UUFHcEMsK0NBQStDO1FBQ3JDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUdqRCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEQsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNMLENBQUM7OEdBaENRLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDZSQU5sQixDQUFDLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxDQUFDOzsyRkFNdkUsb0JBQW9CO2tCQVRoQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxZQUFZO29CQUN0QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLENBQUM7b0JBQ2hGLElBQUksRUFBRTt3QkFDRix5QkFBeUIsRUFBRSxhQUFhO3dCQUN4QyxZQUFZLEVBQUUsS0FBSztxQkFDdEI7aUJBQ0o7d0RBSVksS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBR0ksYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgZWZmZWN0LCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJkeFRhYnNDb250ZXh0U2VydmljZSwgVEFCU19DT05URVhUX1RPS0VOIH0gZnJvbSAnLi90YWJzLWNvbnRleHQuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFic1Byb3BzIHtcbiAgICAvKiogVGhlIHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgdGFiLCBpZiBjb250cm9sbGVkICovXG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YWx1ZSBvZiB0aGUgdGFiIHRvIHNlbGVjdCBieSBkZWZhdWx0LCBpZiB1bmNvbnRyb2xsZWQgKi9cbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XG4gICAgLyoqIEEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBuZXcgdGFiIGlzIHNlbGVjdGVkICovXG4gICAgb25WYWx1ZUNoYW5nZT86ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmllbnRhdGlvbiB0aGUgdGFicyBhcmUgbGF5ZWQgb3V0LlxuICAgICAqIE1haW5seSBzbyBhcnJvdyBuYXZpZ2F0aW9uIGlzIGRvbmUgYWNjb3JkaW5nbHkgKGxlZnQgJiByaWdodCB2cy4gdXAgJiBkb3duKVxuICAgICAqIEBkZWZhdWx0VmFsdWUgaG9yaXpvbnRhbFxuICAgICAqL1xuICAgIG9yaWVudGF0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkaXJlY3Rpb24gb2YgbmF2aWdhdGlvbiBiZXR3ZWVuIHRvb2xiYXIgaXRlbXMuXG4gICAgICovXG4gICAgZGlyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYSB0YWIgaXMgYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAgICogQGRlZmF1bHRWYWx1ZSBhdXRvbWF0aWNcbiAgICAgKiAqL1xuICAgIGFjdGl2YXRpb25Nb2RlPzogJ2F1dG9tYXRpYycgfCAnbWFudWFsJztcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbVGFic1Jvb3RdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVEFCU19DT05URVhUX1RPS0VOLCB1c2VFeGlzdGluZzogUmR4VGFic0NvbnRleHRTZXJ2aWNlIH1dLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1thdHRyLmRhdGEtb3JpZW50YXRpb25dJzogJ29yaWVudGF0aW9uJyxcbiAgICAgICAgJ1thdHRyLmRpcl0nOiAnZGlyJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgUmR4VGFic1Jvb3REaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFic0NvbnRleHQgPSBpbmplY3QoVEFCU19DT05URVhUX1RPS0VOKTtcblxuICAgIEBJbnB1dCgpIHZhbHVlPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgICBASW5wdXQoKSBvcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcbiAgICBASW5wdXQoKSBkaXI/OiBzdHJpbmc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVyIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLlxuICAgIEBPdXRwdXQoKSBvblZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50YWJzQ29udGV4dC52YWx1ZSQoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy50YWJzQ29udGV4dC5zZXRPcmllbnRhdGlvbih0aGlzLm9yaWVudGF0aW9uKTtcblxuICAgICAgICBpZiAodGhpcy5kaXIpIHtcbiAgICAgICAgICAgIHRoaXMudGFic0NvbnRleHQuc2V0RGlyKHRoaXMuZGlyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnRhYnNDb250ZXh0LnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnRhYnNDb250ZXh0LnNldFZhbHVlKHRoaXMuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,52 @@
1
+ import { booleanAttribute, computed, Directive, inject, input } from '@angular/core';
2
+ import { TABS_CONTEXT_TOKEN } from './tabs-context.service';
3
+ import * as i0 from "@angular/core";
4
+ export class RdxTabsTriggerDirective {
5
+ constructor() {
6
+ this.tabsContext = inject(TABS_CONTEXT_TOKEN);
7
+ // A unique value that associates the trigger with a content.
8
+ this.value = input.required();
9
+ // When true, prevents the user from interacting with the tab.
10
+ this.disabled = input(false, {
11
+ transform: booleanAttribute
12
+ });
13
+ this.contentId = computed(() => `${this.tabsContext.getBaseId()}-content-${this.value()}`);
14
+ this.triggerId = computed(() => `${this.tabsContext.getBaseId()}-trigger-${this.value}`);
15
+ this.selected = computed(() => this.tabsContext.value$() === this.value());
16
+ }
17
+ onMouseDown(event) {
18
+ if (!this.disabled() && event.button === 0 && !event.ctrlKey) {
19
+ this.tabsContext?.setValue(this.value());
20
+ }
21
+ else {
22
+ // prevent focus to avoid accidental activation
23
+ event.preventDefault();
24
+ }
25
+ }
26
+ onKeyDown(event) {
27
+ if ([' ', 'Enter'].includes(event.key)) {
28
+ this.tabsContext?.setValue(this.value());
29
+ }
30
+ }
31
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
32
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.4", type: RdxTabsTriggerDirective, isStandalone: true, selector: "[TabsTrigger]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button", "role": "tab" }, listeners: { "mousedown": "onMouseDown($event)", "keydown": "onKeyDown($event)" }, properties: { "id": "triggerId", "attr.aria-selected": "selected()", "attr.aria-controls": "contentId()", "attr.data-disabled": "disabled() ? '' : undefined", "attr.data-state": "selected() ? 'active' : 'inactive'" } }, ngImport: i0 }); }
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxTabsTriggerDirective, decorators: [{
35
+ type: Directive,
36
+ args: [{
37
+ selector: '[TabsTrigger]',
38
+ standalone: true,
39
+ host: {
40
+ type: 'button',
41
+ role: 'tab',
42
+ '[id]': 'triggerId',
43
+ '[attr.aria-selected]': 'selected()',
44
+ '[attr.aria-controls]': 'contentId()',
45
+ '[attr.data-disabled]': "disabled() ? '' : undefined",
46
+ '[attr.data-state]': "selected() ? 'active' : 'inactive'",
47
+ '(mousedown)': 'onMouseDown($event)',
48
+ '(keydown)': 'onKeyDown($event)'
49
+ }
50
+ }]
51
+ }] });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy10cmlnZ2VyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3ByaW1pdGl2ZXMvdGFicy9zcmMvdGFicy10cmlnZ2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFFUixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFzQjVELE1BQU0sT0FBTyx1QkFBdUI7SUFmcEM7UUFnQnVCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFNUQsNkRBQTZEO1FBQ3BELFVBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7UUFFMUMsOERBQThEO1FBQ3JELGFBQVEsR0FBRyxLQUFLLENBQXdCLEtBQUssRUFBRTtZQUNwRCxTQUFTLEVBQUUsZ0JBQWdCO1NBQzlCLENBQUMsQ0FBQztRQUVnQixjQUFTLEdBQUcsUUFBUSxDQUNuQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFlBQVksSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2xFLENBQUM7UUFDaUIsY0FBUyxHQUFHLFFBQVEsQ0FDbkMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxZQUFZLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FDaEUsQ0FBQztRQUVpQixhQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FnQjVGO0lBZGEsV0FBVyxDQUFDLEtBQWlCO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQzthQUFNLENBQUM7WUFDSiwrQ0FBK0M7WUFDL0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDTCxDQUFDO0lBRVMsU0FBUyxDQUFDLEtBQW9CO1FBQ3BDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDTCxDQUFDOzhHQWpDUSx1QkFBdUI7a0dBQXZCLHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkFmbkMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLElBQUksRUFBRTt3QkFDRixJQUFJLEVBQUUsUUFBUTt3QkFDZCxJQUFJLEVBQUUsS0FBSzt3QkFDWCxNQUFNLEVBQUUsV0FBVzt3QkFDbkIsc0JBQXNCLEVBQUUsWUFBWTt3QkFDcEMsc0JBQXNCLEVBQUUsYUFBYTt3QkFDckMsc0JBQXNCLEVBQUUsNkJBQTZCO3dCQUNyRCxtQkFBbUIsRUFBRSxvQ0FBb0M7d0JBQ3pELGFBQWEsRUFBRSxxQkFBcUI7d0JBQ3BDLFdBQVcsRUFBRSxtQkFBbUI7cUJBQ25DO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm9vbGVhbklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBjb21wdXRlZCxcbiAgICBEaXJlY3RpdmUsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIElucHV0U2lnbmFsV2l0aFRyYW5zZm9ybVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVEFCU19DT05URVhUX1RPS0VOIH0gZnJvbSAnLi90YWJzLWNvbnRleHQuc2VydmljZSc7XG5cbmludGVyZmFjZSBUYWJzVHJpZ2dlclByb3BzIHtcbiAgICAvLyBXaGVuIHRydWUsIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdGFiLlxuICAgIGRpc2FibGVkOiBJbnB1dFNpZ25hbFdpdGhUcmFuc2Zvcm08Ym9vbGVhbiwgQm9vbGVhbklucHV0Pjtcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbVGFic1RyaWdnZXJdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgIHJvbGU6ICd0YWInLFxuICAgICAgICAnW2lkXSc6ICd0cmlnZ2VySWQnLFxuICAgICAgICAnW2F0dHIuYXJpYS1zZWxlY3RlZF0nOiAnc2VsZWN0ZWQoKScsXG4gICAgICAgICdbYXR0ci5hcmlhLWNvbnRyb2xzXSc6ICdjb250ZW50SWQoKScsXG4gICAgICAgICdbYXR0ci5kYXRhLWRpc2FibGVkXSc6IFwiZGlzYWJsZWQoKSA/ICcnIDogdW5kZWZpbmVkXCIsXG4gICAgICAgICdbYXR0ci5kYXRhLXN0YXRlXSc6IFwic2VsZWN0ZWQoKSA/ICdhY3RpdmUnIDogJ2luYWN0aXZlJ1wiLFxuICAgICAgICAnKG1vdXNlZG93biknOiAnb25Nb3VzZURvd24oJGV2ZW50KScsXG4gICAgICAgICcoa2V5ZG93biknOiAnb25LZXlEb3duKCRldmVudCknXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBSZHhUYWJzVHJpZ2dlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIFRhYnNUcmlnZ2VyUHJvcHMge1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0YWJzQ29udGV4dCA9IGluamVjdChUQUJTX0NPTlRFWFRfVE9LRU4pO1xuXG4gICAgLy8gQSB1bmlxdWUgdmFsdWUgdGhhdCBhc3NvY2lhdGVzIHRoZSB0cmlnZ2VyIHdpdGggYSBjb250ZW50LlxuICAgIHJlYWRvbmx5IHZhbHVlID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuXG4gICAgLy8gV2hlbiB0cnVlLCBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIGludGVyYWN0aW5nIHdpdGggdGhlIHRhYi5cbiAgICByZWFkb25seSBkaXNhYmxlZCA9IGlucHV0PGJvb2xlYW4sIEJvb2xlYW5JbnB1dD4oZmFsc2UsIHtcbiAgICAgICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlXG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29udGVudElkID0gY29tcHV0ZWQoXG4gICAgICAgICgpID0+IGAke3RoaXMudGFic0NvbnRleHQuZ2V0QmFzZUlkKCl9LWNvbnRlbnQtJHt0aGlzLnZhbHVlKCl9YFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyaWdnZXJJZCA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiBgJHt0aGlzLnRhYnNDb250ZXh0LmdldEJhc2VJZCgpfS10cmlnZ2VyLSR7dGhpcy52YWx1ZX1gXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudGFic0NvbnRleHQudmFsdWUkKCkgPT09IHRoaXMudmFsdWUoKSk7XG5cbiAgICBwcm90ZWN0ZWQgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKCkgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmICFldmVudC5jdHJsS2V5KSB7XG4gICAgICAgICAgICB0aGlzLnRhYnNDb250ZXh0Py5zZXRWYWx1ZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcHJldmVudCBmb2N1cyB0byBhdm9pZCBhY2NpZGVudGFsIGFjdGl2YXRpb25cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChbJyAnLCAnRW50ZXInXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgICAgICB0aGlzLnRhYnNDb250ZXh0Py5zZXRWYWx1ZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
@@ -0,0 +1,431 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, ElementRef, signal, input, effect, Directive, contentChild, Input, contentChildren } from '@angular/core';
3
+ import * as i1 from '@angular/cdk/accordion';
4
+ import { CdkAccordionItem, CdkAccordion } from '@angular/cdk/accordion';
5
+ import { animationFrameScheduler } from 'rxjs';
6
+
7
+ const RdxAccordionContentToken = new InjectionToken('RdxAccordionContentToken');
8
+ class RdxAccordionContentDirective {
9
+ constructor() {
10
+ /**
11
+ * @ignore
12
+ */
13
+ this.elementRef = inject(ElementRef);
14
+ /**
15
+ * @ignore
16
+ */
17
+ this.initialized = signal(false);
18
+ /**
19
+ * Current item state
20
+ */
21
+ this.state = signal('closed');
22
+ /**
23
+ * When true, prevents the user from interacting with the accordion and all its items.
24
+ */
25
+ this.disabled = input(false);
26
+ /**
27
+ * @ignore
28
+ */
29
+ this.accordionItem = inject(CdkAccordionItem);
30
+ /**
31
+ * @ignore
32
+ */
33
+ this.orientation = 'vertical';
34
+ effect(() => {
35
+ if (this.state()) {
36
+ this.setPresence();
37
+ }
38
+ });
39
+ }
40
+ /**
41
+ * @ignore
42
+ */
43
+ ngOnInit() {
44
+ this.togglePresence();
45
+ }
46
+ /**
47
+ * @ignore
48
+ */
49
+ setOpen(state) {
50
+ if (this.disabled()) {
51
+ return;
52
+ }
53
+ if (state === undefined) {
54
+ this.state.update(() => (this.state() === 'open' ? 'closed' : 'open'));
55
+ }
56
+ else {
57
+ this.state.update(() => state);
58
+ }
59
+ }
60
+ /**
61
+ * @ignore
62
+ */
63
+ initialize() {
64
+ if (!this.initialized()) {
65
+ this.togglePresence();
66
+ animationFrameScheduler.schedule(() => {
67
+ this.elementRef.nativeElement
68
+ .getAnimations()
69
+ .forEach((animation) => animation.cancel());
70
+ this.initialized.set(true);
71
+ });
72
+ }
73
+ }
74
+ /**
75
+ * @ignore
76
+ */
77
+ setPresence() {
78
+ if (!this.initialized()) {
79
+ this.initialize();
80
+ return;
81
+ }
82
+ animationFrameScheduler.schedule(() => {
83
+ const animations = this.elementRef.nativeElement.getAnimations();
84
+ const hidden = this.elementRef.nativeElement.hasAttribute('hidden');
85
+ if (hidden) {
86
+ this.show();
87
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
88
+ const height = `${this.elementRef.nativeElement.scrollHeight /*rect.height*/}px`;
89
+ const width = `${rect.width}px`;
90
+ this.elementRef.nativeElement.style.setProperty('--radix-accordion-content-height', height);
91
+ this.elementRef.nativeElement.style.setProperty('--radix-accordion-content-width', width);
92
+ this.hide();
93
+ }
94
+ Promise.all(animations.map((animation) => animation.finished)).then(() => {
95
+ this.togglePresence();
96
+ });
97
+ });
98
+ }
99
+ /**
100
+ * @ignore
101
+ */
102
+ togglePresence() {
103
+ if (this.state() === 'open') {
104
+ this.show();
105
+ }
106
+ else {
107
+ this.hide();
108
+ }
109
+ }
110
+ /**
111
+ * @ignore
112
+ */
113
+ show() {
114
+ this.elementRef.nativeElement.removeAttribute('hidden');
115
+ }
116
+ /**
117
+ * @ignore
118
+ */
119
+ hide() {
120
+ this.elementRef.nativeElement.setAttribute('hidden', '');
121
+ }
122
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
123
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.4", type: RdxAccordionContentDirective, isStandalone: true, selector: "[AccordionContent]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-state": "state()", "attr.data-disabled": "disabled() ? \"\" : undefined", "attr.data-orientation": "orientation" } }, providers: [{ provide: RdxAccordionContentToken, useExisting: RdxAccordionContentDirective }], exportAs: ["AccordionContent"], hostDirectives: [{ directive: i1.CdkAccordionItem }], ngImport: i0 }); }
124
+ }
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionContentDirective, decorators: [{
126
+ type: Directive,
127
+ args: [{
128
+ selector: '[AccordionContent]',
129
+ standalone: true,
130
+ exportAs: 'AccordionContent',
131
+ providers: [{ provide: RdxAccordionContentToken, useExisting: RdxAccordionContentDirective }],
132
+ host: {
133
+ '[attr.data-state]': 'state()',
134
+ '[attr.data-disabled]': 'disabled() ? "" : undefined',
135
+ '[attr.data-orientation]': 'orientation'
136
+ },
137
+ hostDirectives: [CdkAccordionItem]
138
+ }]
139
+ }], ctorParameters: () => [] });
140
+
141
+ const RdxAccordionItemToken = new InjectionToken('RdxAccordionItemToken');
142
+ function injectAccordionItem() {
143
+ return inject(RdxAccordionItemDirective);
144
+ }
145
+ class RdxAccordionItemDirective {
146
+ constructor() {
147
+ /**
148
+ * @ignore
149
+ */
150
+ this.accordionContent = contentChild.required(RdxAccordionContentToken);
151
+ /**
152
+ * Current item state
153
+ */
154
+ this.state = signal('closed');
155
+ /**
156
+ * When true, prevents the user from interacting with the item.
157
+ */
158
+ this.disabled = input(false);
159
+ /**
160
+ * @ignore
161
+ */
162
+ this.orientation = 'vertical';
163
+ }
164
+ /**
165
+ * Changes current item state
166
+ */
167
+ setOpen(state) {
168
+ if (this.disabled()) {
169
+ return;
170
+ }
171
+ if (state === undefined) {
172
+ this.state.update(() => (this.state() === 'open' ? 'closed' : 'open'));
173
+ }
174
+ else {
175
+ this.state.update(() => state);
176
+ }
177
+ this.accordionContent().setOpen(this.state());
178
+ }
179
+ /**
180
+ * @ignore
181
+ */
182
+ setOrientation(orientation) {
183
+ this.orientation = orientation;
184
+ this.accordionContent().orientation = orientation;
185
+ }
186
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
187
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.0.4", type: RdxAccordionItemDirective, isStandalone: true, selector: "[AccordionItem]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-state": "state()", "attr.data-disabled": "disabled() ? \"\" : undefined", "attr.data-orientation": "orientation" } }, providers: [
188
+ { provide: RdxAccordionItemToken, useExisting: RdxAccordionItemDirective, multi: true }
189
+ ], queries: [{ propertyName: "accordionContent", first: true, predicate: RdxAccordionContentToken, descendants: true, isSignal: true }], exportAs: ["AccordionItem"], hostDirectives: [{ directive: i1.CdkAccordion }], ngImport: i0 }); }
190
+ }
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionItemDirective, decorators: [{
192
+ type: Directive,
193
+ args: [{
194
+ selector: '[AccordionItem]',
195
+ standalone: true,
196
+ exportAs: 'AccordionItem',
197
+ providers: [
198
+ { provide: RdxAccordionItemToken, useExisting: RdxAccordionItemDirective, multi: true }
199
+ ],
200
+ host: {
201
+ '[attr.data-state]': 'state()',
202
+ '[attr.data-disabled]': 'disabled() ? "" : undefined',
203
+ '[attr.data-orientation]': 'orientation'
204
+ },
205
+ hostDirectives: [CdkAccordion]
206
+ }]
207
+ }], propDecorators: { value: [{
208
+ type: Input
209
+ }] } });
210
+
211
+ const RdxAccordionRootToken = new InjectionToken('RdxAccordionRootDirective');
212
+ function injectAccordionRoot() {
213
+ return inject(RdxAccordionRootDirective);
214
+ }
215
+ class RdxAccordionRootDirective {
216
+ constructor() {
217
+ /**
218
+ * @private
219
+ * @ignore
220
+ */
221
+ this.accordionItems = contentChildren(RdxAccordionItemToken);
222
+ /**
223
+ * @private
224
+ * @ignore
225
+ */
226
+ this._orientation = 'vertical';
227
+ /**
228
+ * @private
229
+ * @ignore
230
+ */
231
+ this._value = [];
232
+ /**
233
+ * The value of the item to expand when initially rendered and type is "single". Use when you do not need to control the state of the items.
234
+ */
235
+ this.defaultValue = [];
236
+ /**
237
+ * Determines whether one or multiple items can be opened at the same time.
238
+ */
239
+ this.type = 'single';
240
+ /**
241
+ * @ignore
242
+ */
243
+ this.collapsible = true;
244
+ }
245
+ /**
246
+ * The controlled value of the item to expand
247
+ */
248
+ set value(value) {
249
+ if (value !== undefined) {
250
+ this._value = Array.isArray(value) ? value : [value];
251
+ }
252
+ else {
253
+ this._value = [];
254
+ }
255
+ this.onValueChange(this._value);
256
+ }
257
+ /**
258
+ * The orientation of the accordion.
259
+ */
260
+ set orientation(orientation) {
261
+ this._orientation = orientation ?? 'vertical';
262
+ this.accordionItems().forEach((accordionItem) => accordionItem.setOrientation(this._orientation));
263
+ }
264
+ /**
265
+ * @ignore
266
+ */
267
+ ngOnInit() {
268
+ if (this.defaultValue) {
269
+ this.value = this.defaultValue;
270
+ }
271
+ }
272
+ /**
273
+ * @ignore
274
+ */
275
+ onValueChange(value) {
276
+ if (this.type === 'single') {
277
+ const currentValue = value.length > 0 ? value[0] : undefined;
278
+ this.accordionItems().forEach((accordionItem) => {
279
+ if (accordionItem.value === currentValue) {
280
+ accordionItem.setOpen();
281
+ }
282
+ else {
283
+ accordionItem.setOpen('closed');
284
+ }
285
+ });
286
+ }
287
+ else {
288
+ value.forEach((valueItem) => {
289
+ this.accordionItems().forEach((accordionItem) => {
290
+ if (accordionItem.value === valueItem) {
291
+ accordionItem.setOpen();
292
+ }
293
+ });
294
+ });
295
+ }
296
+ }
297
+ /**
298
+ * @ignore
299
+ */
300
+ getOrientation() {
301
+ return this._orientation;
302
+ }
303
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionRootDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
304
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.0.4", type: RdxAccordionRootDirective, isStandalone: true, selector: "[AccordionRoot]", inputs: { defaultValue: "defaultValue", type: "type", collapsible: "collapsible", value: "value", orientation: "orientation" }, host: { properties: { "attr.data-orientation": "getOrientation()" } }, providers: [{ provide: RdxAccordionRootToken, useExisting: RdxAccordionRootDirective }], queries: [{ propertyName: "accordionItems", predicate: RdxAccordionItemToken, isSignal: true }], ngImport: i0 }); }
305
+ }
306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionRootDirective, decorators: [{
307
+ type: Directive,
308
+ args: [{
309
+ selector: '[AccordionRoot]',
310
+ standalone: true,
311
+ providers: [{ provide: RdxAccordionRootToken, useExisting: RdxAccordionRootDirective }],
312
+ host: {
313
+ '[attr.data-orientation]': 'getOrientation()'
314
+ }
315
+ }]
316
+ }], propDecorators: { defaultValue: [{
317
+ type: Input
318
+ }], type: [{
319
+ type: Input
320
+ }], collapsible: [{
321
+ type: Input
322
+ }], value: [{
323
+ type: Input
324
+ }], orientation: [{
325
+ type: Input
326
+ }] } });
327
+
328
+ class RdxAccordionHeaderDirective {
329
+ constructor() {
330
+ /**
331
+ * @ignore
332
+ */
333
+ this.accordionItem = injectAccordionItem();
334
+ }
335
+ /**
336
+ * @ignore
337
+ */
338
+ getState() {
339
+ return this.accordionItem.state();
340
+ }
341
+ /**
342
+ * @ignore
343
+ */
344
+ getDisabled() {
345
+ return this.accordionItem.disabled() ? '' : undefined;
346
+ }
347
+ /**
348
+ * @ignore
349
+ */
350
+ getOrientation() {
351
+ return this.accordionItem.orientation;
352
+ }
353
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionHeaderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
354
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: RdxAccordionHeaderDirective, isStandalone: true, selector: "[AccordionHeader]", host: { properties: { "attr.data-state": "getState()", "attr.data-disabled": "getDisabled()", "attr.data-orientation": "getOrientation()" } }, ngImport: i0 }); }
355
+ }
356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionHeaderDirective, decorators: [{
357
+ type: Directive,
358
+ args: [{
359
+ selector: '[AccordionHeader]',
360
+ standalone: true,
361
+ host: {
362
+ '[attr.data-state]': 'getState()',
363
+ '[attr.data-disabled]': 'getDisabled()',
364
+ '[attr.data-orientation]': 'getOrientation()'
365
+ }
366
+ }]
367
+ }] });
368
+
369
+ class RdxAccordionTriggerDirective {
370
+ constructor() {
371
+ /**
372
+ * @ignore
373
+ */
374
+ this.accordionRoot = injectAccordionRoot();
375
+ /**
376
+ * @ignore
377
+ */
378
+ this.accordionItem = injectAccordionItem();
379
+ }
380
+ /**
381
+ * Fires when trigger clicked
382
+ */
383
+ onClick() {
384
+ if (!this.accordionRoot.collapsible) {
385
+ return;
386
+ }
387
+ if (this.accordionItem.value) {
388
+ this.accordionRoot.value = [this.accordionItem.value];
389
+ }
390
+ }
391
+ /**
392
+ * @ignore
393
+ */
394
+ getState() {
395
+ return this.accordionItem.state();
396
+ }
397
+ /**
398
+ * @ignore
399
+ */
400
+ getDisabled() {
401
+ return this.accordionItem.disabled() || undefined;
402
+ }
403
+ /**
404
+ * @ignore
405
+ */
406
+ getOrientation() {
407
+ return this.accordionRoot.getOrientation();
408
+ }
409
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
410
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: RdxAccordionTriggerDirective, isStandalone: true, selector: "[AccordionTrigger]", host: { listeners: { "click": "onClick()" }, properties: { "attr.data-state": "getState()", "attr.data-disabled": "getDisabled()", "attr.data-orientation": "getOrientation()" } }, ngImport: i0 }); }
411
+ }
412
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RdxAccordionTriggerDirective, decorators: [{
413
+ type: Directive,
414
+ args: [{
415
+ selector: '[AccordionTrigger]',
416
+ standalone: true,
417
+ host: {
418
+ '(click)': 'onClick()',
419
+ '[attr.data-state]': 'getState()',
420
+ '[attr.data-disabled]': 'getDisabled()',
421
+ '[attr.data-orientation]': 'getOrientation()'
422
+ }
423
+ }]
424
+ }] });
425
+
426
+ /**
427
+ * Generated bundle index. Do not edit.
428
+ */
429
+
430
+ export { RdxAccordionContentDirective, RdxAccordionContentToken, RdxAccordionHeaderDirective, RdxAccordionItemDirective, RdxAccordionItemToken, RdxAccordionRootDirective, RdxAccordionRootToken, RdxAccordionTriggerDirective, injectAccordionItem, injectAccordionRoot };
431
+ //# sourceMappingURL=radix-ng-primitives-accordion.mjs.map