@ngxviewbuilder/runtime 0.12.2 → 0.12.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/fesm2022/ngxviewbuilder-runtime-autocomplete-element-DU7SLoLr.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-avatar-element-BWDaCDjn.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-badge-element-BUv50o0Q.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-breadcrumbs-element-Cb6NqxmR.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-button-element-LyUxiJtc.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-chart-element-B1uBvHYa.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-checkbox-element-CQzqJqdF.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-column-C9GuN6kf.mjs +43 -0
- package/fesm2022/ngxviewbuilder-runtime-custom-html-element-BR66FC2H.mjs +3 -0
- package/fesm2022/ngxviewbuilder-runtime-date-range-element-C8RBJmSj.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-datepicker-element-DT_3dhZY.mjs +1 -0
- package/fesm2022/{ngxviewbuilder-runtime-divider-element-Bit-YRpc.mjs → ngxviewbuilder-runtime-divider-element-Dy0UbtJZ.mjs} +1 -1
- package/fesm2022/ngxviewbuilder-runtime-element-wrapper-B7BMP_6p.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-file-upload-element-D9RXvqKq.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-icon-element-BhhGVwki.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-iframe-element-Cu80J5fV.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-image-element-BcWyv_1w.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-list-box-element-B3arqtqK.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-list-grid-element-Bypg41r5.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-mark-for-check-on-property-change-CJyXJ0dU.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-message-card-element-MG1HDIgX.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-multi-select-element-BWJx77Pg.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-ngx-view-builder-api.service-YhGi50Zx.mjs +4 -0
- package/fesm2022/ngxviewbuilder-runtime-number-element-Cv-8UzYT.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-number-stepper-element-BERWK0N0.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-nvb-select-DZN__Phy.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-page-title-element-BypNpk6v.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-phone-input-element-Dc7vFgbW.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-progress-bar-element-CTsruGjk.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-radio-element-BVBDe7Ek.mjs +1 -0
- package/fesm2022/{ngxviewbuilder-runtime-rich-text-element-DAl3vSxG.mjs → ngxviewbuilder-runtime-rich-text-element-wkavxR4_.mjs} +2 -2
- package/fesm2022/ngxviewbuilder-runtime-router-outlet-element-D5MWP2_E.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-select-button-element-BTHOZoYq.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-select-element-BmbIc2mf.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-signature-pad-element-C8Wm6CAy.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-single-checkbox-element-D6xFAe8I.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-slider-element-DDrlelkb.mjs +1 -0
- package/fesm2022/{ngxviewbuilder-runtime-spacer-element-BGJ-ObOf.mjs → ngxviewbuilder-runtime-spacer-element-Byp-9ui-.mjs} +1 -1
- package/fesm2022/ngxviewbuilder-runtime-stats-card-element-BlpMA4xC.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-table-element-DkFoz7Bs.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-text-element-x7z3vIFH.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-textarea-element-vyeC0HZs.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-time-picker-element-Dkz84ISf.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-toast-element-C52aKUbB.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-toggle-switch-element-DVMw3-vu.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime-video-element-DgRSZoBA.mjs +1 -0
- package/fesm2022/ngxviewbuilder-runtime.mjs +1 -1
- package/package.json +1 -1
- package/types/ngxviewbuilder-runtime.d.ts +116 -6
- package/fesm2022/ngxviewbuilder-runtime-autocomplete-element-DWbMobho.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-avatar-element-98vFX6ZL.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-badge-element-WdHbUp_X.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-breadcrumbs-element-qlHbgWfh.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-button-element-BWI56rGB.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-chart-element-wN98hSa2.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-checkbox-element-yAUJgMY7.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-column-CEOo23I_.mjs +0 -43
- package/fesm2022/ngxviewbuilder-runtime-custom-html-element-D7ezjkGw.mjs +0 -3
- package/fesm2022/ngxviewbuilder-runtime-date-range-element-kRoWWvXf.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-datepicker-element-Co2_JHM2.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-dynamic-text.pipe-BUJ4fCqt.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-element-wrapper-D0lfZvuW.mjs +0 -4
- package/fesm2022/ngxviewbuilder-runtime-file-upload-element-B1sGgTAJ.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-icon-element-BBV3IriU.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-iframe-element-DAKlSTTJ.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-image-element-Co9eNt6D.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-list-box-element-BkqVfq4H.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-list-grid-element-BsVooLf9.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-message-card-element-DOlB-FAw.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-multi-select-element-5YHKOX69.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-number-element-MNO3T8kR.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-number-stepper-element-Jl6DZNAb.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-nvb-select-DuPHFQk6.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-page-title-element-BdfBrnaW.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-phone-input-element-BDZkscMD.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-progress-bar-element-Dg7Y6-jq.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-radio-element-xscwN_Hs.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-router-outlet-element-BpGv-kkh.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-select-button-element-BPH_N-fd.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-select-element-B_FOlIzR.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-signature-pad-element-BxZMh4-H.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-single-checkbox-element-DZiHDP6i.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-slider-element-NBbgW-1w.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-stats-card-element-DUxzXyTC.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-table-element-yvDWlU-z.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-text-element-C9W3pPu7.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-textarea-element-55rqT93w.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-time-picker-element-C1p0lG_4.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-toast-element-Dc8tFqFS.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-toggle-switch-element-DEmC69ye.mjs +0 -1
- package/fesm2022/ngxviewbuilder-runtime-video-element-COR0eePU.mjs +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngxviewbuilder/runtime",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.3",
|
|
4
4
|
"description": "Native Angular runtime for NGX View Builder: renders forms, dashboards, data tables and guided flows defined as JSON.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"homepage": "https://ngxviewbuilder.io",
|
|
@@ -2080,6 +2080,8 @@ export declare class NgxViewBuilderApiService {
|
|
|
2080
2080
|
onTableSavedFiltersRequested: EventEmitter$1<INgxViewBuilderTableSavedFiltersRequestEvent>;
|
|
2081
2081
|
onTableSavedFilterSaveRequested: EventEmitter$1<INgxViewBuilderTableSavedFilterSaveRequestedEvent>;
|
|
2082
2082
|
onElementDefaultsChanged: EventEmitter$1<INgxViewBuilderElementDefaultsEvent>;
|
|
2083
|
+
private readonly isValidationSandbox;
|
|
2084
|
+
private readonly environmentInjector;
|
|
2083
2085
|
constructor();
|
|
2084
2086
|
attachBuilderAdapter(adapter: INgxViewBuilderBuilderAdapter | null | undefined): void;
|
|
2085
2087
|
/**
|
|
@@ -2145,6 +2147,8 @@ export declare class NgxViewBuilderApiService {
|
|
|
2145
2147
|
*/
|
|
2146
2148
|
setWebsocketAuthorizer(authorizer: NgxViewBuilderWebsocketAuthorizer | null | undefined): void;
|
|
2147
2149
|
setDefaultDataSources(dataSources: IDataSource[] | null | undefined, overwriteExisting?: boolean): void;
|
|
2150
|
+
private readonly hostDefaultDataSources;
|
|
2151
|
+
private applyDefaultDataSourcesTo;
|
|
2148
2152
|
setAiAssistantConfig(config: INgxViewBuilderAiAssistantConfig | null | undefined): void;
|
|
2149
2153
|
getAiAssistantConfig(): INgxViewBuilderAiAssistantConfig;
|
|
2150
2154
|
setContentTranslations(translations: Record<string, Record<string, string>>, merge?: boolean): void;
|
|
@@ -2154,7 +2158,14 @@ export declare class NgxViewBuilderApiService {
|
|
|
2154
2158
|
notifyDialogClosed(pageIndex: number, pageName: string | null, dialogTitle?: string | null, reason?: NgxViewBuilderDialogCloseReason): void;
|
|
2155
2159
|
notifyValidationResult(isValid: boolean, issues: INgxViewBuilderValidationIssue[]): void;
|
|
2156
2160
|
showToast(payload: INgxViewBuilderToastPayload): void;
|
|
2157
|
-
|
|
2161
|
+
/**
|
|
2162
|
+
* `validateData()` or `validateData(options)` validates the view on screen and shows its
|
|
2163
|
+
* messages, like the Validate button. `validateData(structure, data, options?)` validates
|
|
2164
|
+
* a given structure headlessly, without touching the view.
|
|
2165
|
+
*/
|
|
2166
|
+
validateData(formJson?: IStructure | string | INgxViewBuilderValidateDataOptions | null, dataJson?: Record<string, unknown> | string | null, options?: INgxViewBuilderValidateDataOptions): Promise<INgxViewBuilderValidationEvent>;
|
|
2167
|
+
private isValidateOptionsObject;
|
|
2168
|
+
private validateCurrentView;
|
|
2158
2169
|
notifyComplete(isValid: boolean, data: Record<string, unknown>, issues: INgxViewBuilderValidationIssue[]): void;
|
|
2159
2170
|
notifySaveRequested(source?: NgxViewBuilderSaveRequestedSource): void;
|
|
2160
2171
|
registerRenderRoot(root: HTMLElement | ShadowRoot | null): void;
|
|
@@ -2208,12 +2219,27 @@ export declare class NgxViewBuilderApiService {
|
|
|
2208
2219
|
markPristine(): void;
|
|
2209
2220
|
isDirty(): boolean;
|
|
2210
2221
|
private registerScopedChildApi;
|
|
2222
|
+
private replayInheritedRegistrationsInto;
|
|
2223
|
+
/**
|
|
2224
|
+
* Two kinds of root calls have to reach the instance-scoped services a runtime view or
|
|
2225
|
+
* <nvb-scope> creates for itself:
|
|
2226
|
+
*
|
|
2227
|
+
* - registrations and host-wide settings (functions, validator types, elements, context,
|
|
2228
|
+
* theme…) are recorded, applied to every live child and replayed into later ones;
|
|
2229
|
+
* - calls about "the view" (structure, values, lookup, validation…) go to the active
|
|
2230
|
+
* child view whenever the root does not own a view itself, which only the designer does.
|
|
2231
|
+
*/
|
|
2232
|
+
private readonly inheritedRegistrations;
|
|
2233
|
+
private bridgedCallDepth;
|
|
2234
|
+
private installScopeBridging;
|
|
2235
|
+
private invokeBridgedMethod;
|
|
2236
|
+
private resolveViewDelegateApi;
|
|
2211
2237
|
private unregisterScopedChildApi;
|
|
2212
2238
|
private resolveScopedChildApi;
|
|
2213
2239
|
/**
|
|
2214
|
-
*
|
|
2215
|
-
*
|
|
2216
|
-
* it
|
|
2240
|
+
* In the designer the root owns the edited view, and a preview runtime inside it must
|
|
2241
|
+
* not take over getStructure(). A root setStructure() made while a runtime view is on
|
|
2242
|
+
* screen goes to that view, so it no longer pins the root to a structure of its own.
|
|
2217
2243
|
*/
|
|
2218
2244
|
private resolveStructureDelegateApi;
|
|
2219
2245
|
reloadDataSource(elementNameOrPath: string, dataSourceName?: string, runtimeContext?: Record<string, unknown>): Promise<unknown | null>;
|
|
@@ -2233,7 +2259,8 @@ export declare class NgxViewBuilderApiService {
|
|
|
2233
2259
|
setElementErrors(elementNameOrPath: string, errors: string | readonly string[] | null | undefined): boolean;
|
|
2234
2260
|
clearElementErrors(elementNameOrPath: string): boolean;
|
|
2235
2261
|
getElementErrors(elementNameOrPath: string): string[];
|
|
2236
|
-
|
|
2262
|
+
/** Merges values into the current data; every key goes through the same path as setValue. */
|
|
2263
|
+
setElementsData(data: Record<string, unknown>): Promise<void>;
|
|
2237
2264
|
setApplicationLocale(locale: string): void;
|
|
2238
2265
|
getApplicationLocale(): string;
|
|
2239
2266
|
setLocale(locale: string): void;
|
|
@@ -2287,6 +2314,15 @@ export declare class NgxViewBuilderApiService {
|
|
|
2287
2314
|
saveTemplate(template: INgxViewBuilderTemplateInput, previousCode?: string): void;
|
|
2288
2315
|
removeTemplate(name: string): void;
|
|
2289
2316
|
deleteTemplate(code: string): void;
|
|
2317
|
+
/** The structure templates are read from and written to: the builder's live one if any. */
|
|
2318
|
+
private getTemplateStructure;
|
|
2319
|
+
/**
|
|
2320
|
+
* In the builder the template list is changed on the live structure the canvas and the
|
|
2321
|
+
* Templates tab edit. Rebuilding it from getStructure() would go through an export that
|
|
2322
|
+
* keeps only the templates an element uses, and every other template would be lost. A
|
|
2323
|
+
* runtime view rebuilds from its captured source, which keeps them all.
|
|
2324
|
+
*/
|
|
2325
|
+
private mutateStructureTemplates;
|
|
2290
2326
|
setSidebarTemplates(templates: INgxViewBuilderSidebarLibraryItem[], replace?: boolean): void;
|
|
2291
2327
|
loadSidebarGroups(groups: INgxViewBuilderSidebarGroupInput[], replace?: boolean): void;
|
|
2292
2328
|
setSidebarGroups(groups: INgxViewBuilderSidebarGroupInput[], replace?: boolean): void;
|
|
@@ -2318,6 +2354,7 @@ export declare class NgxViewBuilderApiService {
|
|
|
2318
2354
|
* decides whether anything actually changed.
|
|
2319
2355
|
*/
|
|
2320
2356
|
notifyStructureChanged(): void;
|
|
2357
|
+
private scheduleStructureChanged;
|
|
2321
2358
|
private emitStructureChanged;
|
|
2322
2359
|
getElement(nameOrPath: string): unknown;
|
|
2323
2360
|
getElementModel(nameOrPath: string): ElementBaseModel | null;
|
|
@@ -2336,6 +2373,11 @@ export declare class NgxViewBuilderApiService {
|
|
|
2336
2373
|
setElementProperties(nameOrPath: string, propertyPatch: Record<string, unknown> | null | undefined): boolean;
|
|
2337
2374
|
updateElement(nameOrPath: string, updater: (element: ElementBaseModel) => void): boolean;
|
|
2338
2375
|
refreshElement(nameOrPath: string): boolean;
|
|
2376
|
+
/** Comparable per-key snapshot of an element's own properties (no parent links). */
|
|
2377
|
+
private snapshotElementProperties;
|
|
2378
|
+
private diffElementProperties;
|
|
2379
|
+
/** Runs the same notifications a setElementProperty() write does, for keys written directly. */
|
|
2380
|
+
private announceElementPropertyChanges;
|
|
2339
2381
|
/**
|
|
2340
2382
|
* Live handle for one element: values, properties, per element subscriptions
|
|
2341
2383
|
* and - for a dynamicTable / dynamicPanel - row and column control.
|
|
@@ -2475,6 +2517,20 @@ export declare class NgxViewBuilderApiService {
|
|
|
2475
2517
|
* replaced.
|
|
2476
2518
|
*/
|
|
2477
2519
|
private flushElementPropertyChanges;
|
|
2520
|
+
/**
|
|
2521
|
+
* Containers, repeaters and logic cache an element's own disabled / read-only state as
|
|
2522
|
+
* its "base" and recompute the visible state from it (base || parent || logic). A host
|
|
2523
|
+
* write is a new base, otherwise the next recompute puts the old one back.
|
|
2524
|
+
*/
|
|
2525
|
+
private syncInteractionBaseState;
|
|
2526
|
+
/**
|
|
2527
|
+
* A runtime renders from a captured copy of the structure, which is also what
|
|
2528
|
+
* getStructure() and onStructureChanged report. A property written on the live model is
|
|
2529
|
+
* written there too, so a host that saves the structure after an API change keeps it.
|
|
2530
|
+
* Row instances of a repeater are per-row copies and stay out of the definition.
|
|
2531
|
+
*/
|
|
2532
|
+
private mirrorPropertyToSource;
|
|
2533
|
+
private findSourceElementDefinition;
|
|
2478
2534
|
/** True for a model that a dynamicTable / dynamicPanel built for one of its rows. */
|
|
2479
2535
|
private isRepeaterRowInstanceModel;
|
|
2480
2536
|
private getElementPropertyChangeCacheKey;
|
|
@@ -2519,6 +2575,8 @@ export declare class NgxViewBuilderApiService {
|
|
|
2519
2575
|
private isElementModel;
|
|
2520
2576
|
private resolveElementModel;
|
|
2521
2577
|
private getBuilderStructureModel;
|
|
2578
|
+
/** Every model the lookups may match, the builder's first whenever it is attached. */
|
|
2579
|
+
private orderedModelCandidates;
|
|
2522
2580
|
private getBuilderFlatModelMap;
|
|
2523
2581
|
private getStructureSourceValue;
|
|
2524
2582
|
private getMutableStructureSource;
|
|
@@ -2690,6 +2748,11 @@ export interface INgxViewBuilderMigrationConfig {
|
|
|
2690
2748
|
migrations?: IStructureMigration[];
|
|
2691
2749
|
}
|
|
2692
2750
|
export declare class BuilderModel {
|
|
2751
|
+
/**
|
|
2752
|
+
* Goes up on every `setJson`, so a builder that is already on screen can tell a view
|
|
2753
|
+
* was loaded into the model after it started (a view fetched over HTTP, say).
|
|
2754
|
+
*/
|
|
2755
|
+
readonly revision: import("@angular/core").WritableSignal<number>;
|
|
2693
2756
|
private _structureJson;
|
|
2694
2757
|
private _sourceJson;
|
|
2695
2758
|
private _migrationResult;
|
|
@@ -2698,6 +2761,7 @@ export declare class BuilderModel {
|
|
|
2698
2761
|
private _defaultStructure;
|
|
2699
2762
|
constructor();
|
|
2700
2763
|
setJson(json: string): void;
|
|
2764
|
+
private applyJson;
|
|
2701
2765
|
getJson(): IStructure;
|
|
2702
2766
|
/**
|
|
2703
2767
|
* True when the loaded structure declares a newer schema version than this runtime
|
|
@@ -3415,6 +3479,11 @@ interface INgxViewBuilderValidatorValidateOptions {
|
|
|
3415
3479
|
}
|
|
3416
3480
|
export declare class NgxViewBuilderValidator {
|
|
3417
3481
|
private readonly http;
|
|
3482
|
+
private readonly api;
|
|
3483
|
+
/**
|
|
3484
|
+
* Remote mode: the request goes to a validation service at this url. Left empty, the
|
|
3485
|
+
* component validates in the page itself with the same rules the runtime uses.
|
|
3486
|
+
*/
|
|
3418
3487
|
backendUrl: import("@angular/core").InputSignal<string>;
|
|
3419
3488
|
validatePath: import("@angular/core").InputSignal<string>;
|
|
3420
3489
|
appUrl: import("@angular/core").InputSignal<string>;
|
|
@@ -3436,6 +3505,8 @@ export declare class NgxViewBuilderValidator {
|
|
|
3436
3505
|
validationError: import("@angular/core").OutputEmitterRef<INgxViewBuilderValidatorError>;
|
|
3437
3506
|
ngOnInit(): void;
|
|
3438
3507
|
validate(overrides?: INgxViewBuilderValidatorValidateOptions | null): Promise<INgxViewBuilderValidatorResponse>;
|
|
3508
|
+
private isLocalMode;
|
|
3509
|
+
private validateLocally;
|
|
3439
3510
|
private resolveRequest;
|
|
3440
3511
|
private resolveValidateUrl;
|
|
3441
3512
|
private buildHeaders;
|
|
@@ -3551,6 +3622,15 @@ export declare class DataService {
|
|
|
3551
3622
|
private _data;
|
|
3552
3623
|
private dirtyState;
|
|
3553
3624
|
private baselineSnapshot;
|
|
3625
|
+
/**
|
|
3626
|
+
* Right after data is loaded, default values, expressions and load events still write
|
|
3627
|
+
* into it. Those writes are part of the loaded state, not edits, so until the view has
|
|
3628
|
+
* been quiet for a moment (or a person types) they move the baseline instead of making
|
|
3629
|
+
* the form dirty.
|
|
3630
|
+
*/
|
|
3631
|
+
private settlingInitialValues;
|
|
3632
|
+
private settlingTimer;
|
|
3633
|
+
private settlingDeadline;
|
|
3554
3634
|
onValueChanging: EventEmitter$1<IValueChangingEvent>;
|
|
3555
3635
|
onValueChanged: EventEmitter$1<IValueChangedEvent>;
|
|
3556
3636
|
onDataMutated: EventEmitter$1<IValueMutationEvent>;
|
|
@@ -3563,6 +3643,9 @@ export declare class DataService {
|
|
|
3563
3643
|
/** The language the view is rendered in, as `api.getLanguage()` reports it. */
|
|
3564
3644
|
getActiveLanguage(): string;
|
|
3565
3645
|
setData(data: Record<string, unknown>): void;
|
|
3646
|
+
private startInitialSettling;
|
|
3647
|
+
private restartSettlingTimer;
|
|
3648
|
+
private endInitialSettling;
|
|
3566
3649
|
setValue(path: string, value: unknown, options?: {
|
|
3567
3650
|
sender?: unknown;
|
|
3568
3651
|
trigger?: ValueChangeTrigger;
|
|
@@ -4993,6 +5076,7 @@ export declare class ElementActionService {
|
|
|
4993
5076
|
private structureService;
|
|
4994
5077
|
private uiTranslationService;
|
|
4995
5078
|
private markupSecurityService;
|
|
5079
|
+
private eventService;
|
|
4996
5080
|
private injector;
|
|
4997
5081
|
private router;
|
|
4998
5082
|
private debounceTimers;
|
|
@@ -5033,6 +5117,12 @@ export declare class ElementActionService {
|
|
|
5033
5117
|
private executeReloadElements;
|
|
5034
5118
|
private executeValidate;
|
|
5035
5119
|
private executeSubmit;
|
|
5120
|
+
/**
|
|
5121
|
+
* The `submit` trigger: when the form is submitted, every element's submit actions run
|
|
5122
|
+
* before the data is handed to the host. A button's own submit actions already run on
|
|
5123
|
+
* its click, so buttons are left out here.
|
|
5124
|
+
*/
|
|
5125
|
+
runFormSubmitTriggers(): Promise<void>;
|
|
5036
5126
|
private getApiService;
|
|
5037
5127
|
private handleActionResponse;
|
|
5038
5128
|
private reloadCurrentElementIfNeeded;
|
|
@@ -5052,6 +5142,13 @@ export declare class ElementActionService {
|
|
|
5052
5142
|
private assignActionResponseValue;
|
|
5053
5143
|
private resolveSetValuePayload;
|
|
5054
5144
|
private resolveSetOptionsPayload;
|
|
5145
|
+
/**
|
|
5146
|
+
* Parses a JSON literal before any token replacement (its own braces would otherwise read
|
|
5147
|
+
* as a {token}), then fills tokens inside its strings. A string that is exactly one token
|
|
5148
|
+
* keeps the value's type. With `stringsArePaths`, a plain string naming a context path is
|
|
5149
|
+
* replaced by that value. Returns undefined when the text is not JSON.
|
|
5150
|
+
*/
|
|
5151
|
+
private resolveJsonWithTokens;
|
|
5055
5152
|
private resolveContextValue;
|
|
5056
5153
|
private resolveActionTargetPaths;
|
|
5057
5154
|
private getRuntimeVariableDefinitions;
|
|
@@ -6313,7 +6410,8 @@ export interface INgxViewBuilderHeadlessValidateRequest {
|
|
|
6313
6410
|
options?: INgxViewBuilderValidateDataOptions;
|
|
6314
6411
|
}
|
|
6315
6412
|
export interface INgxViewBuilderHeadlessApi {
|
|
6316
|
-
validateData
|
|
6413
|
+
/** `validateData({ formJson, dataJson, options })` or `validateData(formJson, dataJson, options)`. */
|
|
6414
|
+
validateData: (request: INgxViewBuilderHeadlessValidateRequest | IStructure | string, dataJson?: Record<string, unknown> | string | null, options?: INgxViewBuilderValidateDataOptions) => Promise<INgxViewBuilderValidationEvent>;
|
|
6317
6415
|
ping: () => 'ok';
|
|
6318
6416
|
}
|
|
6319
6417
|
export interface INgxViewBuilderHeadlessOptions {
|
|
@@ -6663,6 +6761,8 @@ export declare class ExpressionService {
|
|
|
6663
6761
|
private readonly pendingAffectedPathEvaluations;
|
|
6664
6762
|
/** Property changes queued while one element's logic keys are being applied. */
|
|
6665
6763
|
private readonly propertyChangeBatches;
|
|
6764
|
+
/** How many passes are running for an element; its batch flushes when the last ends. */
|
|
6765
|
+
private readonly propertyChangePassDepth;
|
|
6666
6766
|
private static readonly DATA_SOURCE_REFRESH_WINDOW_MS;
|
|
6667
6767
|
private readonly dataSourceExpressionCache;
|
|
6668
6768
|
private readonly dataSourceExpressionRefreshedAt;
|
|
@@ -7376,9 +7476,17 @@ export declare class NvbScope implements OnDestroy {
|
|
|
7376
7476
|
translations: import("@angular/core").InputSignal<Record<string, Record<string, string>>>;
|
|
7377
7477
|
private readonly context;
|
|
7378
7478
|
private readonly dataService;
|
|
7479
|
+
/**
|
|
7480
|
+
* Created eagerly: constructing the scope's API instance is what replays the host's
|
|
7481
|
+
* registrations (expression functions, validator types, custom elements) into the
|
|
7482
|
+
* scope's own services.
|
|
7483
|
+
*/
|
|
7484
|
+
private readonly api;
|
|
7379
7485
|
private readonly disposeDataSubscription;
|
|
7380
7486
|
constructor();
|
|
7381
7487
|
ngOnDestroy(): void;
|
|
7488
|
+
/** The scope's data as the host sees it: without the library's own `__` keys. */
|
|
7489
|
+
private publicData;
|
|
7382
7490
|
static ɵfac: i0.ɵɵFactoryDeclaration<NvbScope, never>;
|
|
7383
7491
|
static ɵcmp: i0.ɵɵComponentDeclaration<NvbScope, "nvb-scope", never, {
|
|
7384
7492
|
"data": {
|
|
@@ -7425,6 +7533,7 @@ export declare class NvbElementContextService {
|
|
|
7425
7533
|
private readonly structureService;
|
|
7426
7534
|
private readonly dataService;
|
|
7427
7535
|
private readonly uiTranslationService;
|
|
7536
|
+
private readonly eventService;
|
|
7428
7537
|
private readonly entries;
|
|
7429
7538
|
private readonly entryNames;
|
|
7430
7539
|
private readonly entryRows;
|
|
@@ -8166,6 +8275,7 @@ export declare class ElementContentBox implements OnInit, OnDestroy {
|
|
|
8166
8275
|
private readonly onElementFocusHandler;
|
|
8167
8276
|
private readonly onElementContextMenuRequestedHandler;
|
|
8168
8277
|
private readonly onDropHandler;
|
|
8278
|
+
private readonly changeDetectorRef;
|
|
8169
8279
|
private readonly onAfterPropertyChangedHandler;
|
|
8170
8280
|
ngOnInit(): void;
|
|
8171
8281
|
ngOnDestroy(): void;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as f}from"./ngxviewbuilder-runtime-rolldown-runtime-DpJrqANO.mjs";import{an as p,c as y,d as x,g as L,n as m,on as z,p as _,t as g,yt as w}from"./ngxviewbuilder-runtime-dynamic-text.pipe-BUJ4fCqt.mjs";import{ft as O,r as C,rt as T,t as v}from"./ngxviewbuilder-runtime-element-wrapper-D0lfZvuW.mjs";import*as r from"@angular/core";import{ChangeDetectionStrategy as I,Component as V,HostListener as D,ViewChild as M,computed as c,inject as l,input as k,signal as o}from"@angular/core";import{NgClass as b}from"@angular/common";import{cloneDeep as R,get as u,isEqual as N}from"lodash-es";var B=f({AutocompleteElement:()=>d});const A=["items","data.items","data.rows","data.records","data.results","data.content","records","rows","results","content","result","data"];var d=class h{model=k.required(...ngDevMode?[{debugName:"model"}]:[]);tid=C(this.model,"nvb-autocomplete","autocomplete");containerRef;inputValue=o("",...ngDevMode?[{debugName:"inputValue"}]:[]);isOpen=o(false,...ngDevMode?[{debugName:"isOpen"}]:[]);highlightedIndex=o(0,...ngDevMode?[{debugName:"highlightedIndex"}]:[]);dataSourceLoaded=o(false,...ngDevMode?[{debugName:"dataSourceLoaded"}]:[]);isEditorView=o(p.isEditor(),...ngDevMode?[{debugName:"isEditorView"}]:[]);useCompactStyle=o(false,...ngDevMode?[{debugName:"useCompactStyle"}]:[]);isLoading=o(false,...ngDevMode?[{debugName:"isLoading"}]:[]);dataVersion=o(0,...ngDevMode?[{debugName:"dataVersion"}]:[]);blurTimer=null;lazySearchTimer=null;lazySearchSubscription=null;lazySearchRequestId=0;lazyLastRemoteQuery="";lazyLocalBaseQuery=o("",...ngDevMode?[{debugName:"lazyLocalBaseQuery"}]:[]);lazyLocalResultComplete=o(false,...ngDevMode?[{debugName:"lazyLocalResultComplete"}]:[]);searchItems=o([],...ngDevMode?[{debugName:"searchItems"}]:[]);searchBaseQuery=o("",...ngDevMode?[{debugName:"searchBaseQuery"}]:[]);searchComplete=o(false,...ngDevMode?[{debugName:"searchComplete"}]:[]);selectedSearchOption=null;elementActionService=l(T);dataService=l(z);eventService=l(L);expressionService=l(x);dataSourceService=l(y);visibleOptions=c(()=>{this.dataVersion();return this.computeVisibleOptions()},...ngDevMode?[{debugName:"visibleOptions"}]:[]);suggestionOptions=c(()=>{const e=this.visibleOptions();const t=this.inputValue().trim().toLowerCase();if(!t)return[];const n=this.normalizeMaxSuggestions(this.model().maxSuggestions);if(this.isSearchMode())return this.filterSearchOptions(e,t).slice(0,n);let a=e;if(!this.model().lazyLoad||this.shouldFilterLazyOptionsLocally(t))a=e.filter(i=>this.optionMatchesSearch(i,t));return a.slice(0,n)},...ngDevMode?[{debugName:"suggestionOptions"}]:[]);dropdownHasContent=c(()=>this.isLoading()||this.suggestionOptions().length>0||this.canShowEmptyState(),...ngDevMode?[{debugName:"dropdownHasContent"}]:[]);dataSourceLoading=c(()=>Boolean(this.model().dataSource)&&!this.dataSourceLoaded()&&!this.model().lazyLoad&&!this.isSearchMode()&&!this.isEditorView(),...ngDevMode?[{debugName:"dataSourceLoading"}]:[]);onDataSourceLoadedHandler=()=>{this.dataSourceLoaded.set(true);this.dataVersion.update(e=>e+1);this.syncInputFromModelValue()};onDataValueChangedHandler=()=>{this.dataVersion.update(e=>e+1);this.syncInputFromModelValue()};ngOnInit(){const e=!this.model().dataSource||Boolean(this.model().dataSourceLoaded)||Boolean(this.model().lazyLoad)||this.isSearchMode();this.dataSourceLoaded.set(e);this.model().afterDataSourceLoad.add(this.onDataSourceLoadedHandler);this.dataService.onValueChanged.add(this.onDataValueChangedHandler);this.eventService.afterPropertyChanged.add(this.onDataValueChangedHandler);this.isEditorView.set(p.isEditor());if(this.model()?.parentElement&&this.model()?.parentElement instanceof w)this.useCompactStyle.set(this.model()?.parentElement["useCompactStyle"]);this.syncInputFromModelValue()}ngOnDestroy(){this.model().afterDataSourceLoad.remove(this.onDataSourceLoadedHandler);this.dataService.onValueChanged.remove(this.onDataValueChangedHandler);this.eventService.afterPropertyChanged.remove(this.onDataValueChangedHandler);this.clearBlurTimer();this.clearLazySearchTimer();this.clearLazySearchSubscription()}onInput(e){if(this.isInteractionLocked())return;this.clearBlurTimer();const t=e.target;if(!t)return;const n=String(t.value??"");this.inputValue.set(n);this.highlightedIndex.set(0);this.isOpen.set(n.trim().length>0);if(!this.model().forceSelection)this.model().setValue(n,"input");this.runActions("input",n);if(this.isSearchMode())this.scheduleRemoteSearch(n);else if(this.model().lazyLoad&&this.model().dataSource)this.scheduleLazySearch(n)}onFocus(){if(this.isInteractionLocked())return;this.clearBlurTimer();this.runActions("focus",this.model().value);this.isOpen.set(false)}onBlur(){this.clearBlurTimer();this.blurTimer=setTimeout(()=>{this.applyBlurBehavior();this.isOpen.set(false);this.runActions("blur",this.model().value)},120)}onKeyDown(e){if(!this.isOpen()&&e.key==="ArrowDown"){this.isOpen.set(true);return}const t=this.suggestionOptions();if(!t.length){if(e.key==="Escape")this.isOpen.set(false);return}if(e.key==="ArrowDown"){e.preventDefault();const n=(this.highlightedIndex()+1)%t.length;this.highlightedIndex.set(n);return}if(e.key==="ArrowUp"){e.preventDefault();const n=(this.highlightedIndex()-1+t.length)%t.length;this.highlightedIndex.set(n);return}if(e.key==="Enter"){e.preventDefault();const n=t[this.highlightedIndex()]??null;if(n)this.selectOption(n);return}if(e.key==="Escape"){e.preventDefault();this.isOpen.set(false)}}onOptionMouseDown(e,t){t.preventDefault();if(this.isInteractionLocked())return;this.clearBlurTimer();this.selectOption(e)}clear(e){e.preventDefault();e.stopPropagation();if(this.isInteractionLocked())return;this.clearLazySearchTimer();this.clearLazySearchSubscription();this.resetLazySearchState();this.resetRemoteSearchState();this.isLoading.set(false);this.inputValue.set("");this.isOpen.set(false);this.highlightedIndex.set(0);this.model().setValue(null,"change");this.runActions("change",null)}isHighlighted(e){return this.highlightedIndex()===e}isSelected(e){return this.isSameValue(e.value,this.model().value)}trackSuggestion(e,t){return`${String(e.value??"")}-${t}`}hasSearchTerm(){return this.inputValue().trim().length>0}canShowEmptyState(){if(!this.hasSearchTerm())return false;if(this.isSearchMode())return this.searchAnswerCovers(this.inputValue());if(!this.model().lazyLoad)return true;const e=this.normalizeMinSearchLength(this.model().minSearchLength);return this.inputValue().trim().length>=e}onDocumentClick(e){if(!this.isOpen())return;const t=this.containerRef?.nativeElement;if(!t){this.isOpen.set(false);return}const n=e.target;const a=typeof e.composedPath==="function"?e.composedPath():[];if(!((n?t.contains(n):false)||a.includes(t))){this.applyBlurBehavior();this.isOpen.set(false)}}selectOption(e){const t=e.value!==null&&typeof e.value==="object"?R(e.value):e.value;if(this.isSearchMode())this.selectedSearchOption={...e,value:t};this.inputValue.set(e.label);this.isOpen.set(false);this.highlightedIndex.set(0);this.model().setValue(t,"change");this.runActions("change",t)}applyBlurBehavior(){if(!this.model().forceSelection)return;const e=this.inputValue().trim();const t=this.model().value;if(!e){this.model().setValue(null,"change");if(!Object.is(t,this.model().value))this.runActions("change",this.model().value);return}const n=this.visibleOptions().find(a=>a.label.toLowerCase()===e.toLowerCase());if(n){this.inputValue.set(n.label);this.model().setValue(n.value,"change")}else{this.inputValue.set("");this.model().setValue(null,"change")}if(!Object.is(t,this.model().value))this.runActions("change",this.model().value)}isSearchMode(){return String(this.model().searchDataSourceName??"").trim().length>0}scheduleRemoteSearch(e){const t=String(e??"").trim();const n=this.normalizeMinSearchLength(this.model().minSearchLength);this.clearLazySearchTimer();if(t.length<n){this.cancelRemoteSearch();return}if(this.canNarrowSearchLocally(t)||this.isAnsweredQuery(t)){this.cancelRemoteSearch();this.highlightedIndex.set(0);this.isOpen.set(true);return}this.isLoading.set(true);const a=this.normalizeDebounceMs(this.model().debounceMs);this.lazySearchTimer=setTimeout(()=>{this.lazySearchTimer=null;this.executeRemoteSearch(t)},a)}executeRemoteSearch(e){const t=String(this.model().searchDataSourceName??"").trim();if(!t||this.canNarrowSearchLocally(e)){this.cancelRemoteSearch();return}this.clearLazySearchSubscription();const n=++this.lazySearchRequestId;this.isLoading.set(true);this.lazySearchSubscription=this.dataSourceService.getData$(t,true,this.model(),this.buildLazyRuntimeContext(e)).subscribe({next:a=>{if(n!==this.lazySearchRequestId)return;const i=this.resolveSearchItems(a);const s=this.resolveSearchResultLimit();this.searchItems.set(i);this.searchBaseQuery.set(e);this.searchComplete.set(s!==null&&i.length<s);this.dataVersion.update(S=>S+1);this.highlightedIndex.set(0);this.isOpen.set(this.hasSearchTerm());this.isLoading.set(this.lazySearchTimer!==null)},error:()=>{if(n!==this.lazySearchRequestId)return;this.searchItems.set([]);this.searchBaseQuery.set(e);this.searchComplete.set(false);this.dataVersion.update(a=>a+1);this.isLoading.set(this.lazySearchTimer!==null)}})}cancelRemoteSearch(){this.clearLazySearchTimer();this.clearLazySearchSubscription();this.lazySearchRequestId+=1;this.isLoading.set(false)}resetRemoteSearchState(){this.cancelRemoteSearch();this.searchItems.set([]);this.searchBaseQuery.set("");this.searchComplete.set(false);this.dataVersion.update(e=>e+1)}canNarrowSearchLocally(e){return this.searchComplete()&&this.searchAnswerCovers(e)}isAnsweredQuery(e){const t=this.normalizeSearchText(this.searchBaseQuery());return Boolean(t)&&this.normalizeSearchText(e)===t}searchAnswerCovers(e){const t=this.normalizeSearchText(this.searchBaseQuery());return Boolean(t)&&this.normalizeSearchText(e).startsWith(t)}filterSearchOptions(e,t){if(this.isAnsweredQuery(t))return e;if(!this.searchAnswerCovers(t))return[];return e.filter(n=>this.searchOptionMatches(n,t))}searchOptionMatches(e,t){if(this.optionMatchesSearch(e,t))return true;const n=e.raw;if(!n||typeof n!=="object")return false;const a=this.normalizeSearchText(t);return Object.values(n).some(i=>(typeof i==="string"||typeof i==="number")&&this.normalizeSearchText(i).includes(a))}computeSearchOptions(){return this.searchItems().map(e=>this.toSearchOption(e)).filter(e=>e!==null)}toSearchOption(e){const t=this.resolveSearchLabel(e);if(!t)return null;const n=String(this.model().searchValueKey??"").trim();return{label:t,value:n&&e!==null&&typeof e==="object"?u(e,n):e,raw:e}}resolveSearchLabel(e){if(e===null||e===void 0)return"";if(typeof e!=="object")return String(e).trim();const t=e;const n=String(this.model().searchLabelKey??"").trim();const a=n?u(t,n):t["label"]??t["name"]??t["title"]??t["text"];if(a===null||a===void 0)return"";return typeof a==="object"?JSON.stringify(a):String(a).trim()}resolveSearchItems(e){const t=String(this.model().searchItemsPath??"").trim();if(t){const n=u(e,t);return Array.isArray(n)?n:[]}if(Array.isArray(e))return e;if(!e||typeof e!=="object")return[];for(const n of A){const a=u(e,n);if(Array.isArray(a))return a}return[]}resolveSearchResultLimit(){const e=this.model().searchResultLimit;if(e===null||e===void 0||String(e).trim()==="")return null;const t=Number(e);return Number.isFinite(t)&&t>0?Math.floor(t):null}scheduleLazySearch(e){const t=String(e??"").trim();const n=this.normalizeMinSearchLength(this.model().minSearchLength);this.clearLazySearchTimer();if(t.length<n){this.clearLazySearchSubscription();this.resetLazySearchState();this.isLoading.set(false);this.model().options=[];this.dataVersion.update(i=>i+1);return}if(this.tryUseLocalLazySearch(t))return;if(this.normalizeSearchText(t)===this.normalizeSearchText(this.lazyLastRemoteQuery)&&this.flattenOptions(this.model().options??[]).length>0){this.isLoading.set(false);this.highlightedIndex.set(0);this.isOpen.set(true);return}const a=this.normalizeDebounceMs(this.model().debounceMs);this.lazySearchTimer=setTimeout(()=>{this.executeLazySearch(t)},a)}executeLazySearch(e){if(!this.model().dataSource)return;this.clearLazySearchSubscription();const t=++this.lazySearchRequestId;this.lazyLastRemoteQuery=e;this.isLoading.set(true);this.lazySearchSubscription=this.dataSourceService.getData$(this.model().dataSource,true,this.model(),this.buildLazyRuntimeContext(e)).subscribe({next:n=>{if(t!==this.lazySearchRequestId)return;this.model().setOptions(n);this.model().dataSourceLoaded=true;this.dataSourceLoaded.set(true);this.updateLazySearchCompletionState(e);this.dataVersion.update(a=>a+1);this.highlightedIndex.set(0);this.isOpen.set(true);this.isLoading.set(false)},error:()=>{if(t!==this.lazySearchRequestId)return;this.model().options=[];this.resetLazySearchState();this.dataVersion.update(n=>n+1);this.isLoading.set(false)}})}buildLazyRuntimeContext(e){const t=String(this.model().name??"").trim();const n=String(this.model().queryContextKey??"").trim()||"query";const a=(this.isSearchMode()?this.resolveSearchResultLimit():null)??this.normalizeMaxSuggestions(this.model().maxSuggestions);const i={[n]:e,query:e,filterValue:e,filterValueModified4Search:null,term:e,search:e,recordCount:a,rowLimit:a,limit:a,take:a,maxSuggestions:a,value:this.model().value,item:null,row:null};if(t){i[t]=this.model().value;i["__autocomplete"]={[t]:{query:e,term:e,recordCount:a,value:this.model().value}}}return _(this.model(),s=>this.dataService.getValue(s),i)??i}tryUseLocalLazySearch(e){if(!this.shouldFilterLazyOptionsLocally(e))return false;this.clearLazySearchSubscription();this.isLoading.set(false);this.highlightedIndex.set(0);this.isOpen.set(true);this.dataVersion.update(t=>t+1);return true}updateLazySearchCompletionState(e){const t=this.flattenOptions(this.model().options??[]).length;const n=this.normalizeMaxSuggestions(this.model().maxSuggestions);this.lazyLocalBaseQuery.set(e);this.lazyLocalResultComplete.set(t<n)}resetLazySearchState(){this.lazySearchRequestId+=1;this.lazyLastRemoteQuery="";this.lazyLocalBaseQuery.set("");this.lazyLocalResultComplete.set(false)}shouldFilterLazyOptionsLocally(e){if(!this.model().lazyLoad)return false;if(!this.lazyLocalResultComplete())return false;const t=this.normalizeSearchText(e);const n=this.normalizeSearchText(this.lazyLocalBaseQuery());return Boolean(n)&&t.startsWith(n)}computeVisibleOptions(){if(this.isSearchMode())return this.computeSearchOptions();return this.flattenOptions(this.model().options??[]).filter(e=>this.passesOptionFilters(e)&&this.isOptionVisible(e))}flattenOptions(e){if(!Array.isArray(e))return[];const t=[];e.forEach(n=>{const a=n;if(Array.isArray(a?.["items"])){a["items"].forEach(i=>{const s=i;t.push({label:String(s?.["label"]??"").trim(),value:s?.["value"],visibleIf:String(s?.["visibleIf"]??"").trim()||void 0})});return}t.push({label:String(a?.["label"]??"").trim(),value:a?.["value"],visibleIf:String(a?.["visibleIf"]??"").trim()||void 0})});return t.filter(n=>n.label.length>0)}optionMatchesSearch(e,t){const n=this.normalizeSearchText(t);if(!n)return true;return this.normalizeSearchText(e.label).includes(n)}normalizeSearchText(e){return String(e??"").trim().toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"")}passesOptionFilters(e){const t=String(this.model().filterOptionsBy??"").trim()||String(this.model().dataSource?.filterOptionsBy??"").trim();const n=String(this.model().filterIfEqual??"").trim();const a=String(this.model().filterIfNotEqual??"").trim();if(!t&&!n&&!a)return true;const i=this.dataService.getData()??{};return O([e],t,i,{valuePath:"value",filterIfEqual:n,filterIfNotEqual:a}).length>0}isOptionVisible(e){const t=String(e?.visibleIf??"").trim();if(!t)return true;try{const n=this.normalizeOptionCondition(t);const a=this.expressionService.runPropertyConditionSync(this.dataService.getData(),n);return Boolean(a)}catch{return true}}normalizeOptionCondition(e){const t=e.replace(/{/g,"").replace(/}/g,"").trim();if(!t)return"";return this.expressionService.applyContextToExpression(t,this.model())}syncInputFromModelValue(){const e=this.model().value;if(e===null||e===void 0){this.inputValue.set("");return}if(this.isSearchMode()){this.inputValue.set(this.resolveSearchInputText(e));return}if(!this.model().forceSelection){if(typeof e==="string"&&!this.visibleOptions().some(n=>this.isSameValue(n.value,e))){this.inputValue.set(e);return}}const t=this.visibleOptions().find(n=>this.isSameValue(n.value,e));if(t){this.inputValue.set(t.label);return}this.inputValue.set(String(e))}resolveSearchInputText(e){const t=this.visibleOptions().find(n=>this.isSameValue(n.value,e))??(this.selectedSearchOption&&this.isSameValue(this.selectedSearchOption.value,e)?this.selectedSearchOption:null);if(t)return t.label;if(typeof e==="object")return this.resolveSearchLabel(e);return String(e)}runActions(e,t){const n=t!==void 0?t:this.model().value;const a=String(this.model().name??"").trim();const i={value:n,item:null,row:null};if(a)i[a]=n;this.elementActionService.runActions(this.model(),this.model().events??[],e,i)}isInteractionLocked(){const e=this.model();if(!e)return false;if(Boolean(e["__pfInteractionLocked"]))return true;if(this.dataSourceLoading())return true;return Boolean(e.disabled)||Boolean(e.readOnly)}isSameValue(e,t){if(e!==null&&typeof e==="object"||t!==null&&typeof t==="object")return N(e,t);return String(e??"")===String(t??"")}clearBlurTimer(){if(!this.blurTimer)return;clearTimeout(this.blurTimer);this.blurTimer=null}clearLazySearchTimer(){if(!this.lazySearchTimer)return;clearTimeout(this.lazySearchTimer);this.lazySearchTimer=null}clearLazySearchSubscription(){if(!this.lazySearchSubscription)return;this.lazySearchSubscription.unsubscribe();this.lazySearchSubscription=null}normalizeMaxSuggestions(e){const t=Number(e);if(!Number.isFinite(t))return 20;return Math.max(1,Math.min(500,Math.floor(t)))}normalizeMinSearchLength(e){const t=Number(e);if(!Number.isFinite(t))return 1;return Math.max(0,Math.min(10,Math.floor(t)))}normalizeDebounceMs(e){const t=Number(e);if(!Number.isFinite(t)||String(e??"").trim()==="")return 1e3;return Math.max(0,Math.min(1e4,Math.floor(t)))}static ɵfac=r.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:r,type:h,deps:[],target:r.ɵɵFactoryTarget.Component});static ɵcmp=r.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"22.2.1",type:h,isStandalone:true,selector:"autocomplete-element",inputs:{model:{classPropertyName:"model",publicName:"model",isSignal:true,isRequired:true,transformFunction:null}},host:{listeners:{"document:click":"onDocumentClick($event)"}},viewQueries:[{propertyName:"containerRef",first:true,predicate:["container"],descendants:true}],ngImport:r,template:"<element-wrapper [model]=\"model()\">\n @if (model().dataSource && !dataSourceLoaded() && !model().lazyLoad && isEditorView()) {\n <div class=\"nvb-empty-element-wrapper\">\n <div class=\"nvb-control__text-input nvb-empty-select-placeholder\"></div>\n <small class=\"nvb-element-title\">\n <span class=\"material-symbols-outlined\">database</span>\n {{ model()?.dataSource?.source?.title || model()?.dataSource?.name }}\n </small>\n </div>\n } @else {\n <div\n class=\"nvb-autocomplete\"\n [class.nvb-autocomplete--open]=\"isOpen()\"\n [class.nvb-autocomplete--loading]=\"dataSourceLoading()\"\n #container\n [attr.data-testid]=\"tid('root')\"\n [attr.aria-busy]=\"dataSourceLoading() ? 'true' : null\"\n >\n <div class=\"nvb-autocomplete__control\">\n <span class=\"material-symbols-outlined nvb-autocomplete__icon\">search</span>\n <input [attr.data-testid]=\"tid('input')\"\n [id]=\"model().name\"\n [ngClass]=\"useCompactStyle() ? 'nvb-control__column-input' : 'nvb-control__text-input'\"\n class=\"nvb-autocomplete__input\"\n type=\"text\"\n [placeholder]=\"\n dataSourceLoading()\n ? ('autocomplete.loading' | uiT: 'Loading...')\n : model().placeholder\n ? (model().placeholder | dynamicText: model())\n : ('autocomplete.placeholder' | uiT: 'Search...')\n \"\n [disabled]=\"model().disabled || dataSourceLoading()\"\n [readOnly]=\"model().readOnly\"\n [value]=\"inputValue()\"\n autocomplete=\"off\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeyDown($event)\"\n />\n\n @if (dataSourceLoading()) {\n <span class=\"nvb-autocomplete__spinner\" aria-hidden=\"true\"></span>\n } @else if (inputValue()) {\n <button [attr.data-testid]=\"tid('clear')\"\n type=\"button\"\n class=\"nvb-autocomplete__clear\"\n [attr.title]=\"'autocomplete.clear' | uiT: 'Clear'\"\n [attr.aria-label]=\"'autocomplete.clear' | uiT: 'Clear'\"\n (mousedown)=\"clear($event)\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n }\n </div>\n\n @if (isOpen() && !dataSourceLoading() && dropdownHasContent()) {\n <div class=\"nvb-autocomplete__dropdown\" [attr.data-testid]=\"tid('options')\">\n @if (isLoading()) {\n <div class=\"nvb-autocomplete__status\">\n {{ 'autocomplete.loading' | uiT: 'Loading...' }}\n </div>\n }\n\n @for (\n option of suggestionOptions();\n track trackSuggestion(option, $index);\n let i = $index\n ) {\n <button [attr.data-testid]=\"tid('option', i)\"\n type=\"button\"\n class=\"nvb-autocomplete__option\"\n [ngClass]=\"{\n 'nvb-autocomplete__option--highlighted': isHighlighted(i),\n 'nvb-autocomplete__option--selected': isSelected(option),\n }\"\n (mousedown)=\"onOptionMouseDown(option, $event)\"\n >\n {{ option.label }}\n </button>\n }\n\n @if (!isLoading() && suggestionOptions().length === 0 && canShowEmptyState()) {\n <div class=\"nvb-autocomplete__status\">\n {{ 'autocomplete.empty' | uiT: 'No results found' }}\n </div>\n }\n </div>\n }\n </div>\n }\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-autocomplete{position:relative;width:100%;overflow:visible}.nvb-autocomplete--open{z-index:var(--nvb-floating-overlay-container-z-index, 2147482990)}.nvb-autocomplete--loading{cursor:progress}.nvb-autocomplete__control{position:relative;display:flex;align-items:center}.nvb-autocomplete__input{padding-left:34px;padding-right:30px}.nvb-autocomplete--loading .nvb-autocomplete__input{background:linear-gradient(90deg,transparent 0%,color-mix(in oklab,var(--nvb-color-neutral-000) 72%,transparent) 48%,transparent 100%),color-mix(in oklab,var(--nvb-color-neutral-050) 78%,var(--nvb-color-neutral-000));background-size:220% 100%;animation:nvb-autocomplete-loading-shimmer 1.35s ease-in-out infinite}.nvb-autocomplete__icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);font-size:18px;color:var(--nvb-color-neutral-500);pointer-events:none;z-index:1}.nvb-autocomplete__clear{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:none;background:transparent;color:var(--nvb-color-neutral-500);width:24px;height:24px;border-radius:var(--nvb-radius-md);cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.nvb-autocomplete__clear:hover{background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-700)}.nvb-autocomplete__clear span{font-size:16px}.nvb-autocomplete__spinner{position:absolute;right:10px;top:50%;width:14px;height:14px;border:2px solid color-mix(in oklab,var(--nvb-color-neutral-400) 45%,transparent);border-top-color:var(--nvb-color-primary-500);border-radius:var(--nvb-radius-full);transform:translateY(-50%);animation:nvb-autocomplete-loading-spin .8s linear infinite}.nvb-autocomplete__dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;max-height:280px;overflow-y:auto;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);z-index:var(--nvb-floating-overlay-z-index, 2147483000);padding:4px}.nvb-autocomplete__option{display:block;width:100%;border:none;background:transparent;text-align:left;min-height:32px;padding:0 10px;border-radius:var(--nvb-control-radius);font-size:13px;color:var(--nvb-color-neutral-700);cursor:pointer;transition:background-color .12s ease}.nvb-autocomplete__option:hover,.nvb-autocomplete__option--highlighted{background:var(--nvb-color-neutral-100)}.nvb-autocomplete__option--selected{background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700);font-weight:600}.nvb-autocomplete__status{padding:10px 12px;font-size:12px;color:var(--nvb-color-neutral-500)}@keyframes nvb-autocomplete-loading-shimmer{0%{background-position:180% 0}to{background-position:-80% 0}}@keyframes nvb-autocomplete-loading-spin{to{transform:translateY(-50%) rotate(360deg)}}\n"],dependencies:[{kind:"component",type:v,selector:"element-wrapper",inputs:["model","controlIdInput","labelForInput","groupRole","showTextWrapperInput"],exportAs:["elementWrapper"]},{kind:"directive",type:b,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"pipe",type:g,name:"dynamicText"},{kind:"pipe",type:m,name:"uiT"}],changeDetection:r.ChangeDetectionStrategy.OnPush})};r.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:r,type:d,decorators:[{type:V,args:[{selector:"autocomplete-element",changeDetection:I.OnPush,imports:[v,g,b,m],template:"<element-wrapper [model]=\"model()\">\n @if (model().dataSource && !dataSourceLoaded() && !model().lazyLoad && isEditorView()) {\n <div class=\"nvb-empty-element-wrapper\">\n <div class=\"nvb-control__text-input nvb-empty-select-placeholder\"></div>\n <small class=\"nvb-element-title\">\n <span class=\"material-symbols-outlined\">database</span>\n {{ model()?.dataSource?.source?.title || model()?.dataSource?.name }}\n </small>\n </div>\n } @else {\n <div\n class=\"nvb-autocomplete\"\n [class.nvb-autocomplete--open]=\"isOpen()\"\n [class.nvb-autocomplete--loading]=\"dataSourceLoading()\"\n #container\n [attr.data-testid]=\"tid('root')\"\n [attr.aria-busy]=\"dataSourceLoading() ? 'true' : null\"\n >\n <div class=\"nvb-autocomplete__control\">\n <span class=\"material-symbols-outlined nvb-autocomplete__icon\">search</span>\n <input [attr.data-testid]=\"tid('input')\"\n [id]=\"model().name\"\n [ngClass]=\"useCompactStyle() ? 'nvb-control__column-input' : 'nvb-control__text-input'\"\n class=\"nvb-autocomplete__input\"\n type=\"text\"\n [placeholder]=\"\n dataSourceLoading()\n ? ('autocomplete.loading' | uiT: 'Loading...')\n : model().placeholder\n ? (model().placeholder | dynamicText: model())\n : ('autocomplete.placeholder' | uiT: 'Search...')\n \"\n [disabled]=\"model().disabled || dataSourceLoading()\"\n [readOnly]=\"model().readOnly\"\n [value]=\"inputValue()\"\n autocomplete=\"off\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeyDown($event)\"\n />\n\n @if (dataSourceLoading()) {\n <span class=\"nvb-autocomplete__spinner\" aria-hidden=\"true\"></span>\n } @else if (inputValue()) {\n <button [attr.data-testid]=\"tid('clear')\"\n type=\"button\"\n class=\"nvb-autocomplete__clear\"\n [attr.title]=\"'autocomplete.clear' | uiT: 'Clear'\"\n [attr.aria-label]=\"'autocomplete.clear' | uiT: 'Clear'\"\n (mousedown)=\"clear($event)\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n }\n </div>\n\n @if (isOpen() && !dataSourceLoading() && dropdownHasContent()) {\n <div class=\"nvb-autocomplete__dropdown\" [attr.data-testid]=\"tid('options')\">\n @if (isLoading()) {\n <div class=\"nvb-autocomplete__status\">\n {{ 'autocomplete.loading' | uiT: 'Loading...' }}\n </div>\n }\n\n @for (\n option of suggestionOptions();\n track trackSuggestion(option, $index);\n let i = $index\n ) {\n <button [attr.data-testid]=\"tid('option', i)\"\n type=\"button\"\n class=\"nvb-autocomplete__option\"\n [ngClass]=\"{\n 'nvb-autocomplete__option--highlighted': isHighlighted(i),\n 'nvb-autocomplete__option--selected': isSelected(option),\n }\"\n (mousedown)=\"onOptionMouseDown(option, $event)\"\n >\n {{ option.label }}\n </button>\n }\n\n @if (!isLoading() && suggestionOptions().length === 0 && canShowEmptyState()) {\n <div class=\"nvb-autocomplete__status\">\n {{ 'autocomplete.empty' | uiT: 'No results found' }}\n </div>\n }\n </div>\n }\n </div>\n }\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-autocomplete{position:relative;width:100%;overflow:visible}.nvb-autocomplete--open{z-index:var(--nvb-floating-overlay-container-z-index, 2147482990)}.nvb-autocomplete--loading{cursor:progress}.nvb-autocomplete__control{position:relative;display:flex;align-items:center}.nvb-autocomplete__input{padding-left:34px;padding-right:30px}.nvb-autocomplete--loading .nvb-autocomplete__input{background:linear-gradient(90deg,transparent 0%,color-mix(in oklab,var(--nvb-color-neutral-000) 72%,transparent) 48%,transparent 100%),color-mix(in oklab,var(--nvb-color-neutral-050) 78%,var(--nvb-color-neutral-000));background-size:220% 100%;animation:nvb-autocomplete-loading-shimmer 1.35s ease-in-out infinite}.nvb-autocomplete__icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);font-size:18px;color:var(--nvb-color-neutral-500);pointer-events:none;z-index:1}.nvb-autocomplete__clear{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:none;background:transparent;color:var(--nvb-color-neutral-500);width:24px;height:24px;border-radius:var(--nvb-radius-md);cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.nvb-autocomplete__clear:hover{background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-700)}.nvb-autocomplete__clear span{font-size:16px}.nvb-autocomplete__spinner{position:absolute;right:10px;top:50%;width:14px;height:14px;border:2px solid color-mix(in oklab,var(--nvb-color-neutral-400) 45%,transparent);border-top-color:var(--nvb-color-primary-500);border-radius:var(--nvb-radius-full);transform:translateY(-50%);animation:nvb-autocomplete-loading-spin .8s linear infinite}.nvb-autocomplete__dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;max-height:280px;overflow-y:auto;border:1px solid var(--nvb-color-neutral-300);border-radius:var(--nvb-menu-radius, var(--nvb-input-radius));background:var(--nvb-color-neutral-000);box-shadow:var(--nvb-shadow-8);z-index:var(--nvb-floating-overlay-z-index, 2147483000);padding:4px}.nvb-autocomplete__option{display:block;width:100%;border:none;background:transparent;text-align:left;min-height:32px;padding:0 10px;border-radius:var(--nvb-control-radius);font-size:13px;color:var(--nvb-color-neutral-700);cursor:pointer;transition:background-color .12s ease}.nvb-autocomplete__option:hover,.nvb-autocomplete__option--highlighted{background:var(--nvb-color-neutral-100)}.nvb-autocomplete__option--selected{background:var(--nvb-color-primary-050);color:var(--nvb-color-primary-700);font-weight:600}.nvb-autocomplete__status{padding:10px 12px;font-size:12px;color:var(--nvb-color-neutral-500)}@keyframes nvb-autocomplete-loading-shimmer{0%{background-position:180% 0}to{background-position:-80% 0}}@keyframes nvb-autocomplete-loading-spin{to{transform:translateY(-50%) rotate(360deg)}}\n"]}]}],propDecorators:{model:[{type:r.Input,args:[{isSignal:true,alias:"model",required:true}]}],containerRef:[{type:M,args:["container"]}],onDocumentClick:[{type:D,args:["document:click",["$event"]]}]}});export{B as n,d as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as o}from"./ngxviewbuilder-runtime-dynamic-text.pipe-BUJ4fCqt.mjs";import{r as v,rt as m,t as s}from"./ngxviewbuilder-runtime-element-wrapper-D0lfZvuW.mjs";import*as a from"@angular/core";import{ChangeDetectionStrategy as u,Component as g,computed as l,inject as b,input as f,signal as p}from"@angular/core";import{NgStyle as d}from"@angular/common";var c=class r{model=f.required(...ngDevMode?[{debugName:"model"}]:[]);tid=v(this.model,"nvb-avatar","avatar");previewOpen=p(false,...ngDevMode?[{debugName:"previewOpen"}]:[]);previewSrc=p("",...ngDevMode?[{debugName:"previewSrc"}]:[]);elementActionService=b(m);avatarStyle=l(()=>{const e=Number(this.model()?.size);const n=Number.isFinite(e)&&e>0?Math.floor(e):48;const t=String(this.model()?.shape??"circle").trim().toLowerCase();return{width:`${n}px`,height:`${n}px`,"border-radius":t==="square"?"10px":"999px","background-color":String(this.model()?.backgroundColor??"#dfe6ff").trim()||"#dfe6ff",color:String(this.model()?.textColor??"#1b2d6b").trim()||"#1b2d6b",border:this.model().showBorder?"1px solid var(--nvb-color-neutral-300)":"none"}},...ngDevMode?[{debugName:"avatarStyle"}]:[]);initials=l(()=>{const e=String(this.model()?.nameText??"").trim();if(!e)return"U";const n=e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0);if(!n.length)return"U";return n.slice(0,2).map(t=>t[0].toUpperCase()).join("")},...ngDevMode?[{debugName:"initials"}]:[]);onAvatarClick(e,n){n.preventDefault();n.stopPropagation();const t={value:e||this.initials(),item:null,row:null};const i=String(this.model().name??"").trim();if(i)t[i]=t["value"];this.elementActionService.runActions(this.model(),this.model().events??[],"click",t);if(!this.model().showPreview||!e)return;this.previewSrc.set(e);this.previewOpen.set(true)}closePreview(e){e?.preventDefault();e?.stopPropagation();this.previewOpen.set(false);this.previewSrc.set("")}static ɵfac=a.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:a,type:r,deps:[],target:a.ɵɵFactoryTarget.Component});static ɵcmp=a.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"22.2.1",type:r,isStandalone:true,selector:"avatar-element",inputs:{model:{classPropertyName:"model",publicName:"model",isSignal:true,isRequired:true,transformFunction:null}},ngImport:a,template:"<element-wrapper [model]=\"model()\">\n @let avatarSrc = model().src | dynamicText: model();\n @let avatarName = model().nameText | dynamicText: model();\n\n <div class=\"nvb-avatar-wrap\" [attr.data-testid]=\"tid('root')\">\n <button [attr.data-testid]=\"tid('avatar')\"\n type=\"button\"\n class=\"nvb-avatar\"\n [ngStyle]=\"avatarStyle()\"\n (click)=\"onAvatarClick(avatarSrc, $event)\"\n >\n @if (avatarSrc) {\n <img [src]=\"avatarSrc\" [alt]=\"avatarName\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </button>\n </div>\n\n @if (previewOpen()) {\n <div [attr.data-testid]=\"tid('close-preview')\" class=\"nvb-avatar-preview\" (click)=\"closePreview()\">\n <button [attr.data-testid]=\"tid('close')\" type=\"button\" class=\"nvb-avatar-preview__close\" (click)=\"closePreview($event)\">\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n <img [src]=\"previewSrc()\" [alt]=\"avatarName\" />\n </div>\n }\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-avatar-wrap{width:100%;display:flex;justify-content:flex-start;align-items:center}.nvb-avatar{border:none;padding:0;overflow:hidden;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;font-weight:700;font-size:14px;line-height:1}.nvb-avatar img{width:100%;height:100%;object-fit:cover;display:block}.nvb-avatar-preview{position:fixed;inset:0;background:#000000b8;z-index:1300;display:grid;place-items:center;padding:20px}.nvb-avatar-preview img{width:min(300px,100vw - 40px);height:min(300px,100vw - 40px);object-fit:cover;border-radius:14px;box-shadow:0 16px 32px #0000004d;background:#fff}.nvb-avatar-preview__close{position:absolute;top:12px;right:12px;width:36px;height:36px;border:none;border-radius:var(--nvb-radius-lg);background:#ffffff2e;color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.nvb-avatar-preview__close span{font-size:20px}\n"],dependencies:[{kind:"component",type:s,selector:"element-wrapper",inputs:["model","controlIdInput","labelForInput","groupRole","showTextWrapperInput"],exportAs:["elementWrapper"]},{kind:"directive",type:d,selector:"[ngStyle]",inputs:["ngStyle"]},{kind:"pipe",type:o,name:"dynamicText"}],changeDetection:a.ChangeDetectionStrategy.OnPush})};a.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:a,type:c,decorators:[{type:g,args:[{selector:"avatar-element",changeDetection:u.OnPush,imports:[s,d,o],template:"<element-wrapper [model]=\"model()\">\n @let avatarSrc = model().src | dynamicText: model();\n @let avatarName = model().nameText | dynamicText: model();\n\n <div class=\"nvb-avatar-wrap\" [attr.data-testid]=\"tid('root')\">\n <button [attr.data-testid]=\"tid('avatar')\"\n type=\"button\"\n class=\"nvb-avatar\"\n [ngStyle]=\"avatarStyle()\"\n (click)=\"onAvatarClick(avatarSrc, $event)\"\n >\n @if (avatarSrc) {\n <img [src]=\"avatarSrc\" [alt]=\"avatarName\" />\n } @else {\n <span>{{ initials() }}</span>\n }\n </button>\n </div>\n\n @if (previewOpen()) {\n <div [attr.data-testid]=\"tid('close-preview')\" class=\"nvb-avatar-preview\" (click)=\"closePreview()\">\n <button [attr.data-testid]=\"tid('close')\" type=\"button\" class=\"nvb-avatar-preview__close\" (click)=\"closePreview($event)\">\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n <img [src]=\"previewSrc()\" [alt]=\"avatarName\" />\n </div>\n }\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-avatar-wrap{width:100%;display:flex;justify-content:flex-start;align-items:center}.nvb-avatar{border:none;padding:0;overflow:hidden;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;font-weight:700;font-size:14px;line-height:1}.nvb-avatar img{width:100%;height:100%;object-fit:cover;display:block}.nvb-avatar-preview{position:fixed;inset:0;background:#000000b8;z-index:1300;display:grid;place-items:center;padding:20px}.nvb-avatar-preview img{width:min(300px,100vw - 40px);height:min(300px,100vw - 40px);object-fit:cover;border-radius:14px;box-shadow:0 16px 32px #0000004d;background:#fff}.nvb-avatar-preview__close{position:absolute;top:12px;right:12px;width:36px;height:36px;border:none;border-radius:var(--nvb-radius-lg);background:#ffffff2e;color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.nvb-avatar-preview__close span{font-size:20px}\n"]}]}],propDecorators:{model:[{type:a.Input,args:[{isSignal:true,alias:"model",required:true}]}]}});export{c as AvatarElement};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as b}from"./ngxviewbuilder-runtime-rolldown-runtime-DpJrqANO.mjs";import{d,t as l}from"./ngxviewbuilder-runtime-dynamic-text.pipe-BUJ4fCqt.mjs";import{r as v,t as s}from"./ngxviewbuilder-runtime-element-wrapper-D0lfZvuW.mjs";import*as o from"@angular/core";import{ChangeDetectionStrategy as m,Component as g,computed as n,inject as p,input as u}from"@angular/core";import{NgClass as c}from"@angular/common";var x=b({BadgeElement:()=>i});var i=class t{expressionService=p(d);model=u.required(...ngDevMode?[{debugName:"model"}]:[]);tid=v(this.model,"nvb-badge","badge");resolvedVariant=n(()=>this.resolveVariant(),...ngDevMode?[{debugName:"resolvedVariant"}]:[]);badgeClass=n(()=>{const e=this.resolvedVariant();const r=this.resolveSize();return{[`nvb-badge--${e}`]:true,[`nvb-badge--${r}`]:true,"nvb-badge--square":!Boolean(this.model()?.pill)}},...ngDevMode?[{debugName:"badgeClass"}]:[]);iconName=n(()=>{const e=String(this.model()?.icon??"").trim();if(e)return e;switch(this.resolvedVariant()){case"success":return"check_circle";case"warn":return"warning";case"risk":return"error";case"primary":return"bolt";case"neutral":return"radio_button_checked";default:return"info"}},...ngDevMode?[{debugName:"iconName"}]:[]);resolveVariant(){const e=this.resolveConditionalVariant()||this.resolveExpressionValue(this.model()?.variantExpression)||this.model()?.variant;const r=String(e??"info").trim().toLowerCase();if(r==="warn"||r==="warning")return"warn";if(r==="risk"||r==="danger"||r==="error")return"risk";if(r==="success"||r==="succes"||r==="completed")return"success";if(r==="neutral"||r==="archived")return"neutral";if(r==="primary"||r==="new")return"primary";if(r==="info"||r==="inprogress"||r==="in_progress"||r==="in-progress"||r==="blocked")return"info";return"info"}resolveConditionalVariant(){if(String(this.model()?.variantMode??"static").trim().toLowerCase()!=="conditional")return"";const e=Array.isArray(this.model()?.variantRules)?this.model().variantRules:[];for(const r of e){const a=String(r?.condition??"").trim();if(!a)continue;if(Boolean(this.expressionService.evaluateInlineExpression(a,this.model())))return String(r?.variant??"").trim()}return""}resolveText(){const e=String(this.model()?.text??"").trim();if(e)return e;const r=String(this.model()?.label??"").trim();if(r)return r;return"Badge"}resolveSize(){const e=String(this.model()?.size??"md").trim().toLowerCase();if(e==="sm"||e==="lg")return e;return"md"}resolveExpressionValue(e){const r=String(e??"").trim();if(!r)return"";const a=this.expressionService.evaluateInlineExpression(r,this.model());return String(a??"").trim()}static ɵfac=o.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:o,type:t,deps:[],target:o.ɵɵFactoryTarget.Component});static ɵcmp=o.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"22.2.1",type:t,isStandalone:true,selector:"badge-element",inputs:{model:{classPropertyName:"model",publicName:"model",isSignal:true,isRequired:true,transformFunction:null}},ngImport:o,template:"<element-wrapper [model]=\"model()\">\n <span class=\"nvb-badge\" [ngClass]=\"badgeClass()\" [attr.data-testid]=\"tid('root')\">\n @if (model().showIcon) {\n <span class=\"material-symbols-outlined nvb-badge__icon\">{{ iconName() }}</span>\n }\n <span class=\"nvb-badge__text\">{{ resolveText() | dynamicText: model() }}</span>\n </span>\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-badge{display:inline-flex;align-items:center;gap:5px;border-radius:var(--nvb-radius-full);border:1px solid var(--nvb-color-neutral-300);background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-700);line-height:1.4;max-width:100%;vertical-align:middle}.nvb-badge__icon{font-size:14px;line-height:1}.nvb-badge__text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.nvb-badge--sm{min-height:20px;padding:2px 7px;font-size:11px}.nvb-badge--md{min-height:24px;padding:3px 9px;font-size:12px}.nvb-badge--lg{min-height:28px;padding:4px 11px;font-size:13px}.nvb-badge--square{border-radius:var(--nvb-radius-md)}.nvb-badge--info{border-color:color-mix(in oklab,var(--nvb-color-primary-500) 30%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-primary-500) 14%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700)}.nvb-badge--success{border-color:color-mix(in oklab,var(--nvb-color-success-500) 34%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-success-500) 14%,var(--nvb-color-surface-mix-target, white));color:color-mix(in oklab,var(--nvb-color-success-500) 75%,black)}.nvb-badge--warn,.nvb-badge--warning{border-color:color-mix(in oklab,var(--nvb-color-warning-500) 40%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-warning-500) 16%,var(--nvb-color-surface-mix-target, white));color:color-mix(in oklab,var(--nvb-color-warning-500) 78%,black)}.nvb-badge--risk,.nvb-badge--danger{border-color:color-mix(in oklab,var(--nvb-color-risk-500) 38%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-risk-500) 14%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-risk-700)}.nvb-badge--primary,.nvb-badge--new{border-color:color-mix(in oklab,var(--nvb-color-primary-500) 36%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-primary-500) 12%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700)}\n"],dependencies:[{kind:"component",type:s,selector:"element-wrapper",inputs:["model","controlIdInput","labelForInput","groupRole","showTextWrapperInput"],exportAs:["elementWrapper"]},{kind:"directive",type:c,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"pipe",type:l,name:"dynamicText"}],changeDetection:o.ChangeDetectionStrategy.OnPush})};o.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:o,type:i,decorators:[{type:g,args:[{selector:"badge-element",changeDetection:m.OnPush,imports:[s,c,l],template:"<element-wrapper [model]=\"model()\">\n <span class=\"nvb-badge\" [ngClass]=\"badgeClass()\" [attr.data-testid]=\"tid('root')\">\n @if (model().showIcon) {\n <span class=\"material-symbols-outlined nvb-badge__icon\">{{ iconName() }}</span>\n }\n <span class=\"nvb-badge__text\">{{ resolveText() | dynamicText: model() }}</span>\n </span>\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-badge{display:inline-flex;align-items:center;gap:5px;border-radius:var(--nvb-radius-full);border:1px solid var(--nvb-color-neutral-300);background:var(--nvb-color-neutral-100);color:var(--nvb-color-neutral-700);line-height:1.4;max-width:100%;vertical-align:middle}.nvb-badge__icon{font-size:14px;line-height:1}.nvb-badge__text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.nvb-badge--sm{min-height:20px;padding:2px 7px;font-size:11px}.nvb-badge--md{min-height:24px;padding:3px 9px;font-size:12px}.nvb-badge--lg{min-height:28px;padding:4px 11px;font-size:13px}.nvb-badge--square{border-radius:var(--nvb-radius-md)}.nvb-badge--info{border-color:color-mix(in oklab,var(--nvb-color-primary-500) 30%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-primary-500) 14%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700)}.nvb-badge--success{border-color:color-mix(in oklab,var(--nvb-color-success-500) 34%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-success-500) 14%,var(--nvb-color-surface-mix-target, white));color:color-mix(in oklab,var(--nvb-color-success-500) 75%,black)}.nvb-badge--warn,.nvb-badge--warning{border-color:color-mix(in oklab,var(--nvb-color-warning-500) 40%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-warning-500) 16%,var(--nvb-color-surface-mix-target, white));color:color-mix(in oklab,var(--nvb-color-warning-500) 78%,black)}.nvb-badge--risk,.nvb-badge--danger{border-color:color-mix(in oklab,var(--nvb-color-risk-500) 38%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-risk-500) 14%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-risk-700)}.nvb-badge--primary,.nvb-badge--new{border-color:color-mix(in oklab,var(--nvb-color-primary-500) 36%,var(--nvb-color-surface-mix-target, white));background:color-mix(in oklab,var(--nvb-color-primary-500) 12%,var(--nvb-color-surface-mix-target, white));color:var(--nvb-color-primary-700)}\n"]}]}],propDecorators:{model:[{type:o.Input,args:[{isSignal:true,alias:"model",required:true}]}]}});export{x as n,i as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{sn as y,t as b}from"./ngxviewbuilder-runtime-dynamic-text.pipe-BUJ4fCqt.mjs";import{ht as x,o as v,r as S,rt as I,t as f}from"./ngxviewbuilder-runtime-element-wrapper-D0lfZvuW.mjs";import*as s from"@angular/core";import{ChangeDetectionStrategy as w,Component as _,computed as h,inject as d,input as k,signal as T}from"@angular/core";import{get as C}from"lodash-es";import{filter as R}from"rxjs";import{NavigationEnd as D,Router as L}from"@angular/router";var g=class p{model=k.required(...ngDevMode?[{debugName:"model"}]:[]);tid=S(this.model,"nvb-breadcrumbs","breadcrumbs");elementActionService=d(I);markupSecurityService=d(x);uiTranslationService=d(y);router=d(L,{optional:true});routeRefresh=T(0,...ngDevMode?[{debugName:"routeRefresh"}]:[]);navigationSubscription=null;ngOnInit(){if(!this.router)return;this.navigationSubscription=this.router.events.pipe(R(t=>t instanceof D)).subscribe(()=>{this.routeRefresh.update(t=>t+1)})}ngOnDestroy(){this.navigationSubscription?.unsubscribe();this.navigationSubscription=null}renderedItems=h(()=>{this.routeRefresh();const t=this.resolveSourceItems();const e=[];if(this.model().showHome){const i=String(this.model()?.homeLabel??"").trim();e.push({label:i||this.uiTranslationService.translate("breadcrumbs.home","Home"),value:String(this.model()?.homeUrl??"/").trim()||"/"})}e.push(...t);const r=Number(this.model()?.maxItems??0);const n=Number.isFinite(r)&&r>0?Math.floor(r):0;if(n>0&&e.length>n&&n>=2)return[e[0],{label:"...",value:"",ellipsis:true},...e.slice(e.length-(n-1))];return e},...ngDevMode?[{debugName:"renderedItems"}]:[]);separatorIcon=h(()=>{return String(this.model()?.separator??"").trim()||"chevron_right"},...ngDevMode?[{debugName:"separatorIcon"}]:[]);resolveItemHref(t){return this.markupSecurityService.sanitizeNavigationUrl(String(t??""))}onItemClick(t,e,r){if(t.ellipsis){r.preventDefault();return}if(Array.isArray(this.model().events)&&this.model().events.length>0)r.preventDefault();else{const a=r.currentTarget instanceof HTMLAnchorElement?String(r.currentTarget.getAttribute("href")??"").trim():"";if(a.startsWith("/")&&this.router){r.preventDefault();this.router.navigateByUrl(a).catch(()=>{if(typeof window!=="undefined"&&typeof window.location?.assign==="function")window.location.assign(a)});return}}const n={item:t,row:t,index:e,value:t.value};const i=String(this.model().name??"").trim();if(i)n[i]=t.value;this.elementActionService.runActions(this.model(),this.model().events??[],"click",n)}resolveSourceItems(){if(this.model()?.itemsSource==="route")return this.buildRouteItems();return Array.isArray(this.model()?.items)?[...this.model().items]:[]}buildRouteItems(){const t=this.router?.routerState?.snapshot?.root??null;if(!t)return[];const e=String(this.model()?.routeLabelDataKey??"breadcrumb").trim()||"breadcrumb";const r=this.model()?.routeUsePathFallback!==false;const n=this.model()?.routeIncludeCurrent!==false;const i=this.resolveLeafSnapshot(t);const a=[];const o=[];for(const c of i.pathFromRoot){const m=c.url.map(u=>String(u?.path??"").trim()).filter(Boolean);if(m.length>0)a.push(...m);const l=this.resolveRouteItem(c,a,e,r);if(l)o.push(l)}if(!n&&o.length>0)o.pop();return o}resolveLeafSnapshot(t){let e=t;while(e.firstChild)e=e.firstChild;return e}resolveRouteItem(t,e,r,n){const i=this.resolveRouteBreadcrumbConfig(t,r);if(i?.skip)return null;const a=n?this.resolveFallbackRouteLabel(t):"";const o=this.resolveRouteTemplate(String(i?.label??a??"").trim(),t,e);if(!o)return null;const c=this.resolveRouteTemplate(String(i?.value??"").trim(),t,e);const m=e.length>0?`/${e.join("/")}`:"/";return{label:o,value:c||m}}resolveRouteBreadcrumbConfig(t,e){const r=t.data?.[e];if(r===false||r===null)return{skip:true};if(typeof r==="string"){const i=r.trim();return i?{label:i}:null}if(!r||typeof r!=="object"||Array.isArray(r))return null;const n=r;return{label:String(n["label"]??"").trim()||void 0,value:String(n["value"]??"").trim()||void 0,skip:Boolean(n["skip"])}}resolveFallbackRouteLabel(t){const e=String(t.data?.["title"]??"").trim();if(e)return e;const r=t.url.map(i=>this.humanizeSegment(String(i?.path??"").trim())).filter(Boolean).join(" / ");if(r)return r;const n=String(t.routeConfig?.path??"").trim();if(n.startsWith(":")){const i=n.slice(1).split("/")[0];const a=String(t.params?.[i]??"").trim();if(a)return a}return""}humanizeSegment(t){const e=decodeURIComponent(String(t??"").trim());if(!e)return"";return e.replace(/[-_]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,r=>r.toUpperCase())}resolveRouteTemplate(t,e,r){const n=String(t??"").trim();if(!n)return"";const i=r.length>0?`/${r.join("/")}`:"/";const a=String(e.params?.["id"]??e.paramMap.get("id")??"").trim()||void 0;const o={route:{id:a,url:i,params:e.params??{},queryParams:e.queryParams??{},data:e.data??{},fragment:e.fragment??"",path:String(e.routeConfig?.path??"").trim()},id:a,url:i,params:e.params??{},queryParams:e.queryParams??{},data:e.data??{}};const c=m=>{const l=String(m??"").trim();if(!l)return"";const u=C(o,l);if(u===null||u===void 0)return"";return String(u)};return n.replace(/\{\{([^}]+)\}\}/g,(m,l)=>c(l)).replace(/\{([^}]+)\}/g,(m,l)=>c(l))}static ɵfac=s.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:s,type:p,deps:[],target:s.ɵɵFactoryTarget.Component});static ɵcmp=s.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"22.2.1",type:p,isStandalone:true,selector:"breadcrumbs-element",inputs:{model:{classPropertyName:"model",publicName:"model",isSignal:true,isRequired:true,transformFunction:null}},ngImport:s,template:"<element-wrapper [model]=\"model()\">\n <nav class=\"nvb-breadcrumbs\" aria-label=\"Breadcrumbs\" [attr.data-testid]=\"tid('root')\">\n <ol>\n @for (item of renderedItems(); track $index; let itemIndex = $index; let isLast = $last) {\n <li>\n @if (item.ellipsis) {\n <span class=\"nvb-breadcrumbs__ellipsis\">...</span>\n } @else if (!isLast && item.value) {\n <a [attr.data-testid]=\"tid('link', itemIndex)\"\n [attr.href]=\"resolveItemHref(item.value | dynamicText: model())\"\n (click)=\"onItemClick(item, itemIndex, $event)\"\n >\n {{ item.label | dynamicText: model() }}\n </a>\n } @else {\n <span class=\"nvb-breadcrumbs__current\">{{ item.label | dynamicText: model() }}</span>\n }\n\n @if (!isLast) {\n <nvb-icon class=\"nvb-breadcrumbs__separator\" [name]=\"separatorIcon()\"></nvb-icon>\n }\n </li>\n }\n </ol>\n </nav>\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-breadcrumbs{width:100%}.nvb-breadcrumbs ol{list-style:none;margin:0;padding:0;display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-width:0}.nvb-breadcrumbs li{display:inline-flex;align-items:center;gap:6px;min-width:0}.nvb-breadcrumbs a,.nvb-breadcrumbs__current,.nvb-breadcrumbs__ellipsis{font-size:12px;line-height:1.3;text-decoration:none;max-width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nvb-breadcrumbs a{color:var(--nvb-color-primary-700);cursor:pointer}.nvb-breadcrumbs a:hover{text-decoration:underline}.nvb-breadcrumbs__current{color:var(--nvb-color-neutral-700);font-weight:600}.nvb-breadcrumbs__ellipsis{color:var(--nvb-color-neutral-500)}.nvb-breadcrumbs__separator{font-size:14px;color:var(--nvb-color-neutral-500)}\n"],dependencies:[{kind:"component",type:f,selector:"element-wrapper",inputs:["model","controlIdInput","labelForInput","groupRole","showTextWrapperInput"],exportAs:["elementWrapper"]},{kind:"component",type:v,selector:"nvb-icon",inputs:["name","svg","ariaLabel"]},{kind:"pipe",type:b,name:"dynamicText"}],changeDetection:s.ChangeDetectionStrategy.OnPush})};s.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:s,type:g,decorators:[{type:_,args:[{selector:"breadcrumbs-element",changeDetection:w.OnPush,imports:[f,b,v],template:"<element-wrapper [model]=\"model()\">\n <nav class=\"nvb-breadcrumbs\" aria-label=\"Breadcrumbs\" [attr.data-testid]=\"tid('root')\">\n <ol>\n @for (item of renderedItems(); track $index; let itemIndex = $index; let isLast = $last) {\n <li>\n @if (item.ellipsis) {\n <span class=\"nvb-breadcrumbs__ellipsis\">...</span>\n } @else if (!isLast && item.value) {\n <a [attr.data-testid]=\"tid('link', itemIndex)\"\n [attr.href]=\"resolveItemHref(item.value | dynamicText: model())\"\n (click)=\"onItemClick(item, itemIndex, $event)\"\n >\n {{ item.label | dynamicText: model() }}\n </a>\n } @else {\n <span class=\"nvb-breadcrumbs__current\">{{ item.label | dynamicText: model() }}</span>\n }\n\n @if (!isLast) {\n <nvb-icon class=\"nvb-breadcrumbs__separator\" [name]=\"separatorIcon()\"></nvb-icon>\n }\n </li>\n }\n </ol>\n </nav>\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-breadcrumbs{width:100%}.nvb-breadcrumbs ol{list-style:none;margin:0;padding:0;display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-width:0}.nvb-breadcrumbs li{display:inline-flex;align-items:center;gap:6px;min-width:0}.nvb-breadcrumbs a,.nvb-breadcrumbs__current,.nvb-breadcrumbs__ellipsis{font-size:12px;line-height:1.3;text-decoration:none;max-width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nvb-breadcrumbs a{color:var(--nvb-color-primary-700);cursor:pointer}.nvb-breadcrumbs a:hover{text-decoration:underline}.nvb-breadcrumbs__current{color:var(--nvb-color-neutral-700);font-weight:600}.nvb-breadcrumbs__ellipsis{color:var(--nvb-color-neutral-500)}.nvb-breadcrumbs__separator{font-size:14px;color:var(--nvb-color-neutral-500)}\n"]}]}],propDecorators:{model:[{type:s.Input,args:[{isSignal:true,alias:"model",required:true}]}]}});export{g as BreadcrumbsElement};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as S}from"./ngxviewbuilder-runtime-rolldown-runtime-DpJrqANO.mjs";import{g as k,on as C,t as m}from"./ngxviewbuilder-runtime-dynamic-text.pipe-BUJ4fCqt.mjs";import{o as h,r as D,rt as I,t as g}from"./ngxviewbuilder-runtime-element-wrapper-D0lfZvuW.mjs";import{t as A}from"./ngxviewbuilder-runtime-dropdown-coordinator.service-CDJcQkrB.mjs";import*as i from"@angular/core";import{ChangeDetectionStrategy as T,ChangeDetectorRef as z,Component as P,ElementRef as B,HostListener as b,ViewChild as N,computed as e,inject as a,input as O,signal as l}from"@angular/core";import{NgClass as L,NgStyle as f}from"@angular/common";var W=S({ButtonElement:()=>s});var s=class u{model=O.required(...ngDevMode?[{debugName:"model"}]:[]);tid=D(this.model,"nvb-button","button");buttonTrigger;elementActionService=a(I);dataService=a(C);eventService=a(k);cdr=a(z);elementRef=a(B);dropdownCoordinatorService=a(A);dropdownId=`button-menu-${Math.random().toString(36).slice(2,11)}`;dropdownCoordinatorSubscription=null;onPropertyChangedHandler=n=>{const o=String(this.model()?.dataPath??"").trim();if(!o)return;if(String(n?.payload?.elementNameOrPath??"").trim()!==o)return;this.cdr.markForCheck()};menuOpen=l(false,...ngDevMode?[{debugName:"menuOpen"}]:[]);menuPosition=l("bottom",...ngDevMode?[{debugName:"menuPosition"}]:[]);menuStyle=l({},...ngDevMode?[{debugName:"menuStyle"}]:[]);isMenuOpen=e(()=>this.menuOpen(),...ngDevMode?[{debugName:"isMenuOpen"}]:[]);menuActions=e(()=>{const n=this.model()?.menuActions;return Array.isArray(n)?n.filter(Boolean):[]},...ngDevMode?[{debugName:"menuActions"}]:[]);isMenuButton=e(()=>this.menuActions().length>0,...ngDevMode?[{debugName:"isMenuButton"}]:[]);buttonText=e(()=>{if(this.isIconOnly())return"";const n=String(this.model()?.text??"").trim();if(n)return n;const o=String(this.model()?.label??"").trim();if(o)return o;return"Button"},...ngDevMode?[{debugName:"buttonText"}]:[]);buttonIcon=e(()=>String(this.model()?.icon??"").trim(),...ngDevMode?[{debugName:"buttonIcon"}]:[]);badgeText=e(()=>String(this.model()?.badge??"").trim(),...ngDevMode?[{debugName:"badgeText"}]:[]);hasIcon=e(()=>this.buttonIcon().length>0,...ngDevMode?[{debugName:"hasIcon"}]:[]);hasBadge=e(()=>this.badgeText().length>0,...ngDevMode?[{debugName:"hasBadge"}]:[]);iconPosition=e(()=>{const n=String(this.model()?.iconPosition??"left").trim().toLowerCase();if(n==="right")return"right";if(n==="top")return"top";if(n==="bottom")return"bottom";return"left"},...ngDevMode?[{debugName:"iconPosition"}]:[]);buttonSize=e(()=>{const n=String(this.model()?.size??"normal").trim().toLowerCase();if(n==="small")return"small";if(n==="large")return"large";return"normal"},...ngDevMode?[{debugName:"buttonSize"}]:[]);isLoading=e(()=>Boolean(this.model()?.loading),...ngDevMode?[{debugName:"isLoading"}]:[]);isIconOnly=e(()=>{if(this.hasBadge())return false;if(Boolean(this.model()?.iconOnly)&&this.hasIcon())return true;const n=String(this.model()?.text??"").trim();const o=String(this.model()?.label??"").trim();return this.hasIcon()&&n.length===0&&o.length===0},...ngDevMode?[{debugName:"isIconOnly"}]:[]);showText=e(()=>this.buttonText().length>0,...ngDevMode?[{debugName:"showText"}]:[]);showVisual=e(()=>this.isLoading()||this.hasIcon(),...ngDevMode?[{debugName:"showVisual"}]:[]);shellClass=e(()=>this.isIconOnly()?"nvb-button-shell nvb-button-shell--compact":"nvb-button-shell",...ngDevMode?[{debugName:"shellClass"}]:[]);buttonClass=e(()=>{const n=String(this.model()?.variant??"solid").trim();const o=String(this.model()?.tone??"primary").trim().toLowerCase();const t=["nvb-button"];if(n==="outline")t.push("nvb-button--outline");else if(n==="text")t.push("nvb-button--text");else t.push("nvb-button--solid");if(this.hasIcon())t.push("nvb-button--with-icon");if(this.iconPosition()==="right")t.push("nvb-button--icon-right");else if(this.iconPosition()==="top")t.push("nvb-button--icon-top");else if(this.iconPosition()==="bottom")t.push("nvb-button--icon-bottom");else t.push("nvb-button--icon-left");if(this.isIconOnly())t.push("nvb-button--icon-only");if(this.isLoading())t.push("nvb-button--loading");if(this.hasBadge())t.push("nvb-button--with-badge");t.push(`nvb-button--tone-${o||"primary"}`);t.push(`nvb-button--size-${this.buttonSize()}`);return t.join(" ")},...ngDevMode?[{debugName:"buttonClass"}]:[]);buttonStyle=e(()=>{const n=String(this.model()?.color??"").trim();const o=String(this.model()?.textColor??"").trim();const t={};if(n)t["--nvb-button-color"]=n;if(o){t["--nvb-button-text-color"]=o;t["--nvb-button-own-text-color"]=o}return t},...ngDevMode?[{debugName:"buttonStyle"}]:[]);constructor(){this.dropdownCoordinatorSubscription=this.dropdownCoordinatorService.activeDropdownId$.subscribe(n=>{this.menuOpen.set(String(n??"").trim()===this.dropdownId)})}ngOnInit(){this.eventService.afterPropertyChanged.add(this.onPropertyChangedHandler)}ngOnDestroy(){this.dropdownCoordinatorSubscription?.unsubscribe();this.dropdownCoordinatorSubscription=null;this.eventService.afterPropertyChanged.remove(this.onPropertyChangedHandler);this.closeMenu()}onButtonClick(n){n.preventDefault();n.stopPropagation();if(this.model().disabled||this.model().readOnly)return;if(this.isMenuButton()){this.toggleMenu();return}this.runButtonActions()}async onMenuActionClick(n,o){o.preventDefault();o.stopPropagation();if(this.model().disabled||this.model().readOnly)return;const t=this.buildRuntimeContext();await this.elementActionService.runAction(this.model(),n,t);this.closeMenu()}resolveMenuActionLabel(n,o){const t=String(n?.label??"").trim();if(t)return t;const r=String(n?.type??"").trim().toLowerCase();if(r==="navigate")return"Navigate";if(r==="datasource")return"Run data source";if(r==="setvalue")return"Set value";if(r==="reloadelements")return"Reload elements";if(r==="dialog")return"Dialog";if(r==="toast")return"Show toast";return`Action ${o+1}`}resolveMenuActionIcon(n){const o=String(n?.icon??"").trim();if(o)return o;const t=String(n?.type??"").trim().toLowerCase();if(t==="navigate")return"open_in_new";if(t==="datasource")return"database";if(t==="setvalue")return"edit_note";if(t==="reloadelements")return"refresh";if(t==="dialog")return"web_asset";if(t==="toast")return"notifications";return""}onDocumentPointerDown(n){if(!this.isMenuOpen())return;const o=this.elementRef.nativeElement;const t=n.target;if(o&&t&&!o.contains(t))this.closeMenu()}onDocumentEscape(){this.closeMenu()}onWindowResize(){if(!this.isMenuOpen())return;this.calculateMenuPosition()}onDocumentScroll(){if(!this.isMenuOpen())return;this.calculateMenuPosition()}async runButtonActions(){const n=this.buildRuntimeContext();await this.elementActionService.runActions(this.model(),this.model().events??[],"click",n);await this.elementActionService.runActions(this.model(),this.model().events??[],"submit",n)}buildRuntimeContext(){const n=this.ensureArray(this.dataService.getValue("__table.selectedItems"));const o=this.ensureArray(this.dataService.getValue("__table.selectedRows"));const t=this.ensureArray(this.dataService.getValue("__table.selectedKeys"));const r=Number(this.dataService.getValue("__table.selectedCount")??o.length);return{item:null,row:null,selectedItems:n,selectedRows:o,selectedKeys:t,selectedCount:Number.isFinite(r)?r:o.length,table:this.dataService.getValue("__table")??null}}ensureArray(n){return Array.isArray(n)?n:[]}toggleMenu(){if(this.isMenuOpen()){this.closeMenu();return}this.calculateMenuPosition();this.dropdownCoordinatorService.requestOpen(this.dropdownId)}closeMenu(){this.dropdownCoordinatorService.requestClose(this.dropdownId)}calculateMenuPosition(){const n=this.buttonTrigger?.nativeElement;if(typeof window==="undefined"||!n||typeof n.getBoundingClientRect!=="function"){this.menuPosition.set("bottom");this.menuStyle.set({minWidth:"180px"});return}const o=n.getBoundingClientRect();const t=8;const r=6;const x=Math.max(window.innerWidth??0,0);const c=Math.max(180,Math.round(o.width));const y=Math.max(96,this.menuActions().length*40+16);const v=window.innerHeight-o.bottom-t;const w=o.top-t;const d=v<Math.min(y,220)&&w>v;const p=t;const _=Math.max(p,x-c-t);const M=Math.min(Math.max(Math.round(o.left),p),_);this.menuPosition.set(d?"top":"bottom");this.menuStyle.set({position:"fixed",left:`${M}px`,top:`${Math.round(d?o.top-r:o.bottom+r)}px`,minWidth:`${c}px`,zIndex:"var(--nvb-floating-overlay-z-index, 1400)"})}static ɵfac=i.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"22.2.1",ngImport:i,type:u,deps:[],target:i.ɵɵFactoryTarget.Component});static ɵcmp=i.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"22.2.1",type:u,isStandalone:true,selector:"button-element",inputs:{model:{classPropertyName:"model",publicName:"model",isSignal:true,isRequired:true,transformFunction:null}},host:{listeners:{"document:pointerdown":"onDocumentPointerDown($event)","document:keydown.escape":"onDocumentEscape()","window:resize":"onWindowResize()","document:scroll":"onDocumentScroll()"}},viewQueries:[{propertyName:"buttonTrigger",first:true,predicate:["buttonTrigger"],descendants:true}],ngImport:i,template:"<element-wrapper [model]=\"model()\" #fieldWrapper=\"elementWrapper\">\n <div [class]=\"shellClass()\">\n <button\n #buttonTrigger\n type=\"button\"\n [class]=\"buttonClass()\"\n [disabled]=\"model().disabled || model().readOnly\"\n [attr.aria-busy]=\"isLoading()\"\n [attr.aria-haspopup]=\"isMenuButton() ? 'menu' : null\"\n [attr.aria-expanded]=\"isMenuButton() ? isMenuOpen() : null\"\n [attr.aria-describedby]=\"fieldWrapper.describedByIds()\"\n [attr.aria-labelledby]=\"fieldWrapper.hasLabelText() ? fieldWrapper.labelId() : null\"\n [attr.aria-label]=\"\n fieldWrapper.hasLabelText() ? null : buttonText() || model().label || model().name\n \"\n [attr.data-testid]=\"tid('trigger')\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"onButtonClick($event)\"\n >\n @if (showVisual()) {\n @if (isLoading()) {\n <span class=\"nvb-button__spinner\" aria-hidden=\"true\"></span>\n } @else if (hasIcon()) {\n <nvb-icon class=\"nvb-button__icon\" [name]=\"buttonIcon()\"></nvb-icon>\n }\n }\n @if (showText() || hasBadge()) {\n <span class=\"nvb-button__content\">\n @if (showText()) {\n <span class=\"nvb-button__text\">{{ buttonText() | dynamicText: model() }}</span>\n }\n @if (hasBadge()) {\n <span class=\"nvb-button__badge\">{{ badgeText() | dynamicText: model() }}</span>\n }\n </span>\n }\n </button>\n\n @if (isMenuButton() && isMenuOpen()) {\n <div\n class=\"nvb-button-menu\"\n [class.nvb-button-menu--top]=\"menuPosition() === 'top'\"\n [ngStyle]=\"menuStyle()\"\n role=\"menu\"\n >\n @for (action of menuActions(); track action.id || action.label || $index; let i = $index) {\n <button\n type=\"button\"\n class=\"nvb-button-menu__item\"\n role=\"menuitem\"\n [attr.aria-label]=\"resolveMenuActionLabel(action, i)\"\n [attr.data-testid]=\"tid('menu-item', i)\"\n (click)=\"onMenuActionClick(action, $event)\"\n >\n @if (resolveMenuActionIcon(action)) {\n <nvb-icon\n class=\"nvb-button-menu__icon\"\n [name]=\"resolveMenuActionIcon(action)\"\n ></nvb-icon>\n }\n <span>{{ resolveMenuActionLabel(action, i) }}</span>\n </button>\n }\n </div>\n }\n </div>\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-button-shell{position:relative;display:inline-flex;width:100%}.nvb-button-shell--compact{width:auto}.nvb-button{width:100%;min-height:var(--nvb-control-height, 40px);border-radius:var(--nvb-input-radius, var(--nvb-radius-sm));border:var(--nvb-input-border-width, 1px) solid transparent;font-size:var(--nvb-control-font-size, 14px);font-weight:600;padding:0 var(--nvb-control-padding-x, 12px);line-height:20px;cursor:pointer;transition:background-color .16s ease,border-color .16s ease,color .16s ease,box-shadow .16s ease;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-shadow:none}.nvb-button:focus-visible{outline:none;box-shadow:var(--nvb-focus-ring, 0 0 0 1px var(--nvb-color-neutral-000), 0 0 0 3px color-mix(in oklab, var(--nvb-color-primary-400) 55%, transparent))}.nvb-button--tone-primary{--nvb-button-tone-color: var(--nvb-color-primary-600);--nvb-button-tone-border: var(--nvb-color-primary-600);--nvb-button-tone-text: var(--nvb-color-primary-700);--nvb-button-tone-surface: var(--nvb-color-primary-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button--tone-neutral{--nvb-button-tone-color: var(--nvb-color-neutral-700);--nvb-button-tone-border: var(--nvb-color-neutral-300);--nvb-button-tone-text: var(--nvb-color-neutral-700);--nvb-button-tone-surface: var(--nvb-color-neutral-100);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button--tone-success{--nvb-button-tone-color: var(--nvb-color-success-500);--nvb-button-tone-border: var(--nvb-color-success-300);--nvb-button-tone-text: var(--nvb-color-success-700);--nvb-button-tone-surface: var(--nvb-color-success-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button--tone-info{--nvb-button-tone-color: var(--nvb-color-info-500);--nvb-button-tone-border: var(--nvb-color-info-300);--nvb-button-tone-text: var(--nvb-color-info-700);--nvb-button-tone-surface: var(--nvb-color-info-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button--tone-warning{--nvb-button-tone-color: var(--nvb-color-warning-500);--nvb-button-tone-border: var(--nvb-color-warning-300);--nvb-button-tone-text: var(--nvb-color-warning-800);--nvb-button-tone-surface: var(--nvb-color-warning-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-950)}.nvb-button--tone-risk{--nvb-button-tone-color: var(--nvb-color-risk-500);--nvb-button-tone-border: var(--nvb-color-risk-300);--nvb-button-tone-text: var(--nvb-color-risk-700);--nvb-button-tone-surface: var(--nvb-color-risk-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button:disabled{cursor:not-allowed;opacity:.65}.nvb-button--solid{background-color:var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-500)));border-color:var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-500)));color:var(--nvb-button-own-text-color, var(--nvb-button-tone-contrast, var(--nvb-color-neutral-000)))}.nvb-button--solid:hover:not(:disabled){background-color:color-mix(in oklab,var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-600))) 90%,var(--nvb-color-neutral-950));border-color:color-mix(in oklab,var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-600))) 90%,var(--nvb-color-neutral-950))}.nvb-button--outline{background-color:var(--nvb-color-neutral-000);border-color:var(--nvb-button-color, var(--nvb-button-tone-border, var(--nvb-button-tone-color, var(--nvb-color-primary-500))));color:var(--nvb-button-text-color, var(--nvb-button-color, var(--nvb-button-tone-text, var(--nvb-color-primary-700))))}.nvb-button--outline:hover:not(:disabled){background-color:color-mix(in oklab,var(--nvb-button-tone-surface) 70%,var(--nvb-color-neutral-000))}.nvb-button--text{background-color:transparent;border-color:transparent;color:var(--nvb-button-text-color, var(--nvb-button-color, var(--nvb-button-tone-text, var(--nvb-color-primary-700))))}.nvb-button--text:hover:not(:disabled){background-color:color-mix(in oklab,var(--nvb-button-tone-surface) 68%,var(--nvb-color-neutral-000))}.nvb-button__icon{font-size:18px;line-height:1;flex:0 0 auto}.nvb-button__content{display:inline-flex;align-items:center;justify-content:center;gap:8px}.nvb-button__text{white-space:nowrap}.nvb-button__badge{min-width:18px;height:18px;padding:0 6px;border-radius:var(--nvb-radius-full);display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;line-height:1}.nvb-button__spinner{width:16px;height:16px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;animation:nvb-button-spin .7s linear infinite}.nvb-button--icon-right{flex-direction:row-reverse}.nvb-button--icon-top{flex-direction:column}.nvb-button--icon-bottom{flex-direction:column-reverse}.nvb-button--size-small{min-height:var(--nvb-control-height-sm, 32px);padding:0 max(var(--nvb-control-padding-x, 12px) - 2px,8px);font-size:13px}.nvb-button--size-small.nvb-button--icon-only{width:var(--nvb-control-height-sm, 32px);min-width:var(--nvb-control-height-sm, 32px)}.nvb-button--size-large{min-height:44px;padding:0 16px;font-size:15px}.nvb-button--size-large.nvb-button--icon-only{width:44px;min-width:44px}.nvb-button--icon-only{width:var(--nvb-control-height, 40px);min-width:var(--nvb-control-height, 40px);padding:0;justify-content:center}.nvb-button-menu{position:fixed;top:0;left:0;z-index:var(--nvb-floating-overlay-z-index, 2147483000);min-width:180px;padding:6px;border-radius:var(--nvb-menu-radius, var(--nvb-input-radius, var(--nvb-radius-md)));border:1px solid var(--nvb-color-neutral-200, #d6dbe1);background:var(--nvb-color-neutral-000, #ffffff);box-shadow:var(--nvb-shadow-8);display:flex;flex-direction:column;gap:4px}.nvb-button-menu--top{transform:translateY(calc(-100% - 6px))}.nvb-button-menu__item{width:100%;min-height:36px;border:0;border-radius:var(--nvb-radius-sm);background:transparent;color:var(--nvb-color-neutral-800, #1f2937);display:inline-flex;align-items:center;gap:8px;padding:8px 10px;text-align:left;cursor:pointer}.nvb-button-menu__item:hover{background:var(--nvb-color-neutral-100, #f3f4f6)}.nvb-button-menu__icon{flex:0 0 auto}.nvb-button--solid .nvb-button__badge{background:var(--nvb-color-neutral-000);color:var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-500)))}.nvb-button--outline .nvb-button__badge,.nvb-button--text .nvb-button__badge{background:var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-500)));color:var(--nvb-color-neutral-000)}@keyframes nvb-button-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"],dependencies:[{kind:"component",type:g,selector:"element-wrapper",inputs:["model","controlIdInput","labelForInput","groupRole","showTextWrapperInput"],exportAs:["elementWrapper"]},{kind:"directive",type:f,selector:"[ngStyle]",inputs:["ngStyle"]},{kind:"component",type:h,selector:"nvb-icon",inputs:["name","svg","ariaLabel"]},{kind:"pipe",type:m,name:"dynamicText"}],changeDetection:i.ChangeDetectionStrategy.OnPush})};i.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"22.2.1",ngImport:i,type:s,decorators:[{type:P,args:[{selector:"button-element",changeDetection:T.OnPush,imports:[g,L,f,m,h],template:"<element-wrapper [model]=\"model()\" #fieldWrapper=\"elementWrapper\">\n <div [class]=\"shellClass()\">\n <button\n #buttonTrigger\n type=\"button\"\n [class]=\"buttonClass()\"\n [disabled]=\"model().disabled || model().readOnly\"\n [attr.aria-busy]=\"isLoading()\"\n [attr.aria-haspopup]=\"isMenuButton() ? 'menu' : null\"\n [attr.aria-expanded]=\"isMenuButton() ? isMenuOpen() : null\"\n [attr.aria-describedby]=\"fieldWrapper.describedByIds()\"\n [attr.aria-labelledby]=\"fieldWrapper.hasLabelText() ? fieldWrapper.labelId() : null\"\n [attr.aria-label]=\"\n fieldWrapper.hasLabelText() ? null : buttonText() || model().label || model().name\n \"\n [attr.data-testid]=\"tid('trigger')\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"onButtonClick($event)\"\n >\n @if (showVisual()) {\n @if (isLoading()) {\n <span class=\"nvb-button__spinner\" aria-hidden=\"true\"></span>\n } @else if (hasIcon()) {\n <nvb-icon class=\"nvb-button__icon\" [name]=\"buttonIcon()\"></nvb-icon>\n }\n }\n @if (showText() || hasBadge()) {\n <span class=\"nvb-button__content\">\n @if (showText()) {\n <span class=\"nvb-button__text\">{{ buttonText() | dynamicText: model() }}</span>\n }\n @if (hasBadge()) {\n <span class=\"nvb-button__badge\">{{ badgeText() | dynamicText: model() }}</span>\n }\n </span>\n }\n </button>\n\n @if (isMenuButton() && isMenuOpen()) {\n <div\n class=\"nvb-button-menu\"\n [class.nvb-button-menu--top]=\"menuPosition() === 'top'\"\n [ngStyle]=\"menuStyle()\"\n role=\"menu\"\n >\n @for (action of menuActions(); track action.id || action.label || $index; let i = $index) {\n <button\n type=\"button\"\n class=\"nvb-button-menu__item\"\n role=\"menuitem\"\n [attr.aria-label]=\"resolveMenuActionLabel(action, i)\"\n [attr.data-testid]=\"tid('menu-item', i)\"\n (click)=\"onMenuActionClick(action, $event)\"\n >\n @if (resolveMenuActionIcon(action)) {\n <nvb-icon\n class=\"nvb-button-menu__icon\"\n [name]=\"resolveMenuActionIcon(action)\"\n ></nvb-icon>\n }\n <span>{{ resolveMenuActionLabel(action, i) }}</span>\n </button>\n }\n </div>\n }\n </div>\n</element-wrapper>\n",styles:[":host{display:block;width:100%}.nvb-button-shell{position:relative;display:inline-flex;width:100%}.nvb-button-shell--compact{width:auto}.nvb-button{width:100%;min-height:var(--nvb-control-height, 40px);border-radius:var(--nvb-input-radius, var(--nvb-radius-sm));border:var(--nvb-input-border-width, 1px) solid transparent;font-size:var(--nvb-control-font-size, 14px);font-weight:600;padding:0 var(--nvb-control-padding-x, 12px);line-height:20px;cursor:pointer;transition:background-color .16s ease,border-color .16s ease,color .16s ease,box-shadow .16s ease;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-shadow:none}.nvb-button:focus-visible{outline:none;box-shadow:var(--nvb-focus-ring, 0 0 0 1px var(--nvb-color-neutral-000), 0 0 0 3px color-mix(in oklab, var(--nvb-color-primary-400) 55%, transparent))}.nvb-button--tone-primary{--nvb-button-tone-color: var(--nvb-color-primary-600);--nvb-button-tone-border: var(--nvb-color-primary-600);--nvb-button-tone-text: var(--nvb-color-primary-700);--nvb-button-tone-surface: var(--nvb-color-primary-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button--tone-neutral{--nvb-button-tone-color: var(--nvb-color-neutral-700);--nvb-button-tone-border: var(--nvb-color-neutral-300);--nvb-button-tone-text: var(--nvb-color-neutral-700);--nvb-button-tone-surface: var(--nvb-color-neutral-100);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button--tone-success{--nvb-button-tone-color: var(--nvb-color-success-500);--nvb-button-tone-border: var(--nvb-color-success-300);--nvb-button-tone-text: var(--nvb-color-success-700);--nvb-button-tone-surface: var(--nvb-color-success-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button--tone-info{--nvb-button-tone-color: var(--nvb-color-info-500);--nvb-button-tone-border: var(--nvb-color-info-300);--nvb-button-tone-text: var(--nvb-color-info-700);--nvb-button-tone-surface: var(--nvb-color-info-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button--tone-warning{--nvb-button-tone-color: var(--nvb-color-warning-500);--nvb-button-tone-border: var(--nvb-color-warning-300);--nvb-button-tone-text: var(--nvb-color-warning-800);--nvb-button-tone-surface: var(--nvb-color-warning-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-950)}.nvb-button--tone-risk{--nvb-button-tone-color: var(--nvb-color-risk-500);--nvb-button-tone-border: var(--nvb-color-risk-300);--nvb-button-tone-text: var(--nvb-color-risk-700);--nvb-button-tone-surface: var(--nvb-color-risk-050);--nvb-button-tone-contrast: var(--nvb-color-neutral-000)}.nvb-button:disabled{cursor:not-allowed;opacity:.65}.nvb-button--solid{background-color:var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-500)));border-color:var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-500)));color:var(--nvb-button-own-text-color, var(--nvb-button-tone-contrast, var(--nvb-color-neutral-000)))}.nvb-button--solid:hover:not(:disabled){background-color:color-mix(in oklab,var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-600))) 90%,var(--nvb-color-neutral-950));border-color:color-mix(in oklab,var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-600))) 90%,var(--nvb-color-neutral-950))}.nvb-button--outline{background-color:var(--nvb-color-neutral-000);border-color:var(--nvb-button-color, var(--nvb-button-tone-border, var(--nvb-button-tone-color, var(--nvb-color-primary-500))));color:var(--nvb-button-text-color, var(--nvb-button-color, var(--nvb-button-tone-text, var(--nvb-color-primary-700))))}.nvb-button--outline:hover:not(:disabled){background-color:color-mix(in oklab,var(--nvb-button-tone-surface) 70%,var(--nvb-color-neutral-000))}.nvb-button--text{background-color:transparent;border-color:transparent;color:var(--nvb-button-text-color, var(--nvb-button-color, var(--nvb-button-tone-text, var(--nvb-color-primary-700))))}.nvb-button--text:hover:not(:disabled){background-color:color-mix(in oklab,var(--nvb-button-tone-surface) 68%,var(--nvb-color-neutral-000))}.nvb-button__icon{font-size:18px;line-height:1;flex:0 0 auto}.nvb-button__content{display:inline-flex;align-items:center;justify-content:center;gap:8px}.nvb-button__text{white-space:nowrap}.nvb-button__badge{min-width:18px;height:18px;padding:0 6px;border-radius:var(--nvb-radius-full);display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;line-height:1}.nvb-button__spinner{width:16px;height:16px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;animation:nvb-button-spin .7s linear infinite}.nvb-button--icon-right{flex-direction:row-reverse}.nvb-button--icon-top{flex-direction:column}.nvb-button--icon-bottom{flex-direction:column-reverse}.nvb-button--size-small{min-height:var(--nvb-control-height-sm, 32px);padding:0 max(var(--nvb-control-padding-x, 12px) - 2px,8px);font-size:13px}.nvb-button--size-small.nvb-button--icon-only{width:var(--nvb-control-height-sm, 32px);min-width:var(--nvb-control-height-sm, 32px)}.nvb-button--size-large{min-height:44px;padding:0 16px;font-size:15px}.nvb-button--size-large.nvb-button--icon-only{width:44px;min-width:44px}.nvb-button--icon-only{width:var(--nvb-control-height, 40px);min-width:var(--nvb-control-height, 40px);padding:0;justify-content:center}.nvb-button-menu{position:fixed;top:0;left:0;z-index:var(--nvb-floating-overlay-z-index, 2147483000);min-width:180px;padding:6px;border-radius:var(--nvb-menu-radius, var(--nvb-input-radius, var(--nvb-radius-md)));border:1px solid var(--nvb-color-neutral-200, #d6dbe1);background:var(--nvb-color-neutral-000, #ffffff);box-shadow:var(--nvb-shadow-8);display:flex;flex-direction:column;gap:4px}.nvb-button-menu--top{transform:translateY(calc(-100% - 6px))}.nvb-button-menu__item{width:100%;min-height:36px;border:0;border-radius:var(--nvb-radius-sm);background:transparent;color:var(--nvb-color-neutral-800, #1f2937);display:inline-flex;align-items:center;gap:8px;padding:8px 10px;text-align:left;cursor:pointer}.nvb-button-menu__item:hover{background:var(--nvb-color-neutral-100, #f3f4f6)}.nvb-button-menu__icon{flex:0 0 auto}.nvb-button--solid .nvb-button__badge{background:var(--nvb-color-neutral-000);color:var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-500)))}.nvb-button--outline .nvb-button__badge,.nvb-button--text .nvb-button__badge{background:var(--nvb-button-color, var(--nvb-button-tone-color, var(--nvb-color-primary-500)));color:var(--nvb-color-neutral-000)}@keyframes nvb-button-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"]}]}],ctorParameters:()=>[],propDecorators:{model:[{type:i.Input,args:[{isSignal:true,alias:"model",required:true}]}],buttonTrigger:[{type:N,args:["buttonTrigger"]}],onDocumentPointerDown:[{type:b,args:["document:pointerdown",["$event"]]}],onDocumentEscape:[{type:b,args:["document:keydown.escape"]}],onWindowResize:[{type:b,args:["window:resize"]}],onDocumentScroll:[{type:b,args:["document:scroll"]}]}});export{W as n,s as t};
|