@radix-ng/primitives 0.39.2 → 0.39.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/core/index.d.ts CHANGED
@@ -8,9 +8,11 @@ export * from './src/getActiveElement';
8
8
  export * from './src/id-generator';
9
9
  export * from './src/inject-ng-control';
10
10
  export * from './src/is-client';
11
+ export * from './src/is-equal';
11
12
  export * from './src/is-inside-form';
12
13
  export * from './src/is-nullish';
13
14
  export * from './src/is-number';
15
+ export * from './src/isValueEqualOrExist';
14
16
  export * from './src/kbd-constants';
15
17
  export * from './src/provide-token';
16
18
  export * from './src/window';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Compare two objects using reference equality and stable deep hashing.
3
+ * @param {any} object1 First object
4
+ * @param {any} object2 Second object
5
+ * @return {boolean} true if equal and false if not
6
+ */
7
+ export declare function isEqual(object1: any, object2: any): boolean;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The function `isValueEqualOrExist` checks if a value is equal to or exists in another value or
3
+ * array.
4
+ * @param {T | T[] | undefined} base - It represents the base value that you want to compare with the `current` value.
5
+ * @param {T | T[] | undefined} current - The `current` parameter represents the current value that you want to compare with the `base` value or values.
6
+ * @returns The `isValueEqualOrExist` function returns a boolean value. It checks if the `base` value
7
+ * is equal to the `current` value or if the `current` value exists within the `base` value. The
8
+ * function handles cases where `base` can be a single value, an array of values, or undefined.
9
+ */
10
+ export declare function isValueEqualOrExist<T>(base: T | T[] | undefined, current: T | T[] | undefined): boolean;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Serializes any input value into a string for hashing.
3
+ *
4
+ * This method uses best efforts to generate stable serialized values.
5
+ * However, it is not designed for security purposes.
6
+ * Keep in mind that there is always a chance of intentional collisions caused by user input.
7
+ *
8
+ * @param input any value to serialize
9
+ * @return {string} serialized string value
10
+ */
11
+ export declare function serialize(input: any): string;
@@ -22,3 +22,4 @@ export type Nullable<Type> = null | Type | undefined;
22
22
  * ```
23
23
  */
24
24
  export type SafeFunction = (...args: unknown[]) => unknown;
25
+ export type AcceptableValue = string | number | Record<string, any> | null;
@@ -13,6 +13,9 @@ const rootContext = () => {
13
13
  disabled: instance.isDisabled,
14
14
  open: instance.open,
15
15
  toggle: () => {
16
+ if (instance.isDisabled()) {
17
+ return;
18
+ }
16
19
  untracked(() => {
17
20
  instance.open.set(!instance.open());
18
21
  });
@@ -1 +1 @@
1
- {"version":3,"file":"radix-ng-primitives-collapsible.mjs","sources":["../../../packages/primitives/collapsible/src/collapsible-root.directive.ts","../../../packages/primitives/collapsible/src/collapsible-content-presence.directive.ts","../../../packages/primitives/collapsible/src/collapsible-content.directive.ts","../../../packages/primitives/collapsible/src/collapsible-trigger.directive.ts","../../../packages/primitives/collapsible/index.ts","../../../packages/primitives/collapsible/radix-ng-primitives-collapsible.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n InputSignal,\n linkedSignal,\n model,\n ModelSignal,\n output,\n Signal,\n untracked\n} from '@angular/core';\nimport { createContext } from '@radix-ng/primitives/core';\n\nexport type RdxCollapsibleState = 'open' | 'closed';\n\nexport interface CollapsibleRootContext {\n contentId: InputSignal<string>;\n open: ModelSignal<boolean>;\n toggle: () => void;\n disabled: Signal<boolean>;\n}\n\nexport const [injectCollapsibleRootContext, provideCollapsibleRootContext] =\n createContext<CollapsibleRootContext>('CollapsibleRootContext');\n\nconst rootContext = (): CollapsibleRootContext => {\n const instance = inject(RdxCollapsibleRootDirective);\n\n return {\n contentId: instance.contentId,\n disabled: instance.isDisabled,\n open: instance.open,\n toggle: () => {\n untracked(() => {\n instance.open.set(!instance.open());\n });\n instance.onOpenChange.emit(instance.open());\n }\n };\n};\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxCollapsibleRoot]',\n exportAs: 'rdxCollapsibleRoot',\n providers: [provideCollapsibleRootContext(rootContext)],\n host: {\n '[attr.data-state]': 'open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined'\n }\n})\nexport class RdxCollapsibleRootDirective {\n /**\n * The controlled open state of the collapsible.\n * Sets the state of the directive. `true` - expanded, `false` - collapsed\n *\n * @group Props\n * @defaultValue false\n */\n readonly open = model<boolean>(false);\n\n readonly contentId = input<string>('');\n\n /**\n * Determines whether a directive is available for interaction.\n * When true, prevents the user from interacting with the collapsible.\n *\n * @group Props\n */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly _disabled = linkedSignal(this.disabled);\n\n readonly isDisabled = this._disabled.asReadonly();\n\n readonly isOpen = computed(() => this.open());\n\n /**\n * Emitted with new value when directive state changed.\n * Event handler called when the open state of the collapsible changes.\n *\n * @group Emits\n */\n readonly onOpenChange = output<boolean>();\n}\n","import { Directive } from '@angular/core';\nimport { provideRdxPresenceContext, RdxPresenceDirective } from '@radix-ng/primitives/presence';\nimport { injectCollapsibleRootContext } from './collapsible-root.directive';\n\n@Directive({\n selector: 'ng-template[rdxCollapsibleContentPresence]',\n providers: [\n provideRdxPresenceContext(() => ({\n present: injectCollapsibleRootContext()!.open\n }))\n ],\n hostDirectives: [RdxPresenceDirective]\n})\nexport class RdxCollapsibleContentPresenceDirective {}\n","import { isPlatformBrowser } from '@angular/common';\nimport { afterNextRender, computed, Directive, effect, ElementRef, inject, PLATFORM_ID, signal } from '@angular/core';\nimport { injectCollapsibleRootContext } from './collapsible-root.directive';\n\n@Directive({\n selector: '[rdxCollapsibleContent]',\n host: {\n '[id]': 'rootContext.contentId()',\n '[attr.data-state]': 'rootContext.open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'rootContext.disabled() ? \"true\" : undefined',\n '[attr.hidden]': 'shouldHide() ? \"until-found\" : undefined',\n '[style.--radix-collapsible-content-width.px]': 'width()',\n '[style.--radix-collapsible-content-height.px]': 'height()',\n '(animationend)': 'onAnimationEnd()'\n }\n})\nexport class RdxCollapsibleContentDirective {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n protected readonly rootContext = injectCollapsibleRootContext()!;\n\n readonly isOpen = computed(() => this.rootContext.open());\n\n readonly height = signal<number | null>(null);\n readonly width = signal<number | null>(null);\n readonly shouldHide = signal(true);\n private isMountAnimationPrevented = signal(true);\n private currentStyle = signal<{ transitionDuration: string; animationName: string } | null>(null);\n\n private firstRender = true;\n\n constructor() {\n effect(() => {\n const isOpen = this.isOpen();\n\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n requestAnimationFrame(() => {\n this.updateDimensions(isOpen);\n });\n });\n\n afterNextRender(() => {\n requestAnimationFrame(() => {\n this.isMountAnimationPrevented.set(false);\n });\n });\n }\n\n onAnimationEnd() {\n if (!this.isOpen()) {\n this.shouldHide.set(true);\n }\n }\n\n private async updateDimensions(isOpen: boolean) {\n const node = this.elementRef.nativeElement;\n if (!node) return;\n\n if (!this.currentStyle()) {\n this.currentStyle.set({\n transitionDuration: node.style.transitionDuration,\n animationName: node.style.animationName\n });\n }\n\n if (isOpen) {\n this.shouldHide.set(false);\n node.hidden = false;\n }\n\n node.style.transitionDuration = '0s';\n node.style.animationName = 'none';\n\n const rect = node.getBoundingClientRect();\n this.height.set(rect.height);\n this.width.set(rect.width);\n\n if (!this.isMountAnimationPrevented() && !this.firstRender) {\n node.style.transitionDuration = this.currentStyle()?.transitionDuration || '';\n node.style.animationName = this.currentStyle()?.animationName || '';\n }\n\n this.firstRender = false;\n }\n}\n","import { Directive } from '@angular/core';\nimport { injectCollapsibleRootContext } from './collapsible-root.directive';\n\n@Directive({\n selector: '[rdxCollapsibleTrigger]',\n host: {\n '[attr.aria-controls]': 'rootContext.contentId()',\n '[attr.aria-expanded]': 'rootContext.open()',\n '[attr.data-state]': 'rootContext.open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'rootContext.disabled() ? \"true\" : undefined',\n '[attr.disabled]': 'rootContext.disabled() || undefined',\n\n '(click)': 'rootContext.toggle()'\n }\n})\nexport class RdxCollapsibleTriggerDirective {\n protected readonly rootContext = injectCollapsibleRootContext()!;\n}\n","import { NgModule } from '@angular/core';\nimport { RdxCollapsibleContentPresenceDirective } from './src/collapsible-content-presence.directive';\nimport { RdxCollapsibleContentDirective } from './src/collapsible-content.directive';\nimport { RdxCollapsibleRootDirective } from './src/collapsible-root.directive';\nimport { RdxCollapsibleTriggerDirective } from './src/collapsible-trigger.directive';\n\nexport * from './src/collapsible-content-presence.directive';\nexport * from './src/collapsible-content.directive';\nexport * from './src/collapsible-root.directive';\nexport * from './src/collapsible-trigger.directive';\n\nconst _imports = [\n RdxCollapsibleContentDirective,\n RdxCollapsibleRootDirective,\n RdxCollapsibleTriggerDirective,\n RdxCollapsibleContentPresenceDirective\n];\n\n@NgModule({\n imports: [..._imports],\n exports: [..._imports]\n})\nexport class RdxCollapsibleModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"radix-ng-primitives-collapsible.mjs","sources":["../../../packages/primitives/collapsible/src/collapsible-root.directive.ts","../../../packages/primitives/collapsible/src/collapsible-content-presence.directive.ts","../../../packages/primitives/collapsible/src/collapsible-content.directive.ts","../../../packages/primitives/collapsible/src/collapsible-trigger.directive.ts","../../../packages/primitives/collapsible/index.ts","../../../packages/primitives/collapsible/radix-ng-primitives-collapsible.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n InputSignal,\n linkedSignal,\n model,\n ModelSignal,\n output,\n Signal,\n untracked\n} from '@angular/core';\nimport { createContext } from '@radix-ng/primitives/core';\n\nexport type RdxCollapsibleState = 'open' | 'closed';\n\nexport interface CollapsibleRootContext {\n contentId: InputSignal<string>;\n open: ModelSignal<boolean>;\n toggle: () => void;\n disabled: Signal<boolean>;\n}\n\nexport const [injectCollapsibleRootContext, provideCollapsibleRootContext] =\n createContext<CollapsibleRootContext>('CollapsibleRootContext');\n\nconst rootContext = (): CollapsibleRootContext => {\n const instance = inject(RdxCollapsibleRootDirective);\n\n return {\n contentId: instance.contentId,\n disabled: instance.isDisabled,\n open: instance.open,\n toggle: () => {\n if (instance.isDisabled()) {\n return;\n }\n\n untracked(() => {\n instance.open.set(!instance.open());\n });\n\n instance.onOpenChange.emit(instance.open());\n }\n };\n};\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxCollapsibleRoot]',\n exportAs: 'rdxCollapsibleRoot',\n providers: [provideCollapsibleRootContext(rootContext)],\n host: {\n '[attr.data-state]': 'open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined'\n }\n})\nexport class RdxCollapsibleRootDirective {\n /**\n * The controlled open state of the collapsible.\n * Sets the state of the directive. `true` - expanded, `false` - collapsed\n *\n * @group Props\n * @defaultValue false\n */\n readonly open = model<boolean>(false);\n\n readonly contentId = input<string>('');\n\n /**\n * Determines whether a directive is available for interaction.\n * When true, prevents the user from interacting with the collapsible.\n *\n * @group Props\n */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly _disabled = linkedSignal(this.disabled);\n\n readonly isDisabled = this._disabled.asReadonly();\n\n readonly isOpen = computed(() => this.open());\n\n /**\n * Emitted with new value when directive state changed.\n * Event handler called when the open state of the collapsible changes.\n *\n * @group Emits\n */\n readonly onOpenChange = output<boolean>();\n}\n","import { Directive } from '@angular/core';\nimport { provideRdxPresenceContext, RdxPresenceDirective } from '@radix-ng/primitives/presence';\nimport { injectCollapsibleRootContext } from './collapsible-root.directive';\n\n@Directive({\n selector: 'ng-template[rdxCollapsibleContentPresence]',\n providers: [\n provideRdxPresenceContext(() => ({\n present: injectCollapsibleRootContext()!.open\n }))\n ],\n hostDirectives: [RdxPresenceDirective]\n})\nexport class RdxCollapsibleContentPresenceDirective {}\n","import { isPlatformBrowser } from '@angular/common';\nimport { afterNextRender, computed, Directive, effect, ElementRef, inject, PLATFORM_ID, signal } from '@angular/core';\nimport { injectCollapsibleRootContext } from './collapsible-root.directive';\n\n@Directive({\n selector: '[rdxCollapsibleContent]',\n host: {\n '[id]': 'rootContext.contentId()',\n '[attr.data-state]': 'rootContext.open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'rootContext.disabled() ? \"true\" : undefined',\n '[attr.hidden]': 'shouldHide() ? \"until-found\" : undefined',\n '[style.--radix-collapsible-content-width.px]': 'width()',\n '[style.--radix-collapsible-content-height.px]': 'height()',\n '(animationend)': 'onAnimationEnd()'\n }\n})\nexport class RdxCollapsibleContentDirective {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n protected readonly rootContext = injectCollapsibleRootContext()!;\n\n readonly isOpen = computed(() => this.rootContext.open());\n\n readonly height = signal<number | null>(null);\n readonly width = signal<number | null>(null);\n readonly shouldHide = signal(true);\n private isMountAnimationPrevented = signal(true);\n private currentStyle = signal<{ transitionDuration: string; animationName: string } | null>(null);\n\n private firstRender = true;\n\n constructor() {\n effect(() => {\n const isOpen = this.isOpen();\n\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n requestAnimationFrame(() => {\n this.updateDimensions(isOpen);\n });\n });\n\n afterNextRender(() => {\n requestAnimationFrame(() => {\n this.isMountAnimationPrevented.set(false);\n });\n });\n }\n\n onAnimationEnd() {\n if (!this.isOpen()) {\n this.shouldHide.set(true);\n }\n }\n\n private async updateDimensions(isOpen: boolean) {\n const node = this.elementRef.nativeElement;\n if (!node) return;\n\n if (!this.currentStyle()) {\n this.currentStyle.set({\n transitionDuration: node.style.transitionDuration,\n animationName: node.style.animationName\n });\n }\n\n if (isOpen) {\n this.shouldHide.set(false);\n node.hidden = false;\n }\n\n node.style.transitionDuration = '0s';\n node.style.animationName = 'none';\n\n const rect = node.getBoundingClientRect();\n this.height.set(rect.height);\n this.width.set(rect.width);\n\n if (!this.isMountAnimationPrevented() && !this.firstRender) {\n node.style.transitionDuration = this.currentStyle()?.transitionDuration || '';\n node.style.animationName = this.currentStyle()?.animationName || '';\n }\n\n this.firstRender = false;\n }\n}\n","import { Directive } from '@angular/core';\nimport { injectCollapsibleRootContext } from './collapsible-root.directive';\n\n@Directive({\n selector: '[rdxCollapsibleTrigger]',\n host: {\n '[attr.aria-controls]': 'rootContext.contentId()',\n '[attr.aria-expanded]': 'rootContext.open()',\n '[attr.data-state]': 'rootContext.open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'rootContext.disabled() ? \"true\" : undefined',\n '[attr.disabled]': 'rootContext.disabled() || undefined',\n\n '(click)': 'rootContext.toggle()'\n }\n})\nexport class RdxCollapsibleTriggerDirective {\n protected readonly rootContext = injectCollapsibleRootContext()!;\n}\n","import { NgModule } from '@angular/core';\nimport { RdxCollapsibleContentPresenceDirective } from './src/collapsible-content-presence.directive';\nimport { RdxCollapsibleContentDirective } from './src/collapsible-content.directive';\nimport { RdxCollapsibleRootDirective } from './src/collapsible-root.directive';\nimport { RdxCollapsibleTriggerDirective } from './src/collapsible-trigger.directive';\n\nexport * from './src/collapsible-content-presence.directive';\nexport * from './src/collapsible-content.directive';\nexport * from './src/collapsible-root.directive';\nexport * from './src/collapsible-trigger.directive';\n\nconst _imports = [\n RdxCollapsibleContentDirective,\n RdxCollapsibleRootDirective,\n RdxCollapsibleTriggerDirective,\n RdxCollapsibleContentPresenceDirective\n];\n\n@NgModule({\n imports: [..._imports],\n exports: [..._imports]\n})\nexport class RdxCollapsibleModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AA0BO,MAAM,CAAC,4BAA4B,EAAE,6BAA6B,CAAC,GACtE,aAAa,CAAyB,wBAAwB;AAElE,MAAM,WAAW,GAAG,MAA6B;AAC7C,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,2BAA2B,CAAC;IAEpD,OAAO;QACH,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ,EAAE,QAAQ,CAAC,UAAU;QAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,MAAK;AACT,YAAA,IAAI,QAAQ,CAAC,UAAU,EAAE,EAAE;gBACvB;;YAGJ,SAAS,CAAC,MAAK;gBACX,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACvC,aAAC,CAAC;YAEF,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;;KAElD;AACL,CAAC;AAED;;AAEG;MAUU,2BAA2B,CAAA;AATxC,IAAA,WAAA,GAAA;AAUI;;;;;;AAMG;AACM,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAU,KAAK,CAAC;AAE5B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,CAAC;AAEtC;;;;;AAKG;QACM,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAwB,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAE/E,QAAA,IAAA,CAAA,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;QAExC,IAAM,CAAA,MAAA,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AAE7C;;;;;AAKG;QACM,IAAY,CAAA,YAAA,GAAG,MAAM,EAAW;AAC5C;8GAjCY,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,8oBANzB,CAAC,6BAA6B,CAAC,WAAW,CAAC,CAAC,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAM9C,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBATvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,SAAS,EAAE,CAAC,6BAA6B,CAAC,WAAW,CAAC,CAAC;AACvD,oBAAA,IAAI,EAAE;AACF,wBAAA,mBAAmB,EAAE,4BAA4B;AACjD,wBAAA,sBAAsB,EAAE;AAC3B;AACJ,iBAAA;;;MChDY,sCAAsC,CAAA;8GAAtC,sCAAsC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sCAAsC,EAPpC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4CAAA,EAAA,SAAA,EAAA;AACP,YAAA,yBAAyB,CAAC,OAAO;AAC7B,gBAAA,OAAO,EAAE,4BAA4B,EAAG,CAAC;AAC5C,aAAA,CAAC;AACL,SAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAGQ,sCAAsC,EAAA,UAAA,EAAA,CAAA;kBATlD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,4CAA4C;AACtD,oBAAA,SAAS,EAAE;AACP,wBAAA,yBAAyB,CAAC,OAAO;AAC7B,4BAAA,OAAO,EAAE,4BAA4B,EAAG,CAAC;AAC5C,yBAAA,CAAC;AACL,qBAAA;oBACD,cAAc,EAAE,CAAC,oBAAoB;AACxC,iBAAA;;;MCIY,8BAA8B,CAAA;AAgBvC,IAAA,WAAA,GAAA;AAfiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;QAE9B,IAAW,CAAA,WAAA,GAAG,4BAA4B,EAAG;AAEvD,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;AAEhD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAgB,IAAI,CAAC;AACpC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,CAAC;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAA,CAAA,yBAAyB,GAAG,MAAM,CAAC,IAAI,CAAC;AACxC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAA+D,IAAI,CAAC;QAEzF,IAAW,CAAA,WAAA,GAAG,IAAI;QAGtB,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAE5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBACrC;;YAGJ,qBAAqB,CAAC,MAAK;AACvB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACjC,aAAC,CAAC;AACN,SAAC,CAAC;QAEF,eAAe,CAAC,MAAK;YACjB,qBAAqB,CAAC,MAAK;AACvB,gBAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,aAAC,CAAC;AACN,SAAC,CAAC;;IAGN,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAChB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;;;IAIzB,MAAM,gBAAgB,CAAC,MAAe,EAAA;AAC1C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC1C,QAAA,IAAI,CAAC,IAAI;YAAE;AAEX,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AAClB,gBAAA,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB;AACjD,gBAAA,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC;AAC7B,aAAA,CAAC;;QAGN,IAAI,MAAM,EAAE;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;;AAGvB,QAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI;AACpC,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AAEjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE;QACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACxD,YAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,kBAAkB,IAAI,EAAE;AAC7E,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,IAAI,EAAE;;AAGvE,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;;8GAtEnB,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,4CAAA,EAAA,oBAAA,EAAA,+CAAA,EAAA,aAAA,EAAA,4CAAA,EAAA,4CAAA,EAAA,SAAA,EAAA,6CAAA,EAAA,UAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAZ1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,IAAI,EAAE;AACF,wBAAA,MAAM,EAAE,yBAAyB;AACjC,wBAAA,mBAAmB,EAAE,wCAAwC;AAC7D,wBAAA,sBAAsB,EAAE,6CAA6C;AACrE,wBAAA,eAAe,EAAE,0CAA0C;AAC3D,wBAAA,8CAA8C,EAAE,SAAS;AACzD,wBAAA,+CAA+C,EAAE,UAAU;AAC3D,wBAAA,gBAAgB,EAAE;AACrB;AACJ,iBAAA;;;MCAY,8BAA8B,CAAA;AAZ3C,IAAA,WAAA,GAAA;QAauB,IAAW,CAAA,WAAA,GAAG,4BAA4B,EAAG;AACnE;8GAFY,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,sBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,yBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,4CAAA,EAAA,oBAAA,EAAA,+CAAA,EAAA,eAAA,EAAA,qCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAZ1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,IAAI,EAAE;AACF,wBAAA,sBAAsB,EAAE,yBAAyB;AACjD,wBAAA,sBAAsB,EAAE,oBAAoB;AAC5C,wBAAA,mBAAmB,EAAE,wCAAwC;AAC7D,wBAAA,sBAAsB,EAAE,6CAA6C;AACrE,wBAAA,iBAAiB,EAAE,qCAAqC;AAExD,wBAAA,SAAS,EAAE;AACd;AACJ,iBAAA;;;ACHD,MAAM,QAAQ,GAAG;IACb,8BAA8B;IAC9B,2BAA2B;IAC3B,8BAA8B;IAC9B;CACH;MAMY,oBAAoB,CAAA;8GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAV7B,8BAA8B;YAC9B,2BAA2B;YAC3B,8BAA8B;AAC9B,YAAA,sCAAsC,aAHtC,8BAA8B;YAC9B,2BAA2B;YAC3B,8BAA8B;YAC9B,sCAAsC,CAAA,EAAA,CAAA,CAAA;+GAO7B,oBAAoB,EAAA,CAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC;AACtB,oBAAA,OAAO,EAAE,CAAC,GAAG,QAAQ;AACxB,iBAAA;;;ACrBD;;AAEG;;;;"}
@@ -358,6 +358,205 @@ function injectIsClient() {
358
358
  return inject(Platform).isBrowser;
359
359
  }
360
360
 
361
+ // Originally based on https://github.com/puleos/object-hash v3.0.0 (MIT)
362
+ /**
363
+ * Serializes any input value into a string for hashing.
364
+ *
365
+ * This method uses best efforts to generate stable serialized values.
366
+ * However, it is not designed for security purposes.
367
+ * Keep in mind that there is always a chance of intentional collisions caused by user input.
368
+ *
369
+ * @param input any value to serialize
370
+ * @return {string} serialized string value
371
+ */
372
+ function serialize(input) {
373
+ if (typeof input === 'string') {
374
+ return `'${input}'`;
375
+ }
376
+ return new Serializer().serialize(input);
377
+ }
378
+ const Serializer = /*@__PURE__*/ (function () {
379
+ class Serializer {
380
+ #context = new Map();
381
+ compare(a, b) {
382
+ const typeA = typeof a;
383
+ const typeB = typeof b;
384
+ if (typeA === 'string' && typeB === 'string') {
385
+ return a.localeCompare(b);
386
+ }
387
+ if (typeA === 'number' && typeB === 'number') {
388
+ return a - b;
389
+ }
390
+ return String.prototype.localeCompare.call(this.serialize(a, true), this.serialize(b, true));
391
+ }
392
+ serialize(value, noQuotes) {
393
+ if (value === null) {
394
+ return 'null';
395
+ }
396
+ switch (typeof value) {
397
+ case 'string': {
398
+ return noQuotes ? value : `'${value}'`;
399
+ }
400
+ case 'bigint': {
401
+ return `${value}n`;
402
+ }
403
+ case 'object': {
404
+ return this.$object(value);
405
+ }
406
+ case 'function': {
407
+ return this.$function(value);
408
+ }
409
+ }
410
+ return String(value);
411
+ }
412
+ serializeObject(object) {
413
+ const objString = Object.prototype.toString.call(object);
414
+ if (objString !== '[object Object]') {
415
+ return this.serializeBuiltInType(objString.length < 10 /* '[object a]'.length === 10, the minimum */
416
+ ? `unknown:${objString}`
417
+ : objString.slice(8, -1) /* '[object '.length === 8 */, object);
418
+ }
419
+ const constructor = object.constructor;
420
+ const objName = constructor === Object || constructor === undefined ? '' : constructor.name;
421
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
422
+ // @ts-expect-error
423
+ if (objName !== '' && globalThis[objName] === constructor) {
424
+ return this.serializeBuiltInType(objName, object);
425
+ }
426
+ if ('toJSON' in object && typeof object.toJSON === 'function') {
427
+ const json = object.toJSON();
428
+ return (objName +
429
+ (json !== null && typeof json === 'object' ? this.$object(json) : `(${this.serialize(json)})`));
430
+ }
431
+ const keys = Object.keys(object).sort((a, b) => a.localeCompare(b));
432
+ let content = `${objName}{`;
433
+ for (let i = 0; i < keys.length; i++) {
434
+ const key = keys[i];
435
+ content += `${key}:${this.serialize(object[key])}`;
436
+ if (i < keys.length - 1) {
437
+ content += ',';
438
+ }
439
+ }
440
+ return content + '}';
441
+ }
442
+ serializeBuiltInType(type, object) {
443
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
444
+ // @ts-expect-error
445
+ const handler = this['$' + type];
446
+ if (handler) {
447
+ return handler.call(this, object);
448
+ }
449
+ if (typeof object.entries === 'function') {
450
+ return this.serializeObjectEntries(type, object.entries());
451
+ }
452
+ throw new Error(`Cannot serialize ${type}`);
453
+ }
454
+ serializeObjectEntries(type, entries) {
455
+ const sortedEntries = Array.from(entries).sort((a, b) => this.compare(a[0], b[0]));
456
+ let content = `${type}{`;
457
+ for (let i = 0; i < sortedEntries.length; i++) {
458
+ const [key, value] = sortedEntries[i];
459
+ content += `${this.serialize(key, true)}:${this.serialize(value)}`;
460
+ if (i < sortedEntries.length - 1) {
461
+ content += ',';
462
+ }
463
+ }
464
+ return content + '}';
465
+ }
466
+ $object(object) {
467
+ let content = this.#context.get(object);
468
+ if (content === undefined) {
469
+ this.#context.set(object, `#${this.#context.size}`);
470
+ content = this.serializeObject(object);
471
+ this.#context.set(object, content);
472
+ }
473
+ return content;
474
+ }
475
+ $function(fn) {
476
+ const fnStr = Function.prototype.toString.call(fn);
477
+ if (fnStr.slice(-15 /* "[native code] }".length */) === '[native code] }') {
478
+ return `${fn.name || ''}()[native]`;
479
+ }
480
+ return `${fn.name}(${fn.length})${fnStr.replace(/\s*\n\s*/g, '')}`;
481
+ }
482
+ $Array(arr) {
483
+ let content = '[';
484
+ for (let i = 0; i < arr.length; i++) {
485
+ content += this.serialize(arr[i]);
486
+ if (i < arr.length - 1) {
487
+ content += ',';
488
+ }
489
+ }
490
+ return content + ']';
491
+ }
492
+ $Date(date) {
493
+ try {
494
+ return `Date(${date.toISOString()})`;
495
+ }
496
+ catch {
497
+ return `Date(null)`;
498
+ }
499
+ }
500
+ $ArrayBuffer(arr) {
501
+ return `ArrayBuffer[${new Uint8Array(arr).join(',')}]`;
502
+ }
503
+ $Set(set) {
504
+ return `Set${this.$Array(Array.from(set).sort((a, b) => this.compare(a, b)))}`;
505
+ }
506
+ $Map(map) {
507
+ return this.serializeObjectEntries('Map', map.entries());
508
+ }
509
+ }
510
+ for (const type of ['Error', 'RegExp', 'URL']) {
511
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
512
+ // @ts-expect-error
513
+ Serializer.prototype['$' + type] = function (val) {
514
+ return `${type}(${val})`;
515
+ };
516
+ }
517
+ for (const type of [
518
+ 'Int8Array',
519
+ 'Uint8Array',
520
+ 'Uint8ClampedArray',
521
+ 'Int16Array',
522
+ 'Uint16Array',
523
+ 'Int32Array',
524
+ 'Uint32Array',
525
+ 'Float32Array',
526
+ 'Float64Array'
527
+ ]) {
528
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
529
+ // @ts-expect-error
530
+ Serializer.prototype['$' + type] = function (arr) {
531
+ return `${type}[${arr.join(',')}]`;
532
+ };
533
+ }
534
+ for (const type of ['BigInt64Array', 'BigUint64Array']) {
535
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
536
+ // @ts-expect-error
537
+ Serializer.prototype['$' + type] = function (arr) {
538
+ return `${type}[${arr.join('n,')}${arr.length > 0 ? 'n' : ''}]`;
539
+ };
540
+ }
541
+ return Serializer;
542
+ })();
543
+
544
+ /**
545
+ * Compare two objects using reference equality and stable deep hashing.
546
+ * @param {any} object1 First object
547
+ * @param {any} object2 Second object
548
+ * @return {boolean} true if equal and false if not
549
+ */
550
+ function isEqual(object1, object2) {
551
+ if (object1 === object2) {
552
+ return true;
553
+ }
554
+ if (serialize(object1) === serialize(object2)) {
555
+ return true;
556
+ }
557
+ return false;
558
+ }
559
+
361
560
  function isInsideForm(el) {
362
561
  if (!el || !el.nativeElement) {
363
562
  return true;
@@ -371,6 +570,26 @@ function isNullish(value) {
371
570
 
372
571
  const isNumber = (v) => typeof v === 'number';
373
572
 
573
+ /**
574
+ * The function `isValueEqualOrExist` checks if a value is equal to or exists in another value or
575
+ * array.
576
+ * @param {T | T[] | undefined} base - It represents the base value that you want to compare with the `current` value.
577
+ * @param {T | T[] | undefined} current - The `current` parameter represents the current value that you want to compare with the `base` value or values.
578
+ * @returns The `isValueEqualOrExist` function returns a boolean value. It checks if the `base` value
579
+ * is equal to the `current` value or if the `current` value exists within the `base` value. The
580
+ * function handles cases where `base` can be a single value, an array of values, or undefined.
581
+ */
582
+ function isValueEqualOrExist(base, current) {
583
+ if (isNullish(base))
584
+ return false;
585
+ if (Array.isArray(base)) {
586
+ return base.some((val) => isEqual(val, current));
587
+ }
588
+ else {
589
+ return isEqual(base, current);
590
+ }
591
+ }
592
+
374
593
  const ALT = 'Alt';
375
594
  const ARROW_DOWN = 'ArrowDown';
376
595
  const ARROW_LEFT = 'ArrowLeft';
@@ -2341,5 +2560,5 @@ function watch(deps, fn, options) {
2341
2560
  * Generated bundle index. Do not edit.
2342
2561
  */
2343
2562
 
2344
- export { A, ALT, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, ASTERISK, BACKSPACE, CAPS_LOCK, CONTROL, CTRL, DELETE, END, ENTER, ESCAPE, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, HOME, META, P, PAGE_DOWN, PAGE_UP, RDX_POSITIONING_DEFAULTS, RDX_POSITIONS, RdxAutoFocusDirective, RdxControlValueAccessor, RdxFocusInitialDirective, RdxPositionAlign, RdxPositionSide, SHIFT, SPACE, SPACE_CODE, TAB, WINDOW, _IdGenerator, a, areAllDaysBetweenValid, clamp, createContent, createContext, createFormatter, createMonth, createMonths, getActiveElement, getAllPossibleConnectedPositions, getArrowPositionParams, getContentPosition, getDaysBetween, getDaysInMonth, getDefaultDate, getDefaultTime, getLastFirstDayOfWeek, getNextLastDayOfWeek, getOptsByGranularity, getPlaceholder, getSegmentElements, getSideAndAlignFromAllPossibleConnectedPositions, handleCalendarInitialFocus, hasTime, initializeSegmentValues, injectControlValueAccessor, injectDocument, injectIsClient, injectNgControl, injectWindow, isAcceptableSegmentKey, isAfter, isAfterOrSame, isBefore, isBeforeOrSame, isBetween, isBetweenInclusive, isCalendarDateTime, isInsideForm, isNullish, isNumber, isNumberString, isSegmentNavigationKey, isZonedDateTime, j, k, n, p, provideToken, provideValueAccessor, resizeEffect, roundToStepPrecision, segmentBuilders, snapValueToStep, syncSegmentValues, syncTimeSegmentValues, toDate, useArrowNavigation, useDateField, watch };
2563
+ export { A, ALT, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, ASTERISK, BACKSPACE, CAPS_LOCK, CONTROL, CTRL, DELETE, END, ENTER, ESCAPE, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, HOME, META, P, PAGE_DOWN, PAGE_UP, RDX_POSITIONING_DEFAULTS, RDX_POSITIONS, RdxAutoFocusDirective, RdxControlValueAccessor, RdxFocusInitialDirective, RdxPositionAlign, RdxPositionSide, SHIFT, SPACE, SPACE_CODE, TAB, WINDOW, _IdGenerator, a, areAllDaysBetweenValid, clamp, createContent, createContext, createFormatter, createMonth, createMonths, getActiveElement, getAllPossibleConnectedPositions, getArrowPositionParams, getContentPosition, getDaysBetween, getDaysInMonth, getDefaultDate, getDefaultTime, getLastFirstDayOfWeek, getNextLastDayOfWeek, getOptsByGranularity, getPlaceholder, getSegmentElements, getSideAndAlignFromAllPossibleConnectedPositions, handleCalendarInitialFocus, hasTime, initializeSegmentValues, injectControlValueAccessor, injectDocument, injectIsClient, injectNgControl, injectWindow, isAcceptableSegmentKey, isAfter, isAfterOrSame, isBefore, isBeforeOrSame, isBetween, isBetweenInclusive, isCalendarDateTime, isEqual, isInsideForm, isNullish, isNumber, isNumberString, isSegmentNavigationKey, isValueEqualOrExist, isZonedDateTime, j, k, n, p, provideToken, provideValueAccessor, resizeEffect, roundToStepPrecision, segmentBuilders, snapValueToStep, syncSegmentValues, syncTimeSegmentValues, toDate, useArrowNavigation, useDateField, watch };
2345
2564
  //# sourceMappingURL=radix-ng-primitives-core.mjs.map